框架选择
预计学习时间:40分钟
选择合适的Agent开发框架能够大幅提高开发效率。不同框架在设计理念、功能特性和技术栈方面各有特长。
主流Agent开发框架对比
LangChain
LangChain是目前最流行的Agent开发框架,提供完整的工具链用于构建基于大语言模型的应用。
核心特性
- 模块化组件:将Agent系统拆分为可组合的功能块
- 工具集成:丰富的内置工具和自定义工具接口
- 记忆管理:多种记忆类型支持(对话历史、向量存储等)
- 多LLM支持:兼容OpenAI、Anthropic、Hugging Face等模型
架构组件
- Chains:将多个组件连接为处理流水线
- Agents:实现决策逻辑,如ReAct推理
- Tools:外部功能调用接口
- Memory:对话状态和历史记录管理
- Retrievers:知识库检索组件
# LangChain Agent示例
from langchain.agents import initialize_agent, Tool
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
# 定义工具
tools = [
Tool(
name="ProductSearch",
func=lambda query: search_product_database(query),
description="搜索产品信息,输入为产品名称或关键词"
),
Tool(
name="OrderLookup",
func=lambda order_id: get_order_status(order_id),
description="查询订单状态,输入为订单ID"
)
]
# 初始化记忆组件
memory = ConversationBufferMemory(memory_key="chat_history")
# 创建Agent
agent = initialize_agent(
tools,
OpenAI(temperature=0),
agent="chat-conversational-react-description",
memory=memory,
verbose=True
)
# 运行Agent
response = agent.run("我想查询我的AirPods Pro订单状态")
优缺点分析
优势:
- 完善的生态系统与活跃社区
- 丰富的文档和示例
- 灵活的组件定制能力
局限性:
- 学习曲线相对陡峭
- 某些高级功能需自行实现
- 框架更新较快,API稳定性有限
AutoGPT
核心特性
- 自主性导向:强调Agent自主完成复杂任务的能力
- 目标分解:自动将高级目标拆解为子任务
- 长期记忆:结合向量存储实现持久化记忆
- 自我反思:能够评估和调整自身的执行计划
# AutoGPT风格的Agent架构
class AutoGPTAgent:
def __init__(self, llm, tools, memory_system):
self.llm = llm
self.tools = {tool.name: tool for tool in tools}
self.memory = memory_system
self.current_goal = None
self.subtasks = []
def set_goal(self, goal):
self.current_goal = goal
# 使用LLM分解目标到子任务
planning_prompt = f"目标: {goal}\n请将此目标分解为有序的子任务列表:"
plan_result = self.llm.generate(planning_prompt)
self.subtasks = parse_subtasks(plan_result)
def execute(self):
results = []
for subtask in self.subtasks:
# 思考阶段 - 选择工具
tool_selection_prompt = f"子任务: {subtask}\n可用工具: {list(self.tools.keys())}\n应该使用哪个工具?"
selected_tool_name = self.llm.generate(tool_selection_prompt).strip()
# 执行阶段
if selected_tool_name in self.tools:
tool = self.tools[selected_tool_name]
result = tool.execute(subtask)
# 结果评估
self.memory.add(f"执行: {subtask} 使用 {selected_tool_name}, 结果: {result}")
results.append(result)
# 自我反思
reflection_prompt = f"子任务: {subtask}\n执行结果: {result}\n这个结果是否满足要求?是否需要调整计划?"
reflection = self.llm.generate(reflection_prompt)
if "调整计划" in reflection:
# 重新规划剩余子任务
self._replan_remaining_tasks()
return synthesize_results(results)
优缺点分析
优势:
- 在复杂任务上表现优秀
- 自主性强,干预需求少
- 记忆管理系统设计合理
局限性:
- 资源消耗较高
- 行为可预测性较低
- 需要高质量的LLM才能发挥最佳效果
Hugging Face Agent
核心特性
- 轻量级设计:专注于NLP任务的Agent构建
- 开源模型友好:深度集成Transformers生态
- 低资源支持:优化小型开源模型的Agent能力
- 工具连接API:标准化的工具调用接口
优缺点分析
优势:
- 易于与Hugging Face生态集成
- 支持本地部署开源模型
- 轻量级实现低延迟
局限性:
- 功能相对基础
- 较少的高级组件
- 社区规模小于LangChain
微软 Power Virtual Agents
核心特性
- 低代码/无代码:可视化构建流程
- 企业级集成:与Microsoft生态无缝连接
- 多渠道部署:支持Teams、网站等多平台
- 治理与分析:内置监控和分析工具
优缺点分析
优势:
- 企业级支持和安全性
- 对非技术人员友好
- 与Azure服务深度集成
局限性:
- 定制灵活性有限
- 商业服务,有使用成本
- 开源扩展能力有限
框架选择决策矩阵
| 框架 | 开发灵活性 | 入门门槛 | 社区活跃度 | 工具生态 | LLM支持范围 | 部署复杂度 |
|---|---|---|---|---|---|---|
| LangChain | ★★★★★ | ★★★☆☆ | ★★★★★ | ★★★★★ | 全面 | 中等 |
| AutoGPT | ★★★☆☆ | ★★★★☆ | ★★★★☆ | ★★★☆☆ | 侧重OpenAI | 较高 |
| HF Agent | ★★★★☆ | ★★☆☆☆ | ★★★☆☆ | ★★★☆☆ | 开源友好 | 较低 |
| MS Power Virtual Agents | ★★☆☆☆ | ★☆☆☆☆ | ★★☆☆☆ | ★★★★☆ | 封闭生态 | 最低 |
框架选择考虑因素
1. 项目需求
- 任务复杂度:简单FAQ vs 多步骤任务
- 自主性要求:需要人工监督 vs 完全自动化
- 定制化程度:通用对话 vs 特定领域专家
2. 技术约束
- 模型选择:仅OpenAI API vs 开源模型
- 部署环境:云端 vs 本地 vs 混合
- 资源限制:计算能力、内存、延迟要求
3. 开发团队因素
- 技术栈熟悉度:Python经验 vs JavaScript经验
- 开发时间限制:快速原型 vs 长期项目
- 维护考虑:团队规模、长期支持需求
实战案例:电商客服Agent框架选择
场景描述
- 需求:构建电商平台的客服Agent
- 功能:商品查询、订单追踪、退换货处理
- 约束:需集成现有ERP系统,对响应时间敏感
技术需求分析
- 多轮对话管理
- 结构化知识库集成
- 外部API调用(订单系统、库存系统)
- 上下文依赖的意图识别
框架选择决策
最佳选择:LangChain
决策理由:
- 模块化架构便于分步实现和测试
- 丰富的工具接口支持各类API集成
- 灵活的记忆管理系统支持复杂上下文
- 活跃社区提供支持和最佳实践
# LangChain实现电商客服Agent - 完整架构示例
from langchain.agents import Tool, AgentExecutor, ZeroShotAgent
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# 1. 定义工具函数
def search_products(query):
"""搜索产品数据库"""
# 实际实现会连接到产品数据库
return f"找到以下产品: {query}相关产品列表..."
def check_order_status(order_id):
"""查询订单状态"""
# 实际实现会连接到订单系统
return f"订单 {order_id} 状态: 运输中, 预计3天后送达"
def process_return(order_id):
"""处理退货请求"""
# 实际实现会调用退货处理API
return f"已为订单 {order_id} 创建退货申请, 请等待审核"
# 2. 封装为工具
tools = [
Tool(
name="ProductSearch",
func=search_products,
description="当用户询问产品信息、价格、库存或产品推荐时使用"
),
Tool(
name="OrderStatus",
func=check_order_status,
description="当用户询问订单状态、发货情况或配送时间时使用"
),
Tool(
name="ReturnProcess",
func=process_return,
description="当用户要求退货、换货或取消订单时使用"
)
]
# 3. 创建Agent提示模板
prefix = """你是一个专业的电商客服助手。你的目标是帮助用户解决产品查询、订单跟踪和退换货等问题。
你有以下工具可以使用:"""
suffix = """开始与用户的对话。记住专业、友好且简洁地回答。
历史对话:
{chat_history}
用户: {input}
思考过程:"""
prompt = ZeroShotAgent.create_prompt(
tools,
prefix=prefix,
suffix=suffix,
input_variables=["input", "chat_history"]
)
# 4. 设置记忆系统
memory = ConversationBufferMemory(memory_key="chat_history")
# 5. 构建LLM链和Agent
llm = OpenAI(temperature=0.7)
llm_chain = LLMChain(llm=llm, prompt=prompt)
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True
)
# 6. 运行Agent
response = agent_executor.run("我的订单#12345什么时候能到?")
print(response)
框架整合与自定义
在复杂项目中,可能需要结合不同框架的优势或自行扩展功能:
混合架构示例
# 结合LangChain和自定义组件的混合架构
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
# 自定义记忆组件(扩展标准记忆)
class EnhancedMemory:
def __init__(self, vector_db_client):
self.short_term = [] # 近期对话历史
self.vector_db = vector_db_client # 长期记忆向量数据库
def add_interaction(self, user_input, agent_response):
# 更新短期记忆
self.short_term.append({"user": user_input, "agent": agent_response})
if len(self.short_term) > 10:
self.short_term.pop(0)
# 更新长期记忆
self.vector_db.add_document({
"interaction": f"用户: {user_input}\n助手: {agent_response}",
"timestamp": time.time()
})
def get_relevant_history(self, query):
# 合并短期记忆和相关长期记忆
recent = "\n".join([f"用户: {i['user']}\n助手: {i['agent']}" for i in self.short_term])
relevant = self.vector_db.semantic_search(query, limit=3)
return f"近期对话:\n{recent}\n\n相关历史记忆:\n{relevant}"
# 将自定义组件与LangChain集成
custom_memory = EnhancedMemory(vector_db_client=my_vector_db)
def get_conversation_context(query):
return custom_memory.get_relevant_history(query)
tools = [
Tool(
name="ConversationMemory",
func=get_conversation_context,
description="获取相关的对话历史记录"
),
# 其他标准工具...
]
agent = initialize_agent(tools, OpenAI(temperature=0), agent="chat-conversational-react-description")
现代编码 Agent 框架
2025–2026 年,编码 Agent 从「带工具的 ChatGPT」演进为完整的客户端-服务端 Agent 系统。与 LangChain 等通用编排框架不同,编码 Agent 框架深度集成了文件系统、终端、LSP 和 IDE 协议。
主流编码 Agent 对比
| 框架 | 架构 | 会话持久化 | 权限模型 | 开源 |
|---|---|---|---|---|
| OpenCode | Client/Server + SQLite | 断线重连,Server 常驻 | 规则集 allow/deny/ask | 是 |
| Claude Code | CLI + 会话文件 | --resume 从 transcript 恢复 | CLAUDE.md + Hooks | 否 |
| Cursor | IDE 深度集成 | 项目级索引 + 对话历史 | 内置于 IDE | 否 |
| Codex (OpenAI) | 云端 Agent + 沙箱 | GitHub 原生异步 | OS 级沙箱 | 否 |
OpenCode 架构要点
OpenCode 是当前较有代表性的开源编码 Agent,其设计值得作为学习「生产级 Agent 系统」的参考:
1. 事件驱动 + 线程分离
TUI 主线程只负责渲染,Worker 线程处理 LLM 流式输出、文件 I/O、MCP 连接。两者通过 GlobalBus 事件总线通信,UI 无需轮询。
2. 权限优于 Prompt
不同 Agent(Build / Plan)的差异不在 Prompt 措辞,而在可用工具列表。Plan Agent 直接移除写文件工具,比「请在回复中说不要改文件」可靠得多。
3. 工具注册表 + 懒加载
20+ 内置工具(read/write/edit/bash/LSP/web search/MCP)通过 Registry 管理,init() 仅在首次调用时执行,不影响启动速度。
4. ACP 协议集成 IDE
通过 Agent Client Protocol(JSON-RPC 2.0),Zed、VS Code、Cursor 等 IDE 可作为 Client 驱动 Agent,统一管理会话生命周期和权限确认。
5. 项目记忆 AGENTS.md
将项目约定、代码风格、测试命令写入 AGENTS.md,每次会话自动注入——这是零训练成本的领域适配手段。
# AGENTS.md 示例
- 使用 pytest 运行测试,不用 unittest
- 所有 API 变更需同步更新 OpenAPI spec
- 提交前运行 `ruff check .`
编码 Agent 选型建议
- 需要开源、BYOK、长会话稳定:OpenCode
- 需要最强单次推理、企业治理与 Hooks:Claude Code
- 日常 IDE 内嵌、最低切换成本:Cursor
- GitHub 原生异步 PR 工作流:Codex
更完整的 Agent 理论与 Tool Use 演进,见 4.4 Agent或Agentic Workflow。
不同模型的 Tool Use 调优方案
换模型不只是换 API Key——工具调用的稳定性、并行策略和 Prompt 结构都需要针对性调整。
按模型家族的调优要点
| 模型 | 工具调用特点 | 推荐调优手段 |
|---|---|---|
| GPT-4o / o系列 | strict: true 保证 schema;o 系列内置推理 | 开启 Structured Outputs;复杂任务用 Responses API |
| Claude 3.5/4 | tool_use 内容块;Computer Use 扩展 | 工具描述简洁明确;高风险操作加 ask 确认 |
| Gemini 2.x | 原生 Google Search grounding | 检索类任务优先用 grounding,减少自建 search 工具 |
| Qwen3 / Qwen3.5 | 需匹配 tool-call-parser(如 qwen3_coder) | vLLM 部署时显式配置 parser;工具描述避免与内置指标冲突 |
| 开源小模型(<14B) | 多轮 tool call 易漂移、易死循环 | 限制 max_turns;加格式惩罚;Workflow 约束强于裸 Prompt |
通用调优策略
1. 工具描述(Schema)优化
# 差:描述模糊,模型难以选对
{"name": "search", "description": "搜索"}
# 好:说明何时用、输入输出、边界条件
{
"name": "search_products",
"description": "当用户询问产品信息、价格、库存或推荐时使用。输入为产品名称或关键词,返回匹配产品列表。",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"}
},
"required": ["query"]
}
}
2. 并行 vs 串行
独立工具调用(如同时查两个城市天气)应允许并行;有依赖关系的调用(先 read_file 再 edit)应串行。框架层可用 depends_on 或分轮次约束。
3. 工具结果截断与摘要
Bash 输出、大文件内容会迅速撑爆上下文。生产 Agent 应对 tool_result 做智能截断(保留头尾 + 行数统计)或二次摘要后再回传模型。
4. 终止条件
除模型主动 stop 外,应设置:max_turns、max_tool_calls、重复调用检测(同一工具+参数连续失败 3 次则中断)。
5. 温度与采样
编码 Agent 在 tool selection 阶段宜用较低温度(0–0.3);用户-facing 的最终解释可用较高温度。Qwen 系列在 temperature=0 时易出现重复生成,回测场景常用 0.7 + 固定 seed。
按场景的 Prompt 结构建议
| 场景 | System Prompt 放什么 | User Prompt 放什么 |
|---|---|---|
| 编码 Agent | 角色、项目规则(AGENTS.md)、工具列表 | 当前任务、相关文件路径、错误信息 |
| 交易 Agent | 角色、交易规则、工作流程 | 当日行情、持仓、现金(动态变化) |
| 客服 Agent | 品牌语气、政策边界、可用工具 | 用户问题、订单上下文 |
Agentic-RL 实验中一个典型坑:在工具描述里写「不要用 RSI_15」反而让 Qwen3 更频繁调用该参数。负面约束不如正面 Workflow 有效——详见 Agent微调 的提示词设计章节。
不训练模型时的优化路径
若暂无算力做 Agentic RL,可通过工程手段持续提升 Agent 表现:
- 项目记忆文件(AGENTS.md / CLAUDE.md / SOUL.md)
- 失败/成功经验沉淀(OpenClaw MEMORY.md、Hermes Skills)
- Prompt 与工具 Schema 迭代(基于 benchmark 回归)
- RAG 注入领域知识
详见 6.4 Agent持续演进。
小结
选择适合的Agent框架应基于:
- 业务需求决定核心功能需求
- 技术约束影响框架兼容性
- 团队能力影响开发和维护效率
推荐策略:
- 原型验证: 先使用最熟悉的框架快速验证概念
- 渐进开发: 从简单功能开始,逐步扩展复杂度
- 关注可扩展性: 预留自定义和集成的接口
下一章,我们将探讨 Agent持续演进,学习如何在不训练模型的前提下让 Agent 越用越好;也可通过 Agent微调 进行 Agentic RL 后训练。