编程 LangChain 2026 深度解析:从 Chain 到 Agent,LLM 应用开发的事实标准全面进化

2026-05-14 12:41:08 +0800 CST views 1

LangChain 2026 深度解析:从 Chain 到 Agent,LLM 应用开发的事实标准全面进化

LangChain 在 2026 年完成了一次架构级重构:Agent 取代 Chain 成为核心抽象、LangGraph 状态机成为编排引擎、Deep Agents 支持多智能体协作、MCP Adapters 打通工具生态、LangSmith 提供全链路可观测性。本文深度解析 LangChain 2026 的架构变革、核心 API 演进、实战代码对比(2024 vs 2026),以及从旧版迁移的完整指南。

一、LangChain 2026 架构全景

LangChain 2026 生态图谱:

                    ┌─────────────────────────┐
                    │      LangSmith          │
                    │  全链路可观测性平台      │
                    │  Tracing / Eval / Hub   │
                    └───────────┬─────────────┘
                                │
        ┌───────────────────────┼───────────────────────┐
        │                       │                       │
┌───────┴───────┐     ┌────────┴────────┐     ┌────────┴────────┐
│  LangGraph    │     │  Deep Agents    │     │  LangChain Core │
│  状态机编排    │     │  多智能体协作    │     │  组件+集成      │
│               │     │                 │     │                 │
│ · StateGraph  │     │ · Plan & Execute│     │ · Chat Models   │
│ · State       │     │ · SubAgents     │     │ · Embeddings    │
│ · Checkpointer│     │ · File System   │     │ · Vector Stores │
│ · Channels    │     │ · Human-in-loop │     │ · Tools         │
└───────┬───────┘     └────────┬────────┘     └────────┬────────┘
        │                       │                       │
        └───────────────────────┼───────────────────────┘
                                │
                    ┌───────────┴─────────────┐
                    │    MCP Adapters         │
                    │  框架无关的工具协议      │
                    └─────────────────────────┘

二、核心变革:Chain → Agent

2.1 2024 vs 2026 API 对比

# ====== 2024 年:Chain 模式(已废弃) ======
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

prompt = PromptTemplate(
    template="请根据以下问题回答:{question}",
    input_variables=["question"]
)
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(question="什么是微服务?")

# 多步 Chain 串联
from langchain.chains import SimpleSequentialChain
chain1 = LLMChain(llm=llm1, prompt=prompt1)
chain2 = LLMChain(llm=llm2, prompt=prompt2)
combined = SimpleSequentialChain(chains=[chain1, chain2])

# ❌ 问题:
# 1. Chain 是线性管道,不支持条件分支
# 2. 状态管理靠手动传递
# 3. 无法实现循环(如"反思-修正"循环)
# 4. 错误处理薄弱

# ====== 2026 年:Agent 模式(推荐) ======
from langchain.agents import create_agent
from langchain.tools import tool

# 定义工具
@tool
def search_docs(query: str) -> str:
    """搜索技术文档"""
    return vector_store.similarity_search(query)

@tool
def write_code(code: str, filename: str) -> str:
    """写入代码文件"""
    with open(filename, 'w') as f:
        f.write(code)
    return f"已写入 {filename}"

@tool
def run_tests(filename: str) -> str:
    """运行测试"""
    import subprocess
    result = subprocess.run(
        ["pytest", filename], capture_output=True, text=True
    )
    return result.stdout

# 创建 Agent
agent = create_agent(
    model=ChatOpenAI(model="gpt-4o"),
    tools=[search_docs, write_code, run_tests],
    system_prompt="你是一个全栈开发工程师。请根据需求搜索文档、编写代码并测试。",
)

# 执行(Agent 自动规划步骤、选择工具、处理错误)
result = agent.invoke({
    "messages": [{"role": "user", "content": "帮我写一个用户认证模块,包含 JWT 登录和注册功能"}]
})

# ✅ Agent 模式优势:
# 1. 自动规划(Plan → Execute → Reflect)
# 2. 工具自主选择
# 3. 支持条件分支和循环
# 4. 内置状态管理(LangGraph)

