核心内容摘要
DeOldify图像上色服务对比评测:与主流工具的效果与性能分析
【个人主页玄同765】大语言模型LLM开发工程师中国传媒大学·数字媒体技术智能交互与游戏设计深耕领域大语言模型开发 / RAG知识库 / AI Agent落地 / 模型微调技术栈Python / LangChain/RAGDifyRedisMilvus| SQL/NumPy | FastAPIDocker ️工程能力专注模型工程化部署、知识库构建与优化擅长全流程解决方案「让AI交互更智能让技术落地更高效」欢迎技术探讨/项目合作 关注我解锁大模型与智能交互的无限可能在 LangChain
0 时代Agent智能体模块经历了一场“脱胎换骨”的变革。
如果你还在使用initialize_agent或者AgentType那么你已经站在了旧时代的边缘。
0 版本不仅是版本号的跳跃更是从“黑盒执行器”向“透明状态图”的范式转移。
本文将带你深入对比 LangChain
0 前后的架构差异手把手教你完成从旧版到新版的平滑迁移。
时代的分水岭Pre-
0 vs
0在
0 之前Agent 的开发就像是在配置一个“黑盒”。
你告诉它工具和模型它在后台通过复杂的正则匹配ReAct来决定下一步。
旧版Pre-
0以 AgentExecutor 为核心入口函数initialize_agent已弃用。
核心逻辑依赖AgentExecutor循环。
这是一个硬编码的 Python 循环开发者很难修改其内部逻辑。
交互方式基于字符串。
Agent 思考过程Thought和工具调用Action通常是通过 Prompt 强行让模型输出特定格式如Action: ...然后用正则解析。
记忆管理使用ConversationBufferMemory等组件耦合度高。
新版
0以 LangGraph 为底座入口函数create_agent推荐。
核心逻辑基于LangGraph。
Agent 不再是一个简单的链而是一个状态机State Graph。
交互方式原生Tool Calling。
利用 OpenAI 等模型自带的tool_calls参数输出结构化 JSON告别正则解析的噩梦。
记忆管理引入checkpointer检查点机制支持持久化、断点续传和多线程会话。
代码大对比从“旧”到“新”
工具定义从基础到高级LangChain v
0 提供了多种工具定义方式满足不同复杂度的需求基础工具定义使用tool装饰器是最简单直接的方式from langchain_core.tools import tool tool def search_order(order_id: str) - str: 根据订单ID查询快递状态。
# 模拟数据库查询 return f订单 {order_id} 正在派送中... tools [search_order]结构化工具定义对于需要复杂参数验证的场景使用StructuredToolfrom langchain_core.tools import StructuredTool from pydantic import BaseModel, Field # 定义参数结构 class WeatherRequest(BaseModel): city: str Field(description要查询天气的城市名称) days: int Field(default1, description要查询的天数) def get_weather_detailed(city: str, days: int
- str: 获取指定城市的详细天气信息 weather_data { 北京: [晴25℃, 多云23℃, 阴22℃], 上海: [多云23℃, 阴22℃, 小雨20℃] } if city in weather_data: return \n.join(weather_data[city][:days]) return 未知城市 # 创建结构化工具 weather_tool StructuredTool.from_function( funcget_weather_detailed, nameget_weather_detailed, description获取指定城市的详细天气信息, args_schemaWeatherRequest )工具集合Toolkit对于相关工具的组织和管理使用Toolkitfrom langchain_core.tools import Toolkit from langchain_community.tools import WikipediaQueryRun, DuckDuckGoSearchRun from langchain_community.utilities import WikipediaAPIWrapper class InformationToolkit(Toolkit): 信息查询工具集合 def __init__(self): self.wikipedia_tool WikipediaQueryRun( api_wrapperWikipediaAPIWrapper(langzh) ) self.search_tool DuckDuckGoSearchRun() def get_tools(self): 获取工具列表 return [self.wikipedia_tool, self.search_tool] # 使用工具集合 toolkit InformationToolkit() tools toolkit.get_tools()
初始化 Agent配置 vs 编排❌ 旧版写法已不再推荐from langchain.agents import initialize_agent, AgentType from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-
5-turbo) # 依赖 AgentType 枚举难以自定义逻辑 agent initialize_agent( tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue ) # 字符串调用 agent.run(帮我查一下订单号 12345 的状态)✅ 新版写法
0 推荐from langchain.agents import create_agent from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-4o) #
0 版本直接返回一个 CompiledStateGraph agent create_agent( modelllm, toolstools, system_prompt你是一个专业的物流客服必须通过工具查询信息。
) # 消息流调用 result agent.invoke({ messages: [(human, 帮我查一下订单号 12345 的状态)] })
深度解析
0 的核心改进点
输入输出的标准化Messages First旧版 Agent 习惯于{input: ...}和{output: ...}。
新版全面拥向Message 列表。
agent.invoke的输入和输出都是BaseMessage对象。
*优势与 ChatModel 的 API 完美对齐天然支持多轮对话。
强大的记忆力Memory vs Checkpointer在旧版中如果你想实现多轮对话需要手动维护一个列表。
在
0 中你可以给create_agent传入一个checkpointerfrom langgraph.checkpoint.memory import MemorySaver memory MemorySaver() # 此时 agent 具备了跨请求的记忆能力 agent create_agent(modelllm, toolstools, checkpointermemory) # 通过 thread_id 隔离不同用户的会话 config {configurable: {thread_id: session_001}} agent.invoke({messages: [(human, 我是玄同)]}, config)
中间件MiddlewareAgent 的“插件系统”
0 引入了中间件机制允许你在“模型调用”或“工具执行”前后插入自定义逻辑。
*场景API 鉴权、Token 计数、敏感词过滤、自动化日志。
from langchain.agents.middleware import AgentMiddleware class TokenCounterMiddleware(AgentMiddleware): def wrap_model_call(self, request, handler): # 模型调用前的处理 response handler(request) # 模型调用后的处理如计数 return response
Tools模块高级特性工具参数验证使用 Pydantic 模型对工具参数进行验证确保参数的类型和格式正确from langchain_core.tools import StructuredTool from pydantic import BaseModel, Field, field_validator class CalculateRequest(BaseModel): expression: str Field(description要计算的数学表达式) field_validator(expression) def validate_expression(cls, v): # 简单的表达式验证 allowed_chars set(0123456789-*/() ) if not all(c in allowed_chars for c in v): raise ValueError(表达式只能包含数字、运算符和括号) return v def calculate(expression: str) - str: 计算数学表达式 try: result eval(expression) return f计算结果{result} except Exception as e: return f计算错误{str(e)} calculate_tool StructuredTool.from_function( funccalculate, args_schemaCalculateRequest, description计算数学表达式 )工具错误处理为工具添加错误处理机制确保工具调用失败时能够优雅地处理def safe_calculate(expression: str) - str: 安全计算数学表达式 try: # 验证表达式安全性 if any(c in expression for c in [__, import, exec, eval]): return 表达式不安全 result eval(expression) return f计算结果{result} except Exception as e: return f计算错误{str(e)}工具性能优化使用缓存减少重复调用提高系统性能from functools import lru_cache lru_cache(maxsize
def expensive_tool(query: str) - str: # 复杂计算或API调用 import time time.sleep(
# 模拟耗时操作 return f结果{query}
参数速查表迁移避坑指南功能点Pre-
0 (旧)
0 (新)迁移建议入口类AgentExecutorcreate_agent(返回 Graph)弃用执行器直接使用图Agent类型AgentType枚举create_agent自动适配不再需要手动选 ReAct 或 OpenAI输入格式{input: ...}{messages: [...]}统一使用 Message 列表停止策略max_iterationscreate_agent内部默认处理
0 更稳定通常无需手动设中间步骤agent_scratchpad自动维护在 Graph 状态中不再需要手动在 Prompt 中预留
五、
总结为什么要升级如果说旧版 Agent 是一个“配置出来的工具”那么
0 的 Agent 就是一个“生长出来的应用”。
基于 LangGraph 的create_agent给了开发者前所未有的控制力
可观测性你可以清楚地看到图中的每一个节点是如何流转的。
灵活性如果create_agent的默认逻辑不够用你可以直接手动修改其底层的 Graph 结构。
生产就绪持久化记忆和中间件支持让 Agent 真正能够落地到复杂的企业级场景。
「从
0 开始Agent 不再是一个简单的 Python 循环而是一个健壮的分布式状态机。
」下一篇预告我们将跳出create_agent的便捷封装手动从零构建一个LangGraph复杂 Agent挑战多 Agent 协作场景。
参考链接LangChain 官方文档LangChain GitHub 仓库LangChain v