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 朗读,听比看长报告更高效。
完整流程
- 打字、说话、或上传 PDF 作为研究查询
- Researcher Agent 通过 Onyx MCP 搜索 web 和你的文档
- Analyst Agent 去重、标矛盾、分组发现
- Report Writer Agent 产出结构化、带引用的 Markdown 报告
- 点击「Play Report」用 Voxtral TTS 朗读