2.2 统一 create_agent API

# 2026:所有 Agent 类型统一用一个 API

from langchain.agents import create_agent, AgentType

# ReAct 模式(最常用)
react_agent = create_agent(
    model=ChatOpenAI(model="gpt-4o"),
    tools=[search_tool, calculator_tool],
    agent_type=AgentType.REACT,
)

# Plan-and-Execute 模式(复杂任务)
plan_agent = create_agent(
    model=ChatOpenAI(model="gpt-4o"),
    tools=[search_tool, code_tool, test_tool],
    agent_type=AgentType.PLAN_EXECUTE,
    max_iterations=10,
    early_stopping=True,
)

# 结构化输出模式(JSON Schema)
structured_agent = create_agent(
    model=ChatOpenAI(model="gpt-4o"),
    output_schema={
        "type": "object",
        "properties": {
            "analysis": {"type": "string"},
            "recommendation": {"type": "string"},
            "confidence": {"type": "number"},
        }
    }
)

# 2024 旧版(多种初始化方式,已废弃):
# initialize_agent → ❌
# AgentExecutor.from_agent_and_tools → ❌
# create_openai_functions_agent → ❌

三、LangGraph:状态机编排引擎

3.1 为什么需要状态机?

Agent 的核心难点不是"调用工具",而是"控制流程":

用户请求
    │
    ├─→ 需要搜索? → 搜索 → 分析结果
    │                      │
    │              结果不够?───┘
    │
    ├─→ 需要写代码? → 写代码 → 跑测试
    │                          │
    │                   测试失败?─── 修正代码
    │
    └─→ 需要人工确认? → 暂停 → 等待输入 → 继续

这不是线性管道(Chain),而是有向图(Graph)——这正是 LangGraph 的核心价值。

3.2 StateGraph 基础

from langgraph.graph import StateGraph, END, START
from langgraph.graph.message import MessagesState
from langgraph.checkpoint.memory import MemorySaver

# 1. 定义状态
class AgentState(MessagesState):
    """继承 MessagesState,自带 messages 字段"""
    documents: list[str]      # 搜索到的文档
    code: str                 # 生成的代码
    test_result: str          # 测试结果
    iteration: int            # 当前迭代次数
    max_iterations: int = 3   # 最大迭代次数

# 2. 定义节点
def search_node(state: AgentState) -> AgentState:
    """搜索文档"""
    last_msg = state["messages"][-1].content
    docs = search_tool.invoke(last_msg)
    return {**state, "documents": docs}

def code_node(state: AgentState) -> AgentState:
    """生成代码"""
    docs_context = "\n".join(state["documents"])
    prompt = f"根据以下文档编写代码:\n{docs_context}\n\n需求:{state['messages'][0].content}"
    code = llm.invoke(prompt).content
    return {**state, "code": code}

def test_node(state: AgentState) -> AgentState:
    """运行测试"""
    result = subprocess.run(["pytest", "-v"], capture_output=True, text=True)
    passed = result.returncode == 0
    return {**state, "test_result": result.stdout, "iteration": state["iteration"] + 1}

def router(state: AgentState) -> str:
    """路由决策"""
    if state["iteration"] >= state["max_iterations"]:
        return "end"
    if "FAILED" in state.get("test_result", ""):
        return "code"  # 测试失败,回到代码节点
    return "end"       # 测试通过,结束

# 3. 构建图
graph = StateGraph(AgentState)

graph.add_node("search", search_node)
graph.add_node("code", code_node)
graph.add_node("test", test_node)

graph.add_edge(START, "search")
graph.add_edge("search", "code")
graph.add_edge("code", "test")
graph.add_conditional_edges("test", router, {
    "code": "code",  # 测试失败 → 修改代码
    "end": END,      # 完成
})

# 4. 编译(带持久化)
memory = MemorySaver()
app = graph.compile(checkpointer=memory)

# 5. 执行
config = {"configurable": {"thread_id": "session-001"}}
result = app.invoke(
    {"messages": [{"role": "user", "content": "实现一个 LRUCache"}]},
    config=config
)

