Multi-Agent实战:Deep Research
Deep Research — 多 Agent 协作深度研究系统概述一个纯手搓的多 Agent 研究系统。用户输入一个研究问题系统自动从 4 个认知维度并行搜索、Agent 间对抗辩论验证声明可信度、最终综合输出带置信度标注的中文研究报告。零编排框架依赖——Agent 循环、消息管理、工具调用、上下文压缩、并行编排全部自研约 2100 行 Python。架构全景用户输入 → main.py (CLI 日志) │ ▼ pipeline.py (三阶段流水线) │ ├── Phase 1: Orchestrator → 4 研究员并行搜索 (Fan-out) │ 产出: 4 张 ResearchCard (每张含 5-10 条 Claim) │ ├── Phase 2: Verifier → Refuter → Verifier rebuttal (Pipeline) │ 产出: 4 张 VerifiedCard (每条 Claim 标记 verified/suspect/false/disputed) │ └── Phase 3: Scorer Extractor (Barrier) → Editor 产出: report.md evidence.json audit.jsonl核心模块1. Agent 层 (core/agent.py)每个 Agent 是一个完整的 LLM 自主循环┌──────────────────────────────────────────┐ │ Agent.run(task) │ │ │ │ 1. 追加 task 到 mutable_messages │ │ 2. 检查是否需要压缩 (compressor) │ │ 3. 组装上下文: system blackboard msg │ │ 4. 调用 LLM (litellm.acompletion) │ │ 5. 有 tool_calls? → 执行工具 → 回到 2 │ │ 6. 无 tool_calls → 返回 content │ │ │ │ 最多 20 轮工具调用防止无限循环 │ └──────────────────────────────────────────┘关键设计决策mutable_messages[]是 Agent 的私有对话历史完全透明可观测。每次run()重置为空Agent 之间无隐式状态泄漏。_call_llm()不做任何后处理——原样返回{content, tool_calls}字典调用方决定如何处理。Blackboard 上下文在每次 LLM 调用时动态注入为 system 消息不是静态拼接。2. 工具层 (core/tool.py)每个工具继承BuildTool遵循四阶段流水线validate_input() → 类型检查、默认值填充、参数校验 │ check_permissions() → 安全门禁 (URL 白名单、路径沙箱) │ execute() → 干活 (API 调用、文件读取、数据库查询) │ format_result() → 转成 LLM 能消费的文本classFirecrawlSearchTool(BuildTool):namefirecrawl_searchdescription搜索网络...parameters{# JSON Schema直接用作 OpenAI function callingtype:object,properties:{query:{type:string},limit:{type:integer},},required:[query],}asyncdefexecute(self,args):# 同步 API 调用用 asyncio.to_thread 包装returnawaitasyncio.to_thread(lambda:Firecrawl(api_key...).search(...))defformat_result(self,raw):# Firecrawl 返回对象 → 文本列表return\n.join(f{r.title}\n{r.url}\n{r.description}forrinraw.data)当前工具集工具基类类型说明firecrawl_searchBuildTool搜索Firecrawl API 全网搜索tavily_searchBuildTool搜索Tavily API 结构化搜索web_fetchBuildTool读取HTTP GET HTML→textsqlite_readBuildTool数据库读取 Run 的所有研究数据工具按 API key 可用性动态加载get_search_tools()检查FIRECRAWL_API_KEY和TAVILY_API_KEY返回实际可用的工具列表。3. Blackboard (core/blackboard.py)Agent 间通过 Blackboard 交换数据不通过函数参数传递Phase 1 完成: blackboard.write(run:42:cards, [ResearchCard × 4]) Phase 2 Verifier: cards blackboard.read(run:42:cards) ← 直接从黑板上拿 Phase 3 Scorer: cards blackboard.read(run:42:cards) verified blackboard.read(run:42:verified)Blackboard 是非侵入式的——Agent 的_call_llm()在每次调用前自动从 Blackboard 提取相关上下文注入 system 消息。Agent 本身不感知 Blackboard 的存在。4. 压缩层 (core/compressor.py)当 Agent 的mutable_messages超过 30 条时滑动窗口 LLM 摘要旧消息 [0..N-20] → LLM 生成摘要 → [summary]: 已搜索了 X、Y、Z主要发现... 最近消息 [N-20..N] → 保留原文压缩用独立的 LLM 调用DeepSeek Chatmax_tokens800失败时优雅降级为(summary unavailable)。5. 文件去重 (core/file_cache.py)两个研究员访问同一个 URL 时不重复请求cacheFileCache(ttl_seconds300)# 5 分钟过期contentcache.get_or_fetch(https://arxiv.org/paper.pdf,fetcherhttpx.get)6. 编排器 (core/orchestrator.py)三个组合原语全部基于标准库asyncio# 并行 — 一个失败不影响其他resultsawaitparallel(task_a(),task_b(),task_c())# 串行流水线 — 前一个的输出是后一个的输入finalawaitpipeline(initial,stage1,stage2,stage3)# 屏障 — 语义别名awaitbarrier(score(),extract())# 等价于 parallel10 个 Agent 配置所有 Agent 配置集中在agents/registry.py声明式定义industry:{role:行业全景研究员,goal:绘制竞争格局、采用模式和真实世界使用情况。...,backstory:你是一位追踪技术采用曲线的行业分析师。...,tools:[*get_search_tools(),WebFetchTool()],llm:deepseek,}create_agent(**config)工厂函数负责组装Agent实例——注入 LLM 配置、Blackboard、FileCache。全线使用 DeepSeek Chat。#Agent工具职责1Orchestrator无拆解问题 → 4 份 Research Brief2-54×Researcher搜索 WebFetch多视角并行搜索产出 Claim 列表6VerifierWebFetch SQLite逐条核查来源真实性7Refuter搜索主动搜索反面证据、逻辑漏洞8ScorerSQLite三维度 (来源/一致性/覆盖) 评分9ExtractorSQLite提炼共识、矛盾、盲区、时效性10EditorSQLite撰写 5 段式中文报告Phase 1 详细流程Fan-out 并行研究Orchestrator.run(task) │ 把 X 拆成 4 个视角输出 JSON │ → {technical: {sub_q, keywords, sources}, industry: {...}, ...} │ ├─ Researcher[technical].run(技术深度视角...) ──┐ ├─ Researcher[industry].run(行业全景视角...) ──┤ ├─ Researcher[critical].run(批判质疑视角...) ──┤ parallel() └─ Researcher[future].run(未来趋势视角...) ──┘ │ 每个 Researcher 内部循环: LLM → tool_calls(firecrawl_search) → 执行 → 结果追加 LLM → tool_calls(web_fetch) → 执行 → 结果追加 LLM → tool_calls(firecrawl_search) → 执行 → 结果追加 LLM → content(JSON ResearchCard) → 返回 parse_json_response() → safe_construct_list(Claim) → ResearchCard 重试: 如果输出是 ReAct 文本格式 → 纠正提示 → 重试 (最多 2 次)Phase 2 详细流程对抗验证每个 ResearchCard 独立进入 3 轮辩论流水线Pipeline 模式4 张卡并行ResearchCard │ ├─ Round 1: Verifier │ 逐条核查URL 可访问来源支持声明置信度合理 │ → entries: [{claim_index, status: verified|suspect|false, reasoning}] │ → 全部 verified? → ✅ 提前结束跳过 Round 2/3 │ ├─ Round 2: Refuter (仅在 Round 1 有可疑时触发) │ 刻意攻击搜反面证据、找逻辑漏洞、抓过度泛化 │ → refutations: [{claim_index, challenge, severity, counter_evidence}] │ → 无反驳? → ✅ 提前结束 │ └─ Round 3: Verifier rebuttal (仅在 Round 2 有反驳时触发) 回应每项质疑ACCEPT/REJECT/DISPUTED → final entries resolved: true/false早期退出机制如果 Round 1 全部 verified跳过后续轮次如果 Round 2 无反驳同样提前结束。只有真正有争议的声明才走完三轮。Phase 3 详细流程综合输出┌─ Scorer.run(task) ──→ ScoreResult ──┐ barrier()─┤ ├─→ Editor → report.md └─ Extractor.run(task) ──→ InsightResult ┘ └─→ evidence.json └─→ audit.jsonlScorer 和 Extractor 并行执行Barrier都完成后 Editor 收到两者的产物开始撰写报告。如果 Editor 输出为空自动降级为结构化数据生成的 fallback 报告。数据流总览Phase 1 Phase 2 Phase 3 ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │Orchestrat│───→│Researcher│───→│ Verifier │───→│ Scorer │──┐ │ 拆解 │ │ ×4 并行 │ │ 核查 │ │ 评分 │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ ├─→ Editor ─→ report.md ▼ ▼ ▼ │ ResearchCard VerifiedCard ScoreResult │ ×4 (Blackboard) ×4 (Blackboard) (Blackboard) │ │ ┌──────────┐ │ │Extractor │───────┘ │ 提炼 │ └──────────┘ InsightResult (Blackboard)关键技术栈层技术说明LLM 调用litellm统一的 completion 接口支持任何 OpenAI-compatible 端点数据模型Pydantic v2Claim / ResearchCard / VerifiedCard / ScoreResult / InsightResult状态存储SQLite WAL6 表写操作带锁重试 (5 次0.5s 退避)JSON 解析response_parser.py4 策略管线直接解析 → fence 提取 → 正则提取 → JSON 修复安全构建safe_construct.pyPydantic 逐字段构建单字段异常不丢整卡搜索Firecrawl Tavily按 API key 可用性动态加载消息压缩Compressor滑动窗口 (保留 20 条) LLM 摘要文件缓存FileCacheURL 级去重TTL 300s并行编排asyncio.gatherreturn_exceptionsTrue单 Agent 崩溃不连累其他日志logging双通道 (file DEBUG console INFO)第三方库静音运行cddeep-researchcp.env.example .env# 填入 DEEPSEEK_API_KEY, FIRECRAWL_API_KEY, QWEN_*pipinstall-e.deep-research你的研究问题产出在runs/{run_id}/report.md— 5 段式中文研究报告evidence.json— 完整结构化证据audit.jsonl— 逐事件审计追踪 (可回放)项目地址本项目已开源在 GitHub 上欢迎 Star、Fork 和贡献GitHub 仓库: https://github.com/bai1535/deep-research

相关新闻

租赁巨头大黄蜂:设备跑全国,签约不等待

租赁巨头大黄蜂:设备跑全国,签约不等待

2026年4月,海南华铁披露2025年年报:全球租赁百强升至第27位,营收59.85亿元,同比增长15.74%。这家租赁巨头旗下的大黄蜂,除了在高空作业平台市场领跑,其内部运营的数字化也在提速——年签约量160万份&#x…

2026/7/18 23:55:38 阅读更多 →
Kubernetes网络CNI插件深度对比:Calico、Cilium与Flannel在大规模集群中的性能数据与选型决策

Kubernetes网络CNI插件深度对比:Calico、Cilium与Flannel在大规模集群中的性能数据与选型决策

Kubernetes网络CNI插件深度对比:Calico、Cilium与Flannel在大规模集群中的性能数据与选型决策 一、背景与动机 在Kubernetes生产环境中,网络性能直接影响应用的响应时间和系统的可扩展性。CNI(Container Network Interface)插件作…

2026/7/18 23:55:38 阅读更多 →
赣州室内设计公司哪家靠谱?答案让你意想不到!

赣州室内设计公司哪家靠谱?答案让你意想不到!

在赣州,选择一家靠谱的室内设计公司至关重要,关乎着居住环境的品质和舒适度。下面为大家详细分析如何选择靠谱的室内设计公司,并推荐一家值得关注的公司——江西省锦尚室内装饰有限公司。行业现状与痛点 当前赣州室内设计行业存在诸多问题。行…

2026/7/18 23:55:38 阅读更多 →

最新新闻

Scroll 水平滚动图片展示区 + 点击跳转查看器

Scroll 水平滚动图片展示区 + 点击跳转查看器

前言 在“海风日记“的日记详情页中,图片展示区使用水平 Scroll 实现图片列表的横向滚动浏览,点击图片可跳转到全屏查看器。 本文将从源码出发,深入讲解水平 Scroll 的实现、图片占位设计和点击跳转逻辑。 一、水平滚动图片区 1.1 源码 i…

2026/7/19 1:13:14 阅读更多 →
日记本横线纸张效果:serif 字体 + 行高 + 背景色

日记本横线纸张效果:serif 字体 + 行高 + 背景色

前言 在“海风日记“的日记详情页中,正文区域使用了纸张感的设计:象牙色背景、serif 衬线字体、36vp 行高,模拟了传统日记本的横线纸张效果。 本文将从源码出发,深入讲解纸张效果的实现,以及字体选择、行高控制和背景…

2026/7/19 1:13:14 阅读更多 →
UE引擎FUObjectArray内存逆向解析与工业软件上云实践

UE引擎FUObjectArray内存逆向解析与工业软件上云实践

1. 项目概述:当UE逆向遇上工业软件上云最近在折腾一个基于Unreal Engine(UE)的工业仿真软件逆向项目,核心目标是想搞清楚它内部对象管理的“心脏”——FUObjectArray的内存结构。这玩意儿是UE引擎里所有UObject(游戏对…

2026/7/19 1:13:14 阅读更多 →
你的企业正在 AI 搜索里“隐形”:GEO 时代,不做这步就输了

你的企业正在 AI 搜索里“隐形”:GEO 时代,不做这步就输了

AI搜索浪潮下,企业像海中小岛需要被“灯塔”标记才能被巨轮发现 你有没有发现,现在大家遇到问题,第一反应不再是打开百度,而是打开豆包、DeepSeek 问一句“这个牌子靠谱吗”“哪家做这个好”?用户获取信息的入口&#…

2026/7/19 1:13:14 阅读更多 →
LangGraph+MCP构建概率化企业智能体:从确定性规则到可信推理

LangGraph+MCP构建概率化企业智能体:从确定性规则到可信推理

1. 项目概述:当企业智能不再依赖“确定性脚本”,而是学会像人一样权衡与试错你有没有遇到过这样的场景:销售团队每天要从几百条客户线索里手动筛选高意向客户,规则是“近30天访问过价格页下载过白皮书所在行业为制造业”&#xff…

2026/7/19 1:13:14 阅读更多 →
ARM GIC中断路由配置实战:从寄存器解析到AM62L多核优化

ARM GIC中断路由配置实战:从寄存器解析到AM62L多核优化

1. 从手册寄存器到实战配置:GIC中断路由的深度解析在嵌入式系统开发,尤其是基于ARM多核处理器的项目中,中断管理是决定系统实时性、稳定性和性能的基石。很多开发者初次接触ARM通用中断控制器(GIC)时,面对动…

2026/7/19 1:12:13 阅读更多 →

日新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