从“浅层”到“深层”:LangChain Deep Agents 实战指南
随着 AI Agent 技术的演进,传统的“浅层”Agent 因缺乏灵活性而难以应对复杂任务。本文基于 LangChain 的 Deep Agents 框架,通过构建一个“会议准备助手”的实战案例,系统性地介绍了 Deep Agents 的核心能力。文章详细阐述了如何利用规划工具、文件系统、子 Agent 分工、自定义工具、持久化记忆以及人机交互审批等六大特性,逐步将一个简单的脚本升级为具备自主规划与适应能力的智能体。本文旨在为开发者提供一套可落地的构建方法论,帮助理解 Deep Agents 与传统工作流(如 LangGraph)的区别及适用场景。
为什么我们需要“深层”Agent?
在构建 AI 应用时,我们常遇到一种“浅层”Agent:它们遵循固定的线性工作流。例如,一个会议准备脚本可能只会机械地执行“搜索领英 -> 搜索公司 -> 搜索新闻 -> 生成摘要”的步骤。
这种模式的问题在于缺乏适应性。如果目标人物不在领英上怎么办?如果会议是内部的,不需要公司背景调查怎么办?浅层 Agent 无法处理这些异常。
Deep Agents(深层 Agent)的出现正是为了解决这一问题。与 LangGraph 提供的完全可控但需手动定义状态流转的模式不同,Deep Agents 更加灵活。它允许 Agent 自主规划、根据发现的信息调整策略,并管理自身的上下文。对于研究、编码辅助、数据分析等无法预知确切工作流的复杂场景,Deep Agents 是更自然的选择。
实战:七步构建智能会议助手
我们将通过七个步骤,从零开始构建一个能够自主调研、撰写并发送会议简报的 Deep Agent。
1. 基础构建:赋予 Agent “眼睛”
首先,我们需要安装deepagents和搜索工具tavily-python。最基础的 Agent 只需要具备联网搜索的能力。
python
1from deepagents import create_deep_agent 2from tavily import TavilyClient 3import os 4 5# 初始化搜索工具 6tavily = TavilyClient(api_key=os.environ["TAVILY_API_KEY"]) 7 8def web_search(query: str): 9 return tavily.search(query, max_results=5) 10 11# 创建基础 Agent 12agent = create_deep_agent( 13 tools=[web_search], 14 system_prompt="你是一个会议助手。当被问及即将到来的会议时,请调研参会者及其公司,确保用户做好充分准备。" 15) 16 17# 调用示例 18result = agent.invoke({ 19 "messages": [{"role": "user", "content": "我明天要和 DataFlow Inc. 的工程副总裁 Sarah Chen 开会,帮我准备一下。"}] 20})即使是这个基础版本,Agent 也能自主决定搜索什么内容,并在找不到信息时尝试其他关键词,这比硬编码的脚本灵活得多。
2. 引入规划:让思考有迹可循
面对复杂任务,Agent 容易迷失方向。Deep Agents 内置了规划工具(write_todos,read_todos)。我们只需在提示词中要求 Agent 使用待办清单,它就能将大任务拆解为小步骤,并逐一勾选完成。
python
1agent = create_deep_agent( 2 tools=[web_search], 3 system_prompt="你是一个会议助手。在开始研究前,请创建一个待办清单:\n- 人物背景\n- 公司信息\n- 谈话要点\n\n按顺序执行,完成后标记为完成。" 4)这种显式的规划能力能显著提升 Agent 的专注度,使其在面对突发信息(如发现人物刚跳槽)时,能动态调整计划而非死板执行。
3. 文件存储:突破上下文限制
当调研深入时,搜索结果、新闻摘要等上下文会迅速耗尽模型的 Token 限额。Deep Agents 提供了文件系统工具(write_file,read_file),允许 Agent 将中间信息写入磁盘,保持“工作记忆”的清爽。
python
1agent = create_deep_agent( 2 tools=[web_search], 3 system_prompt="在研究过程中,请将发现保存到文件:\n- 人物信息保存至 /notes/person.md\n- 公司信息保存至 /notes/company.md\n\n这能帮你处理更大型的研究任务。" 4)4. 子 Agent 分工:术业有专攻
调研和写作是两种截然不同的思维模式。我们可以创建子 Agent 来实现“术业有专攻”。主 Agent 负责协调,将调研任务委派给“研究员”子 Agent,将简报撰写委派给“撰稿人”子 Agent。
python
1# 定义子 Agent 2research_subagent = { 3 "name": "researcher", 4 "description": "深入调研人物和公司", 5 "system_prompt": "你是专家研究员,请多渠道交叉验证信息...", 6 "tools": [web_search], 7} 8 9briefing_subagent = { 10 "name": "briefing_writer", 11 "description": "撰写简报", 12 "system_prompt": "你负责撰写一页纸的会议简报,结构为:关键事实 > 谈话点 > 问题...", 13 "tools": [], 14} 15 16# 主 Agent 协调工作 17agent = create_deep_agent( 18 tools=[web_search], 19 subagents=[research_subagent, briefing_subagent], 20 system_prompt="你是协调员。1. 委派人物调研给 researcher;2. 委派公司调研给 researcher;3. 将结果给 briefing_writer 生成文档。" 21)子 Agent 的核心价值在于上下文隔离。所有的搜索细节都保留在子 Agent 内部,主 Agent 只接收最终摘要,从而极大地节省了主上下文的 Token。
5. 自定义工具:连接内部系统
仅靠公开网络搜索是不够的,Agent 还需要访问企业内部数据。通过@tool装饰器,我们可以轻松接入 CRM、日历等系统。
python
1from langchain_core.tools import tool 2 3@tool 4def get_crm_history(person_email: str) -> str: 5 """查询 CRM 中与该人的过往互动记录""" 6 return "CRM 查询结果..." 7 8@tool 9def check_calendar(date: str) -> str: 10 """检查特定日期的日历空闲情况""" 11 return "日历空闲情况..." 12 13# 添加工具 14agent = create_deep_agent( 15 tools=[web_search, get_crm_history, check_calendar], 16 subagents=[research_subagent, briefing_subagent], 17 system_prompt="你可以访问网络、CRM 和日历。请优先检查 CRM,因为过往互动比网络调研更有价值。" 18)6. 持久化记忆:拒绝重复劳动
对于季度复盘或长期客户,我们不需要每次都从头调研。通过配置CompositeBackend,Agent 可以拥有持久化记忆。
python
1from deepagents.backends import CompositeBackend, StateBackend, StoreBackend 2from langgraph.store.memory import InMemoryStore 3 4# 设置持久化存储 5persistent_store = InMemoryStore() 6backend = CompositeBackend( 7 default=StateBackend(), # 临时文件 8 routes={ 9 "/contacts/": StoreBackend(store=persistent_store), # 联系人档案持久化 10 "/meetings/": StoreBackend(store=persistent_store), # 会议历史持久化 11 }, 12) 13 14agent = create_deep_agent( 15 # ... 其他配置 16 backend=backend, 17 system_prompt="在调研新人前,先检查 /contacts/ 下是否有现有档案。准备完简报后,更新档案。" 18)7. 人机交互:安全阀门
在涉及发送邮件等敏感操作时,必须引入“人机回路”(Human-in-the-loop)。Deep Agents 支持在执行特定工具前暂停,等待人类审批。
python
1agent = create_deep_agent( 2 # ... 其他配置 3 interrupt_on={ 4 "send_briefing_email": { 5 "allowed_decisions": ["approve", "edit", "reject"] 6 }, 7 }, 8 system_prompt="研究并创建简报后,提供发送邮件选项。注意:发送邮件需要人工审批。" 9)总结与启示
通过这七个步骤,我们将一个简单的搜索脚本进化为了一个具备高度自主性的智能体。回顾整个过程,有以下几点关键启示:
- 适应性是核心:Deep Agents 最大的优势在于能根据环境变化调整策略,而非死板执行预设脚本。
- 规划即思考:强制 Agent 写下待办清单(Todo List)看似简单,却是提升其逻辑连贯性的最有效手段。
- 上下文隔离:利用子 Agent 处理复杂子任务,是解决长文本上下文限制、保持主 Agent 专注的关键架构模式。
- 渐进式构建:不要试图一步到位。从基础工具开始,遇到瓶颈(如上下文不足、任务太杂)时再引入文件存储或子 Agent,是更稳健的开发路径。
Deep Agents 代表了 AI 应用开发从“自动化脚本”向“自主智能体”的重要跨越。掌握这一模式,将帮助我们在处理复杂、非结构化任务时构建出更强大的 AI 解决方案。