← 返回 FEED
AGENT2026-04-24

100% 开源的 Deep Research 栈:Onyx + CrewAI + Voxtral,赢了 OpenAI 和 Perplexity

Akshay Pachaar 写了一篇万字长文,手把手教你怎么搭一套击败 OpenAI Deep Research、Claude 和 Perplexity 的开源深度研究栈。

为什么自己做

所有主流研究工具都是闭源 SaaS——你的查询、连接的内部文档都在别人服务器上。对于受监管行业、有 IP 敏感数据或数据驻留要求的团队,这是真实障碍。

三个工具

  • Onyx:开源 AI 平台,自托管,RAG + web search + deep research,在 DeepResearch Bench(100 个 PhD 级研究任务,22 个领域)排名第一
  • CrewAI:多 Agent 编排,用 Flows 做阶段隔离,用 SKILL.md 做指令注入,用 MCP 直接连 Onyx
  • Voxtral:Mistral 原生语音模型家族,处理语音输入和报告朗读

核心架构原则

1. 阶段严格分离

大多数研究工具的做法:一个 Agent 做搜索、收集、写报告,共享一个 context window。结果是 context 越来越脏,最后 Writer 拿到的材料已经被 reinterpret 了两遍。

Onyx 团队称之为「deep frying」:事实被反复扭曲,矛盾被平滑掉,原始材料到输出时已经面目全非。

解法:用 Flow 连接三个独立 Crew,每个只收到前一个阶段的干净输出,不累积 context。

2. 检索要有 LLM selection 步骤

并行查询 → 搜索 → BM-25 + vector 混合索引 → Reciprocal Rank Fusion 合并 → LLM 评审并只保留相关内容 → context expansion → 答案合成。

关键是这个 LLM selection step——跳过它,幻觉就进来了。

3. 强制 Reflection

每个 dispatch 之间必须有 reflection step,产出结构化输出:

  • 什么已经覆盖
  • 还有什么缺口
  • 出现了什么新方向
  • 继续循环是否能获得新信息

这个 reflection 每次都跑,系统表现才像研究员,而不是检索引擎。

4. Planner 没有工具访问权限

Phase 2 的 planner 分解查询成最多 6 个探索方向,但它没有工具访问权限——只能出 plan,不能出答案。这是防止 plan 自己回答了自己的问题。

5. Researcher 和 Analyst 严格隔离

  • Researcher Agent 不直接搜索,它接收任务 brief
  • Analyst Agent 从不看完整查询或 plan
  • 强制 self-contained task brief,防止 context leakage

CrewAI 的 SKILL.md 注入

CrewAI 的 Skills 机制让你在 runtime 把 SKILL.md 注入到 agent 的 system prompt 里,在行动的时刻给指令:

researcher_agent = Agent(
    role="Senior Research Analyst",
    goal="Gather information on research query with source URLs",
    backstory="You are a disciplined analyst. Record every source URL.",
    mcps=[f"{ONYX_MCP_URL}?token={ONYX_TOKEN}"]
)

一个声明,Researcher Agent 立刻获得三个工具:搜索知识库、搜索 web、抓取任意 URL 全文。

语音层:Voxtral

语音不是 bolt-on,是原生设计。输入:说话代替打字,transcript 直接进 pipeline。输出:Markdown 报告用 TTS 朗读,听比看长报告更高效。

完整流程

  1. 打字、说话、或上传 PDF 作为研究查询
  2. Researcher Agent 通过 Onyx MCP 搜索 web 和你的文档
  3. Analyst Agent 去重、标矛盾、分组发现
  4. Report Writer Agent 产出结构化、带引用的 Markdown 报告
  5. 点击「Play Report」用 Voxtral TTS 朗读

原文:How to build a Deep Researcher — Akshay Pachaar