3.3 Human-in-the-Loop

from langgraph.graph import StateGraph, END, START
from langgraph.types import interrupt, Command
from langgraph.checkpoint.memory import MemorySaver

def review_node(state: AgentState) -> AgentState:
    """人工审核节点:暂停等待用户确认"""
    # interrupt() 会暂停图执行,等待人类输入
    feedback = interrupt({
        "question": "请审核以下代码,确认是否通过:",
        "code": state["code"],
        "options": ["通过", "需要修改", "拒绝"]
    })
    
    return {**state, "feedback": feedback}

def router(state: AgentState) -> str:
    if state.get("feedback") == "通过":
        return "deploy"
    elif state.get("feedback") == "需要修改":
        return "code"  # 回去修改
    else:
        return "end"

# 使用:
result = app.invoke(
    {"messages": [{"role": "user", "content": "实现排序算法"}]},
    config=config
)
# 图在 review_node 处暂停,返回 interrupt 数据

# 用户提供反馈后继续:
result = app.invoke(
    Command(resume="需要修改:请用快排替代冒泡"),
    config=config
)
# 图从 review_node 继续,路由到 code 节点

四、Deep Agents:多智能体协作

4.1 SubAgent 模式

from langchain.agents import create_agent
from langchain_deep_agents import DeepAgent, SubAgent

# 创建专家子 Agent
code_agent = SubAgent(
    name="coder",
    model=ChatOpenAI(model="gpt-4o"),
    tools=[write_code, run_tests, search_docs],
    system_prompt="你是一个高级后端开发工程师,擅长 Python 和 Go。",
)

review_agent = SubAgent(
    name="reviewer",
    model=ChatOpenAI(model="gpt-4o"),
    tools=[read_code, lint_check],
    system_prompt="你是一个代码审查专家,注重代码质量和安全性。",
)

research_agent = SubAgent(
    name="researcher",
    model=ChatOpenAI(model="gpt-4o"),
    tools=[search_web, search_docs, summarize],
    system_prompt="你是一个技术调研专家,擅长收集和分析技术方案。",
)

# 组装多智能体团队
team = DeepAgent(
    agents=[research_agent, code_agent, review_agent],
    coordinator_model=ChatOpenAI(model="gpt-4o"),
    mode="sequential",  # sequential | parallel | hierarchical
)

# 执行复杂任务
result = team.invoke(
    "调研并实现一个基于 Redis 的分布式锁方案,要求:"
    "1. 支持 TTL 自动过期"
    "2. 防止死锁"
    "3. 包含单元测试"
    "4. 代码审查通过"
)

# Deep Agent 执行流程:
# 1. Coordinator 分析任务,分配给 researcher
# 2. Researcher 搜索 Redis 分布式锁的最佳实践
# 3. Researcher 输出调研报告
# 4. Coordinator 将调研结果 + 需求交给 coder
# 5. Coder 编写实现代码和测试
# 6. Coordinator 将代码交给 reviewer
# 7. Reviewer 审查代码,给出反馈
# 8. 如果审查不通过,Coordinator 安排 coder 修改
# 9. 所有子 Agent 通过后,输出最终结果

4.2 文件系统集成

from langchain_deep_agents import DeepAgent, SubAgent

# 2026 新特性:Agent 可以直接操作文件系统
agent = DeepAgent(
    agents=[coder_agent],
    workspace="/path/to/project",  # 沙箱目录
    allowed_paths=["/path/to/project/src"],  # 允许访问的路径
)

# Agent 可以:
# - 读取项目文件(理解现有代码)
# - 创建/修改文件(写代码)
# - 运行命令(测试、构建)
# - 查看目录结构(导航项目)

result = agent.invoke(
    "在 src/auth/ 目录下实现 JWT 认证模块,"
    "参考 src/models/ 下已有的 User 模型,"
    "并编写对应的单元测试。"
)

五、MCP Adapters:框架无关的工具协议

5.1 什么是 MCP?

