Loading... 折腾 Deep Research 类 Agent 这小半年,最大的感受是:模型越来越聪明,但"一次性让它交一份能看的报告"这件事,还是劝退。 你让它写 5000 字调研,它给你一坨没引用的观点汤。你让它"再深入一点",它在原文后面粘一段新的。你让它"结构再清晰一点",它把小标题改粗。刷新一下浏览器,没了。 所以我干脆做了个东西,叫 [hermes-dashboard](https://github.com/SnowWarri0r/hermes-dashboard)。 简单说,它是 [Hermes Agent](https://github.com/NousResearch/hermes-agent) 的一个前端,但它不是那种"套个聊天框"的前端。它把一次研究任务拆成了五道工序,中间还塞了一个专门挑刺的角色。 ## 一篇报告要过五关 跑一个任务的时候,模型不是从头写到尾,而是走这么一条流水线: ``` 用户目标 ├─ Plan 把目标拆成 3~7 个章节 + 3~6 个调研问题(输出 JSON) ├─ Research 每个问题起一个独立的 Hermes Run,并行跑,最多 5 条 ├─ Draft 汇总所有调研,写一版完整报告 ├─ Critique 切换成挑刺评审角色,列出内容漏洞、弱论点、缺引用 └─ Revise 带着这份批评重写最终稿 ``` 最有意思的是 Critique 那一步。同一个模型,换一个 Prompt,它会变得挺刻薄的:"第二节对 X 的论断没有引用""第三节和第五节有重复内容""你提到 Y 但没说清楚它和 Z 的关系"。然后 Revise 拿着这份清单重写。 出来的东西不太像 AI 一口气写完的,更像被编辑退回过一次的稿子。这个差别比我想的大。 当然不是每次都需要这么重。所以我留了三档: - Quick:一次调用,糊弄事用 - Standard:计划 + 并行调研 + 起草,日常够用 - Deep:全套五阶段,交付前用 随手问个东西非要走完五步,纯粹是烧 token 玩。 ## 把黑盒撬开 以前用 Agent 跑长任务,最难受的其实不是慢,是**不知道它在干嘛**。转圈十分钟,不知道是在搜、在想、还是卡了。 所以 UI 上我花了点心思: - Draft 和 Revise 阶段文字是流式出的,边写边显示,带自动滚动和闪烁光标。中途模型会吐出 `**`、`` ` ``、`[` 这种没闭合的 markdown,我在流里做了清洗,不然页面会一卡一卡地"破版"。 - 右边侧栏是每个阶段的实时状态:现在跑到哪一步、调了什么工具、烧了多少 token、耗了多久。并行那几条研究分支摊成网格,完成数一眼能看到。 - 跑得久的任务切到别的标签页也没事,完成会弹系统通知。只有在页面不在前台的时候才弹,避免打扰。 这些都不是什么黑科技,但加在一起,"挂着任务该干嘛干嘛"这件事终于是真的成立了。 ## 迭代不是"追问",是"出第二版" 这个地方是我比较较真的。 很多产品的"追问"是在对话框里再聊一轮,上下文越堆越长。我觉得做研究不是这么个逻辑 —— 研究是**出版本**的。 所以 follow-up 在这里做法不一样:你说"再补一下 B 端的数据",它会把前一版报告压缩一下塞进新的 Plan Prompt,然后**整条流水线从头再跑一遍**。出来的是一份独立完整的 v2,不会出现"在上一版的基础上我补充了以下内容"这种元评论。 每一版都是一个 Tab,v1 / v2 / v3 这样排着。需要对比的时候点开 Diff 视图,行级高亮,加了啥删了啥一目了然。 报告超过 6k 字会自动压缩再塞给下一轮 Plan,这个阈值是我试出来的 —— 再高,模型会开始忽略早期内容;再低,上下文又太碎。 ## 所有东西都落盘 早期版本我图省事把状态放内存里,刷新就没。自己用了三天就受不了了。 现在全都走 SQLite,数据库就在 `~/.hermes-dashboard/tasks.db`。任务、回合、阶段、每条 SSE 事件全进去。刷新浏览器、换电脑、重启服务,打开还是你离开时的样子。 搜索用的 FTS5,如果你配了 embedding endpoint,知识库会走向量召回(余弦相似度);没配也不要紧,自动 fallback 到关键词 + LLM 查询扩展。日常的过滤、`#tag` 标签、Pin 收藏、状态筛选(跑着的 / 完成的 / 失败的)都是标配。 ## 架构 ``` 浏览器 (React + Vite) │ /api/* 中间件 (Hono + SQLite) ← 编排流水线、存状态、广播 SSE │ /v1/runs + SSE Hermes Gateway (:8642) ← 真正干活的 Agent ``` 中间件是主角。它负责把一次任务拆成阶段、起 Hermes Run、订 SSE、落盘、再把事件推给前端。前端本身是无状态的,所有数据都从 API 拉 —— 换个浏览器打开,状态一模一样。 前后端默认都 bind 在 `0.0.0.0`,我习惯把它丢在开发机上跑着,手机、平板、公司电脑都能连。 技术栈没什么花活:React 19、Tailwind v4、Zustand、react-markdown,后端 Hono + better-sqlite3,主题沿用 VoltAgent 的暗黑配色(Abyss Black 加一点信号绿)。 ## 跑起来 前置是你已经有 Hermes Agent。先让它的 gateway 开 API: ```bash # ~/.hermes/.env API_SERVER_KEY=your-secret-key API_SERVER_ENABLED=true API_SERVER_CORS_ORIGINS=http://localhost:5173 hermes gateway start ``` 然后: ```bash git clone https://github.com/SnowWarri0r/hermes-dashboard.git cd hermes-dashboard pnpm install && cd server && pnpm install && cd .. HERMES_API_KEY=your-secret-key pnpm dev ``` 打开 `http://localhost:5173` 就行。生产环境一条 `pnpm build && pnpm start`,单进程跑在 8787,API 和前端静态资源都在一起。 ## 一些碎碎念 做完之后自己用了一段时间,几个意外的观察: 一个是 **Critique 那一步经常比 Draft 有意思**。模型在挑刺模式下会说一些它自己起草时根本不会提的话。有时候我光看 critique 就觉得任务值了。 一个是 **并行研究分支的"收敛感"**。五条线同时在跑,你盯着看会有种在指挥一个小团队的错觉 —— 虽然它们其实没有在互相通信,但视觉上真的不一样。 还有一个是 **版本 Diff 的价值被我低估了**。一开始觉得这是锦上添花,后来发现它是我判断"这轮 follow-up 到底改了啥、值不值得留"的主要依据。纯看新版本,你分不清楚是模型真改了还是它在重新措辞。 --- 代码在这: [https://github.com/SnowWarri0r/hermes-dashboard](https://github.com/SnowWarri0r/hermes-dashboard) MIT 协议,自取。觉得有意思的话点个 Star,有 bug 或者想法开 issue 聊。 Last modification:April 13, 2026 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 如果觉得我的文章对你有用,请随意赞赏