文档版本:1.0 整理日期:2026-07-16 适用范围:LangChain Python v1+、LangGraph v1+ 配套文件:LangChain_动态流程展示图.gif
1. 摘要
LangChain 是一个面向大语言模型应用的开源开发框架,主要解决以下问题:
LangChain v1+ 的核心定位已经从早期的“Chain 编排工具”逐步转向:
以 create_agent 为高层 Agent 入口,以 LangGraph 为底层有状态运行时,以 Middleware 完成上下文工程和安全控制。
对于新项目,建议采用以下技术路线:
简单模型调用
↓
LangChain Model / Message / Tool
↓
create_agent
↓
Middleware + Structured Output + Streaming
↓
需要复杂状态机时下沉到 LangGraph
↓
使用 LangSmith 进行追踪、评估与生产监控
2. LangChain 生态定位
2.1 生态组件关系
| LangChain | Agent 应用框架 | 模型、消息、工具、Agent、中间件、检索等高层抽象 |
| LangGraph | Agent 编排运行时 | 状态图、持久化、循环、分支、人工介入、故障恢复 |
| LangSmith | Agent 工程平台 | Trace、调试、数据集、评估、Prompt 管理、部署观测 |
| Deep Agents | 高能力 Agent Harness | 规划、子 Agent、文件系统、上下文管理等预构建能力 |
| Provider Packages | 模型集成包 | langchain-openai、langchain-anthropic 等独立集成 |
2.2 分层理解
#mermaid-svg-OC6iH9RYSZg5Wj5l{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OC6iH9RYSZg5Wj5l .error-icon{fill:#552222;}#mermaid-svg-OC6iH9RYSZg5Wj5l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OC6iH9RYSZg5Wj5l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .marker.cross{stroke:#333333;}#mermaid-svg-OC6iH9RYSZg5Wj5l svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OC6iH9RYSZg5Wj5l p{margin:0;}#mermaid-svg-OC6iH9RYSZg5Wj5l .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .cluster-label text{fill:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .cluster-label span{color:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .cluster-label span p{background-color:transparent;}#mermaid-svg-OC6iH9RYSZg5Wj5l .label text,#mermaid-svg-OC6iH9RYSZg5Wj5l span{fill:#333;color:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .node rect,#mermaid-svg-OC6iH9RYSZg5Wj5l .node circle,#mermaid-svg-OC6iH9RYSZg5Wj5l .node ellipse,#mermaid-svg-OC6iH9RYSZg5Wj5l .node polygon,#mermaid-svg-OC6iH9RYSZg5Wj5l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .rough-node .label text,#mermaid-svg-OC6iH9RYSZg5Wj5l .node .label text,#mermaid-svg-OC6iH9RYSZg5Wj5l .image-shape .label,#mermaid-svg-OC6iH9RYSZg5Wj5l .icon-shape .label{text-anchor:middle;}#mermaid-svg-OC6iH9RYSZg5Wj5l .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .rough-node .label,#mermaid-svg-OC6iH9RYSZg5Wj5l .node .label,#mermaid-svg-OC6iH9RYSZg5Wj5l .image-shape .label,#mermaid-svg-OC6iH9RYSZg5Wj5l .icon-shape .label{text-align:center;}#mermaid-svg-OC6iH9RYSZg5Wj5l .node.clickable{cursor:pointer;}#mermaid-svg-OC6iH9RYSZg5Wj5l .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .arrowheadPath{fill:#333333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OC6iH9RYSZg5Wj5l .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OC6iH9RYSZg5Wj5l .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OC6iH9RYSZg5Wj5l .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OC6iH9RYSZg5Wj5l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .cluster text{fill:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l .cluster span{color:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OC6iH9RYSZg5Wj5l .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OC6iH9RYSZg5Wj5l rect.text{fill:none;stroke-width:0;}#mermaid-svg-OC6iH9RYSZg5Wj5l .icon-shape,#mermaid-svg-OC6iH9RYSZg5Wj5l .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OC6iH9RYSZg5Wj5l .icon-shape p,#mermaid-svg-OC6iH9RYSZg5Wj5l .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OC6iH9RYSZg5Wj5l .icon-shape .label rect,#mermaid-svg-OC6iH9RYSZg5Wj5l .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OC6iH9RYSZg5Wj5l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OC6iH9RYSZg5Wj5l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OC6iH9RYSZg5Wj5l :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Trace
Trace
业务应用 / API / Web UI
LangChainAgent、Model、Tool、Middleware
LangGraph状态图、循环、持久化、HITL
模型供应商OpenAI / Anthropic / Google / Ollama
外部系统数据库 / 搜索 / 文件 / MCP / SaaS
LangSmithTrace / Evaluation / Observability
2.3 LangChain 与 LangGraph 的选择
使用 LangChain:
- 希望快速构建 Tool Calling Agent;
- 业务流程接近“模型判断 → 调用工具 → 返回观察 → 再判断”;
- 希望通过中间件完成动态提示词、摘要、权限和审批;
- 不想手动搭建状态图。
使用 LangGraph:
- 流程存在复杂分支、循环、并行或回退;
- 需要明确控制每一个节点;
- 需要长时间运行和故障恢复;
- 需要人工审批后继续执行;
- 需要多 Agent 协作;
- 需要精细管理状态和持久化。
二者并非互斥:LangChain 的 Agent 本身构建在 LangGraph 之上。
3. LangChain 的核心架构
3.1 总体执行模型
LangChain Agent 的本质是:
Agent = Model + Harness
其中:
- Model:负责理解上下文、规划下一步、生成工具调用或最终答案;
- Harness:围绕模型运行的全部工程能力,包括提示词、工具、状态、中间件、停止条件、错误处理等。
Agent 的典型循环如下:
#mermaid-svg-wPeUkHrE0cCYeSzP{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wPeUkHrE0cCYeSzP .error-icon{fill:#552222;}#mermaid-svg-wPeUkHrE0cCYeSzP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wPeUkHrE0cCYeSzP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wPeUkHrE0cCYeSzP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wPeUkHrE0cCYeSzP .marker.cross{stroke:#333333;}#mermaid-svg-wPeUkHrE0cCYeSzP svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wPeUkHrE0cCYeSzP p{margin:0;}#mermaid-svg-wPeUkHrE0cCYeSzP .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP .cluster-label text{fill:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP .cluster-label span{color:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP .cluster-label span p{background-color:transparent;}#mermaid-svg-wPeUkHrE0cCYeSzP .label text,#mermaid-svg-wPeUkHrE0cCYeSzP span{fill:#333;color:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP .node rect,#mermaid-svg-wPeUkHrE0cCYeSzP .node circle,#mermaid-svg-wPeUkHrE0cCYeSzP .node ellipse,#mermaid-svg-wPeUkHrE0cCYeSzP .node polygon,#mermaid-svg-wPeUkHrE0cCYeSzP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wPeUkHrE0cCYeSzP .rough-node .label text,#mermaid-svg-wPeUkHrE0cCYeSzP .node .label text,#mermaid-svg-wPeUkHrE0cCYeSzP .image-shape .label,#mermaid-svg-wPeUkHrE0cCYeSzP .icon-shape .label{text-anchor:middle;}#mermaid-svg-wPeUkHrE0cCYeSzP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wPeUkHrE0cCYeSzP .rough-node .label,#mermaid-svg-wPeUkHrE0cCYeSzP .node .label,#mermaid-svg-wPeUkHrE0cCYeSzP .image-shape .label,#mermaid-svg-wPeUkHrE0cCYeSzP .icon-shape .label{text-align:center;}#mermaid-svg-wPeUkHrE0cCYeSzP .node.clickable{cursor:pointer;}#mermaid-svg-wPeUkHrE0cCYeSzP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wPeUkHrE0cCYeSzP .arrowheadPath{fill:#333333;}#mermaid-svg-wPeUkHrE0cCYeSzP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wPeUkHrE0cCYeSzP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wPeUkHrE0cCYeSzP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wPeUkHrE0cCYeSzP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wPeUkHrE0cCYeSzP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wPeUkHrE0cCYeSzP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wPeUkHrE0cCYeSzP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wPeUkHrE0cCYeSzP .cluster text{fill:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP .cluster span{color:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wPeUkHrE0cCYeSzP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wPeUkHrE0cCYeSzP rect.text{fill:none;stroke-width:0;}#mermaid-svg-wPeUkHrE0cCYeSzP .icon-shape,#mermaid-svg-wPeUkHrE0cCYeSzP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wPeUkHrE0cCYeSzP .icon-shape p,#mermaid-svg-wPeUkHrE0cCYeSzP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wPeUkHrE0cCYeSzP .icon-shape .label rect,#mermaid-svg-wPeUkHrE0cCYeSzP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wPeUkHrE0cCYeSzP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wPeUkHrE0cCYeSzP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wPeUkHrE0cCYeSzP :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
用户输入
构建上下文
调用模型
是否调用工具
执行工具
写入 ToolMessage / 状态
结构化输出或文本回答
返回用户
3.2 配套动态流程图