MCP(Model Context Protocol)是 Anthropic 提出的开放协议,让 AI 工具可以跨框架互操作。LangChain 2026 内置 MCP 适配器。

from langchain_mcp_adapters import MCPToolkit

# 连接 MCP 服务器(可以是任何实现 MCP 协议的服务)
toolkit = MCPToolkit(
    server_url="http://localhost:3000/mcp",
    # 或者本地 stdio 方式:
    # command="npx",
    # args=["-y", "@anthropic/mcp-server-filesystem", "/path/to/dir"],
)

# 自动发现工具
tools = toolkit.get_tools()
# [
#   Tool(name="read_file", description="读取文件内容"),
#   Tool(name="write_file", description="写入文件"),
#   Tool(name="list_directory", description="列出目录"),
#   Tool(name="search_code", description="搜索代码"),
# ]

# 直接用于 Agent
agent = create_agent(
    model=ChatOpenAI(model="gpt-4o"),
    tools=tools,
)

# MCP 的价值:
# 1. 一次实现,所有框架可用(LangChain / Claude / Cursor)
# 2. 标准化工具接口
# 3. 远程工具服务器(团队共享工具)

5.2 自定义 MCP Server

# 用 FastMCP 创建自定义 MCP 服务器(5 分钟)
from fastmcp import FastMCP

mcp = FastMCP("my-tools")

@mcp.tool()
def query_database(sql: str) -> str:
    """执行 SQL 查询"""
    import sqlite3
    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    conn.close()
    return str(results)

@mcp.tool()
def send_notification(message: str, channel: str = "general") -> str:
    """发送通知到 Slack"""
    # ... Slack API 调用
    return f"已发送到 {channel}"

@mcp.tool()
def deploy_service(service_name: str) -> str:
    """部署服务到 Kubernetes"""
    # ... kubectl apply
    return f"{service_name} 部署成功"

# 启动服务器(stdio 模式)
if __name__ == "__main__":
    mcp.run()

# 其他 LangChain Agent 即可通过 MCP 调用这些工具

六、中间件系统

6.1 请求/响应拦截

from langchain.agents import create_agent
from langchain.middleware import Middleware, MiddlewareContext

# 日志中间件
class LoggingMiddleware(Middleware):
    async def on_request(self, ctx: MiddlewareContext):
        print(f"[请求] 工具: {ctx.tool_name}, 输入: {ctx.input}")
    
    async def on_response(self, ctx: MiddlewareContext):
        print(f"[响应] 工具: {ctx.tool_name}, 输出长度: {len(str(ctx.output))}")
    
    async def on_error(self, ctx: MiddlewareContext, error: Exception):
        print(f"[错误] 工具: {ctx.tool_name}, 错误: {error}")

# Token 计数中间件
class TokenCounterMiddleware(Middleware):
    def __init__(self):
        self.total_tokens = 0
    
    async def on_response(self, ctx: MiddlewareContext):
        if hasattr(ctx.response, 'token_usage'):
            self.total_tokens += ctx.response.token_usage.total_tokens
            print(f"累计 Token: {self.total_tokens}")

# 重试中间件
class RetryMiddleware(Middleware):
    def __init__(self, max_retries=3, delay=1.0):
        self.max_retries = max_retries
        self.delay = delay
    
    async def on_error(self, ctx: MiddlewareContext, error: Exception):
        if ctx.retry_count < self.max_retries:
            ctx.retry_count += 1
            await asyncio.sleep(self.delay * ctx.retry_count)
            ctx.retry = True  # 告诉框架重试

# 使用中间件
agent = create_agent(
    model=ChatOpenAI(model="gpt-4o"),
    tools=[search_tool, code_tool],
    middleware=[
        LoggingMiddleware(),
        TokenCounterMiddleware(),
        RetryMiddleware(max_retries=3),
    ]
)

七、LangSmith:全链路可观测性

7.1 Tracing

import os
os.environ["LANGSMITH_API_KEY"] = "ls__..."
os.environ["LANGSMITH_TRACING"] = "true"

