📚 为什么需要了解架构?

LangChain 1.0 是一个重大版本更新, 相比 0.x 版本在架构和 API 设计上有本质变化。 理解核心架构可以帮助你:

💡 架构理解的重要性
方面 收益
正确选择抽象 Agent vs Chain vs LCEL,选择最适合场景的模式
避免常见陷阱 理解 langchain vs langchain-classic 的区别
更好的调试 知道数据在各模块间如何流动
扩展和定制 理解钩子和中间件的执行顺序
性能优化 识别瓶颈,合理使用缓存和并行

🏛️ LangChain 1.0 整体架构

LangChain 1.0 采用分层架构, 从底层的 LangGraph 到高层的 Agent,每一层都有明确的职责:

graph TB subgraph Application["应用层"] Agent["create_agent()
高级 Agent API"] end subgraph Middleware["中间件层"] MW["Middleware System
before_agent | after_agent
wrap_model_call | wrap_tool_call"] end subgraph Core["核心抽象层"] Models["Models
init_chat_model()"] Messages["Messages
content_blocks"] Tools["Tools
@tool 装饰器"] end subgraph Graph["图执行层"] LG["LangGraph
StateGraph | Checkpointer"] end Agent --> MW MW --> Core Core --> LG Agent -.-> Tools Agent -.-> Models MW -.-> Messages style Application fill:#3b82f6,color:#fff style Middleware fill:#10b981,color:#fff style Core fill:#f59e0b,color:#fff style Graph fill:#8b5cf6,color:#fff

架构分层说明

层级 职责 核心 API
应用层 提供开发者友好的高级 API create_agent()
中间件层 动态上下文工程、可观测性、安全防护 CustomMiddleware, PIIMiddleware, etc.
核心抽象层 统一的模型、消息、工具接口 init_chat_model(), @tool
图执行层 状态管理、流程编排、持久化 LangGraph StateGraph, Checkpointer
✨ 1.0 架构的核心理念
  • 图优先:所有 Agent 都基于 LangGraph 图执行引擎
  • 统一抽象:跨提供商的标准化接口(models, messages)
  • 可组合性:通过中间件和钩子灵活扩展
  • 可观测性:内置追踪和调试支持(LangSmith)

📦 langchain vs langchain-classic

LangChain 1.0 引入了两个包来区分新旧 API:

包名 用途 主要 API 推荐场景
langchain LangChain 1.0 标准 API create_agent()
init_chat_model()
✅ 所有新项目
✅ 生产环境
langchain-classic 0.x 版本兼容包 LLMChain
initialize_agent()
⚠️ 遗留代码迁移
⚠️ 过渡期使用
⚠️ 重要提醒

langchain-classic 仅用于过渡,不会获得新功能更新。 建议尽快迁移到 langchain 1.0 API。

Python 🟢 基础
"""
langchain vs langchain-classic 对比示例
"""

# ❌ langchain-classic(0.x 版本,不推荐)
from langchain_classic import LLMChain
from langchain_classic.agents import initialize_agent, AgentType

llm = ChatOpenAI(model_name="gpt-4")
chain = LLMChain(llm=llm, prompt=prompt)
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)

# ✅ langchain(1.0 版本,推荐)
from langchain import init_chat_model
from langchain.agents import create_agent

model = init_chat_model("gpt-4o", model_provider="openai")
agent = create_agent(
    model="gpt-4o",
    tools=tools,
    system_prompt="你是专业的 AI 助手"
)

🧩 核心模块介绍

LangChain 1.0 围绕几个核心模块构建,每个模块都有清晰的职责和 API:

