---
title: "deepagents学习打卡day04"
source: https://www.zbhgis.com/note/note-20260919-1
author: zbhgis 浩瀚地学
created: 2026-09-19
tags: [Agent, Agent]
---

> 本文来自浩瀚地学，规范页面（含代码高亮与图片灯箱）：https://www.zbhgis.com/note/note-20260919-1
# deepagents学习打卡day04

个人主页：https://github.com/zbhgis/

# 打卡记录

## deepagents输出

```bash

============================================================
最终回答
============================================================


# LangGraph / CrewAI / AutoGen 定位差异调研

## 一句话概括（核心答案）

| 框架 | 最适合场景（一句话） |
|---|---|
| **LangGraph** | **需要精细控制、可持久化、可回放、含循环/分支/人工审批的长时生产级状态机型 Agent 工作流**（如客服工单、内容审核、企业审批链路）。 |
| **CrewAI** | **任务天然可拆成"角色分工"、追求快速搭建、类团队协作的中小型多智能体应用**（如市场调研+分析+写稿、内容营销流水线）。 |
| **AutoGen** | **通过多智能体"对话/群聊"来探索式求解问题、需要大量代码生成与执行、研究原型或人机协同调试的场景**（如编程助手、科研原型、Magentic-One 这类开放式 Agent 团队）。 |

---

## 差异要点对照

**1. LangGraph —— "图 + 状态机"的低层编排引擎**
- 定位：LangChain 生态下的**低层编排框架与运行时**，把 LLM 应用建模成**有向状态图**（节点=步骤、边=跳转）。
- 关键能力：类型化共享状态、条件边、循环、持久化 checkpoint、`interrupt_before` 人工打断/恢复、流式输出。
- 优势：控制力最强、生产成熟度最高、Token 效率好；Klarna、Uber、J.P. Morgan 在用。
- 代价：学习曲线最陡，需要事先设计好 State Schema。
- 适合：需要**确定性、可审计、可回放**的企业级 Agent 生产系统。

**2. CrewAI —— "角色 + 团队"的高层抽象**
- 定位：由 João Moura 创建的**独立开源框架**，围绕 `Agent / Crew / Task` 三个核心对象，让不同"角色"（研究员、分析师、写手…）像人类团队一样协作。
- 关键能力：角色人设、任务委派、Crew 级资源共享、易上手。
- 优势：上手最快、抽象直观，适合"任务可自然拆成角色"的业务（研究、分析、报告、编码）。
- 代价：控制粒度较弱，复杂日志/调试体验一般，长期企业承诺的框架风险相对更高。
- 适合：**中小规模、快速交付、角色分工清晰**的多 Agent 业务应用。

**3. AutoGen —— "对话驱动"的多智能体框架**
- 定位：微软研究院发起的**多智能体对话框架**，把任务视为多个可对话 Agent（LLM/工具/人类）之间的自动聊天，拓扑可根据对话动态调整。
- 关键能力：GroupChat、动态/静态会话拓扑、强代码生成与执行、human-in-the-loop。
- 优势：编程式代码执行能力最强，适合探索型、开放式问题；衍生出 Magentic-One 等 Agent 团队。
- 代价：Token 开销最大、代码可读性随规模下降；⚠️ **2026 年起已进入维护模式**，微软官方已推出合并了 AutoGen 与 Semantic Kernel 的 **Microsoft Agent Framework** 作为继任者。
- 适合：**研究原型、需要多方 Agent 自由对话协商**、以及代码密集型的探索式求解。

---

## 选型速查

- 学习曲线：CrewAI（最易）> AutoGen（中）> LangGraph（最陡）
- 控制力：LangGraph > AutoGen > CrewAI
- 生产成熟度：LangGraph > CrewAI > AutoGen
- 代码执行：**AutoGen 最强**
- 常见混搭：CrewAI 做研究/合成阶段，LangGraph 做审批/执行阶段；AutoGen 做生成/迭代阶段，LangGraph 做落地阶段。
- 若新项目：优先 LangGraph 或 Microsoft Agent Framework；仅在任务天然角色化、且追求速度时才用 CrewAI；AutoGen 新项目建议直接看 Microsoft Agent Framework。
✅ Agent 发起了 write_todos 工具调用
✅ 找到 write_todos 调用: Updated todo list to [{'content': '调研 LangGraph 的定位、特性、适用场景', 'status': 'in_progress'}, {'content': '调研 CrewAI 的定位、特性、适用场景', 'status': 'pending'}, {'content': '调研 AutoGen 的定位、特性、适用场景', 'status': 'pending'}, {'content': '对比三者差异，给出各自最适合场景的一句话概括', 'status': 'pending'}]
✅ Agent 发起了 write_todos 工具调用
✅ 找到 write_todos 调用: Updated todo list to [{'content': '调研 LangGraph 的定位、特性、适用场景', 'status': 'completed'}, {'content': '调研 CrewAI 的定位、特性、适用场景', 'status': 'completed'}, {'content': '调研 AutoGen 的定位、特性、适用场景', 'status': 'completed'}, {'content': '对比三者差异，给出各自最适合场景的一句话概括', 'status': 'completed'}]
```