4. 核心组件详解
4.1 Models:统一模型接口
LangChain 对不同供应商的聊天模型提供统一调用接口,核心方法包括:
| invoke() | 单次同步调用 |
| ainvoke() | 单次异步调用 |
| stream() | 同步流式调用 |
| astream() | 异步流式调用 |
| batch() | 批量调用 |
| with_structured_output() | 约束模型返回结构化数据 |
| bind_tools() | 将工具绑定到模型 |
示例:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-5.5",
temperature=0,
)
response = model.invoke([
{"role": "system", "content": "你是一名严谨的技术助手。"},
{"role": "user", "content": "解释什么是向量数据库。"},
])
print(response.content)
模型初始化方式
LangChain v1+ 支持两类方式:
# 方式一:直接初始化供应商模型
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-5.5")
# 方式二:在 create_agent 中使用 provider:model 标识
from langchain.agents import create_agent
agent = create_agent("openai:gpt-5.5", tools=[])
工程建议
- 生产环境固定模型版本和参数;
- 将超时、重试、并发数放入统一配置;
- 对高成本模型增加路由策略;
- 将温度、最大输出长度和工具权限按任务动态配置;
- 不要让业务代码直接依赖某个供应商的私有响应格式。
4.2 Messages:上下文的基本单位
Messages 是 LangChain 中模型上下文的基本单位。
常见消息类型:
| SystemMessage | 系统规则、角色和边界 |
| HumanMessage | 用户输入 |
| AIMessage | 模型输出,可能包含工具调用 |
| ToolMessage | 工具执行结果 |
| RemoveMessage | 从状态中删除指定消息 |
| 自定义消息内容块 | 文本、图片、音频、推理块、引用等 |
示例:
from langchain.messages import SystemMessage, HumanMessage
messages = [
SystemMessage("你是一名 Python 工程师。"),
HumanMessage("给出一个线程安全队列示例。"),
]
response = model.invoke(messages)
Messages 不只是字符串,还可携带:
- tool call;
- token usage;
- provider metadata;
- reasoning block;
- multimodal content;
- response id;
- finish reason。
因此,工程中应尽量保留消息对象,不要过早把消息压缩成纯字符串。
4.3 Tools:让模型执行外部动作
Tool 是具有明确输入和输出定义的可调用函数。模型根据当前上下文决定:
基础定义
from langchain.tools import tool
@tool
def multiply(a: float, b: float) –> float:
"""计算两个数字的乘积。"""
return a * b
工具说明非常重要,因为模型会依据:
- 函数名;
- Docstring;
- 参数名称;
- 参数类型;
- 参数描述;
来判断如何调用工具。
工具设计原则
工具分类
查询型工具
├── 搜索
├── 数据库查询
├── 文件读取
└── 状态查询
计算型工具
├── 代码执行
├── 数学计算
└── 数据分析
动作型工具
├── 发邮件
├── 修改工单
├── 调用机器人
└── 下发业务指令
动作型工具的风险最高,应增加权限校验和 Human-in-the-loop。
4.4 Agent:模型与工具的循环执行器
最小 Agent 示例:
from langchain.agents import create_agent
from langchain.tools import tool
@tool
def get_weather(city: str) –> str:
"""查询城市天气。"""
# 示例数据;生产环境替换为真实天气接口
return f"{city}:晴,26°C"
agent = create_agent(
model="openai:gpt-5.5",
tools=[get_weather],
system_prompt="你是一个可靠的助手。需要实时信息时必须调用工具。",
)
result = agent.invoke({
"messages": [
{"role": "user", "content": "深圳天气如何?"}
]
})
print(result["messages"][–1].content)
Agent 内部过程
1. 接收 messages
2. Middleware 在模型调用前处理上下文
3. 模型生成 AIMessage
4. 如果 AIMessage 包含 tool_calls:
4.1 执行工具
4.2 生成 ToolMessage
4.3 写回状态
4.4 再次调用模型
5. 如果没有 tool_calls:
5.1 输出最终结果
6. 达到迭代上限或错误条件时停止
Agent 适用场景
- 搜索助手;
- 企业知识库;
- 数据分析助手;
- 工单处理;
- 邮件、日历、CRM 协同;
- 运维诊断;
- 机器人任务规划;
- 多步骤研究任务。
不适合直接使用自由 Agent 的场景
- 步骤完全固定且必须严格执行;
- 金融交易、医疗决策等高风险自动执行;
- 延迟要求极低;
- 模型无需动态选择工具;
- 每一步必须具有确定性和形式化证明。
这类场景更适合固定工作流或 LangGraph 明确状态机。
4.5 Middleware:LangChain v1+ 的关键扩展机制
Middleware 可以在 Agent 生命周期的关键位置插入控制逻辑。
典型用途:
- 动态系统提示词;
- 对话摘要;
- PII 脱敏;
- 工具权限过滤;
- 模型动态路由;
- 重试和降级;
- 内容安全;
- 人工审批;
- 成本和 token 限制;
- 日志与业务埋点;
- 上下文裁剪。
中间件的概念位置
#mermaid-svg-LHB2KHWw2mUJPT5l{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LHB2KHWw2mUJPT5l .error-icon{fill:#552222;}#mermaid-svg-LHB2KHWw2mUJPT5l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LHB2KHWw2mUJPT5l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LHB2KHWw2mUJPT5l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LHB2KHWw2mUJPT5l .marker.cross{stroke:#333333;}#mermaid-svg-LHB2KHWw2mUJPT5l svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LHB2KHWw2mUJPT5l p{margin:0;}#mermaid-svg-LHB2KHWw2mUJPT5l .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l .cluster-label text{fill:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l .cluster-label span{color:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l .cluster-label span p{background-color:transparent;}#mermaid-svg-LHB2KHWw2mUJPT5l .label text,#mermaid-svg-LHB2KHWw2mUJPT5l span{fill:#333;color:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l .node rect,#mermaid-svg-LHB2KHWw2mUJPT5l .node circle,#mermaid-svg-LHB2KHWw2mUJPT5l .node ellipse,#mermaid-svg-LHB2KHWw2mUJPT5l .node polygon,#mermaid-svg-LHB2KHWw2mUJPT5l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LHB2KHWw2mUJPT5l .rough-node .label text,#mermaid-svg-LHB2KHWw2mUJPT5l .node .label text,#mermaid-svg-LHB2KHWw2mUJPT5l .image-shape .label,#mermaid-svg-LHB2KHWw2mUJPT5l .icon-shape .label{text-anchor:middle;}#mermaid-svg-LHB2KHWw2mUJPT5l .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LHB2KHWw2mUJPT5l .rough-node .label,#mermaid-svg-LHB2KHWw2mUJPT5l .node .label,#mermaid-svg-LHB2KHWw2mUJPT5l .image-shape .label,#mermaid-svg-LHB2KHWw2mUJPT5l .icon-shape .label{text-align:center;}#mermaid-svg-LHB2KHWw2mUJPT5l .node.clickable{cursor:pointer;}#mermaid-svg-LHB2KHWw2mUJPT5l .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LHB2KHWw2mUJPT5l .arrowheadPath{fill:#333333;}#mermaid-svg-LHB2KHWw2mUJPT5l .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LHB2KHWw2mUJPT5l .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LHB2KHWw2mUJPT5l .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LHB2KHWw2mUJPT5l .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LHB2KHWw2mUJPT5l .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LHB2KHWw2mUJPT5l .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LHB2KHWw2mUJPT5l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LHB2KHWw2mUJPT5l .cluster text{fill:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l .cluster span{color:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LHB2KHWw2mUJPT5l .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LHB2KHWw2mUJPT5l rect.text{fill:none;stroke-width:0;}#mermaid-svg-LHB2KHWw2mUJPT5l .icon-shape,#mermaid-svg-LHB2KHWw2mUJPT5l .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LHB2KHWw2mUJPT5l .icon-shape p,#mermaid-svg-LHB2KHWw2mUJPT5l .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LHB2KHWw2mUJPT5l .icon-shape .label rect,#mermaid-svg-LHB2KHWw2mUJPT5l .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LHB2KHWw2mUJPT5l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LHB2KHWw2mUJPT5l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LHB2KHWw2mUJPT5l :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Tool Call
Final
用户输入
Before Agent
Before Model
Model
After Model
Tool
After Agent
输出
预构建中间件示例
from langchain.agents import create_agent
from langchain.agents.middleware import (
PIIMiddleware,
SummarizationMiddleware,
HumanInTheLoopMiddleware,
)
agent = create_agent(
model="openai:gpt-5.5",
tools=[read_email, send_email],
middleware=[
PIIMiddleware(
"email",
strategy="redact",
apply_to_input=True,
),
SummarizationMiddleware(
model="openai:gpt-5.5-mini",
trigger=("tokens", 6000),
keep=("messages", 20),
),
HumanInTheLoopMiddleware(
interrupt_on={
"send_email": True,
}
),
],
)
注:不同小版本的中间件参数可能变化,生产项目应固定依赖版本,并以对应版本官方 API Reference 为准。
自定义中间件适用逻辑
请求进入
↓
读取用户权限
↓
动态选择可用工具
↓
根据任务难度选择模型
↓
裁剪或摘要历史消息
↓
模型调用
↓
检查工具调用风险
↓
执行 / 拒绝 / 请求人工审批
4.6 Structured Output:结构化输出
自然语言输出很难直接被业务系统可靠解析。LangChain 支持通过 Pydantic、dataclass 或 JSON Schema 约束最终结果。
from pydantic import BaseModel, Field
from langchain.agents import create_agent
class TicketResult(BaseModel):
category: str = Field(description="工单分类")
priority: int = Field(ge=1, le=5)
summary: str
need_human: bool
agent = create_agent(
model="openai:gpt-5.5",
tools=[],
response_format=TicketResult,
)
result = agent.invoke({
"messages": [
{
"role": "user",
"content": "线上支付接口持续返回500错误,影响全部用户。"
}
]
})
ticket = result["structured_response"]
print(ticket.category, ticket.priority)
优势
- 类型安全;
- 自动校验;
- 避免脆弱的正则解析;
- 便于接数据库、API 和消息队列;
- 更适合自动化决策。
实践建议
- Schema 字段不要过多;
- 枚举值应明确;
- 给关键字段加范围约束;
- 允许返回 reason 或 evidence;
- 自动执行前必须进行二次业务校验;
- Schema 变更要进行版本管理。
4.7 Memory:短期记忆与长期记忆
LangChain/LangGraph 将记忆分为两类。
短期记忆
- 作用域:单个 thread;
- 典型内容:对话历史、当前任务状态、工具结果;
- 实现方式:Checkpointer;
- 用途:续聊、暂停恢复、人工介入、故障恢复。
长期记忆
- 作用域:跨 thread;
- 典型内容:用户偏好、稳定事实、历史经验;
- 实现方式:Store;
- 用途:个性化、长期知识、跨会话共享。
#mermaid-svg-40JX4OYEBYMIZmHS{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-40JX4OYEBYMIZmHS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-40JX4OYEBYMIZmHS .error-icon{fill:#552222;}#mermaid-svg-40JX4OYEBYMIZmHS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-40JX4OYEBYMIZmHS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-40JX4OYEBYMIZmHS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-40JX4OYEBYMIZmHS .marker.cross{stroke:#333333;}#mermaid-svg-40JX4OYEBYMIZmHS svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-40JX4OYEBYMIZmHS p{margin:0;}#mermaid-svg-40JX4OYEBYMIZmHS .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-40JX4OYEBYMIZmHS .cluster-label text{fill:#333;}#mermaid-svg-40JX4OYEBYMIZmHS .cluster-label span{color:#333;}#mermaid-svg-40JX4OYEBYMIZmHS .cluster-label span p{background-color:transparent;}#mermaid-svg-40JX4OYEBYMIZmHS .label text,#mermaid-svg-40JX4OYEBYMIZmHS span{fill:#333;color:#333;}#mermaid-svg-40JX4OYEBYMIZmHS .node rect,#mermaid-svg-40JX4OYEBYMIZmHS .node circle,#mermaid-svg-40JX4OYEBYMIZmHS .node ellipse,#mermaid-svg-40JX4OYEBYMIZmHS .node polygon,#mermaid-svg-40JX4OYEBYMIZmHS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-40JX4OYEBYMIZmHS .rough-node .label text,#mermaid-svg-40JX4OYEBYMIZmHS .node .label text,#mermaid-svg-40JX4OYEBYMIZmHS .image-shape .label,#mermaid-svg-40JX4OYEBYMIZmHS .icon-shape .label{text-anchor:middle;}#mermaid-svg-40JX4OYEBYMIZmHS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-40JX4OYEBYMIZmHS .rough-node .label,#mermaid-svg-40JX4OYEBYMIZmHS .node .label,#mermaid-svg-40JX4OYEBYMIZmHS .image-shape .label,#mermaid-svg-40JX4OYEBYMIZmHS .icon-shape .label{text-align:center;}#mermaid-svg-40JX4OYEBYMIZmHS .node.clickable{cursor:pointer;}#mermaid-svg-40JX4OYEBYMIZmHS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-40JX4OYEBYMIZmHS .arrowheadPath{fill:#333333;}#mermaid-svg-40JX4OYEBYMIZmHS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-40JX4OYEBYMIZmHS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-40JX4OYEBYMIZmHS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-40JX4OYEBYMIZmHS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-40JX4OYEBYMIZmHS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-40JX4OYEBYMIZmHS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-40JX4OYEBYMIZmHS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-40JX4OYEBYMIZmHS .cluster text{fill:#333;}#mermaid-svg-40JX4OYEBYMIZmHS .cluster span{color:#333;}#mermaid-svg-40JX4OYEBYMIZmHS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-40JX4OYEBYMIZmHS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-40JX4OYEBYMIZmHS rect.text{fill:none;stroke-width:0;}#mermaid-svg-40JX4OYEBYMIZmHS .icon-shape,#mermaid-svg-40JX4OYEBYMIZmHS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-40JX4OYEBYMIZmHS .icon-shape p,#mermaid-svg-40JX4OYEBYMIZmHS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-40JX4OYEBYMIZmHS .icon-shape .label rect,#mermaid-svg-40JX4OYEBYMIZmHS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-40JX4OYEBYMIZmHS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-40JX4OYEBYMIZmHS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-40JX4OYEBYMIZmHS :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Thread 1
Checkpoint
Thread 2
Checkpoint
Long-term Store
内存示例
from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaver
checkpointer = InMemorySaver()
agent = create_agent(
model="openai:gpt-5.5",
tools=[],
checkpointer=checkpointer,
)
config = {
"configurable": {
"thread_id": "user-001-session-01"
}
}
agent.invoke(
{"messages": [{"role": "user", "content": "我的项目叫 Atlas。"}]},
config,
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "我的项目叫什么?"}]},
config,
)
InMemorySaver 仅适用于本地测试。生产环境通常使用数据库型 Checkpointer。
长对话治理
对话无限增长会导致:
- token 成本上升;
- 延迟增加;
- 旧信息干扰;
- 超出上下文窗口;
- 模型注意力分散。
常见策略:
保留最近 N 条消息
+ 对较早消息做摘要
+ 将稳定事实写入长期 Store
+ 将大型工具结果存入外部对象存储
+ 只向模型注入当前任务需要的内容
4.8 Retrieval 与 RAG
RAG 通过在推理时检索外部知识,缓解模型知识静态和上下文有限的问题。
标准数据处理流程
#mermaid-svg-o9DLwBxvuAcTiauZ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-o9DLwBxvuAcTiauZ .error-icon{fill:#552222;}#mermaid-svg-o9DLwBxvuAcTiauZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o9DLwBxvuAcTiauZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o9DLwBxvuAcTiauZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-o9DLwBxvuAcTiauZ .marker.cross{stroke:#333333;}#mermaid-svg-o9DLwBxvuAcTiauZ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-o9DLwBxvuAcTiauZ p{margin:0;}#mermaid-svg-o9DLwBxvuAcTiauZ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ .cluster-label text{fill:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ .cluster-label span{color:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ .cluster-label span p{background-color:transparent;}#mermaid-svg-o9DLwBxvuAcTiauZ .label text,#mermaid-svg-o9DLwBxvuAcTiauZ span{fill:#333;color:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ .node rect,#mermaid-svg-o9DLwBxvuAcTiauZ .node circle,#mermaid-svg-o9DLwBxvuAcTiauZ .node ellipse,#mermaid-svg-o9DLwBxvuAcTiauZ .node polygon,#mermaid-svg-o9DLwBxvuAcTiauZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-o9DLwBxvuAcTiauZ .rough-node .label text,#mermaid-svg-o9DLwBxvuAcTiauZ .node .label text,#mermaid-svg-o9DLwBxvuAcTiauZ .image-shape .label,#mermaid-svg-o9DLwBxvuAcTiauZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-o9DLwBxvuAcTiauZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-o9DLwBxvuAcTiauZ .rough-node .label,#mermaid-svg-o9DLwBxvuAcTiauZ .node .label,#mermaid-svg-o9DLwBxvuAcTiauZ .image-shape .label,#mermaid-svg-o9DLwBxvuAcTiauZ .icon-shape .label{text-align:center;}#mermaid-svg-o9DLwBxvuAcTiauZ .node.clickable{cursor:pointer;}#mermaid-svg-o9DLwBxvuAcTiauZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-o9DLwBxvuAcTiauZ .arrowheadPath{fill:#333333;}#mermaid-svg-o9DLwBxvuAcTiauZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-o9DLwBxvuAcTiauZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-o9DLwBxvuAcTiauZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o9DLwBxvuAcTiauZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-o9DLwBxvuAcTiauZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o9DLwBxvuAcTiauZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-o9DLwBxvuAcTiauZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-o9DLwBxvuAcTiauZ .cluster text{fill:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ .cluster span{color:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-o9DLwBxvuAcTiauZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-o9DLwBxvuAcTiauZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-o9DLwBxvuAcTiauZ .icon-shape,#mermaid-svg-o9DLwBxvuAcTiauZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o9DLwBxvuAcTiauZ .icon-shape p,#mermaid-svg-o9DLwBxvuAcTiauZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-o9DLwBxvuAcTiauZ .icon-shape .label rect,#mermaid-svg-o9DLwBxvuAcTiauZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o9DLwBxvuAcTiauZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-o9DLwBxvuAcTiauZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-o9DLwBxvuAcTiauZ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
原始文档
Document Loader
Text Splitter
Embedding
Vector Store
用户问题
Retriever
相关上下文
LLM / Agent
基于知识的回答
RAG 的三类架构
| 2-Step RAG | 先检索,再生成 | 稳定、延迟可控 | 灵活性较低 | FAQ、文档问答 |
| Agentic RAG | Agent 自主决定是否检索 | 灵活、可组合多工具 | 延迟和成本不确定 | 研究助手 |
| Hybrid RAG | 检索、验证和生成组合 | 可平衡质量与控制 | 设计复杂 | 企业级知识系统 |
最小向量检索示例
from langchain_core.documents import Document
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
documents = [
Document(
page_content="LangGraph 提供有状态图编排和持久化。",
metadata={"source": "internal-doc-1"},
),
Document(
page_content="LangSmith 用于追踪和评估 Agent。",
metadata={"source": "internal-doc-2"},
),
]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = InMemoryVectorStore(embeddings)
vector_store.add_documents(documents)
retriever = vector_store.as_retriever(search_kwargs={"k": 2})
docs = retriever.invoke("哪个组件负责 Agent 追踪?")
for doc in docs:
print(doc.page_content, doc.metadata)
将 Retriever 封装为 Tool
from langchain.tools import tool
@tool
def search_internal_docs(query: str) –> str:
"""检索企业内部技术文档。"""
docs = retriever.invoke(query)
return "\\n\\n".join(
f"[来源: {d.metadata.get('source')}]\\n{d.page_content}"
for d in docs
)
然后将 search_internal_docs 加入 Agent 工具列表,即可构建 Agentic RAG。
RAG 工程重点
4.9 Streaming:流式输出
LangChain 支持:
- Agent 步骤更新;
- 模型 token;
- 工具调用事件;
- 自定义进度;
- 子图事件;
- 多种事件投影。
传统流式模式常见参数:
| updates | 每一步 Agent 状态变化 |
| messages | LLM token 和元数据 |
| custom | 用户自定义进度事件 |
for chunk in agent.stream(
{
"messages": [
{"role": "user", "content": "查询天气并给出出行建议。"}
]
},
stream_mode="updates",
):
print(chunk)
新版应用可优先使用 Event Streaming,将 messages、values、tool calls、subgraphs 等投影视为相互独立的事件流。
流式输出的价值
- 降低用户感知延迟;
- 展示工具调用进度;
- 显示多步骤任务当前状态;
- 支持取消;
- 支持前端逐步渲染;
- 便于观察 Agent 卡在哪一步。
4.10 Runtime 与 Context Engineering
一个可靠的 Agent 不仅依赖 Prompt,更依赖“何时向模型提供什么上下文”。
LangChain 将上下文大体分为:
| Runtime Context | 本次运行或会话 | 用户 ID、权限、数据库连接、配置 |
| State | 当前 thread | Messages、工具结果、任务进度 |
| Store | 跨 thread | 用户偏好、稳定事实、长期记忆 |
Context Engineering 的控制对象包括:
- System Prompt;
- Messages;
- Tools;
- Model;
- Response Format;
- 检索结果;
- 用户权限;
- Token 预算。
示例策略
普通用户
→ 只开放查询工具
→ 使用低成本模型
→ 输出简洁结果
管理员
→ 开放查询和修改工具
→ 写操作要求人工审批
→ 记录完整审计信息
长对话
→ 摘要早期历史
→ 保留最近消息
→ 注入长期偏好
4.11 MCP 集成
Model Context Protocol(MCP)用于标准化模型应用与工具、资源和外部上下文的连接方式。
LangChain 可通过 langchain-mcp-adapters 接入 MCP Server。
pip install -U langchain-mcp-adapters
MCP 的价值:
- 工具接口标准化;
- 一个 MCP Server 可被多个 Agent 客户端复用;
- 降低 SaaS、数据库和本地工具的集成成本;
- 将工具实现与 Agent 编排解耦。
需要注意:
- 默认会话是否有状态;
- MCP Server 的权限边界;
- 工具输入校验;
- 网络超时;
- 远程代码和文件访问风险;
- 多 Server 工具重名。
5. LangGraph:复杂 Agent 的底层运行时
LangGraph 用状态图描述工作流:
- State:共享状态;
- Node:计算节点;
- Edge:固定边;
- Conditional Edge:条件分支;
- START / END:入口和结束;
- Checkpointer:状态快照;
- Store:长期记忆;
- Interrupt:暂停并等待人工输入;
- Subgraph:子图和多 Agent 模块。
最小状态图示例
from langgraph.graph import StateGraph, MessagesState, START, END
def answer_node(state: MessagesState):
return {
"messages": [
{"role": "ai", "content": "hello world"}
]
}
builder = StateGraph(MessagesState)
builder.add_node("answer", answer_node)
builder.add_edge(START, "answer")
builder.add_edge("answer", END)
graph = builder.compile()
result = graph.invoke({
"messages": [
{"role": "user", "content": "hi"}
]
})
条件工作流示意
#mermaid-svg-okcb1m0zeKYrSoCn{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-okcb1m0zeKYrSoCn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-okcb1m0zeKYrSoCn .error-icon{fill:#552222;}#mermaid-svg-okcb1m0zeKYrSoCn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-okcb1m0zeKYrSoCn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-okcb1m0zeKYrSoCn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-okcb1m0zeKYrSoCn .marker.cross{stroke:#333333;}#mermaid-svg-okcb1m0zeKYrSoCn svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-okcb1m0zeKYrSoCn p{margin:0;}#mermaid-svg-okcb1m0zeKYrSoCn .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-okcb1m0zeKYrSoCn .cluster-label text{fill:#333;}#mermaid-svg-okcb1m0zeKYrSoCn .cluster-label span{color:#333;}#mermaid-svg-okcb1m0zeKYrSoCn .cluster-label span p{background-color:transparent;}#mermaid-svg-okcb1m0zeKYrSoCn .label text,#mermaid-svg-okcb1m0zeKYrSoCn span{fill:#333;color:#333;}#mermaid-svg-okcb1m0zeKYrSoCn .node rect,#mermaid-svg-okcb1m0zeKYrSoCn .node circle,#mermaid-svg-okcb1m0zeKYrSoCn .node ellipse,#mermaid-svg-okcb1m0zeKYrSoCn .node polygon,#mermaid-svg-okcb1m0zeKYrSoCn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-okcb1m0zeKYrSoCn .rough-node .label text,#mermaid-svg-okcb1m0zeKYrSoCn .node .label text,#mermaid-svg-okcb1m0zeKYrSoCn .image-shape .label,#mermaid-svg-okcb1m0zeKYrSoCn .icon-shape .label{text-anchor:middle;}#mermaid-svg-okcb1m0zeKYrSoCn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-okcb1m0zeKYrSoCn .rough-node .label,#mermaid-svg-okcb1m0zeKYrSoCn .node .label,#mermaid-svg-okcb1m0zeKYrSoCn .image-shape .label,#mermaid-svg-okcb1m0zeKYrSoCn .icon-shape .label{text-align:center;}#mermaid-svg-okcb1m0zeKYrSoCn .node.clickable{cursor:pointer;}#mermaid-svg-okcb1m0zeKYrSoCn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-okcb1m0zeKYrSoCn .arrowheadPath{fill:#333333;}#mermaid-svg-okcb1m0zeKYrSoCn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-okcb1m0zeKYrSoCn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-okcb1m0zeKYrSoCn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-okcb1m0zeKYrSoCn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-okcb1m0zeKYrSoCn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-okcb1m0zeKYrSoCn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-okcb1m0zeKYrSoCn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-okcb1m0zeKYrSoCn .cluster text{fill:#333;}#mermaid-svg-okcb1m0zeKYrSoCn .cluster span{color:#333;}#mermaid-svg-okcb1m0zeKYrSoCn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-okcb1m0zeKYrSoCn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-okcb1m0zeKYrSoCn rect.text{fill:none;stroke-width:0;}#mermaid-svg-okcb1m0zeKYrSoCn .icon-shape,#mermaid-svg-okcb1m0zeKYrSoCn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-okcb1m0zeKYrSoCn .icon-shape p,#mermaid-svg-okcb1m0zeKYrSoCn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-okcb1m0zeKYrSoCn .icon-shape .label rect,#mermaid-svg-okcb1m0zeKYrSoCn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-okcb1m0zeKYrSoCn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-okcb1m0zeKYrSoCn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-okcb1m0zeKYrSoCn :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
否
是
是
否
START
任务解析
是否需要检索
知识库检索
模型生成
证据是否充分
Web/数据库工具
高风险操作
人工审批
执行动作
最终回答
END
LangGraph 的关键优势
- 执行过程可恢复;
- 支持循环和分支;
- 支持长时间运行任务;
- 每一步状态可观测;
- 可以暂停并修改状态;
- 支持子图和多 Agent;
- 可实现确定性工作流与模型决策混合。
6. 一个完整 Agent 应用示例
下面示例包含:
- Tool;
- Agent;
- Structured Output;
- Memory;
- Streaming。
from pydantic import BaseModel, Field
from langchain.agents import create_agent
from langchain.tools import tool
from langgraph.checkpoint.memory import InMemorySaver
class FinalAnswer(BaseModel):
answer: str
used_tools: list[str] = Field(default_factory=list)
confidence: float = Field(ge=0.0, le=1.0)
@tool
def search_product_manual(question: str) –> str:
"""查询产品使用手册。"""
# 生产环境替换为向量库检索
if "重置" in question:
return "按住 RESET 键 8 秒,指示灯闪烁后松开。"
return "未检索到相关内容。"
checkpointer = InMemorySaver()
agent = create_agent(
model="openai:gpt-5.5",
tools=[search_product_manual],
system_prompt=(
"你是产品技术支持助手。"
"涉及产品操作步骤时必须先查询手册。"
"不得编造手册中不存在的步骤。"
),
response_format=FinalAnswer,
checkpointer=checkpointer,
)
config = {
"configurable": {
"thread_id": "support-session-001"
}
}
for event in agent.stream(
{
"messages": [
{
"role": "user",
"content": "设备如何恢复出厂设置?"
}
]
},
config,
stream_mode="updates",
):
print(event)
7. 企业级推荐架构
#mermaid-svg-pBjzEcNAfGARrDaU{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pBjzEcNAfGARrDaU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pBjzEcNAfGARrDaU .error-icon{fill:#552222;}#mermaid-svg-pBjzEcNAfGARrDaU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pBjzEcNAfGARrDaU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pBjzEcNAfGARrDaU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pBjzEcNAfGARrDaU .marker.cross{stroke:#333333;}#mermaid-svg-pBjzEcNAfGARrDaU svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pBjzEcNAfGARrDaU p{margin:0;}#mermaid-svg-pBjzEcNAfGARrDaU .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-pBjzEcNAfGARrDaU .cluster-label text{fill:#333;}#mermaid-svg-pBjzEcNAfGARrDaU .cluster-label span{color:#333;}#mermaid-svg-pBjzEcNAfGARrDaU .cluster-label span p{background-color:transparent;}#mermaid-svg-pBjzEcNAfGARrDaU .label text,#mermaid-svg-pBjzEcNAfGARrDaU span{fill:#333;color:#333;}#mermaid-svg-pBjzEcNAfGARrDaU .node rect,#mermaid-svg-pBjzEcNAfGARrDaU .node circle,#mermaid-svg-pBjzEcNAfGARrDaU .node ellipse,#mermaid-svg-pBjzEcNAfGARrDaU .node polygon,#mermaid-svg-pBjzEcNAfGARrDaU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pBjzEcNAfGARrDaU .rough-node .label text,#mermaid-svg-pBjzEcNAfGARrDaU .node .label text,#mermaid-svg-pBjzEcNAfGARrDaU .image-shape .label,#mermaid-svg-pBjzEcNAfGARrDaU .icon-shape .label{text-anchor:middle;}#mermaid-svg-pBjzEcNAfGARrDaU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pBjzEcNAfGARrDaU .rough-node .label,#mermaid-svg-pBjzEcNAfGARrDaU .node .label,#mermaid-svg-pBjzEcNAfGARrDaU .image-shape .label,#mermaid-svg-pBjzEcNAfGARrDaU .icon-shape .label{text-align:center;}#mermaid-svg-pBjzEcNAfGARrDaU .node.clickable{cursor:pointer;}#mermaid-svg-pBjzEcNAfGARrDaU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pBjzEcNAfGARrDaU .arrowheadPath{fill:#333333;}#mermaid-svg-pBjzEcNAfGARrDaU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pBjzEcNAfGARrDaU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pBjzEcNAfGARrDaU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pBjzEcNAfGARrDaU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pBjzEcNAfGARrDaU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pBjzEcNAfGARrDaU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pBjzEcNAfGARrDaU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pBjzEcNAfGARrDaU .cluster text{fill:#333;}#mermaid-svg-pBjzEcNAfGARrDaU .cluster span{color:#333;}#mermaid-svg-pBjzEcNAfGARrDaU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pBjzEcNAfGARrDaU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pBjzEcNAfGARrDaU rect.text{fill:none;stroke-width:0;}#mermaid-svg-pBjzEcNAfGARrDaU .icon-shape,#mermaid-svg-pBjzEcNAfGARrDaU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pBjzEcNAfGARrDaU .icon-shape p,#mermaid-svg-pBjzEcNAfGARrDaU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pBjzEcNAfGARrDaU .icon-shape .label rect,#mermaid-svg-pBjzEcNAfGARrDaU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pBjzEcNAfGARrDaU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pBjzEcNAfGARrDaU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pBjzEcNAfGARrDaU :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Web / App / API
API Gateway认证、限流、审计
LangChain / LangGraph
Middleware权限、摘要、路由、Guardrail
LLM Gateway模型路由、重试、缓存
Tool Service搜索、DB、SaaS、业务动作
RAG ServiceLoader、Index、Retriever、Reranker
PersistenceCheckpoint、Store
LangSmith / OTelTrace、Eval、Metrics
Queue / Worker长任务、异步任务
模块职责
| API Gateway | 认证、租户隔离、限流、请求审计 |
| Orchestrator | Agent/Graph 编排、状态转换 |
| Middleware | 权限、上下文、模型路由、安全控制 |
| Model Gateway | 供应商切换、重试、缓存、成本统计 |
| Tool Service | 统一工具协议、幂等、超时、审计 |
| RAG Service | 文档处理、索引、检索、重排 |
| Persistence | 会话状态、长期记忆、断点恢复 |
| Observability | Trace、评估、指标、错误定位 |
| Queue/Worker | 长时间和高并发任务 |
8. 项目目录建议
langchain_agent_project/
├── app/
│ ├── api/
│ │ ├── routes.py
│ │ └── schemas.py
│ ├── agents/
│ │ ├── support_agent.py
│ │ └── research_agent.py
│ ├── graphs/
│ │ ├── support_graph.py
│ │ └── states.py
│ ├── tools/
│ │ ├── search_tools.py
│ │ ├── database_tools.py
│ │ └── action_tools.py
│ ├── middleware/
│ │ ├── auth.py
│ │ ├── model_router.py
│ │ └── guardrails.py
│ ├── rag/
│ │ ├── loaders.py
│ │ ├── indexer.py
│ │ ├── retriever.py
│ │ └── reranker.py
│ ├── memory/
│ │ ├── checkpointer.py
│ │ └── store.py
│ ├── prompts/
│ │ └── system_prompts.py
│ ├── observability/
│ │ ├── tracing.py
│ │ └── metrics.py
│ ├── config.py
│ └── main.py
├── tests/
│ ├── unit/
│ ├── integration/
│ ├── evals/
│ └── datasets/
├── scripts/
│ ├── build_index.py
│ └── run_evaluation.py
├── .env.example
├── pyproject.toml
├── Dockerfile
└── README.md
9. 安装与环境配置
9.1 基础安装
python -m venv .venv
source .venv/bin/activate
pip install -U langchain
pip install -U langchain-openai
pip install -U langgraph
LangChain 当前要求 Python 3.10+。
9.2 环境变量
export OPENAI_API_KEY="your-api-key"
# 可选:LangSmith Trace
export LANGSMITH_TRACING="true"
export LANGSMITH_API_KEY="your-langsmith-api-key"
export LANGSMITH_PROJECT="langchain-demo"
9.3 依赖固定
推荐使用:
pyproject.toml + uv.lock
或:
requirements.in + requirements.txt
生产环境不要长期使用无限制的 pip install -U,而应:
10. 可靠性设计
10.1 超时与重试
工具调用应至少包含:
连接超时
+ 读取超时
+ 有限重试
+ 指数退避
+ 熔断
+ 幂等键
不要让 Agent 无限重试。
10.2 停止条件
需要设置:
- 最大模型调用次数;
- 最大工具调用次数;
- 最大总运行时间;
- 最大 token;
- 最大成本;
- 最大递归深度;
- 工具连续失败阈值。
10.3 高风险工具
高风险工具包括:
- 转账;
- 删除数据;
- 发送外部邮件;
- 修改权限;
- 下发生产指令;
- 控制物理设备。
建议执行链:
模型提出动作
↓
参数 Schema 校验
↓
用户权限校验
↓
业务规则校验
↓
人工审批
↓
执行工具
↓
审计记录
10.4 Prompt Injection 防御
外部文档、网页和工具返回值都应视为不可信输入。
防御措施:
11. 可观测性与评估
Agent 不能只依靠传统接口成功率来评估,还应观察:
11.1 Trace 维度
- 用户请求;
- 每次模型调用;
- Prompt 和 Messages;
- 工具调用参数;
- 工具结果;
- 检索结果;
- Token;
- 延迟;
- 错误;
- 最终输出;
- 人工审批过程。
11.2 评估指标
| Task Success Rate | 最终任务是否完成 |
| Tool Selection Accuracy | 是否选择正确工具 |
| Tool Argument Accuracy | 参数是否正确 |
| Retrieval Recall | 是否召回关键证据 |
| Faithfulness | 回答是否被证据支持 |
| Hallucination Rate | 是否编造 |
| Structured Output Validity | Schema 是否通过 |
| Latency | 端到端耗时 |
| Token / Cost | 单次任务成本 |
| Human Escalation Rate | 转人工比例 |
| Unsafe Action Rate | 危险动作率 |
11.3 测试层次
单元测试
→ Tool 函数、Parser、权限逻辑
集成测试
→ 模型 + 工具 + 数据库
轨迹测试
→ Agent 是否走正确步骤
离线评估
→ 固定数据集批量回归
在线评估
→ 用户反馈、抽样审核、A/B 测试
12. 性能和成本优化
12.1 模型路由
简单分类 / 提取
→ 小模型
复杂规划 / 多工具推理
→ 强模型
代码、数学或视觉任务
→ 专用模型
12.2 上下文优化
- 删除无关历史;
- 摘要旧消息;
- 检索 Top-K 不宜过大;
- 大型文档使用引用而不是全文注入;
- 工具描述保持清晰简短;
- 只暴露当前阶段需要的工具;
- 将中间数据放外部存储;
- 使用结构化状态代替重复自然语言。
12.3 缓存
可缓存:
- Embedding;
- 文档解析;
- 检索结果;
- 确定性模型结果;
- 工具查询;
- Prompt 模板编译结果。
不可盲目缓存:
- 实时价格;
- 用户权限;
- 订单状态;
- 高频变化数据;
- 含敏感数据的结果。
13. LangChain 的优势与局限
13.1 优势
13.2 局限
14. 与其他框架的简要对比
| LangChain | 集成广、Agent 高层抽象、中间件 | 快速构建通用 Agent |
| LangGraph | 低层状态图、持久化、复杂编排 | 长任务、复杂流程、多 Agent |
| LlamaIndex | 数据与 RAG 能力突出 | 知识库、文档问答 |
| Semantic Kernel | 企业应用和插件抽象 | .NET / Microsoft 生态 |
| AutoGen | 多 Agent 会话协作 | 研究型多 Agent |
| CrewAI | 角色和任务式多 Agent | 快速搭建角色团队 |
| Haystack | 搜索、RAG Pipeline | 检索和 NLP 系统 |
| 原生模型 SDK | 最少抽象、控制直接 | 简单调用、极致定制 |
选择原则:
只调用一次模型
→ 原生 SDK
需要统一模型接口和几个工具
→ LangChain
复杂状态机、循环、审批、恢复
→ LangGraph
以文档检索为核心
→ LangChain / LlamaIndex / Haystack
多角色协作原型
→ LangGraph / AutoGen / CrewAI
15. 从旧版 LangChain 迁移的建议
旧版教程中常见:
- LLMChain;
- SequentialChain;
- 大量 langchain.chains;
- initialize_agent;
- 旧式 Memory 类;
- langchain-community 中的集中式集成。
新项目建议:
16. 典型落地方案
16.1 企业知识库助手
文档采集
→ 清洗与权限标签
→ Chunk
→ Embedding
→ Vector DB
→ Hybrid Retrieval
→ Rerank
→ Agent / 2-Step RAG
→ 引用输出
→ LangSmith 评估
16.2 数据分析 Agent
用户问题
→ 意图识别
→ 获取数据库 Schema
→ 生成只读 SQL
→ SQL 安全校验
→ 查询
→ Python 统计
→ 图表与结论
→ 审计
16.3 运维诊断 Agent
告警
→ 查询日志
→ 查询指标
→ 查询部署变更
→ 形成根因假设
→ 执行只读诊断
→ 给出修复建议
→ 人工审批
→ 执行变更
16.4 机器人任务 Agent
自然语言任务
→ 高层任务分解
→ 环境状态查询
→ 导航 / 感知 / 操作工具
→ 安全约束检查
→ 下发技能
→ 获取执行反馈
→ 失败恢复或重新规划
机器人场景中,LangChain/LangGraph 更适合高层任务编排,不应直接承担硬实时运动控制。
17. 生产上线检查表
架构
- Agent 和确定性工作流边界清晰;
- 关键流程是否需要 LangGraph;
- 长任务是否支持持久化和恢复;
- 多租户状态是否隔离。
模型
- 模型版本已固定;
- 超时和重试已配置;
- 模型路由和降级已设计;
- Token 和成本有上限。
Tool
- 输入 Schema 完整;
- 写操作需要审批;
- 工具具备幂等性;
- 外部 API 有超时、重试和熔断;
- 工具结果不会泄露敏感信息。
RAG
- 文档权限过滤;
- 召回率评估;
- 引用可追溯;
- 数据更新和删除机制;
- Prompt Injection 防御。
Memory
- Thread ID 设计;
- Checkpoint 生命周期;
- 长期记忆写入规则;
- 用户可删除记忆;
- 敏感信息存储策略。
Observability
- Trace 已接入;
- 关键指标已监控;
- 有离线评估集;
- 依赖升级前有回归测试;
- 故障轨迹可重放。
18. 总结
LangChain 的核心价值不是“替代模型 SDK”,而是提供一套构建 LLM/Agent 应用的标准工程组件:
模型抽象
+ 消息协议
+ 工具调用
+ Agent Harness
+ Middleware
+ RAG
+ 结构化输出
+ 流式事件
+ 记忆
+ LangGraph 持久化运行时
+ LangSmith 可观测与评估
对于 2026 年的新项目,推荐的决策方式是:
19. 官方参考资料
由于 LangChain 更新较快,代码上线前应根据锁定的包版本核对对应 API Reference。

