深度研究框架 ByteDance DeerFlow
DeerFlow是字节跳动开源的多模态AI研究框架,集成了文本分析、代码执行、图像/音频合成等功能。其核心采用LangGraph构建的多代理系统,包含协调器、研究员、程序员等角色,支持从信息收集到报告生成的完整研究流程。项目已商业化部署至火山引擎,提供在线服务和技术文档生成等企业级应用。技术栈基于Python 3.12+和FastAPI,整合了LiteLLM、多种搜索引擎及私有知识库,具备模块化扩
·
项目概述
DeerFlow(Deep Exploration and Efficient Research Flow)是 ByteDance 开源的一个社区驱动的深度研究框架。它将大语言模型与网络搜索、爬虫、Python 代码执行等专业工具相结合,致力于自动化复杂的研究任务。
项目特点
- 多模态能力:集成文本研究、代码执行、图像生成、音频合成等功能
- 多代理架构:基于 LangGraph 构建的模块化多代理系统
- 人机协作:支持人在循环(Human-in-the-loop)的交互式研究流程
- 社区驱动:开源项目,积极回馈开源社区
项目成就与里程碑
商业化成果
- 正式入驻火山引擎 FaaS 应用中心,提供在线体验服务
- 支持一键部署到火山引擎,降低部署门槛
- 官方网站提供多个实际应用案例展示
技术成果
- GitHub 上获得广泛关注和社区贡献
- 支持多种语言界面(英语、中文、日语、德语、西班牙语、俄语、葡萄牙语)
- 集成多种搜索引擎和知识库系统
- 实现完整的研究报告生成和后期编辑功能
技术栈分析
核心技术栈
后端架构
- Python 3.12+:主要开发语言
- LangChain:LLM 交互和链式操作框架
- LangGraph:多代理编排和工作流管理
- FastAPI:高性能 Web API 框架
- uvloop:高性能异步 I/O 循环
前端技术
- Node.js:JavaScript 运行时
- Next.js:React 全栈框架
- TipTap:富文本编辑器,支持 Notion 风格的块编辑
- pnpm:包管理工具
AI 和 ML 组件
- LiteLLM:多模型 LLM 集成库
- 多种搜索引擎 API:Tavily、Brave Search、DuckDuckGo、Arxiv
- RAG 系统:RAGFlow、VikingDB 私有知识库集成
- TTS 引擎:火山引擎语音合成 API
开发工具
- uv:Python 环境和依赖管理
- Docker:容器化部署
- Marp:PPT 生成工具
- Pytest:单元测试框架
技术优势
- 模块化架构:基于 LangGraph 的状态管理和消息传递系统,易于扩展和维护
- 多模态集成:无缝整合文本、代码、音频、演示文稿生成能力
- 灵活的 LLM 支持:通过 LiteLLM 支持几乎所有主流语言模型
- 强大的搜索能力:集成多种搜索引擎,支持学术论文检索
- 私有知识库支持:可接入企业私有文档和知识库
技术劣势
- 依赖复杂性:技术栈复杂,涉及多个外部 API 和服务
- 部署成本:需要配置多个 API 密钥和服务,初始设置门槛较高
- 资源消耗:多代理系统运行时资源消耗较大
- 安全考虑:Python REPL 和 MCP 服务器需要额外的安全评估
使用场景
学术研究场景
- 文献综述:自动搜索、整理和分析学术论文
- 技术调研:深入分析新技术趋势和发展方向
- 市场研究:收集和分析行业数据,生成研究报告
企业应用场景
- 竞品分析:自动收集竞争对手信息,生成分析报告
- 技术文档生成:基于代码库自动生成技术文档和 API 文档
- 内容营销:生成博客文章、白皮书和营销材料
教育培训场景
- 课程材料制作:生成教学内容、演示文稿和播客
- 学习辅助:帮助学生进行深度研究和知识梳理
- 培训内容开发:创建企业培训材料和技术文档
媒体内容创作
- 新闻报道:快速收集信息并生成深度报道
- 播客制作:自动生成播客脚本并合成音频
- 多媒体内容:结合文字、图像和音频的综合内容创作
代码结构分析
项目目录结构
deer-flow/
├── src/ # 核心源代码
│ ├── agents/ # 多代理实现
│ │ ├── coordinator.py # 协调器代理
│ │ ├── planner.py # 规划器代理
│ │ ├── researcher.py # 研究员代理
│ │ ├── coder.py # 编程代理
│ │ └── reporter.py # 报告生成代理
│ ├── tools/ # 工具集合
│ │ ├── search/ # 搜索工具
│ │ ├── crawl/ # 爬虫工具
│ │ ├── python_repl/ # Python 执行环境
│ │ └── tts/ # 语音合成工具
│ ├── workflows/ # LangGraph 工作流定义
│ ├── utils/ # 工具函数
│ └── config/ # 配置管理
├── web/ # 前端 Web 应用
│ ├── components/ # React 组件
│ ├── pages/ # 页面组件
│ └── api/ # API 路由
├── tests/ # 测试代码
├── examples/ # 示例和案例
├── docs/ # 文档
├── docker/ # Docker 配置
├── main.py # 主入口文件
├── conf.yaml.example # 配置示例
├── .env.example # 环境变量示例
└── langgraph.json # LangGraph 配置
核心组件架构
1. 多代理系统
python
# 代理角色定义
class Agent:
def __init__(self, name: str, tools: List[Tool]):
self.name = name
self.tools = tools
self.llm = create_llm_instance()
async def execute(self, state: AgentState) -> AgentState:
# 代理执行逻辑
pass
# 协调器代理
class Coordinator(Agent):
"""管理整个研究生命周期的入口代理"""
# 规划器代理
class Planner(Agent):
"""负责任务分解和执行计划制定"""
# 研究员代理
class Researcher(Agent):
"""执行网络搜索和信息收集"""
# 编程代理
class Coder(Agent):
"""处理代码分析和执行"""
# 报告器代理
class Reporter(Agent):
"""生成最终研究报告"""
2. 工作流管理
python
from langgraph.graph import StateGraph
from langgraph.prebuilt import ToolNode
# 状态定义
class ResearchState(TypedDict):
messages: List[BaseMessage]
research_plan: Optional[str]
research_results: List[Dict]
final_report: Optional[str]
# 构建工作流图
def create_research_workflow():
workflow = StateGraph(ResearchState)
# 添加节点
workflow.add_node("coordinator", coordinator_node)
workflow.add_node("planner", planner_node)
workflow.add_node("researcher", researcher_node)
workflow.add_node("coder", coder_node)
workflow.add_node("reporter", reporter_node)
# 添加边和条件路由
workflow.add_edge("coordinator", "planner")
workflow.add_conditional_edges(
"planner",
should_continue_research,
{
"continue": "researcher",
"finish": "reporter"
}
)
return workflow.compile()
主要执行步骤
1. 初始化阶段
- 加载配置文件和环境变量
- 初始化 LLM 模型和 API 连接
- 创建工作流图和代理实例
2. 请求处理阶段
- 接收用户研究请求
- 协调器代理分析请求类型
- 决定是否需要制定研究计划
3. 计划制定阶段
- 规划器分析研究目标
- 生成结构化执行计划
- 支持人工反馈和计划修改
4. 研究执行阶段
- 研究员代理执行信息收集
- 编程代理处理代码相关任务
- 各代理协作完成研究任务
5. 报告生成阶段
- 报告器整合研究结果
- 生成结构化研究报告
- 支持多媒体内容生成
时序图
mermaid
sequenceDiagram
participant User as 用户
participant Coordinator as 协调器
participant Planner as 规划器
participant Researcher as 研究员
participant Coder as 编程代理
participant Reporter as 报告器
User->>Coordinator: 提交研究请求
Coordinator->>Planner: 创建研究计划
Planner->>User: 展示计划(可选)
User->>Planner: 反馈和修改
Planner->>Researcher: 执行信息收集
Researcher->>Researcher: 网络搜索和爬取
Researcher->>Coder: 代码分析任务
Coder->>Coder: 执行Python代码
Coder->>Researcher: 返回分析结果
Researcher->>Reporter: 提交研究结果
Reporter->>Reporter: 整合和格式化
Reporter->>User: 生成最终报告
Note over User,Reporter: 支持TTS音频生成和PPT制作
开发示例
1. 基础使用示例
python
# basic_research.py
import asyncio
from src.workflows.research_workflow import create_research_workflow
from src.config.settings import load_config
async def basic_research_example():
"""基础研究功能示例"""
# 加载配置
config = load_config()
# 创建工作流
workflow = create_research_workflow()
# 定义研究请求
initial_state = {
"messages": [{"role": "user", "content": "分析人工智能在医疗领域的应用"}],
"research_plan": None,
"research_results": [],
"final_report": None
}
# 执行研究
final_state = await workflow.ainvoke(initial_state)
# 输出结果
print("研究报告:")
print(final_state["final_report"])
return final_state
# 运行示例
if __name__ == "__main__":
asyncio.run(basic_research_example())
2. 自定义代理示例
python
# custom_agent.py
from src.agents.base import Agent
from src.tools.search import WebSearchTool
from langchain.schema import BaseMessage
class CustomAnalysisAgent(Agent):
"""自定义分析代理示例"""
def __init__(self):
tools = [WebSearchTool(), PythonReplTool()]
super().__init__("custom_analyzer", tools)
async def execute(self, state: dict) -> dict:
"""执行自定义分析逻辑"""
# 获取用户查询
query = state["messages"][-1]["content"]
# 执行网络搜索
search_results = await self.tools[0].run(query)
# 分析搜索结果
analysis_code = f"""
# 分析搜索结果
import json
results = {search_results}
analysis = {{
'total_sources': len(results),
'main_topics': [r.get('title', '') for r in results[:5]],
'summary': '基于搜索结果的初步分析'
}}
print(json.dumps(analysis, ensure_ascii=False, indent=2))
"""
# 执行Python代码
code_result = await self.tools[1].run(analysis_code)
# 更新状态
state["research_results"].append({
"agent": self.name,
"search_results": search_results,
"analysis": code_result
})
return state
# 集成自定义代理
def create_custom_workflow():
"""创建包含自定义代理的工作流"""
workflow = StateGraph(ResearchState)
# 添加自定义代理
custom_agent = CustomAnalysisAgent()
workflow.add_node("custom_analyzer", custom_agent.execute)
# 配置工作流路由
workflow.add_edge("start", "custom_analyzer")
workflow.add_edge("custom_analyzer", "reporter")
return workflow.compile()
3. API 集成示例
python
# api_integration.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from src.workflows.research_workflow import create_research_workflow
app = FastAPI(title="DeerFlow API", version="1.0.0")
class ResearchRequest(BaseModel):
query: str
max_steps: int = 3
auto_accept_plan: bool = True
class ResearchResponse(BaseModel):
report: str
research_plan: str
execution_time: float
@app.post("/research", response_model=ResearchResponse)
async def conduct_research(request: ResearchRequest):
"""研究 API 端点"""
try:
# 创建工作流
workflow = create_research_workflow()
# 准备初始状态
initial_state = {
"messages": [{"role": "user", "content": request.query}],
"max_steps": request.max_steps,
"auto_accept_plan": request.auto_accept_plan
}
# 执行研究
start_time = time.time()
result = await workflow.ainvoke(initial_state)
execution_time = time.time() - start_time
return ResearchResponse(
report=result["final_report"],
research_plan=result["research_plan"],
execution_time=execution_time
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health_check():
"""健康检查端点"""
return {"status": "healthy"}
# TTS 集成示例
@app.post("/tts")
async def text_to_speech(text: str, voice: str = "default"):
"""文本转语音 API"""
from src.tools.tts import TTSService
tts_service = TTSService()
audio_data = await tts_service.synthesize(text, voice)
return {"audio_url": audio_data["url"]}
4. 前端集成示例
javascript
// frontend_integration.js
import React, { useState, useEffect } from 'react';
const ResearchInterface = () => {
const [query, setQuery] = useState('');
const [loading, setLoading] = useState(false);
const [report, setReport] = useState(null);
const handleResearch = async () => {
setLoading(true);
try {
const response = await fetch('/api/research', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: query,
max_steps: 3,
auto_accept_plan: true
})
});
const result = await response.json();
setReport(result);
} catch (error) {
console.error('Research failed:', error);
} finally {
setLoading(false);
}
};
return (
<div className="research-interface">
<div className="input-section">
<textarea
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="输入您的研究问题..."
rows={4}
cols={50}
/>
<button onClick={handleResearch} disabled={loading}>
{loading ? '研究中...' : '开始研究'}
</button>
</div>
{report && (
<div className="results-section">
<h3>研究计划</h3>
<pre>{report.research_plan}</pre>
<h3>研究报告</h3>
<div dangerouslySetInnerHTML={{ __html: report.report }} />
<p>执行时间: {report.execution_time.toFixed(2)} 秒</p>
</div>
)}
</div>
);
};
export default ResearchInterface;
项目评价总结
技术创新性
DeerFlow 在多代理研究自动化领域具有显著的技术创新性,特别是在 LangGraph 基础上构建的模块化架构和人机协作机制方面表现出色。
实用性
项目具有很强的实用价值,能够解决实际的研究和内容创作需求,特别适合需要大量信息收集和分析的场景。
社区影响力
作为 ByteDance 的开源项目,DeerFlow 已经获得了广泛的社区关注,并且积极回馈开源生态系统。
发展前景
随着大模型技术的发展和多代理系统的成熟,DeerFlow 有望在自动化研究和内容生成领域发挥更大的作用。
建议改进方向
- 安全性增强:加强代码执行环境的安全隔离
- 性能优化:优化多代理协作的资源使用效率
- 插件生态:建立更丰富的工具和插件生态系统
- 易用性提升:简化部署和配置流程
DeerFlow 代表了当前多代理 AI 系统在研究自动化领域的先进水平,是一个值得深入学习和应用的优秀开源项目。
更多推荐
所有评论(0)