graph LR User["用户请求"] --> Agent["Agent
create_agent()"] Agent --> Model["Model
init_chat_model()"] Agent --> Tools["Tools
@tool"] Model --> Messages["Messages
content_blocks"] Tools --> Runtime["Runtime
ToolRuntime"] Agent --> Middleware["Middleware
CustomMiddleware"] Middleware --> Checkpointer["Checkpointer
状态持久化"] Middleware --> Store["Store
长期记忆"] style User fill:#e0e0e0,color:#000 style Agent fill:#3b82f6,color:#fff style Model fill:#10b981,color:#fff style Tools fill:#f59e0b,color:#fff style Middleware fill:#8b5cf6,color:#fff

1. Models(模型接口)

提供统一的模型初始化和调用接口,支持 OpenAI、Anthropic、Google 等多个提供商。

Python 🟢 基础
"""
Models 模块 - 统一的模型接口
"""
from langchain import init_chat_model

# 自动推断提供商
model = init_chat_model("gpt-4o")

# 显式指定提供商
model = init_chat_model(
    "claude-3-5-sonnet-20241022",
    model_provider="anthropic",
    temperature=0.7
)

# 支持所有主流提供商
gemini = init_chat_model("gemini-2.0-flash-exp", model_provider="google")
ollama = init_chat_model("llama3.2", model_provider="ollama")

2. Messages(消息系统)

标准化的消息格式,引入 content_blocks 统一跨提供商的内容访问。

Python 🟡 中级
"""
Messages 模块 - 统一的消息格式
"""
from langchain_core.messages import HumanMessage, AIMessage

# 发送消息
response = model.invoke([
    HumanMessage(content="解释量子计算")
])

# 使用 content_blocks 访问内容(跨提供商标准化)
for block in response.content_blocks:
    if block["type"] == "text":
        print(f"文本: {block['text']}")
    elif block["type"] == "reasoning":
        print(f"推理过程: {block['reasoning']}")
    elif block["type"] == "tool_use":
        print(f"工具调用: {block['name']}")

3. Tools(工具系统)

使用 @tool 装饰器快速定义工具,支持参数验证和运行时上下文。

Python 🟡 中级
"""
Tools 模块 - 工具定义和调用
"""
from langchain.tools import tool, ToolRuntime
from typing_extensions import TypedDict

# 简单工具
@tool
def search_web(query: str) -> str:
    """搜索网络信息"""
    return f"搜索结果:{query}"

# 带运行时上下文的工具
class UserContext(TypedDict):
    user_id: str

@tool
def get_user_data(runtime: ToolRuntime[UserContext]) -> str:
    """获取用户数据"""
    user_id = runtime.context["user_id"]
    return f"用户 {user_id} 的数据"

# 在 Agent 中使用
agent = create_agent(
    model="gpt-4o",
    tools=[search_web, get_user_data],
    context_schema=UserContext
)

4. Agents(Agent 系统)

create_agent() 是 1.0 的核心 API, 替代了 0.x 版本的 initialize_agent()

Python 🔴 高级
"""
Agents 模块 - 完整的 Agent 配置
"""
from langchain.agents import create_agent
from langchain.agents.middleware import PIIMiddleware
from langgraph.checkpoint.memory import InMemorySaver

# 创建完整的 Agent
checkpointer = InMemorySaver()
pii_middleware = PIIMiddleware(
    pii_types=["email", "phone_number"],
    strategy="redact"
)

agent = create_agent(
    # 模型配置
    model="gpt-4o",

    # 工具列表
    tools=[search_web, get_user_data],

    # 系统提示词
    system_prompt="你是专业的 AI 助手。请保护用户隐私。",

    # 中间件
    middleware=[pii_middleware],

    # 持久化
    checkpointer=checkpointer,

    # 运行时上下文
    context_schema=UserContext
)

# 调用 Agent
config = {
    "configurable": {"thread_id": "user_001"},
    "context": {"user_id": "user_123"}
}

result = agent.invoke(
    {"messages": [{"role": "user", "content": "你好"}]},
    config=config
)

5. Middleware(中间件系统)

中间件提供钩子机制,用于动态上下文工程、安全防护和可观测性。

🔧 中间件钩子
钩子 触发时机 用途示例
before_agent Agent 执行前 输入验证、注入上下文
after_agent Agent 执行后 输出检查、日志记录
wrap_model_call 模型调用时 动态模型选择、成本追踪
wrap_tool_call 工具调用时 工具过滤、权限检查

💡 设计哲学和原则

LangChain 1.0 的架构设计遵循以下核心原则:

1. 可组合性(Composability)

通过管道操作符 | 和模块化设计,实现灵活的组合:

Python
# LCEL 管道组合
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("翻译: {text}")
chain = prompt | model

# 中间件组合
agent = create_agent(
    model="gpt-4o",
    tools=tools,
    middleware=[
        LoggingMiddleware(),
        PIIMiddleware(),
        ContentSafetyMiddleware()
    ]
)

2. 可观测性(Observability)

内置对 LangSmith 的支持,自动追踪执行轨迹:

Python
import os

# 启用追踪(一行配置)
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"

# 所有 Agent 调用自动追踪
result = agent.invoke({...})

3. 可扩展性(Extensibility)

通过中间件、自定义工具、子图等机制实现扩展:

  • 自定义中间件:实现 CustomMiddleware 钩子
  • 自定义工具:使用 @tool 装饰器
  • 自定义图:使用 LangGraph 构建复杂工作流

4. 生产就绪(Production-Ready)

1.0 版本专注于生产环境需求:

需求 1.0 解决方案
状态持久化 PostgresSaver, InMemorySaver
安全防护 PIIMiddleware, 内容安全检查
性能优化 并行执行、流式输出、缓存
可观测性 LangSmith 集成、结构化日志
错误处理 重试逻辑、降级策略

❓ 常见问题

Q1: 为什么 1.0 基于 LangGraph?

LangGraph 提供了强大的图执行引擎,支持:

  • 状态管理和持久化
  • 复杂的控制流(条件分支、循环)
  • 人工介入(Human-in-the-Loop)
  • 时间旅行(Time Travel)调试

通过将 Agent 构建在 LangGraph 之上,LangChain 获得了这些能力, 同时保持了简单的高级 API。

Q2: langchain-classic 会一直维护吗?

不会langchain-classic 仅用于过渡期, 不会获得新功能更新和长期维护。建议尽快迁移到 1.0 API。

Q3: 如何选择 Agent vs LCEL vs LangGraph?

使用场景 推荐方案
简单的工具调用、对话 create_agent()
数据转换管道、RAG LCEL 管道
复杂工作流、多 Agent 协作 LangGraph StateGraph

Q4: content_blocks 和 content 有什么区别?

content:字符串形式的简单文本
content_blocks:结构化的内容块列表,支持:

  • 多模态内容(文本、图像、工具调用)
  • 跨提供商标准化(OpenAI、Anthropic、Google 等)
  • 推理过程、思考链(Chain of Thought)

Q5: 如何理解"Context Engineering"?

Context Engineering(上下文工程)是 LangChain 1.0 的核心理念:

"以正确的格式提供正确的信息和工具,使 LLM 能够完成任务"

通过中间件和钩子,可以动态调整:

  • 系统提示词(基于用户状态)
  • 可用工具(基于权限)
  • 对话历史(摘要或过滤)
  • 模型选择(基于任务复杂度)

📖 参考资源