OpenAI Agents SDK 实战——和 LangChain Agent 的本质区别
OpenAI Agents SDK 实战——和 LangChain Agent 的本质区别
适读人群:用过 LangChain Agent 的 Python 开发者 | 阅读时长:约 14 分钟 | 核心价值:通过真实对比实验,搞清楚 OpenAI Agents SDK 和 LangChain Agent 的本质差异,以及各自适合的场景
OpenAI 在 2025 年 3 月把之前的 Swarm 正式升级成 Agents SDK,我当时看到发布公告,第一反应是"又一个框架,先观望"。
但一个星期后我在项目里实际用了,然后花了一天把项目里的 LangChain Agent 对比测了一遍。
结论让我有点意外:这两个东西解决问题的思路是不一样的,说"谁更好"没有意义,关键是用对场景。
这篇文章把对比实验的过程和结论都写出来。
先说本质差异
在写代码之前,先把我理解的核心差异讲清楚:
LangChain Agent 的思路:框架驱动
LangChain 给你一套抽象层:工具、记忆、链、提示模板、输出解析器……你通过组合这些抽象组件来构建 Agent。框架做了很多"帮你想"的事情:工具描述怎么格式化给 LLM、如何解析 LLM 的工具调用输出、如何管理对话历史。
代价是:学习成本高,调试困难(你不知道框架帮你做了什么),版本升级经常破坏性变更。
OpenAI Agents SDK 的思路:极简原语
SDK 的设计哲学非常清晰:给你最少的抽象,让你直接控制。核心就三个概念:Agent(配置了工具和指令的 LLM)、Handoff(Agent 之间的交接)、Runner(执行器)。
没有复杂的链、没有各种 Memory 实现、没有输出解析器。你拿到的就是 LLM 的原始输出,解析是你自己的事。
这种极简设计的好处:代码非常透明,你能看到每一步在做什么;坏处:你需要自己处理更多细节。
实验任务
我设计了一个任务来做对比,目标明确、有工具调用、有条件逻辑:
任务:技术新闻分析助手
- 搜索最近的 AI 技术新闻
- 分析新闻内容,判断是否值得关注
- 如果判断"值得关注",进一步抓取详情,生成简报
这个任务有工具调用(搜索、抓取)、有条件判断(是否继续深入)、有多步骤,能比较全面地测试两个框架。
用 LangChain Agent 实现
# langchain_agent_demo.py
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import AIMessage, HumanMessage
import httpx
import json
# 定义工具
@tool
def search_ai_news(query: str) -> str:
"""搜索AI技术相关新闻。query是搜索关键词。返回新闻标题和摘要列表。"""
# 模拟搜索结果(实际项目里接真实搜索API)
mock_results = [
{"title": "OpenAI 发布 GPT-5,推理能力大幅提升", "summary": "OpenAI 宣布发布新一代模型 GPT-5,在数学推理和代码生成上显著优于 GPT-4o。", "url": "https://example.com/1"},
{"title": "Google Gemini 2.0 更新", "summary": "Google 发布 Gemini 2.0,多模态能力增强。", "url": "https://example.com/2"},
{"title": "LangChain 发布 v0.3", "summary": "LangChain 发布新版本,改进了 LCEL 性能。", "url": "https://example.com/3"},
]
return json.dumps(mock_results, ensure_ascii=False)
@tool
def fetch_article_detail(url: str) -> str:
"""获取文章详细内容。url是文章链接。返回文章全文。"""
# 模拟文章内容
mock_details = {
"https://example.com/1": "GPT-5 在多项基准测试中超越了之前所有模型。在 MATH 数据集上得分 97.5%,在 HumanEval 上得分 98%。OpenAI CEO Sam Altman 表示这是里程碑式的发布。新模型支持 256k 上下文,推理速度比 GPT-4o 快 2 倍。",
"https://example.com/2": "Gemini 2.0 改进了视频理解能力,支持实时多模态交互。",
"https://example.com/3": "LangChain v0.3 重构了内部架构,提升了运行效率。",
}
return mock_details.get(url, "无法获取文章内容")
# 构建 Agent
def build_langchain_agent():
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
tools = [search_ai_news, fetch_article_detail]
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个AI技术新闻分析师。
你的任务:
1. 搜索最新AI技术新闻
2. 判断哪些新闻值得深入关注(重大技术突破、影响大的发布)
3. 对值得关注的新闻获取详情,生成简报
评判标准:
- 新的模型发布(尤其是主要厂商):值得关注
- 工具库小版本更新:不值得深入
- 研究突破:值得关注"""),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5,
return_intermediate_steps=True
)
return executor
# 运行
def run_langchain_demo():
agent = build_langchain_agent()
result = agent.invoke({
"input": "分析今天最重要的AI新闻,生成一份简报",
"chat_history": []
})
print("\n=== LangChain Agent 结果 ===")
print(result["output"])
print(f"\n中间步骤数: {len(result['intermediate_steps'])}")用 OpenAI Agents SDK 实现
# openai_agents_demo.py
from agents import Agent, Runner, function_tool
import asyncio
import json
# 定义工具——注意:用装饰器,函数的 docstring 直接成为工具描述
@function_tool
def search_ai_news(query: str) -> str:
"""搜索AI技术相关新闻。返回新闻标题、摘要和URL的JSON列表。"""
mock_results = [
{"title": "OpenAI 发布 GPT-5,推理能力大幅提升", "summary": "OpenAI 宣布发布新一代模型 GPT-5,在数学推理和代码生成上显著优于 GPT-4o。", "url": "https://example.com/1"},
{"title": "Google Gemini 2.0 更新", "summary": "Google 发布 Gemini 2.0,多模态能力增强。", "url": "https://example.com/2"},
{"title": "LangChain 发布 v0.3", "summary": "LangChain 发布新版本,改进了 LCEL 性能。", "url": "https://example.com/3"},
]
return json.dumps(mock_results, ensure_ascii=False)
@function_tool
def fetch_article_detail(url: str) -> str:
"""获取指定URL的文章详细内容。"""
mock_details = {
"https://example.com/1": "GPT-5 在多项基准测试中超越了之前所有模型。在 MATH 数据集上得分 97.5%,在 HumanEval 上得分 98%。新模型支持 256k 上下文,推理速度比 GPT-4o 快 2 倍。",
"https://example.com/2": "Gemini 2.0 改进了视频理解能力,支持实时多模态交互。",
"https://example.com/3": "LangChain v0.3 重构了内部架构,提升了运行效率。",
}
return mock_details.get(url, "无法获取文章内容")
# 构建 Agent
def build_openai_agent():
agent = Agent(
name="AI新闻分析师",
model="gpt-4o-mini",
instructions="""你是一个AI技术新闻分析师。
你的任务:
1. 搜索最新AI技术新闻
2. 判断哪些值得深入(重大技术突破、主要厂商发布)
3. 对值得关注的新闻获取详情,生成简报
评判标准:
- 新模型发布(主要厂商):值得关注
- 工具库小版本更新:不值得深入
- 研究突破:值得关注""",
tools=[search_ai_news, fetch_article_detail]
)
return agent
async def run_openai_agents_demo():
agent = build_openai_agent()
result = await Runner.run(
agent,
"分析今天最重要的AI新闻,生成一份简报"
)
print("\n=== OpenAI Agents SDK 结果 ===")
print(result.final_output)
# 查看执行轨迹
print(f"\n执行步骤数: {len(result.new_messages)}")
if __name__ == "__main__":
asyncio.run(run_openai_agents_demo())Handoff 是 OpenAI Agents SDK 的杀手特性
OpenAI Agents SDK 有一个 LangChain 没有的特性:Handoff——Agent 之间的交接。
这不是普通的多 Agent 调用,而是一个 Agent 可以决定把控制权完全移交给另一个 Agent,并且后者继承整个对话历史。
这在特定场景里非常有用:
# handoff_demo.py
from agents import Agent, Runner, handoff
import asyncio
# 专门的深度分析 Agent
detail_analyst = Agent(
name="深度分析师",
model="gpt-4o", # 用更强的模型
instructions="""你是一个AI技术深度分析师,专门处理被转交过来的重要新闻。
你需要:
1. 对新闻内容进行深度技术分析
2. 评估对行业的影响
3. 给出投资/关注价值评级(A/B/C)
格式化输出深度报告。""",
)
# 主 Agent,负责初步筛选
screening_agent = Agent(
name="新闻筛选师",
model="gpt-4o-mini",
instructions="""你是新闻初步筛选师。
对每条新闻快速判断重要性。
如果发现重大新闻(主要厂商的旗舰模型发布等),
使用 transfer_to_detail_analyst 把分析任务交给深度分析师。
普通新闻直接总结即可。""",
tools=[
search_ai_news,
handoff(detail_analyst) # 这是 Handoff 的声明方式
]
)
async def run_handoff_demo():
result = await Runner.run(
screening_agent,
"搜索今天的AI新闻,重要的做深度分析"
)
print(result.final_output)
# 查看 Handoff 是否发生
for msg in result.new_messages:
if hasattr(msg, 'role') and msg.role == 'tool':
print(f"工具调用: {msg}")
asyncio.run(run_handoff_demo())Handoff 和普通的多 Agent 调用的区别在于:控制权转移是完整的。主 Agent 的全部对话历史被带给下一个 Agent,下一个 Agent 知道之前发生了什么,不需要重新解释上下文。
对比实验结果
我用相同的测试场景跑了两个框架,记录了关键数据:
代码量对比:
| 指标 | LangChain Agent | OpenAI Agents SDK |
|---|---|---|
| 核心代码行数 | ~80 行 | ~45 行 |
| 工具定义方式 | @tool + docstring | @function_tool + docstring |
| Prompt 设置 | ChatPromptTemplate(复杂) | instructions 字符串(简单) |
| 异步支持 | 额外配置 | 原生异步 |
调试体验:
LangChain 的 verbose=True 会打出很多日志,但格式不统一,不容易 parse。中间步骤藏在 intermediate_steps 里,需要遍历才能看清楚。
OpenAI Agents SDK 的 result.new_messages 是标准的消息列表,格式清晰,每个工具调用都能看到完整的输入输出。
稳定性:
在这个任务上两个框架的最终输出质量差不多。但 LangChain Agent 偶尔会因为工具输出格式问题触发重试,OpenAI Agents SDK 没有这个问题(因为它用的是 OpenAI 原生的 tool calling 协议)。
什么情况下选哪个
选 OpenAI Agents SDK:
- 你的整个技术栈都在 OpenAI 生态里
- 你想要极简的代码,不需要复杂的框架抽象
- 你的场景需要 Handoff(多 Agent 交接控制权)
- 你重视调试透明度
选 LangChain Agent:
- 你需要接入多种 LLM(OpenAI、Anthropic、本地模型),LangChain 的模型抽象很有价值
- 你需要 LangChain 生态里的工具(有大量现成的工具集成)
- 你已经有大量 LangChain 代码,迁移成本高
- 你需要 LangGraph 做复杂工作流编排(LangGraph 只能配合 LangChain)
不要根据"哪个更新更好"来选。 OpenAI Agents SDK 新,但这不意味着它更好——它解决的问题和 LangChain 不完全一样。如果你需要支持多种 LLM 后端,LangChain 的优势仍然明显。
一个实际的迁移案例
我把之前一个 LangChain Agent 迁移到了 OpenAI Agents SDK,迁移过程里的感受:
工具迁移很简单,把 @tool 换成 @function_tool,docstring 写法一样,5 分钟搞定。
Prompt 迁移也简单,把 ChatPromptTemplate 换成 instructions 字符串,反而更直接了。
最难的是测试迁移。LangChain 有 AgentExecutor 的各种配置(max_iterations、回调等),OpenAI Agents SDK 里需要自己处理类似的逻辑。
迁移完之后,代码量减少了约 35%,运行速度略有提升(少了一层框架抽象),调试体验明显改善。
总体值得做,但如果你的 LangChain Agent 运行得好好的,没有明显痛点,也不一定要迁移。工程里不应该为了"用新的"而迁移,只有有明确收益时才迁移。
