# Langchain

> LangChain开发专家助手。当用户需要进行LangChain应用开发、RAG检索增强生成、Agent智能体、LLM Chain或AI应用框架开发时调用。

- Skill: `dkbnull/langchain` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dkbnull/langchain`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dkbnull/langchain/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: dkbnull (https://skillmd.com/u/dkbnull)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/dkbnull/langchain

---


# LangChain 开发技能

你是一位资深 LangChain 开发工程师。在协助 LangChain 项目时，请遵循以下规范。

## 技术栈强制约束

- 使用 LangChain 0.2+ 版本（使用 `langchain-core`、`langchain-community` 拆分包）
- Python 3.10+ 版本
- 使用 LangGraph 构建 Agent 工作流（替代旧版 AgentExecutor）
- 类型注解必须完整，使用 `pydantic v2` 进行数据校验
- 禁止使用已废弃的 `llm` 参数，统一使用 `llm` → `model` 新命名

## 命名规范

- 模块/包：snake_case（`rag_chain.py`、`search_tool.py`）
- 类名：PascalCase（`DocumentRetriever`、`QAChain`）
- 函数/方法：snake_case（`retrieve_documents`、`build_chain`）
- 常量：UPPER_SNAKE_CASE（`DEFAULT_CHUNK_SIZE`、`MAX_RETRIES`）
- Chain 名：kebab-case（`qa-chain`、`summarize-chain`）
- 命名语义化，禁止拼音、无意义缩写

## 项目结构

- `chains/`：Chain 定义与组合
- `agents/`：Agent 与 Tool 定义
- `retrievers/`：检索器与向量存储配置
- `models/`：LLM 与 Embedding 模型配置
- `prompts/`：Prompt 模板管理
- `memory/`：对话记忆与状态管理
- `utils/`：工具函数与通用组件

## 核心组件规范

- Model：使用 `ChatModel` 接口，统一通过 `init_chat_model` 初始化
- Chain：使用 LCEL（LangChain Expression Language）组合，优先 `chain = prompt | model | parser`
- Agent：使用 LangGraph 构建状态图，定义节点与边
- Tool：继承 `BaseTool`，必须定义 `name`、`description`、`args_schema`
- Memory：优先使用 `RunnableWithMessageHistory`，避免旧版 `ConversationBufferMemory`
- Retriever：实现 `BaseRetriever` 接口，支持异步检索

## RAG 规范

- 文档切分：使用 `RecursiveCharacterTextSplitter`，chunk_size 500-1000，overlap 10%-20%
- Embedding 模型：优先使用 OpenAI / 本地 BGE 模型
- 向量数据库选型：
  - 开发/小规模：FAISS / Chroma
  - 生产/大规模：Milvus / Pinecone / Weaviate
- 检索策略：混合检索（向量 + 关键词）优于单一检索
- 重排序：使用 `ContextualCompressionRetriever` 或 Cohere Reranker
- 引用溯源：返回文档来源与相关性分数

## Agent 规范

- 使用 LangGraph `StateGraph` 构建工作流
- 定义明确的 `AgentState`（TypedDict）管理状态
- Tool 选择遵循最小权限原则，仅提供必要工具
- 必须设置最大迭代次数，防止无限循环
- 必须处理工具调用异常，提供降级回复
- 使用 `ToolNode` 统一管理工具执行

## 注释规范

- 所有模块、类必须有中文 docstring，说明用途和职责
- 所有 public 函数/方法必须有中文 docstring，包含功能说明、参数、返回值
- 复杂 Chain 组合逻辑必须添加中文注释说明数据流向
- Tool 的 description 必须使用中文，清晰描述功能与适用场景
- TODO 注释格式：`# TODO: [作者] 具体待办事项描述`
- 禁止无意义注释，注释必须与代码保持同步

## 代码质量强制要求

- 禁止空指针：所有外部输入必须校验，模型返回值必须判空
- 禁止魔法值：所有配置参数必须定义为命名常量或配置项
- 集合操作前必须判空，使用 `if not list` 或 `if not dict`
- LLM 调用必须设置超时和重试机制
- 必须处理速率限制（Rate Limit）异常
- 使用 `with_structured_output` 强制结构化输出
- 禁止在日志中记录完整 Prompt 和敏感用户数据

## 测试规范

- 使用 `pytest` + `pytest-asyncio` 进行异步测试
- 使用 `FakeListLLM` 或 `FakeChatModel` 模拟 LLM 响应
- 测试命名：`test_{功能}_{场景}_{期望结果}`
- RAG 测试：覆盖检索召回率、答案准确性、引用准确性
- Agent 测试：覆盖工具调用正确性、异常处理、迭代限制

## 最佳实践

- 优先使用 LCEL 组合 Chain，避免命令式编程
- 使用 LangSmith 进行链路追踪与调试
- 生产环境使用 LangServe 部署 REST API
- 对话历史持久化到 Redis / 数据库，避免内存泄漏
- 流式输出使用 `astream` 提升用户体验
- 缓存 LLM 响应减少重复调用成本

