欢迎光临
我们一直在努力

强力推荐-智能体开源框架LangChain 详解

文档版本:1.0 整理日期:2026-07-16 适用范围:LangChain Python v1+、LangGraph v1+ 配套文件:LangChain_动态流程展示图.gif


1. 摘要

LangChain 是一个面向大语言模型应用的开源开发框架,主要解决以下问题:

  • 统一接入不同模型供应商;
  • 将提示词、模型、工具、检索、记忆和业务逻辑组合为可执行应用;
  • 构建能够循环调用工具的 Agent;
  • 通过 LangGraph 获得状态管理、持久化、流式输出、人工审批和故障恢复能力;
  • 通过 LangSmith 实现调用链追踪、测试、评估和生产可观测性。
  • 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;
    • 参数名称;
    • 参数类型;
    • 参数描述;

    来判断如何调用工具。

    工具设计原则

  • 一个工具只完成一个明确任务;
  • 参数名应具有业务含义;
  • 输出应尽量结构化;
  • 写操作与读操作分离;
  • 高风险操作必须增加审批;
  • 外部 API 调用必须设置超时、重试和幂等键;
  • 不要一次暴露过多相似工具;
  • 工具错误应返回可判断的错误类型,而不是模糊文本。
  • 工具分类

    查询型工具
    ├── 搜索
    ├── 数据库查询
    ├── 文件读取
    └── 状态查询

    计算型工具
    ├── 代码执行
    ├── 数学计算
    └── 数据分析

    动作型工具
    ├── 发邮件
    ├── 修改工单
    ├── 调用机器人
    └── 下发业务指令

    动作型工具的风险最高,应增加权限校验和 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 工程重点

  • 文档解析质量;
  • Chunk 粒度;
  • Metadata 设计;
  • Embedding 模型;
  • 向量、关键词和重排序融合;
  • 检索召回率;
  • 引用和证据;
  • 权限过滤;
  • 数据更新;
  • 幻觉评估。

  • 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,而应:

  • 固定主版本和小版本;
  • 先在测试环境升级;
  • 执行 Agent 回归评估;
  • 检查 Provider Package 的兼容性;
  • 阅读 Release Notes 后再发布。

  • 10. 可靠性设计

    10.1 超时与重试

    工具调用应至少包含:

    连接超时
    + 读取超时
    + 有限重试
    + 指数退避
    + 熔断
    + 幂等键

    不要让 Agent 无限重试。

    10.2 停止条件

    需要设置:

    • 最大模型调用次数;
    • 最大工具调用次数;
    • 最大总运行时间;
    • 最大 token;
    • 最大成本;
    • 最大递归深度;
    • 工具连续失败阈值。

    10.3 高风险工具

    高风险工具包括:

    • 转账;
    • 删除数据;
    • 发送外部邮件;
    • 修改权限;
    • 下发生产指令;
    • 控制物理设备。

    建议执行链:

    模型提出动作
    ↓
    参数 Schema 校验
    ↓
    用户权限校验
    ↓
    业务规则校验
    ↓
    人工审批
    ↓
    执行工具
    ↓
    审计记录

    10.4 Prompt Injection 防御

    外部文档、网页和工具返回值都应视为不可信输入。

    防御措施:

  • 区分系统指令与检索内容;
  • 不执行文档中的“指令”;
  • 工具按最小权限开放;
  • 写操作单独审批;
  • 清理 HTML 和脚本;
  • 对 URL、文件路径和 SQL 参数做校验;
  • 记录模型决策与工具参数;
  • 对敏感数据做脱敏;
  • 进行红队测试。

  • 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 优势

  • 模型供应商接口统一;
  • Tool Calling 和 Agent 开发门槛低;
  • 与 LangGraph 深度集成;
  • 集成生态丰富;
  • 支持 RAG、MCP、记忆、结构化输出;
  • 中间件适合企业级上下文工程;
  • LangSmith 提供完整 Agent 工程链路;
  • Python 和 JavaScript 均有成熟实现。
  • 13.2 局限

  • 版本演进较快;
  • 抽象层较多,问题定位需要理解运行栈;
  • 自由 Agent 的延迟和成本不确定;
  • 复杂生产流程仍需 LangGraph 或自定义编排;
  • Tool 权限和安全边界需要业务方自行设计;
  • RAG 效果取决于数据工程,不是只接向量库即可;
  • Provider 的能力差异无法被完全抹平;
  • Agent 行为具有概率性,必须配套评估。

  • 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 中的集中式集成。

    新项目建议:

  • 简单 Prompt + Model 使用 Runnable/模型接口;
  • Tool Agent 使用 create_agent;
  • 复杂编排使用 LangGraph;
  • Provider 使用独立包,例如 langchain-openai;
  • 状态记忆使用 Checkpointer/Store;
  • Agent 行为控制使用 Middleware;
  • 输出使用 Structured Output;
  • 流式输出优先考虑 Event Streaming;
  • 建立自动化评估后再升级依赖。

  • 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 年的新项目,推荐的决策方式是:

  • 从最简单的模型调用开始;
  • 需要动态工具调用时使用 create_agent;
  • 使用 Middleware 控制上下文、安全和权限;
  • 需要复杂分支、循环、恢复或人工审批时使用 LangGraph;
  • 使用 Structured Output 对接业务系统;
  • 使用 LangSmith 或同类系统进行全链路追踪和评估;
  • 对依赖进行版本锁定,避免无评估升级;
  • 将 Agent 视为概率性软件组件,配套确定性校验和人工兜底。

  • 19. 官方参考资料

  • LangChain Overview
  • LangChain Install
  • LangChain Quickstart
  • LangChain Agents
  • LangChain Models
  • LangChain Messages
  • LangChain Tools
  • LangChain Middleware
  • LangChain Structured Output
  • LangChain Short-term Memory
  • LangChain Retrieval
  • LangChain Streaming
  • LangChain Context Engineering
  • LangChain MCP
  • LangGraph Overview
  • LangGraph Persistence
  • LangChain v1 Release Notes
  • LangChain GitHub Releases
  • 由于 LangChain 更新较快,代码上线前应根据锁定的包版本核对对应 API Reference。

    赞(0)
    未经允许不得转载:171主机测评 » 强力推荐-智能体开源框架LangChain 详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址