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/21 16:41:12 阅读更多 →
Kubernetes网络CNI插件深度对比:Calico、Cilium与Flannel在大规模集群中的性能数据与选型决策

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

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

2026/7/21 16:41:13 阅读更多 →
赣州室内设计公司哪家靠谱?答案让你意想不到!

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

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

2026/7/21 16:41:13 阅读更多 →

最新新闻

亿级数据深度分页优化方案与实战

亿级数据深度分页优化方案与实战

1. 深度分页的本质与挑战当数据量达到亿级规模时,传统的LIMIT offset, size分页方式会变得极其低效。以MySQL为例,执行SELECT * FROM large_table LIMIT 1000000, 20时,数据库需要先扫描1000020条记录,然后丢弃前100万条&#xff…

2026/7/23 3:59:45 阅读更多 →
福州豪宅整木定制选型:从木皮到安装,核心看这几点

福州豪宅整木定制选型:从木皮到安装,核心看这几点

对于福州的别墅、大平层业主来说,高端整木定制是决定空间质感的关键一环。好的整木定制不仅能提升空间的整体性与高级感,更能通过精细化的设计满足个性化的生活需求。在挑选整木定制品牌时,很多人会优先对比图森、M77 等一线品牌,…

2026/7/23 3:59:45 阅读更多 →
英力股份官网访问指南与安全识别技巧

英力股份官网访问指南与安全识别技巧

1. 英力股份官网的正确访问方式最近发现不少人在搜索英力股份的官网时遇到了困扰,作为一家专业的真空设备制造商,英力股份确实拥有自己的官方网站。经过核实,公司唯一正规的官网地址是:https://www.shinyvac.com/这个域名从2015年…

2026/7/23 3:59:45 阅读更多 →
电子精密器件运输包装选择高强度瓦楞纸箱,对降低货损率有哪些量化的价值贡献?

电子精密器件运输包装选择高强度瓦楞纸箱,对降低货损率有哪些量化的价值贡献?

一、定义与概念高强度瓦楞纸箱通常指采用双瓦楞(AB/BC/AC楞)或三瓦楞结构、搭配高克重牛卡纸与高强芯纸制成的工业级包装,其边压强度、耐破强度与缓冲性能显著优于普通纸箱,是电子精密器件运输防护的核心载体。电子精密器件包括芯…

2026/7/23 3:59:45 阅读更多 →
基于 LSH 的高维近邻搜索:碰撞策略与参数调优

基于 LSH 的高维近邻搜索:碰撞策略与参数调优

引言高维数据近邻搜索的挑战与 LSH 的适用性 LSH 的基本原理与核心思想 文章目标:探讨碰撞策略与参数调优对性能的影响局部敏感哈希(LSH)基础LSH 的数学定义与核心性质(局部敏感性) 常见 LSH 函数族(如随机…

2026/7/23 3:59:45 阅读更多 →
JavaScript文件类型判断方法与安全验证实践

JavaScript文件类型判断方法与安全验证实践

1. JavaScript文件类型判断基础原理在Web开发中,文件类型判断是常见的需求场景。用户上传文件时,我们通常需要验证文件类型是否符合预期,这涉及到对文件对象的底层处理机制。JavaScript提供了多种方式来判断文件类型,每种方法都有…

2026/7/23 3:58:44 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/22 12:54:44 阅读更多 →

月新闻