# 所有 LangChain 调用自动上报 Trace
result = agent.invoke({"messages": [{"role": "user", "content": "..."}]})

# LangSmith Dashboard 显示:
# 1. 完整调用链(LLM → Tool → LLM → Tool ...)
# 2. 每次 LLM 调用的 prompt/completion
# 3. 每次 Tool 调用的输入/输出
# 4. Token 消耗和延迟
# 5. 错误堆栈

7.2 Evaluation

from langsmith.evaluation import evaluate, LangChainStringEvaluator

# 定义评估数据集
dataset = [
    {"input": "实现二分查找", "reference": "必须包含递归和迭代两种实现"},
    {"input": "实现快速排序", "reference": "必须包含单元测试"},
]

# 自动评估
def correctness_evaluator(run, example) -> dict:
    prediction = run.outputs["messages"][-1].content
    reference = example.outputs["reference"]
    # 用 LLM 判断输出是否满足要求
    score = evaluator_llm.invoke(
        f"判断以下输出是否满足要求:\n要求:{reference}\n输出:{prediction}\n评分(0-10):"
    )
    return {"score": int(score.content), "key": "correctness"}

results = evaluate(
    agent.invoke,
    data=dataset,
    evaluators=[correctness_evaluator],
)

八、从 2024 迁移到 2026

8.1 迁移清单

# ====== 迁移 1: Chain → Agent ======

# 旧版(2024)
from langchain.chains import LLMChain, RetrievalQA
chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)

# 新版(2026)
agent = create_agent(
    model=llm,
    tools=[retriever.as_tool()],
)

# ====== 迁移 2: AgentExecutor → create_agent ======

# 旧版
from langchain.agents import initialize_agent, AgentExecutor
agent = initialize_agent(tools, llm, agent="zero-shot-react-description")
agent_executor = AgentExecutor(agent=agent, tools=tools)

# 新版
agent = create_agent(model=llm, tools=tools)

# ====== 迁移 3: ConversationChain → MessagesState ======

# 旧版
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
chain = ConversationChain(llm=llm, memory=ConversationBufferMemory())

# 新版(LangGraph + MemorySaver)
from langgraph.graph import StateGraph
from langgraph.graph.message import MessagesState
from langgraph.checkpoint.memory import MemorySaver

graph = StateGraph(MessagesState)
# ... 定义节点和边 ...
app = graph.compile(checkpointer=MemorySaver())

# ====== 迁移 4: OutputParser → 结构化输出 ======

# 旧版
from langchain.output_parsers import PydanticOutputParser
parser = PydanticOutputParser(pydantic_object=AnalysisResult)

# 新版(模型原生支持)
agent = create_agent(
    model=llm,
    output_schema=AnalysisResult.model_json_schema(),
)

8.2 常见问题

# Q: 旧版 PromptTemplate 还能用吗?
# A: 可以,但推荐用 ChatPromptTemplate
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是{role}"),
    ("human", "{question}"),
])

# Q: Memory 怎么迁移?
# A: 用 LangGraph 的 checkpointer 替代
# 旧版: ConversationBufferMemory / ConversationSummaryMemory
# 新版: MemorySaver / SqliteSaver / PostgresSaver

# Q: 工具定义方式变了?
# A: @tool 装饰器不变,但推荐加类型提示和文档字符串
@tool
def search(query: str, top_k: int = 5) -> list[dict]:
    """搜索文档,返回 top_k 个结果
    
    Args:
        query: 搜索关键词
        top_k: 返回结果数量
    """
    return vector_store.similarity_search(query, k=top_k)

九、实战:构建企业知识库 Agent

# 完整实战:企业知识库问答 Agent

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langgraph.graph import StateGraph, END, START
from langgraph.graph.message import MessagesState
from langgraph.checkpoint.memory import MemorySaver

# 1. 加载文档
loader = DirectoryLoader("./docs", glob="**/*.md", loader_cls=TextLoader)
documents = loader.load()

# 2. 切分
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(documents)

