LangChain 1.0 — AI 应用开发的巨大飞跃

发布: (2025年12月8日 GMT+8 07:54)
6 min read
原文: Dev.to

Source: Dev.to

引言

如果你在过去一年或两年里关注过 LangChain,你可能会感受到一种既充满期待又有焦虑的混合情绪:同一件事有很多实现方式,同时也在思考是该用它来做生产环境,还是使用 Azure AI 或其他供应商的方案。LangChain 在原型设计和学习代理时感觉非常棒,但在生产级工具上却难以依赖。

LangChain 1.0 终于提供了生态系统所需要的清理工作。它让人感觉有人站出来说:“好吧,让我们把它弄得更合理一点”。下面是 1.0 中重要的内容——从一个花了大量时间去理解 AI 代理框架和工具链的人的视角出发。

create_agent() — 构建代理的唯一合理方式

from langchain.agents import create_agent
from langchain.models import OpenAI

def my_tool(text: str) -> str:
    return text[::-1]

agent = create_agent(
    model=OpenAI(model_name="gpt-4o-mini"),
    tools=[my_tool],
    system_prompt="You are a helpful assistant."
)

result = agent.invoke({"input": "Reverse hello world"})

在早期版本中,你必须自行 hack 前后 LLM 的逻辑、编织奇怪的 Runnable 链,或编写“迷你中间件”。
版本 1.0 引入了一等公民钩子:

  • before_model
  • after_model
  • 动态提示钩子
  • 验证
  • 安全过滤器
  • 缓存
  • 预算守护
  • 上下文注入

示例:汇总聊天历史

from langchain.agents.middleware import AgentMiddleware

class SummarizeHistory(AgentMiddleware):
    def before_model(self, req, state):
        if len(state["messages"]) > 20:
            state["messages"] = summarize_history(state["messages"]) 
        return req, state

中间件(真正好用!)

中间件现在是一级公民。你可以在模型运行前后注入行为,而无需诉诸临时 hack。

from langchain.agents.middleware import AgentMiddleware

class ValidateOutputs(AgentMiddleware):
    def after_model(self, res, state):
        if "delete" in res["text"].lower():
            raise ValueError("Dangerous action detected")
        return res, state

动态提示

from langchain.agents.middleware import dynamic_prompt

@dynamic_prompt
def choose_prompt(req, state):
    if state.get("mode") == "analysis":
        return "Analyze deeply: {text}"
    return "Summarize: {text}"

不再需要手动拼接字符串;提示会根据状态干净地生成。

结构化共享状态(AgentState

from langchain.agents import AgentState

state = AgentState()
state["messages"] = []
state["user_id"] = "u123"

所有组件——工具、中间件、模型——共享这块记忆表面,消除了“哪个组件添加了这个随机键?”的惊喜。

工具:更严格、更安全、更不易出错

  • 严格的参数模式
  • 统一的工具调用格式
  • 可预测的验证
  • 内置安全层

这些改进使工具适用于安全敏感的应用场景。

invoke() + ContentBlocks

统一的 invoke API 可跨提供商使用:

model.invoke(...)
model.batch(...)
model.stream(...)

ContentBlocks 现在支持:

  • 文本
  • 图像
  • 工具调用
  • 多模态输入
  • 结构化消息

这种统一简化了构建多代理工作流的过程。

LangGraph:成熟的多代理工作流选择

LangGraph 增加了:

  • 监督者/工作者(专家/批评者)模式
  • 确定性转移
  • 重试 + 断点
  • 检查点
  • 长循环
  • 正确的异步行为

如果你需要工作流引擎,LangGraph 应该是默认的起点。

调试与追踪

版本 1.0 带来了:

  • 更清晰的回溯信息
  • 稳定的流式顺序
  • 更好的 notebook 渲染
  • 改进的 LangSmith 追踪
  • 结构化、易读的日志

这些并不光鲜,但对生产环境至关重要。

Runnable API:可预测的行为

model.with_fallbacks([backup_model])
  • 稳定的流式顺序
  • 一致的回退处理

所有粗糙的边缘都已被抚平。

典型的生产部署示例

class Retrieval(AgentMiddleware):
    def before_model(self, req, state):
        docs = vectorstore.similarity_search(req["input"], k=3)
        req["retrievals"] = [d.page_content for d in docs]
        return req, state

class Summarizer(AgentMiddleware):
    def before_model(self, req, state):
        if len(state["messages"]) > 25:
            state["messages"] = summarize_messages(state["messages"]) 
        return req, state

class Safety(AgentMiddleware):
    def after_model(self, res, state):
        if "delete database" in res["text"].lower():
            raise ValueError("Blocked unsafe content")
        return res, state

agent = create_agent(
    model=OpenAI("gpt-4o-mini"),
    system_prompt="You are an assistant.",
    tools=[...]
)

agent.with_middleware([
    Retrieval(),
    Summarizer(),
    Safety()
])

这种模块化组合映射了当今生产 AI 代理应有的行为方式。

升级指南

  1. create_agent() 替换旧的代理构造函数。
  2. 将杂乱的提示逻辑迁移到中间件或动态提示中。
  3. 将基于字典的状态转换为 AgentState
  4. 将工具更新为新的模式验证。
  5. 使用 LangSmith 捕捉细微的迁移问题。

结论

LangChain 1.0 终于让人感觉成熟:少了魔法,多了显式,并且以生产思维构建。经历了周末玩 0.x 版并为预算和可用性担忧后,我现在可以采用 1.0 并说:“是的,我可以构建真实的产品并交付给真正的客户”。

Back to Blog

相关文章

阅读更多 »