框架调研 · 08

DeerFlow:字节跳动的 Deep Research 框架

DeerFlow 是字节跳动 2025 年初开源的 Deep Research 框架,用于自动化地进行深度信息调研并生成结构化报告。它底层基于 LangGraph,是”用框架搭框架”的典型案例。

GitHub:bytedance/deer-flow

是什么

给定一个研究问题,DeerFlow 会:

  1. 规划:把问题拆解成多个子研究方向
  2. 搜索:并行搜索网络,收集信息
  3. 分析:对搜索结果进行摘要和筛选
  4. 综合:把所有子结果整合成结构化报告

类似 OpenAI Deep Research、Perplexity Deep Research,但完全开源可自部署。

架构

用户输入问题
    |
[Coordinator Agent]  ← 协调整个流程
    |
[Planner Agent]      ← 把问题拆成子任务
    |
    +-- [Researcher Agent 1]  ← 并行研究子任务
    +-- [Researcher Agent 2]
    +-- [Researcher Agent N]
    |
[Writer Agent]       ← 整合结果,生成最终报告
    |
最终研究报告

安装与配置

git clone https://github.com/bytedance/deer-flow.git
cd deer-flow
pip install -r requirements.txt

配置文件 conf.yaml

# LLM 配置
BASIC_MODEL:
  base_url: "https://api.openai.com/v1"
  model: "gpt-4o"
  api_key: "your-key"

REASONING_MODEL:
  base_url: "https://api.openai.com/v1"
  model: "o3-mini"
  api_key: "your-key"

# 搜索配置
SEARCH_API: "tavily"  # 或 "serper", "duckduckgo"
TAVILY_API_KEY: "your-tavily-key"

基本使用

import asyncio
from src.workflow import run_agent_workflow

async def main():
    # 运行深度研究
    result = await run_agent_workflow(
        user_input="分析 2024-2025 年 AI Agent 框架生态的发展趋势",
        debug=True,
    )
    print(result["final_report"])

asyncio.run(main())

或者直接命令行:

python main.py --query "LangGraph vs AutoGen 技术对比分析"

核心流程代码(简化版)

DeerFlow 的核心是 LangGraph 的多 Agent 图,下面是简化后的关键逻辑:

from langgraph.graph import StateGraph, END
from typing import TypedDict, List, Annotated
import operator

class ResearchState(TypedDict):
    user_input: str
    research_plan: List[str]
    search_results: Annotated[List[str], operator.add]
    final_report: str

def coordinator_node(state: ResearchState) -> dict:
    """协调器:判断是直接回答还是需要深度研究"""
    # 简单问题直接回答,复杂问题启动研究流程
    return {}

def planner_node(state: ResearchState) -> dict:
    """规划器:把问题拆解成子研究任务"""
    question = state["user_input"]

    # 调用 LLM 生成研究计划
    plan_response = llm.invoke(f"""
把以下研究问题拆解成 3-5 个独立的子研究方向,每行一个:

问题:{question}

子任务:""")

    tasks = [line.strip() for line in plan_response.content.split("\n") if line.strip()]
    return {"research_plan": tasks}

def researcher_node(state: ResearchState) -> dict:
    """研究员:对一个子任务进行网络搜索和分析"""
    # 每个子任务调用搜索 API
    results = []
    for task in state["research_plan"]:
        search_result = search_web(task)  # 调用 Tavily/Serper
        analyzed = analyze_result(task, search_result)  # LLM 分析
        results.append(analyzed)
    return {"search_results": results}

def writer_node(state: ResearchState) -> dict:
    """写作者:整合所有研究结果,生成最终报告"""
    all_results = "\n\n".join(state["search_results"])

    report = llm.invoke(f"""
基于以下研究材料,为问题"{state['user_input']}"撰写一份深度分析报告:

{all_results}

报告格式:
# 标题
## 执行摘要
## 详细分析
## 结论与建议
""")
    return {"final_report": report.content}

# 组装图
graph = StateGraph(ResearchState)
graph.add_node("coordinator", coordinator_node)
graph.add_node("planner", planner_node)
graph.add_node("researcher", researcher_node)
graph.add_node("writer", writer_node)

graph.set_entry_point("coordinator")
graph.add_edge("coordinator", "planner")
graph.add_edge("planner", "researcher")
graph.add_edge("researcher", "writer")
graph.add_edge("writer", END)

Web UI

DeerFlow 提供了 Next.js 前端:

cd web
npm install
npm run dev
# 访问 http://localhost:3000

前端展示:

  • 实时查看每个 Agent 的执行过程
  • 流式显示搜索结果和分析过程
  • 最终报告的 Markdown 渲染

自定义搜索工具

from src.tools.search import create_search_tool

# 接入自定义搜索源
def custom_search(query: str) -> list[dict]:
    """接入内部知识库或特定数据源"""
    results = your_internal_api.search(query)
    return [{"title": r.title, "content": r.content, "url": r.url} for r in results]

# 注册到 DeerFlow
search_tool = create_search_tool(custom_search)

与自己搭建的对比

维度 DeerFlow 自己用 LangGraph 搭
上手速度 快,clone 即用 慢,需要设计架构
灵活性 受限于 DeerFlow 结构 完全自由
生产可用 需要适配 根据需求定制
学习价值 读源码学多 Agent 设计 深度理解每个组件

优缺点

优点:

  • 开源、可本地部署,数据不出境
  • 基于 LangGraph,架构清晰可读
  • 提供 Web UI,演示效果好
  • 字节跳动生产验证

缺点:

  • 需要搜索 API(Tavily/Serper 付费)
  • 研究任务耗时较长(多轮搜索+分析)
  • 定制需要改源码,不如自建灵活

适合什么场景

  • 需要自动化深度研究报告的业务
  • 竞品分析、市场调研自动化
  • 企业内部知识库的深度问答
  • 想学习多 Agent 系统设计(读源码)