# 3. 向量化
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 4. 定义工具
@tool
def search_knowledge_base(query: str) -> str:
    """搜索企业知识库"""
    docs = vectorstore.similarity_search(query, k=3)
    return "\n---\n".join(doc.page_content for doc in docs)

@tool
def get_related_documents(topic: str) -> str:
    """获取相关文档列表"""
    docs = vectorstore.similarity_search(topic, k=10)
    return "\n".join(f"- {doc.metadata.get('source', 'unknown')}" for doc in docs)

# 5. 创建 Agent
agent = create_agent(
    model=ChatOpenAI(model="gpt-4o", temperature=0),
    tools=[search_knowledge_base, get_related_documents],
    system_prompt=(
        "你是企业内部知识库助手。回答问题时:\n"
        "1. 先搜索知识库获取相关文档\n"
        "2. 基于文档内容回答,标注来源\n"
        "3. 如果知识库中没有相关信息,明确告知\n"
        "4. 不要编造信息"
    ),
)

# 6. 使用
result = agent.invoke({
    "messages": [{"role": "user", "content": "公司的年假政策是什么?"}]
})

print(result["messages"][-1].content)
# 输出:根据《员工手册 v3.2》第 5 章,公司年假政策如下:
# - 入职满 1 年:5 天年假
# - 入职满 3 年:10 天年假
# - 入职满 5 年:15 天年假
# 来源:docs/hr/employee-handbook-v3.2.md

十、总结

10.1 LangChain 2026 核心变化

维度20242026影响
核心抽象ChainAgent从线性管道到自主决策
编排引擎LangGraph 状态机支持分支、循环、暂停
多智能体不支持Deep AgentsSubAgent 协作
工具协议LangChain 专属MCP 标准化跨框架互操作
可观测性手动日志LangSmith 全链路Trace + Eval + Hub
状态管理Memory 类Checkpointer持久化 + 恢复
中间件完整中间件系统日志/重试/限流

10.2 选型建议

✅ 推荐用 LangChain 2026 的场景:
  1. 复杂 Agent 应用(多步推理、工具调用、循环修正)
  2. 多智能体协作(代码生成 + 审查 + 测试)
  3. 需要 Human-in-the-Loop 的场景
  4. 企业级应用(需要可观测性、持久化)

⚠️ 不需要 LangChain 的场景:
  1. 简单的单轮对话(直接用 OpenAI SDK)
  2. 纯 RAG 检索(LlamaIndex 更轻量)
  3. 不需要 Agent 的文档问答

🚀 迁移步骤:
  1. pip install -U langchain langgraph
  2. Chain → Agent(create_agent)
  3. Memory → Checkpointer(MemorySaver)
  4. AgentExecutor → create_agent
  5. 接入 LangSmith(免费版够用)

一句话总结:LangChain 2026 的核心转变是从"链式调用工具"到"Agent 自主决策"。LangGraph 状态机让 Agent 可以处理复杂的控制流(分支、循环、暂停),Deep Agents 让多个专业 Agent 协作完成复杂任务,MCP 让工具生态标准化。如果你还在用 2024 版的 Chain 和 AgentExecutor,是时候迁移了。


参考资源

  • LangChain 官方文档:https://python.langchain.com/docs/
  • LangGraph 文档:https://langchain-ai.github.io/langgraph/
  • Deep Agents:https://github.com/langchain-ai/deep-agents
  • MCP 协议:https://modelcontextprotocol.io/
  • LangSmith:https://smith.langchain.com/
  • 迁移指南:https://python.langchain.com/docs/versions/migrating_chains/
复制全文 生成海报 LangChain LangGraph Agent MCP AI

推荐文章

JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
维护网站维护费一年多少钱?
2024-11-19 08:05:52 +0800 CST
Go语言SQL操作实战
2024-11-18 19:30:51 +0800 CST
前端如何优化资源加载
2024-11-18 13:35:45 +0800 CST
imap_open绕过exec禁用的脚本
2024-11-17 05:01:58 +0800 CST
详解 Nginx 的 `sub_filter` 指令
2024-11-19 02:09:49 +0800 CST
程序员茄子在线接单