LangChain 1.0 — AI 应用开发的巨大飞跃
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_modelafter_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 代理应有的行为方式。
升级指南
- 用
create_agent()替换旧的代理构造函数。 - 将杂乱的提示逻辑迁移到中间件或动态提示中。
- 将基于字典的状态转换为
AgentState。 - 将工具更新为新的模式验证。
- 使用 LangSmith 捕捉细微的迁移问题。
结论
LangChain 1.0 终于让人感觉成熟:少了魔法,多了显式,并且以生产思维构建。经历了周末玩 0.x 版并为预算和可用性担忧后,我现在可以采用 1.0 并说:“是的,我可以构建真实的产品并交付给真正的客户”。