Deep Agents:开箱即用的AI智能体框架,快速构建自主规划与执行应用
1. 项目概述:一个开箱即用的AI智能体框架
如果你正在尝试构建一个能自主规划、读写文件、执行命令的AI智能体,大概率会经历一个相当繁琐的过程:先选一个LLM模型,然后设计一套复杂的提示词(Prompt)来教它如何思考,接着为它编写各种工具(Tools)的接口,最后还得自己处理上下文管理、记忆和任务分解。这个过程就像是从零开始组装一台电脑,你需要自己买CPU、内存、硬盘,然后研究如何接线、安装系统。而今天要聊的Deep Agents,就像是一台预装了操作系统和所有必要软件的“整机”,插上电(连上模型)就能直接跑起来。
Deep Agents是LangChain团队推出的一个“智能体套件”(Agent Harness)。它的核心设计哲学是“开箱即用”(Batteries-included)。这意味着,你不用再操心如何把规划、文件系统、子智能体这些模块“焊接”在一起。框架已经为你提供了一个具备完整工作流的智能体,它内置了经过精心设计的默认工具链和提示词,让你能立刻获得一个可以处理复杂任务的AI助手。你可以把它理解为一个高度集成、功能完备的智能体“底盘”,基于这个底盘,你可以快速定制出符合自己业务需求的专属智能体。
这个框架特别适合两类开发者:一是希望快速验证智能体应用想法,不想在基础设施上耗费太多时间的探索者;二是已经对LangChain/LangGraph生态有一定了解,需要一个更高级、更集成的起点来构建生产级应用的工程师。它基于成熟的LangGraph运行时构建,这意味着你获得的所有能力——流式响应、状态持久化、检查点——都是生产就绪的。
2. 核心设计思路:为何选择“集成套件”模式
在深入代码之前,我们先拆解一下Deep Agents的设计思路。为什么“开箱即用”在今天变得如此重要?这背后是智能体开发范式的演进。
早期的智能体开发更像是一种“研究实验”。开发者需要手动编排智能体的思考循环(ReAct模式是典型代表),精心设计每一步的提示词,并确保工具调用的结果能被正确解析并反馈给模型。这个过程充满了不确定性,调试成本极高。随着LangGraph这类框架的出现,智能体的工作流可以被定义为有向图,状态管理变得清晰,但开发者仍然需要自己定义图中的节点、边,并集成各种工具。
Deep Agents的“集成套件”模式,实质上是将智能体开发中那些通用、高频且复杂的部分进行了标准化封装。它预设了一个经过验证的、高效的智能体工作流图。这个图里已经包含了任务规划、工具执行、上下文总结、子任务分发等关键节点。你拿到的create_deep_agent()返回的,就是一个已经编译好的LangGraph图。这相当于跳过了从画电路图到焊接元件的所有步骤,直接拿到了一块可以运行的主板。
这种设计带来了几个显著优势:
- 降低启动门槛:你不需要成为智能体架构专家,就能快速获得一个功能强大的智能体。
- 最佳实践内置:框架内置的提示词和工具交互逻辑,凝聚了LangChain团队在大量实践中的经验,避免了新手容易踩的坑,比如上下文窗口爆炸、任务规划不清晰等。
- 专注业务逻辑:你可以将精力集中在为智能体添加独特的业务工具(比如查询数据库、调用内部API),而不是重复造轮子。
- 标准化与可维护性:所有使用Deep Agents的项目都基于同一套核心架构,这使得代码更易理解、维护和团队协作。
注意:虽然Deep Agents提供了强大的默认能力,但它并非一个“黑盒”。其基于LangGraph构建的架构决定了它的高度可扩展性。你可以深入其内部,修改任何一个节点,或者完全替换默认的工作流。这平衡了“易用性”和“灵活性”。
2.1 内置能力深度解析
Deep Agents宣称“Batteries-included”,那它到底内置了哪些“电池”?我们来逐一拆解这些核心工具背后的设计意图和使用场景。
规划工具 (write_todos)这是智能体实现复杂任务分解的核心。当用户提出一个宏大目标(如“开发一个简单的待办应用”)时,智能体不会盲目地开始写代码。它会先调用write_todos,将任务拆解成一系列有序的、可执行的小步骤,例如:1. 创建项目结构,2. 编写后端API,3. 设计前端界面,4. 实现数据持久化。这个工具不仅生成计划,还能跟踪进度,智能体在完成一个子任务后可以标记它,这为处理长周期、多步骤任务提供了基础框架。
文件系统工具 (read_file,write_file,edit_file,ls,glob,grep)这是智能体与代码库或文档进行交互的“手”和“眼”。read_file和write_file提供了基础的IO能力。edit_file则更为智能,它允许智能体以“补丁”或“指定修改范围”的方式编辑文件,这比简单的重写更安全,更能保留文件原有结构。ls(列出目录)、glob(模式匹配文件)、grep(内容搜索)这三个工具共同构成了智能体的“探索”能力,让它能自主导航项目结构,定位需要修改的代码或查阅相关文档。
Shell访问工具 (execute)这是最具威力的工具,也是安全风险最高的点。它允许智能体在指定的环境中执行任意Shell命令。Deep Agents的官方态度是“信任LLM”,这意味着安全边界必须在工具层面设置,而不是期望模型自我约束。因此,在生产环境中使用execute时,必须将其运行在一个严格受限的沙箱(Sandbox)环境中,限制其网络访问、文件系统权限和可执行的命令。这个工具使得智能体能够运行测试、安装依赖、启动服务,真正实现端到端的自动化。
子智能体工具 (task)这是实现模块化和并行化的关键。当主智能体遇到一个可以独立完成的子任务(例如,“请优化这个函数的算法”),它可以调用task工具,创建一个拥有独立上下文窗口的子智能体去专门处理。这样做有两个好处:一是隔离了上下文,防止子任务的详细讨论污染主任务的思维链;二是理论上可以并行处理多个子任务,提升效率。子智能体完成工作后,会将结果返回给主智能体。
上下文管理(自动总结)这是应对LLM有限上下文窗口的优雅方案。当对话历史(包括用户消息、工具调用和结果、模型回复)的长度接近模型的上下文限制时,Deep Agents会自动触发一个总结过程。它将冗长的历史对话压缩成一段精炼的摘要,然后用这个摘要替代旧的历史,释放出窗口空间以继续对话。这保证了智能体能够处理非常长的交互会话而不会失忆。
大型输出处理(保存至文件)当工具调用产生非常冗长的输出(比如一个大型文件的完整内容或一个复杂命令的详细结果)时,直接将其塞入上下文会迅速耗尽令牌。Deep Agents的智能之处在于,它会自动将这些大型输出保存到临时文件中,然后在上下文中只保留一个对该文件的引用(如文件路径和简短描述)。当智能体后续需要查阅这些内容时,再按需读取部分内容。这是一种高效的内存管理策略。
3. 从安装到第一个智能体:实战入门
理论说得再多,不如亲手跑一遍。我们从一个最简单的例子开始,感受一下Deep Agents的“开箱即用”。
3.1 环境准备与安装
首先,确保你有一个Python环境(建议3.10以上)。Deep Agents可以通过pip或更现代的uv进行安装。我个人更推荐使用uv,因为它能更快地解析和安装依赖,特别是对于像LangChain这样依赖较多的生态。
# 使用pip安装 pip install deepagents # 或者,使用uv安装(如果尚未安装uv,可先运行 `pip install uv`) uv add deepagents安装过程会同时拉取deepagents的核心包以及其依赖,主要是langchain和langgraph。整个过程应该很顺畅。
3.2 创建你的第一个智能体
安装完成后,打开你的Python编辑器或Jupyter Notebook,让我们用不到10行代码召唤出一个能干的智能体。
from deepagents import create_deep_agent # 创建一个默认的Deep Agent agent = create_deep_agent() # 向它发起一个任务 result = agent.invoke({ "messages": [{ "role": "user", "content": "请帮我分析一下当前目录下所有Python文件,统计总行数,并列出其中包含‘import requests’的文件名。" }] }) print(result["messages"][-1]["content"])运行这段代码,你会看到智能体开始“思考”并行动。它会:
- 理解你的指令。
- 可能先调用
ls或glob工具来查看当前目录。 - 使用
grep或read_file结合逻辑来分析Python文件。 - 调用
execute工具运行类似wc -l *.py的命令来统计行数(如果它认为这样更高效)。 - 最终,将分析结果组织成一段清晰的文字回复给你。
这一切都在一次invoke调用中自动完成,你不需要编写任何任务分解逻辑或工具调用链。这就是“开箱即用”的魅力。
3.3 核心配置项解析
create_deep_agent函数接受多个参数,让你能轻松定制智能体的行为。以下是几个最常用的配置项:
更换模型默认情况下,Deep Agents会使用一个配置好的模型(可能是OpenAI的GPT-4系列)。但你可以轻松切换到任何支持工具调用(Tool Calling)的模型。
from langchain.chat_models import init_chat_model from deepagents import create_deep_agent # 使用OpenAI的GPT-4o模型 agent_gpt4o = create_deep_agent( model=init_chat_model("openai:gpt-4o") ) # 使用Anthropic的Claude 3.5 Sonnet模型 agent_claude = create_deep_agent( model=init_chat_model("anthropic:claude-3-5-sonnet-20241022") ) # 使用本地部署的Ollama模型(需确保模型支持tool calling) agent_ollama = create_deep_agent( model=init_chat_model("ollama:llama3.2:latest") )模型是智能体的“大脑”,更换模型会直接影响其推理能力、工具使用准确性和成本。对于代码生成任务,GPT-4o和Claude 3.5 Sonnet通常是顶级选择;如果追求低成本或需要离线运行,可以探索DeepSeek-Coder等优秀的开源模型通过Ollama部署。
添加自定义工具这是将智能体与你的业务系统连接起来的关键。假设你有一个查询用户信息的内部API。
from langchain.tools import tool from deepagents import create_deep_agent @tool def get_user_profile(user_id: str): """根据用户ID查询用户姓名和邮箱。""" # 这里应该是调用你的内部API或数据库 # 示例数据 return {"name": "张三", "email": "zhangsan@example.com"} # 创建智能体,并传入自定义工具 agent = create_deep_agent( tools=[get_user_profile] # 可以是一个工具列表 ) # 现在智能体可以回答:“查询用户ID为‘U123’的邮箱地址” result = agent.invoke({ "messages": [{ "role": "user", "content": "用户U123的邮箱是什么?" }] })自定义工具通过@tool装饰器定义,其函数文档字符串(docstring)至关重要,因为LLM会依靠它来理解工具的用途和参数。Deep Agents会自动将这些工具集成到智能体的工具列表中,并生成相应的调用逻辑。
自定义系统提示词系统提示词定义了智能体的角色和行为准则。你可以覆盖默认提示,让智能体更贴合你的场景。
agent = create_deep_agent( system_prompt="你是一个资深的后端开发专家,擅长Python和Go语言。你的回答应当专业、简洁,专注于提供技术解决方案。在修改代码前,务必先解释你的修改思路。" )一个精心设计的系统提示词能极大地提升智能体在特定领域的表现。例如,对于代码审查任务,你可以提示它“专注于发现安全漏洞、性能问题和代码坏味道”。
配置子智能体你可以对task工具创建的子智能体进行独立配置。
agent = create_deep_agent( subagent_config={ "model": init_chat_model("openai:gpt-4o-mini"), # 子智能体使用更轻量的模型以节省成本 "system_prompt": "你是一个专注的代码片段优化器,只负责优化给定的函数。", } )这样配置后,当主智能体(可能用着昂贵的GPT-4)遇到需要优化的代码块时,它会将任务委派给一个使用GPT-4o Mini的子智能体。这种混合模型策略可以在保证核心任务质量的同时,有效控制成本。
4. 深入实战:构建一个代码库分析助手
让我们通过一个更复杂的例子,将Deep Agents的各项能力串联起来。我们的目标是构建一个能自动分析Git代码库,生成项目结构文档和依赖分析报告的智能体。
4.1 项目定义与工具准备
首先,我们需要让智能体能访问Git。虽然内置的execute工具可以运行git命令,但为了更结构化地处理数据,我们创建一个专用的Git分析工具。
import subprocess from pathlib import Path from langchain.tools import tool from typing import Optional @tool def analyze_git_repo(repo_path: str, branch: Optional[str] = "main"): """ 分析指定Git代码库的基本信息。 参数: repo_path: 代码库的本地路径。 branch: 要分析的分支,默认为'main'。 返回: 包含分支、最新提交、作者和提交数量的字典。 """ repo_dir = Path(repo_path) if not repo_dir.exists(): return {"error": f"路径不存在: {repo_path}"} try: # 获取当前分支 current_branch = subprocess.check_output( ["git", "-C", repo_path, "branch", "--show-current"], text=True ).strip() # 获取最新提交信息 log_output = subprocess.check_output( ["git", "-C", repo_path, "log", "-1", "--pretty=format:%H|%an|%s"], text=True ).strip() commit_hash, author, subject = log_output.split("|", 2) # 获取提交总数 commit_count = subprocess.check_output( ["git", "-C", repo_path, "rev-list", "--count", "HEAD"], text=True ).strip() return { "repository_path": repo_path, "current_branch": current_branch, "latest_commit": { "hash": commit_hash[:8], # 短哈希 "author": author, "subject": subject }, "total_commits": commit_count } except subprocess.CalledProcessError as e: return {"error": f"Git命令执行失败: {e}"}4.2 创建并运行分析智能体
现在,我们创建一个集成了自定义Git工具和内置文件工具的智能体,并给它一个复杂的分析任务。
from deepagents import create_deep_agent from langchain.chat_models import init_chat_model # 创建智能体,集成自定义工具 agent = create_deep_agent( model=init_chat_model("openai:gpt-4o"), tools=[analyze_git_repo], # 将自定义工具加入列表 system_prompt="""你是一个专业的代码库分析助手。你的任务是深入分析给定的项目代码库,理解其技术栈、架构和关键模块。 请遵循以下步骤: 1. 首先,使用Git工具了解项目的基本情况。 2. 遍历项目目录,识别主要的编程语言和框架。 3. 分析核心的依赖文件(如requirements.txt, package.json, pom.xml)。 4. 阅读关键源代码文件(如主入口文件、核心模块),理解其逻辑。 5. 最终生成一份结构化的分析报告,包含项目概述、技术栈、目录结构和核心模块说明。 请确保你的分析有条理,在读取大文件时注意使用摘要,并适时将详细内容保存到文件中。""" ) # 假设我们有一个本地的Flask项目路径 task_input = { "messages": [{ "role": "user", "content": "请深度分析位于 '/home/user/projects/my_flask_app' 的Python项目。生成一份详细的分析报告,并保存到当前目录下的 ‘project_analysis.md’ 文件中。" }] } # 执行分析任务 stream = agent.stream(task_input, stream_mode="values") for chunk in stream: if "messages" in chunk: latest_msg = chunk["messages"][-1] if latest_msg["role"] == "assistant": # 流式输出模型的“思考”过程 if "content" in latest_msg and latest_msg["content"]: print(latest_msg["content"], end="", flush=True) # 你也可以观察工具调用的发生 if "tool_calls" in latest_msg: for tc in latest_msg["tool_calls"]: print(f"\n[调用工具] {tc['name']} -> {tc['args']}")运行这个脚本,你会看到智能体开始工作。它可能会:
- 调用
analyze_git_repo获取项目Git信息。 - 调用
ls和glob浏览项目根目录。 - 调用
read_file读取requirements.txt或pyproject.toml来分析依赖。 - 调用
read_file阅读app.py等核心文件。 - 在分析过程中,如果上下文过长,它会自动触发总结。
- 最后,调用
write_file将完整的分析报告写入project_analysis.md。
通过agent.stream的流式输出,你可以实时看到智能体的“思考链”和工具调用,这对于调试和理解其工作方式非常有帮助。
4.3 利用LangGraph能力:持久化与检查点
由于create_deep_agent返回的是一个编译好的LangGraph图,我们可以直接使用LangGraph的所有高级功能。例如,为长时间运行的任务添加持久化(Persistence),这样即使程序中断,重启后也能从断点恢复。
from deepagents import create_deep_agent from langgraph.checkpoint import MemorySaver # 1. 创建一个内存检查点存储器(生产环境可用数据库) memory = MemorySaver() # 2. 创建智能体时传入检查点存储器 agent_with_memory = create_deep_agent( checkpointer=memory, config={"configurable": {"thread_id": "project_analysis_1"}} # 为本次会话指定一个唯一ID ) # 3. 第一次调用,智能体状态会被自动保存 result1 = agent_with_memory.invoke({ "messages": [{"role": "user", "content": "开始分析 /home/user/projects/my_flask_app"}] }) # ... (假设在这里程序意外关闭) ... # 4. 程序重启后,使用相同的thread_id创建智能体 agent_restored = create_deep_agent( checkpointer=memory, config={"configurable": {"thread_id": "project_analysis_1"}} ) # 5. 继续之前的对话,智能体会从上次中断的状态恢复 result2 = agent_restored.invoke({ "messages": [{"role": "user", "content": "继续,生成报告吧。"}] })这个特性对于运行耗时数小时甚至数天的复杂自动化任务(如大型代码库迁移、数据分析流水线)至关重要。它确保了任务的鲁棒性。
5. 高级特性与最佳实践
掌握了基础用法后,我们来看看如何更高效、更安全地使用Deep Agents。
5.1 安全第一:沙箱化执行环境
如前所述,execute工具能力强大但也危险。绝对不要在拥有高权限的生产服务器上让智能体直接执行任意命令。正确的做法是使用沙箱。
使用Docker沙箱(推荐)你可以配置Deep Agents,让所有execute调用都在一个干净的Docker容器内进行。
from deepagents import create_deep_agent from deepagents.tools.shell import DockerSandbox # 创建一个Docker沙箱配置 sandbox = DockerSandbox( image="python:3.11-slim", # 基础镜像 workdir="/workspace", # 容器内工作目录 # 可以挂载需要的卷,例如将当前目录挂载进去供智能体操作 volumes={"/host/path/to/project": {"bind": "/workspace/project", "mode": "rw"}}, # 限制资源 mem_limit="512m", # 禁用网络(如果任务不需要) network_disabled=True ) agent = create_deep_agent( # 可以通过配置项传递沙箱,具体方式需参考最新文档或源码 # 通常需要自定义工具绑定或通过上下文配置 )重要提示:沙箱配置是深度定制的需求。截至撰写时,Deep Agents可能尚未在高级API中直接暴露沙箱配置。你需要查阅其底层
ShellTool的实现,或者通过自定义一个封装了execute功能但强制在沙箱内运行的新工具来实现。安全无小事,这是生产部署前必须解决的问题。
最小权限原则即使有沙箱,也应遵循最小权限原则。为智能体创建一个专用的、权限受限的系统用户,并确保沙箱容器以该用户身份运行。只挂载必要的目录,并设置为只读(ro)模式除非确需写入。
5.2 性能优化与成本控制
利用流式响应对于需要长时间运行的任务,使用agent.stream()而不是agent.invoke()。这不仅能给用户提供实时反馈,提升体验,还能让你在早期发现任务是否偏离预期,及时中断。
混合模型策略如前所述,利用subagent_config为子任务分配更轻量、更便宜的模型。主智能体负责高层次的规划和决策,子智能体处理具体的、定义明确的子任务(如代码格式化、文本摘要)。这能显著降低API调用成本。
上下文管理调优Deep Agents的自动总结机制是默认开启的。你可以调整其触发阈值,以平衡上下文利用率和信息丢失。
# 假设存在这样的配置参数(具体参数名需查证) agent = create_deep_agent( summarization_threshold=0.8 # 当上下文使用率达到80%时触发总结 )如果智能体在处理需要精确引用历史细节的任务时表现不佳,可以尝试调高这个阈值,或者为特定对话关闭自动总结(如果API支持)。
5.3 集成MCP(模型上下文协议)服务器
MCP(Model Context Protocol)是一个新兴协议,旨在标准化LLM与外部数据源(如数据库、代码库、SaaS工具)的连接方式。Deep Agents通过langchain-mcp-adapters支持MCP。
这意味着你可以轻松地将智能体连接到公司的PostgreSQL数据库、Notion知识库或Jira系统,而无需为每个数据源编写复杂的自定义工具。智能体可以通过MCP服务器查询这些数据源,就像使用内置工具一样自然。这极大地扩展了智能体的感知和行动边界。
# 示例:连接到一个假设的MCP服务器(具体连接方式取决于适配器) # from langchain_mcp_adapters import MCPClient # mcp_client = MCPClient(server_url="http://localhost:8080") # agent = create_deep_agent(tools=mcp_client.get_tools())5.4 调试与监控:使用LangSmith
LangSmith是LangChain提供的LLM应用开发平台,它提供了强大的跟踪、调试和监控能力。Deep Agents与LangSmith无缝集成。
# 设置环境变量 export LANGCHAIN_TRACING_V2=true export LANGCHAIN_API_KEY="your_langchain_api_key" export LANGCHAIN_PROJECT="my_deepagents_project"设置好环境变量后,再次运行你的智能体。所有的调用、工具执行、token消耗、延迟等信息都会被记录到LangSmith。你可以在其Web界面上清晰地看到每一次智能体运行的完整轨迹(Trace),包括每一步的输入输出、模型思考过程。这对于理解智能体为何做出某个决策、优化提示词、定位性能瓶颈不可或缺。
6. 常见问题与故障排除实录
在实际使用中,你可能会遇到一些典型问题。以下是我在项目实践中总结的一些经验和解决方案。
问题1:智能体陷入循环,不断重复调用同一个工具。
- 现象:智能体反复执行
ls或read_file,无法推进任务。 - 原因:通常是提示词不够清晰,或者工具返回的结果未能给模型提供足够的决策信息。也可能是上下文窗口已满,导致模型“忘记”了之前的步骤。
- 排查与解决:
- 检查LangSmith轨迹:查看模型在每次循环中接收到的消息,确认它是否理解了任务目标。
- 优化系统提示词:在系统提示中明确指令,例如“请制定一个清晰的计划并逐步执行,避免重复操作。”
- 增强工具输出:确保你的自定义工具返回结构清晰、信息丰富的字典,而不仅仅是简单的字符串或数字。
- 检查上下文:观察是否触发了自动总结,导致关键细节丢失。可以考虑调高总结阈值或在关键步骤后让智能体手动保存摘要到文件。
问题2:execute工具执行命令失败,但错误信息不明确。
- 现象:智能体报告命令执行失败,但只返回了简单的错误码。
- 原因:沙箱环境可能缺少必要的命令或权限,或者命令本身有语法错误。
- 排查与解决:
- 模拟执行:在配置的沙箱环境(如Docker容器)中手动运行智能体试图执行的命令,验证其可行性。
- 捕获详细输出:修改你的
execute工具封装,使其同时捕获标准输出(stdout)和标准错误(stderr),并将两者都返回给模型,这有助于模型诊断问题。 - 提供更安全的备选方案:对于复杂的Shell操作,考虑提供更具体的工具来代替通用的
execute。例如,创建一个run_python_test工具,它内部固定调用pytest,这比让模型自己拼写pytest命令更安全可靠。
问题3:智能体在处理大型代码库时速度很慢,Token消耗巨大。
- 现象:分析一个包含数百个文件的项目时,响应时间很长,API成本激增。
- 原因:智能体可能试图一次性读取太多文件内容到上下文中。
- 排查与解决:
- 引导式探索:在系统提示中教导智能体“先通过
ls和glob了解整体结构,再选择最关键的文件(如入口文件、主要的__init__.py、配置文件)进行精读”。 - 使用
grep进行过滤:鼓励智能体使用grep工具先定位到包含特定关键字(如class、def、import)的行,再读取相关文件的部分内容,而不是全量读取。 - 分阶段任务:将“分析整个代码库”拆分成多个子任务,通过多次
invoke来完成。每次调用专注于一个模块或一个方面,并利用检查点功能保存进度。
- 引导式探索:在系统提示中教导智能体“先通过
问题4:自定义工具不被智能体调用。
- 现象:明明添加了工具,但智能体似乎“看不见”它,从不使用。
- 原因:可能是工具的描述(docstring)不够清晰,导致模型无法理解其用途;或者是工具的参数定义太复杂;也可能是模型能力不足。
- 排查与解决:
- 审查工具描述:确保docstring清晰、简洁地说明了工具的功能、每个参数的意义和格式。可以参考内置工具的描述风格。
- 简化工具设计:一个工具只做一件事。如果需要复杂功能,拆分成多个小工具。
- 在提示词中强调:在系统提示里明确提到:“你可以使用
get_user_profile工具来查询用户信息。” - 使用更强的模型:如果使用较小的开源模型,可能会影响工具调用的准确性。尝试切换到GPT-4o或Claude 3.5等顶级模型进行测试。
问题5:流式输出不显示模型“思考”过程。
- 现象:使用
agent.stream()时,只看到最终结果,看不到中间的推理和工具调用。 - 原因:
stream_mode参数设置可能不正确,或者处理流式响应的代码只打印了最终消息的content。 - 解决:确保像之前示例那样,在循环中检查
chunk的messages和tool_calls字段。stream_mode="values"会流式返回整个状态的增量更新,而stream_mode="messages"可能只流式返回新的消息内容。查阅LangGraph的流式文档以选择最适合调试的模式。
Deep Agents作为一个新兴但背景强大的框架,它极大地简化了功能型AI智能体的构建流程。它的价值在于提供了一个经过深思熟虑的、可直接运行的起点,而不是一个需要从零搭建的脚手架。对于大多数应用场景,从Deep Agents开始,然后按需定制,是当前最快、最稳健的路径。当然,它的“黑盒”特性也意味着,当你需要极度精细的控制或非标准的工作流时,可能仍需回归到原始的LangGraph进行更底层的构建。理解其内置的工作流和设计哲学,是高效利用它的关键。