## langsmith记录

![image-20260918212535314](https://cdn.jsdelivr.net/gh/zbhgis/BlogImg2@main/blog/202609182125720.png)

## 完整代码

```python
"""
一个使用 todo 机制拆解复杂任务的小型研究 Agent。
核心：显式启用 TodoListMiddleware，让 Agent 获得 write_todos 工具。
"""

import os
from typing import Literal

from dotenv import load_dotenv
from tavily import TavilyClient
from langchain_openai import ChatOpenAI
from langchain.agents.middleware import TodoListMiddleware
from deepagents import create_deep_agent
from deepagents.backends import StateBackend

# 1.模型
load_dotenv()
model = ChatOpenAI(
    model=os.environ.get("LLM_MODEL_NAME"),
    api_key=os.environ.get("LLM_API_KEY"),
    base_url=os.environ.get("LLM_BASE_URL"),
)


# 2.搜索工具
tavily = TavilyClient(api_key=os.environ.get("TAVILY_API_KEY"))


def internet_search(query: str, max_results: int = 5) -> dict:
    """Search the web for the given query."""
    return tavily.search(query, max_results=max_results)


# 3.系统提示词
SYSTEM_PROMPT = """你是一位技术研究员。
面对复杂研究任务时，请先使用 write_todos 制定研究计划，然后逐步执行。
每完成一步，及时更新任务状态。最终给出完整回答。
"""

# 4.创建带todo能力的Agent
agent = create_deep_agent(
    model=model,
    tools=[internet_search],
    system_prompt=SYSTEM_PROMPT,
    backend=StateBackend(),  # 内存文件系统，简化演示
    middleware=[TodoListMiddleware()],  # 关键：显式启用任务规划
)


# 5.执行一个需要多步骤的研究任务
query = (
    "调研 LangGraph、CrewAI 和 AutoGen 三个 Agent 框架的定位差异，"
    "分别用一句话概括它们各自最适合的场景。"
)

result = agent.invoke({"messages": [{"role": "user", "content": query}]})

# 6.输出最终回答
print("\n" + "=" * 60)
print("最终回答")
print("=" * 60)
print(result["messages"][-1].content)


# 7.打印所有消息，查找 ToolMessage
for msg in result["messages"]:
    if hasattr(msg, 'name') and msg.name == 'write_todos':
        print("✅ 找到 write_todos 调用:", msg.content)
    elif hasattr(msg, 'tool_calls'):
        for tc in msg.tool_calls:
            if tc['name'] == 'write_todos':
                print("✅ Agent 发起了 write_todos 工具调用")
```



# 踩坑记录

1.有的时候模型不会调用write_todos工具，有的话能够明确在langsmith中找到trace记录；

2.如果没有的话，多运行几次或者加强提示词。

# 关键内容

1.写入代办：write_todos工具，本质上是启用 `TodoListMiddleware` 后，任务以 pending、in_progress、completed 三种状态保存在 Agent State 中

2.上下文压缩：启用`SummarizationMiddleware`

3.create_deep_agent()的配置

![image-202609181745982](https://cdn.jsdelivr.net/gh/zbhgis/BlogImg2@main/blog/202609181745982.png)

4.不同配置的作用

![Deep Agents v0.7 中间件职责与配置方式：默认提供文件操作、上下文压缩和缺失响应处理；通过专用参数配置子 Agent、Skills、Memory 和人工审批；通过 middleware 配置 Todo、重试等能力；Checkpointer 单独负责状态保存与恢复](https://cdn.jsdelivr.net/gh/zbhgis/BlogImg2@main/blog/202609181747830.png)

# 参考教程

第4章

https://datawhalechina.github.io/deepagents-in-action/chapters/ch04-task-planning/
