DeepAgents 介绍
DeepAgents 是一个基于 LangChain 和 LangGraph 构建的智能代理框架,旨在帮助开发者更高效地构建复杂的 AI 系统。
主要特点
- 模块化设计:易于扩展和集成
- 支持多种 AI 模型:灵活适配不同场景
- 强大的工具链:提高开发效率
技术栈
互动小测验
DeepAgents 主要应用于哪个领域?
为什么选择 DeepAgents?
DeepAgents 不仅仅是一个 AI 代理框架,它是一套完整的智能系统构建方法论。基于 LangChain 和 LangGraph 的成熟生态,让开发者能够快速构建生产级的 AI 应用。
声明式编程
用简洁的声明式语法定义代理行为,无需编写复杂的状态管理代码。你只需描述"做什么",框架负责"怎么做"。
图式编排
基于 LangGraph 的有向图执行引擎,将复杂的代理流程可视化为状态图。支持条件分支、循环、并行执行等高级控制流。
可观测性
内置 LangSmith 追踪集成,每一步代理决策、工具调用和 LLM 交互都有完整记录,便于调试和优化。
生产就绪
内置错误处理、重试机制、速率限制和优雅降级。从原型到生产,代码几乎不需要改动。
DeepAgents 技术架构
# DeepAgents 技术架构层次
┌──────────────────────────────────┐
│ 应用层 (Applications) │
│ 对话系统 │ 数据分析 │ 自动化工作流 │
├──────────────────────────────────┤
│ 代理层 (Agent Runtime) │
│ Agent │ Pipeline │ Router │
├──────────────────────────────────┤
│ 编排层 (LangGraph Engine) │
│ StateGraph │ Node │ Edge │ State │
├──────────────────────────────────┤
│ 工具层 (LangChain Tools) │
│ Search │ Calculator │ Code │ ... │
├──────────────────────────────────┤
│ 模型层 (LLM Providers) │
│ OpenAI │ Anthropic │ Local LLM │
└──────────────────────────────────┘
应用层:最终用户看到的功能——对话机器人、数据分析助手、自动化工作流等。
代理层:核心运行时,管理 Agent 生命周期、Pipeline 执行和 Router 路由。
编排层:LangGraph 提供的状态图引擎,将代理行为编排为有向图执行。
工具层:LangChain 丰富的工具生态,代理可以调用搜索引擎、计算器、代码执行器等。
模型层:支持多种 LLM 后端,可在 OpenAI、Anthropic 和本地模型之间无缝切换。
快速开始:5 分钟上手
# 安装 DeepAgents
pip install deepagents langchain langgraph
# 创建第一个智能代理
from deepagents import Agent, LLM, Tool
# 定义工具
@Tool.define
def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
return f"{city}今天晴,温度25°C"
# 创建代理
agent = Agent(
name="weather_assistant",
llm=LLM(model="gpt-4"),
tools=[get_weather],
system_prompt="你是一个友好的天气助手"
)
# 运行代理
response = agent.run("北京今天天气怎么样?")
print(response)
# 输出:北京今天天气晴朗,温度25°C,适合出门活动!
# 多轮对话
response2 = agent.chat("那上海呢?")
print(response2)
# 输出:上海今天晴,温度25°C...(代理自动理解上下文)
第 1-2 行:安装 deepagents 及其依赖。LangChain 提供工具层,LangGraph 提供编排引擎。
第 5-10 行:用 @Tool.define 装饰器定义自定义工具。函数签名和文档字符串会被自动解析为工具描述。
第 13-17 行:创建代理时指定名称、LLM 模型、可用工具和系统提示词。这四个参数定义了代理的"身份"和"能力"。
第 20-22 行:run 方法执行单次对话。代理会自动决定是否调用工具。
第 25-27 行:chat 方法支持多轮对话,代理自动维护上下文记忆。
学习目标
通过本课程,你将了解:
- DeepAgents 的核心架构
- 如何构建智能代理系统
- 最佳实践和应用案例
LangChain 生态全景
理解 DeepAgents 需要先了解它所依赖的 LangChain 生态系统。LangChain 是目前最流行的 LLM 应用开发框架,而 LangGraph 是其扩展,专门用于构建有状态的、多角色的 AI 应用。
LangChain Core
核心库提供 LLM 接口抽象、消息格式、输出解析器和回调系统。所有上层组件都基于 Core 构建,确保接口一致性。
LangChain Tools
丰富的工具生态,包括搜索引擎、数据库查询、代码执行、文件操作等。代理通过工具与外部世界交互,实现真正的自主行动能力。
LangGraph
有向图编排引擎,支持状态管理、条件分支、循环和并行执行。是将简单代理升级为复杂工作流的关键组件。
LangSmith
可观测性平台,记录每一次 LLM 调用、工具使用和状态变化。对调试、性能优化和质量监控至关重要。
代理 vs 传统编程:范式对比
# 传统编程:硬编码所有逻辑
def process_order(order):
if order.type == "standard":
return standard_shipping(order)
elif order.type == "express":
return express_shipping(order)
elif order.type == "international":
return international_shipping(order)
else:
return unknown_order_handler(order)
# 每新增一种订单类型,都要修改这个函数
# 代理编程:让 AI 自主决策
agent = Agent(
name="order_processor",
llm=LLM(model="gpt-4"),
tools=[standard_shipping, express_shipping,
international_shipping, ask_customer],
system_prompt="你处理各种订单,自主选择最佳处理方式"
)
# 无需硬编码所有分支,代理根据上下文自主决策
result = agent.run("处理这个国际快递订单,需要加急")
# 代理自动选择 international_shipping + express 选项
传统方式:需要预先定义所有可能的分支逻辑。每次新增需求都要修改代码,维护成本随复杂度指数增长。
代理方式:只需提供工具和指导原则,代理根据自然语言描述自主选择执行路径。新增需求无需改代码,只需更新工具或提示词。
核心区别:传统编程是"确定性规则驱动",代理编程是"意图驱动"。代理更适合处理模糊的、多变的、难以穷举的业务场景。
DeepAgents 核心概念
理解 DeepAgents 的核心概念是掌握其架构和设计模式的关键。
主要组件
概念解释
Agents
智能代理是 DeepAgents 的核心,负责决策和执行任务。
LLMs
大型语言模型为代理提供自然语言理解和生成能力。
Chains
链式结构将多个组件连接起来,形成复杂的处理流程。
互动小测验
将以下概念与其描述匹配:
深入理解:Agent 的决策循环
Agent 的核心是一个 ReAct(Reasoning + Acting)循环:观察输入 → 思考下一步 → 执行动作 → 观察结果 → 继续思考,直到得出最终答案。
# Agent ReAct 循环伪代码
class Agent:
def run(self, user_input):
state = {"input": user_input, "history": []}
while not state.get("finished"):
# 1. 思考:分析当前状态
thought = self.llm.think(
state["input"],
state["history"],
available_tools=self.tools
)
# 2. 决策:选择动作
action = self.llm.decide(thought)
if action.type == "tool_call":
# 3. 执行:调用工具
result = self.tools[action.name].run(
action.arguments
)
state["history"].append({
"thought": thought,
"action": action,
"observation": result
})
elif action.type == "final_answer":
# 4. 输出:返回最终答案
state["finished"] = True
return action.content
return "无法完成任务"
第 4-5 行:初始化状态,保存用户输入和交互历史。
第 7-11 行:思考阶段——LLM 分析当前输入和历史记录,决定下一步做什么。可以参考可用工具列表。
第 13-14 行:决策阶段——LLM 输出具体动作,可能是工具调用或最终答案。
第 16-25 行:执行阶段——如果是工具调用,执行工具并将结果记录到历史中,供下一轮思考使用。
第 26-29 行:输出阶段——当 LLM 判断已有足够信息时,输出最终答案并结束循环。
LangGraph 状态图:Agent 的神经网络
LangGraph 是 DeepAgents 的编排引擎,它将 Agent 的工作流程建模为有向状态图。每个节点是一个处理步骤,每条边是状态转换。
from langgraph.graph import StateGraph, END
# 定义状态结构
class AgentState(TypedDict):
messages: list[Message]
current_tool: str | None
tool_result: Any
iteration: int
max_iterations: int
# 构建状态图
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("think", think_node) # 思考
graph.add_node("decide", decide_node) # 决策
graph.add_node("execute", execute_node) # 执行
graph.add_node("respond", respond_node) # 回复
# 添加边(状态转换)
graph.add_edge("think", "decide")
graph.add_conditional_edges(
"decide",
should_continue,
{
"tool_call": "execute",
"final_answer": "respond",
"max_iterations": "respond",
}
)
graph.add_edge("execute", "think") # 执行后回到思考
graph.add_edge("respond", END) # 回复后结束
# 设置入口
graph.set_entry_point("think")
# 编译并运行
app = graph.compile()
result = app.invoke({"messages": [user_message]})
第 3-8 行:定义状态结构——消息历史、当前工具、工具结果、迭代计数和最大迭代次数。
第 11-16 行:创建四个处理节点:思考、决策、执行、回复。
第 19-29 行:定义状态转换。关键在 add_conditional_edges——决策节点根据结果路由到不同分支:需要工具就跳到执行,已有答案就跳到回复。
第 30-31 行:执行完成后回到思考节点,形成循环。回复后跳到 END 结束。
第 35-38 行:设置入口点为思考节点,编译图并运行。整个流程自动执行。
工具系统:Agent 的手脚
工具是 Agent 与外部世界交互的桥梁。DeepAgents 继承了 LangChain 丰富的工具生态,同时支持自定义工具。理解工具系统是构建实用 Agent 的关键。
搜索工具
集成 Google、Bing、Tavily 等搜索引擎,让 Agent 能实时获取网络信息。支持新闻、学术、图片等多种搜索模式。
代码执行工具
沙箱化的 Python 执行环境,Agent 可以编写和运行代码来处理数据、生成图表、执行计算。安全且隔离。
文件操作工具
读写本地和远程文件,支持 PDF、CSV、JSON 等格式。Agent 可以自动解析文档内容并提取关键信息。
数据库工具
连接 SQL 和 NoSQL 数据库,Agent 可以执行查询、分析数据模式、生成报表。支持自然语言到 SQL 的自动转换。
关键要点
- Agents 是系统的决策中心
- LLMs 提供语言能力
- Chains 实现复杂流程
代理决策循环:ReAct 模式
DeepAgents 的代理采用 ReAct(Reasoning + Acting)模式进行决策。每一步,代理都会先"思考"当前状态,然后选择一个"行动"(调用工具或回复用户),再根据行动结果继续推理。
- 观察(Observe):接收用户输入或上一步工具的返回结果
- 思考(Think):LLM 分析当前状态,决定下一步该做什么
- 行动(Act):调用工具执行操作,或生成最终回复
- 重复以上步骤,直到生成最终回复
ReAct 决策过程示例
# 代理内部决策过程(简化版)
agent.run("上海今天的天气适合户外运动吗?")
# 内部决策链:
# [思考] 用户想知道上海天气是否适合户外运动
# [行动] 调用 get_weather("上海")
# [观察] 返回:上海,多云,28°C,湿度 65%
# [思考] 多云28度适合运动,但需考虑湿度较高
# [行动] 调用 get_uv_index("上海")
# [观察] 返回:UV指数 3(中等)
# [思考] 温度适宜,湿度稍高,UV中等,总体适合
# [回复] 上海今天多云28°C,湿度65%,UV指数中等。
# 总体适合户外运动,建议做好防晒并带水补充水分。
代码解读
代理在回答问题时不是一步到位的,而是经过多轮"思考-行动-观察"的循环。每一步都基于前一步的结果做出新的决策。这种模式让代理能够处理需要多步推理的复杂问题。
状态管理:为什么需要 LangGraph?
传统的 LangChain Chain 是线性的——输入经过一系列处理后输出。但真实的 AI 应用往往需要更复杂的控制流:条件分支(根据结果选择不同路径)、循环(反复执行直到满足条件)、并行执行(同时调用多个工具)。
LangGraph 将代理行为建模为有向图(Directed Graph),图中的每个节点是一个处理步骤,边定义了步骤之间的转移条件。这让复杂的多步推理变得清晰可控。
Chain 设计模式详解
from langchain.chains import SequentialChain, RouterChain
# 1. 顺序链:步骤按固定顺序执行
qa_pipeline = SequentialChain(
chains=[
question_analyzer, # 分析问题类型和意图
context_retriever, # 检索相关上下文(RAG)
answer_generator, # 基于上下文生成答案
fact_checker, # 验证答案的事实准确性
],
input_variables=["question"],
output_variables=["answer", "confidence", "sources"]
)
# 2. 路由链:根据输入类型分发
router = RouterChain(
destinations={
"code": code_helper_chain,
"math": math_solver_chain,
"creative": creative_writing_chain,
"general": general_qa_chain,
},
default_chain=general_qa_chain,
llm=LLM(model="gpt-4")
)
# 3. 自定义链:组合任意逻辑
class ValidationChain(Chain):
def _call(self, inputs):
answer = inputs["answer"]
# 交叉验证:用另一个 LLM 验证答案
validation = self.validator_llm.run(
f"验证以下答案是否准确:{answer}"
)
if validation.score < 0.7:
return {"answer": "需要更多研究", "retry": True}
return {"answer": answer, "retry": False}
顺序链:最基础的模式,步骤严格按顺序执行。适合流程固定的任务。每个链的输出自动传递给下一个链的输入。
路由链:LLM 先分析输入类型,然后将请求路由到专门的处理链。代码问题走代码链,数学问题走数学链,实现了智能"分诊"。
自定义链:继承 Chain 基类实现任意逻辑。示例中的验证链用第二个 LLM 交叉验证答案准确性,低于阈值则触发重试。
选择建议:简单线性流程用顺序链,多类型输入用路由链,需要复杂逻辑时自定义链。
Memory(记忆)系统
记忆系统让代理具备上下文感知能力。不同类型的记忆适用于不同场景——对话需要短期记忆,学习需要长期记忆,工作流需要状态记忆。
对话记忆
存储多轮对话的完整历史。支持窗口截断(只保留最近 N 轮)和摘要压缩(将历史对话压缩为摘要)两种策略,平衡上下文长度和 token 成本。
向量记忆
将历史交互向量化存储,通过语义相似度检索相关记忆。适合需要回忆"很久以前说过什么"的场景,突破上下文窗口限制。
实体记忆
从对话中自动提取关键实体(人名、地点、偏好等)并持久化存储。下次对话时自动注入相关实体信息,实现"认识用户"的效果。
DeepAgents 实践应用
通过实际案例理解 DeepAgents 的应用场景,帮助你在自己的项目中快速上手。
应用场景
🗣️ 对话系统
构建智能对话机器人,支持多轮对话和上下文理解。
📊 数据分析
利用 AI 代理自动化数据处理和分析任务。
🔍 信息检索
实现智能搜索和知识库查询功能。
代码示例
from deepagents import Agent, LLM, Chain
# 创建一个简单的代理
agent = Agent(
name="assistant",
llm=LLM(model="gpt-4"),
tools=["search", "calculator"]
)
# 执行任务
result = agent.run("分析这段文本的情感")
print(result)
代码解读
- 第1行:从 deepagents 库中导入三个核心组件
- 第3-7行:创建一个名为"assistant"的代理,使用 GPT-4 模型,并配备搜索和计算器工具
- 第9-10行:让代理执行一个情感分析任务并打印结果
互动小测验
在上述代码中,tools=["search", "calculator"] 的作用是什么?
实战案例:智能客服系统
智能客服是 DeepAgents 最典型的应用场景之一。下面展示如何构建一个能处理退款、查询订单、推荐产品的多功能客服代理。
from deepagents import Agent, LLM, Tool, Router
# 定义客服工具集
@Tool.define
def query_order(order_id: str) -> dict:
"""查询订单状态"""
return {"id": order_id, "status": "配送中", "eta": "明天"}
@Tool.define
def process_refund(order_id: str, reason: str) -> dict:
"""处理退款请求"""
return {"refund_id": "R001", "amount": 299, "status": "处理中"}
@Tool.define
def recommend_products(category: str, budget: int) -> list:
"""推荐产品"""
return [{"name": "产品A", "price": 199}, {"name": "产品B", "price": 259}]
@Tool.define
def escalate_to_human(issue: str) -> str:
"""转接人工客服"""
return f"已转接人工客服,问题描述:{issue}"
# 创建路由:根据意图分发到不同代理
router = Router(
intent_classifier=LLM(model="gpt-4"),
routes={
"order_query": Agent(
name="订单查询专家",
tools=[query_order]
),
"refund": Agent(
name="退款处理专家",
tools=[process_refund, query_order]
),
"recommendation": Agent(
name="产品推荐专家",
tools=[recommend_products]
),
},
fallback=Agent(
name="通用助手",
tools=[escalate_to_human]
)
)
# 运行客服系统
response = router.handle("我昨天买的耳机想退货")
# 路由到退款处理专家
print(response) # "好的,我来帮您处理退款..."
第 3-18 行:定义四个客服工具——查询订单、处理退款、推荐产品和转人工。每个工具的文档字符串会作为 LLM 的工具描述。
第 20-42 行:Router 是一个智能路由器,先用 LLM 判断用户意图,再分发到对应的专业代理。每个代理有专属工具集,确保精确处理。
第 38-40 行:fallback 代理处理无法分类的请求,转接人工客服兜底。
第 45-47 行:用户说"想退货",Router 自动识别为退款意图,路由到退款处理专家代理。
实战案例:自动化数据分析
构建一个能理解自然语言查询、自动生成 SQL、执行分析并可视化结果的数据分析代理。
from deepagents import Agent, LLM, Tool
import pandas as pd
# 定义数据分析工具
@Tool.define
def execute_sql(query: str) -> str:
"""执行 SQL 查询并返回结果"""
result = db.execute(query)
return pd.DataFrame(result).to_markdown()
@Tool.define
def create_chart(data: str, chart_type: str) -> str:
"""根据数据生成图表"""
df = pd.read_csv(data)
fig = df.plot(kind=chart_type).get_figure()
fig.savefig("chart.png")
return "图表已保存到 chart.png"
@Tool.define
def explain_data(summary_stats: str) -> str:
"""用自然语言解释数据统计结果"""
return f"数据分析结果:{summary_stats}"
# 创建数据分析代理
analyst = Agent(
name="data_analyst",
llm=LLM(model="gpt-4"),
tools=[execute_sql, create_chart, explain_data],
system_prompt="""你是一个数据分析专家。
收到分析请求后:
1. 先理解用户想知道什么
2. 编写 SQL 查询数据
3. 选择合适的图表类型
4. 用简洁的语言解释结果"""
)
# 执行分析
result = analyst.run(
"分析上个月各产品类别的销售额,找出增长最快的类别"
)
print(result)
# 代理自动:编写SQL → 执行查询 → 生成柱状图 → 用自然语言解释趋势
工具定义:三个核心工具——SQL 执行、图表生成和数据解读。覆盖数据分析的全流程。
system_prompt:明确告知代理的四步工作流程,确保分析过程有条理。
执行过程:代理收到"分析销售额"请求后,会自动执行 4 个 ReAct 循环:编写 SQL → 执行查询 → 选择图表 → 解释结果。整个过程用户只需一句话。
记忆系统:让代理记住上下文
真正的智能代理需要记住之前的对话内容。DeepAgents 提供了多种记忆机制,从简单的对话历史到复杂的长期记忆。
from deepagents import Agent, LLM, Memory
# 短期记忆:对话历史(默认)
agent_with_short_memory = Agent(
name="assistant",
llm=LLM(model="gpt-4"),
memory=Memory(type="conversation", window=10),
# 只保留最近 10 轮对话
)
# 长期记忆:向量数据库
agent_with_long_memory = Agent(
name="assistant",
llm=LLM(model="gpt-4"),
memory=Memory(
type="vector_store",
provider="chromadb",
collection="user_preferences",
# 自动提取和检索重要信息
),
)
# 组合使用:短期 + 长期
agent = Agent(
name="personal_assistant",
llm=LLM(model="gpt-4"),
memory=[
Memory(type="conversation", window=10),
Memory(type="vector_store", provider="chromadb"),
Memory(type="summary", frequency=5),
# 每 5 轮对话自动生成摘要
],
)
# 测试记忆效果
agent.chat("我叫张三,是一名软件工程师")
agent.chat("我喜欢用 Python 做数据分析")
agent.chat("我正在学习 LangChain")
# 50 轮对话后...
response = agent.chat("根据我的背景,推荐一些学习资源")
# 代理记住了:张三 + Python + 数据分析 + LangChain
# 会推荐:LangChain 实战 + Python AI 开发相关资源
短期记忆:保留最近 N 轮对话,适合当前会话上下文。window=10 表示只保留最近 10 轮。
长期记忆:使用 ChromaDB 等向量数据库存储重要信息,跨会话持久化。代理可以记住用户的偏好、背景和历史交互。
摘要记忆:定期将对话压缩为摘要,节省 token 消耗。每 5 轮自动生成一次。
组合使用:三种记忆协同工作——短期保证当前对话连贯,长期保存用户画像,摘要控制 token 开销。
实践要点
- 选择合适的模型是成功的关键
- 工具的设计要符合任务需求
- 错误处理和日志记录不可或缺
RAG(检索增强生成)实战
RAG 是解决 LLM "知识过期"和"幻觉"问题的核心技术。通过将外部知识库与 LLM 结合,让代理基于真实数据给出准确回答。
from deepagents import Agent, LLM, Tool
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# 第一步:构建知识库
documents = load_documents("./knowledge_base/")
chunks = text_splitter.split_documents(
documents, chunk_size=500, chunk_overlap=50
)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=OpenAIEmbeddings(),
persist_directory="./chroma_db"
)
# 第二步:创建 RAG 检索工具
@Tool.define
def search_knowledge_base(query: str) -> str:
"""在知识库中搜索与查询相关的文档"""
results = vectorstore.similarity_search(query, k=3)
return "\n\n".join([
f"[来源{i+1}] {doc.page_content}"
for i, doc in enumerate(results)
])
# 第三步:创建 RAG 代理
rag_agent = Agent(
name="knowledge_assistant",
llm=LLM(model="gpt-4"),
tools=[search_knowledge_base],
system_prompt="""你是知识库助手。回答时先搜索相关内容,
基于搜索结果给出答案。始终标注信息来源。"""
)
response = rag_agent.run("公司年假政策是什么?")
第一步:加载文档并分割为 500 字的块,用向量嵌入存储到 Chroma 数据库。
第二步:将向量搜索封装为工具,返回最相关的 3 个文档片段。
第三步:创建代理,系统提示词要求先搜索再回答并标注来源,确保答案基于事实。
核心价值:代理不再依赖 LLM 训练数据回答,而是基于你的最新知识库,彻底解决幻觉问题。
DeepAgents 进阶主题
掌握进阶技巧,让你的 DeepAgents 应用更加健壮和高效。
多代理协作
在复杂场景中,多个代理需要协同工作来完成更高级的任务。DeepAgents 提供了灵活的多代理协作机制。
from deepagents import Agent, Router, Pipeline
# 创建多个专业代理
researcher = Agent(
name="researcher",
llm=LLM(model="gpt-4"),
tools=["search", "scraper"]
)
writer = Agent(
name="writer",
llm=LLM(model="gpt-4"),
tools=["editor"]
)
# 创建协作管道
pipeline = Pipeline([
researcher,
writer
])
# 执行多步骤任务
result = pipeline.run("撰写一篇关于 AI 的研究报告")
代码解读
- 第1行:导入多代理协作所需的核心组件
- 第3-8行:创建一个研究员代理,配备搜索和网页抓取工具
- 第10-14行:创建一个写手代理,配备编辑工具
- 第16-20行:将两个代理组合成一个处理管道
- 第22-23行:执行一个需要研究+撰写的复合任务
性能优化
⚡ 缓存策略
利用缓存减少重复的 LLM 调用,显著降低成本和延迟。
🔄 流式处理
使用流式响应提升用户体验,减少等待时间。
📦 批处理
将多个请求合并处理,提高吞吐量。
互动小测验
在多代理协作中,Pipeline 的作用是什么?
高级多代理编排模式
除了简单的 Pipeline 顺序执行,DeepAgents 支持多种复杂的多代理编排模式。选择合适的模式是构建高效 AI 系统的关键。
层级模式(Hierarchical)
一个主代理负责任务分解和分配,多个子代理负责执行。适合复杂任务的分层管理。主代理就像项目经理,子代理就像团队成员。
协作模式(Collaborative)
多个代理平等协作,通过共享状态和消息传递协调行动。适合需要多角度思考的创意任务或复杂分析。
辩论模式(Debate)
两个或多个代理就同一问题提出不同观点,通过"辩论"达成更优结论。适合需要避免偏见的关键决策场景。
瀑布模式(Waterfall)
代理按严格顺序处理,每个代理的输出是下一个代理的输入。适合流程明确、需要严格质量控制的生产线式任务。
层级编排实战代码
# 层级编排:主编排器 + 专业子代理
from deepagents import Agent, LLM, Orchestrator
# 创建主编排器
orchestrator = Orchestrator(
name="project_manager",
llm=LLM(model="gpt-4"),
system_prompt="""你是项目管理代理。
收到任务后:
1. 分析任务需求
2. 分解为子任务
3. 分配给合适的专业代理
4. 综合结果返回最终答案"""
)
# 注册专业子代理
orchestrator.register_agent(
"researcher",
Agent(name="研究员", tools=["search", "scraper", "arxiv"])
)
orchestrator.register_agent(
"analyst",
Agent(name="分析师", tools=["calculator", "statistics"])
)
orchestrator.register_agent(
"writer",
Agent(name="撰稿人", tools=["editor", "formatter"])
)
# 运行层级编排
result = orchestrator.run(
"撰写一份关于 2024 年 AI Agent 技术趋势的深度报告"
)
# 编排器自动:
# 1. 分解为:文献调研 → 数据分析 → 报告撰写
# 2. 分配给:researcher → analyst → writer
# 3. 综合输出最终报告
第 3-13 行:主编排器(Orchestrator)负责整体协调。它的 system_prompt 定义了"分析 → 分解 → 分配 → 综合"四步流程。
第 16-24 行:注册三个专业子代理,每个有专属工具集。编排器根据子任务类型选择最合适的代理。
第 27-35 行:运行时,编排器自动完成整个流程。用户只需描述目标,不需要关心执行细节。
优势:每个子代理专注于自己擅长的领域,整体效果优于单个"全能"代理。这就像专业化分工的优势。
辩论模式:对抗偏见的利器
# 辩论模式:两个代理就同一问题展开辩论
from deepagents import DebateAgent, Judge
pro_agent = DebateAgent(
name="支持方",
stance="支持在医疗领域大规模使用 AI",
llm=LLM(model="gpt-4"),
tools=["search"]
)
con_agent = DebateAgent(
name="反对方",
stance="对医疗 AI 保持谨慎态度",
llm=LLM(model="gpt-4"),
tools=["search"]
)
judge = Judge(
name="裁判",
llm=LLM(model="gpt-4"),
max_rounds=3 # 最多辩论 3 轮
)
# 开始辩论
result = judge.run(
topic="医疗 AI 是否应该获得自主诊断权限?",
agents=[pro_agent, con_agent]
)
# result 包含:
# - 每轮辩论的观点和论据
# - 最终综合结论(综合双方观点)
# - 推荐的行动方案(带条件)
print(result.consensus)
# "在严格监管框架下,允许 AI 辅助诊断,
# 但最终决策权必须由持证医生保留..."
第 3-12 行:创建两个持对立观点的代理。每个代理会主动搜索支持自己观点的证据。
第 14-18 行:裁判代理管理辩论流程,控制轮次,最终综合双方观点得出平衡结论。
第 21-24 行:设置辩论主题和参与代理。裁判确保辩论聚焦且有建设性。
应用场景:政策制定、伦理决策、风险评估等需要多角度审视的关键场景。辩论模式能有效避免单一视角的盲区。
错误处理最佳实践
try:
result = pipeline.run(task)
except LLMRateLimitError:
# 处理速率限制
time.sleep(60)
result = pipeline.run(task)
except AgentTimeoutError:
# 处理超时
result = handle_timeout(task)
finally:
# 清理资源
pipeline.cleanup()
- 始终处理速率限制和超时错误
- 使用重试机制提高可靠性
- 合理管理资源和连接
生产级错误处理策略
# 生产级错误处理框架
from deepagents import Agent, RetryPolicy, CircuitBreaker
# 配置重试策略
retry_policy = RetryPolicy(
max_attempts=3,
backoff="exponential", # 指数退避:1s, 2s, 4s
retry_on=[LLMRateLimitError, LLMAPIError],
fallback_model="gpt-3.5-turbo" # 主模型失败时降级
)
# 配置熔断器
circuit_breaker = CircuitBreaker(
failure_threshold=5, # 连续 5 次失败后熔断
recovery_timeout=60, # 60 秒后尝试恢复
half_open_requests=3 # 半开状态允许 3 次测试请求
)
# 创建带完整错误处理的代理
production_agent = Agent(
name="production_assistant",
llm=LLM(model="gpt-4"),
retry_policy=retry_policy,
circuit_breaker=circuit_breaker,
timeout=30, # 单次请求超时 30 秒
max_iterations=10, # 最多 10 个 ReAct 循环
graceful_degradation=True # 优雅降级而非抛出异常
)
# 监控和告警
@production_agent.on_error
def handle_error(error, context):
logger.error(f"代理错误: {error}", extra=context)
metrics.increment("agent.errors")
if isinstance(error, CircuitBreakerOpenError):
alert.send("代理熔断器已触发,请检查服务状态")
# 执行任务
try:
result = production_agent.run("分析季度销售数据")
except CircuitBreakerOpenError:
result = "服务暂时不可用,已切换到备用方案"
fallback_result = simple_rule_based_analysis(data)
重试策略:指数退避避免频繁重试加剧服务压力。设置 fallback_model 确保主模型不可用时自动降级到更轻量的模型。
熔断器:连续失败达到阈值后自动"熔断",停止发送请求,给服务恢复时间。半开状态允许少量测试请求探测恢复。
优雅降级:graceful_degradation=True 确保出错时代理返回部分结果而非完全失败。
监控:on_error 回调记录错误日志和指标,触发告警。让运维团队第一时间知道问题。
提示词工程最佳实践
提示词(Prompt)是代理行为的"灵魂"。好的提示词让代理精准高效,差的提示词导致幻觉和不可预测行为。以下是经过验证的最佳实践。
角色定义清晰
system_prompt 的第一句应明确定义代理的角色和能力边界。"你是一个专业的 XX 助手,擅长 XX,不具备 XX 能力"。明确边界比列举能力更重要。
工作流显式化
不要让代理自行摸索工作流程。在 system_prompt 中用编号列表明确步骤:"1. 先搜索 2. 再分析 3. 最后总结"。显式指令比隐式期望可靠。
约束条件具体
避免模糊的约束如"尽量准确"。改为具体的约束如"所有数字必须附带来源"、"如果信息不足请明确说明,不要编造"。
总结与练习
恭喜你完成了 DeepAgents 课程的学习!让我们回顾关键知识点并进行综合练习。
课程回顾
模块一:DeepAgents 介绍
了解了 DeepAgents 的基本概念和技术栈,包括其模块化设计和多模型支持。
模块二:核心概念
深入理解了 Agents、LLMs 和 Chains 三大核心组件及其协作方式。
模块三:实践应用
通过实际代码示例学习了如何创建代理、配置工具和执行任务。
模块四:进阶主题
掌握了多代理协作、性能优化和错误处理等高级技巧。
综合测验
问题 1:DeepAgents 主要基于哪两个框架构建?
问题 2:在创建 Agent 时,tools 参数的作用是什么?
问题 3:Pipeline 在多代理协作中的核心作用是什么?
动手练习
练习:构建一个简单的问答代理
尝试使用以下代码模板创建一个能够回答技术问题的代理:
from deepagents import Agent, LLM
# TODO: 创建一个技术问答代理
agent = Agent(
name="tech_helper",
llm=LLM(model="________"), # 选择合适的模型
tools=["________"] # 添加必要的工具
)
# TODO: 测试你的代理
question = "什么是 LangChain?"
result = agent.run(question)
print(result)
💡 提示:选择一个支持中文的模型,并添加搜索工具以获取最新信息。
下一步学习建议
🎉 恭喜你完成了 DeepAgents 课程!你已经掌握了构建智能代理系统的核心知识。继续实践和探索,你将能够构建更加复杂的 AI 应用。
完整实战:构建 AI 研究助手
下面通过一个完整的项目,展示如何用 DeepAgents 构建一个多功能的 AI 研究助手。这个助手能搜索论文、总结内容、对比观点并生成研究报告。
# === 完整项目:AI 研究助手 ===
from deepagents import (
Agent, LLM, Tool, Pipeline, Router,
Memory, Orchestrator
)
# 1. 定义工具集
@Tool.define
def search_papers(query: str, max_results: int = 10) -> list:
"""搜索学术论文"""
return arxiv_client.search(query, max_results)
@Tool.define
def summarize_paper(paper_url: str) -> dict:
"""总结论文核心内容"""
paper = fetch_paper(paper_url)
return {
"title": paper.title,
"summary": paper.abstract,
"key_findings": extract_findings(paper),
"methodology": extract_methodology(paper)
}
@Tool.define
def compare_papers(paper_ids: list) -> str:
"""对比多篇论文的方法和结论"""
papers = [fetch_paper(pid) for pid in paper_ids]
return generate_comparison_table(papers)
# 2. 创建专业代理
researcher = Agent(
name="文献检索员",
llm=LLM(model="gpt-4"),
tools=[search_papers],
system_prompt="你是学术文献检索专家,擅长找到最相关的论文"
)
analyzer = Agent(
name="论文分析师",
llm=LLM(model="gpt-4"),
tools=[summarize_paper, compare_papers],
system_prompt="你是学术论文分析专家,擅长提炼核心观点和方法论"
)
writer = Agent(
name="报告撰写员",
llm=LLM(model="gpt-4"),
tools=[],
system_prompt="你是学术写作专家,擅长将分析结果组织成结构清晰的报告"
)
# 3. 编排工作流
pipeline = Pipeline([
researcher, # 第一步:检索相关论文
analyzer, # 第二步:分析和对比论文
writer # 第三步:撰写研究报告
])
# 4. 执行研究任务
result = pipeline.run(
"调研 2024 年 RAG(检索增强生成)技术的最新进展和趋势"
)
# 5. 输出结果
print(f"检索论文数: {result.papers_found}")
print(f"分析论文数: {result.papers_analyzed}")
print(f"报告字数: {len(result.report)}")
print(result.report)
第 6-20 行:定义三个专业工具——论文搜索、论文总结和论文对比。每个工具封装了具体的操作逻辑。
第 22-42 行:创建三个专业代理,每个有独立的工具集和系统提示词。分工明确,各司其职。
第 45-50 行:用 Pipeline 将三个代理串联,前一个的输出自动传递给下一个。
第 53-55 行:一行代码启动整个研究流程。Pipeline 自动协调三个代理的执行。
第 58-61 行:输出包含检索数量、分析数量和最终报告。整个过程约 5-10 分钟完成。
进阶练习:多代理研究系统
挑战更复杂的场景——使用层级编排和辩论模式构建一个高质量的研究系统。
# 进阶:带质量保证的研究系统
from deepagents import (
Orchestrator, DebateAgent, Judge,
Agent, LLM, QualityGate
)
# 质量门:确保每个阶段输出达标
quality_gate = QualityGate(
criteria={
"completeness": 0.8, # 完整性 ≥ 80%
"accuracy": 0.85, # 准确性 ≥ 85%
"relevance": 0.9 # 相关性 ≥ 90%
},
on_fail="retry_with_feedback", # 不达标则重试
max_retries=3
)
# 创建编排器
orchestrator = Orchestrator(
name="研究总监",
llm=LLM(model="gpt-4"),
quality_gate=quality_gate
)
# 注册辩论模式代理组
orchestrator.register_debate_group(
topic="技术路线选择",
agents=[
DebateAgent(name="保守派", stance="优先稳定性"),
DebateAgent(name="创新派", stance="优先前沿性"),
],
judge=Judge(max_rounds=2)
)
# 运行带质量保证的研究
result = orchestrator.run(
task="评估 Transformer 架构 vs Mamba 架构在长文本处理中的优劣",
quality_threshold=0.85
)
# 如果质量不达标,系统会自动:
# 1. 分析质量缺陷
# 2. 补充搜索缺失信息
# 3. 重新生成不达标部分
# 4. 最多重试 3 次
第 5-12 行:QualityGate 定义质量标准。每个阶段的输出都会自动评估完整性、准确性和相关性。不达标则自动重试。
第 14-18 行:编排器集成了质量门,确保整体输出质量可控。
第 21-27 行:注册辩论组。当研究涉及技术路线选择时,两个持不同立场的代理会展开辩论,帮助发现盲点。
第 30-32 行:运行时指定质量阈值。系统会在质量不达标时自动补充和修正。
第 35-39 行:自动重试机制——分析缺陷、补充信息、重新生成,形成闭环质量控制。
生产部署最佳实践
从原型到生产需要考虑可靠性、可扩展性和成本控制。以下是 DeepAgents 生产部署的关键实践。
# 生产部署配置示例
from deepagents import Agent, LLM, DeploymentConfig
# 1. 多模型路由:按任务复杂度选择模型
model_router = ModelRouter({
"simple": LLM(model="gpt-3.5-turbo", cost_per_1k=0.5),
"medium": LLM(model="gpt-4", cost_per_1k=30),
"complex": LLM(model="gpt-4-turbo", cost_per_1k=60),
})
# 2. 速率限制和成本控制
agent = Agent(
name="production_agent",
llm=model_router,
rate_limit={
"requests_per_minute": 60,
"tokens_per_day": 1000000
},
cost_limit={
"daily_budget": 50.0, # 每日预算上限
"alert_threshold": 0.8 # 80% 时告警
}
)
# 3. 优雅降级配置
agent.add_fallback(
condition=RateLimitExceeded,
fallback_llm=LLM(model="claude-3-haiku"),
max_fallbacks=3
)
# 4. 监控和追踪
agent.enable_tracing(
provider="langsmith",
project="production-agent",
tags=["v2.0", "customer-facing"]
)
# 5. 健康检查
@app.health_check
def agent_health():
return {
"status": "healthy",
"model": agent.current_model,
"requests_today": agent.metrics.requests,
"cost_today": agent.metrics.cost,
"avg_latency": agent.metrics.avg_latency
}
多模型路由:简单任务用便宜模型(GPT-3.5),复杂任务用强模型(GPT-4)。自动根据任务复杂度选择,降低成本 40-60%。
速率限制:防止突发流量打爆 API 配额。按分钟和按天双重限制,确保服务稳定。
优雅降级:主模型限流时自动切换到备用模型。用户无感知,服务不中断。
监控追踪:LangSmith 集成记录每一次调用,便于问题排查和性能优化。
健康检查:标准 HTTP 健康检查端点,支持 K8s/Docker 编排工具的自动运维。