两种Harness设计哲学——Claude Code的单体循环 vs DeepSeek Harness的微内核,以及我们的底座会怎么选
从去年研究 Claude Code,到这两个月追着 DeepSeek Harness 读文档,两套 harness 我都拆得差不多了。它们解决的是同一组问题,给出的答案却经常截然相反。作为 dsh 系列的最后一篇,把两者放在一起对比一下,也说说如果重做我们的底座,我会怎么选。
朝霞化精靈 / 輕快 明亮 恆溫的伴侶 / 她與你共存 / 違背 對抗 相同的命運
愛與疼痛 / 不覺茫茫道路長 / 生活歷險 / 並肩莽莽原野荒
从去年研究 Claude Code,到这两个月追着 DeepSeek Harness 读文档,两套 harness 我都拆得差不多了。它们解决的是同一组问题,给出的答案却经常截然相反。作为 dsh 系列的最后一篇,把两者放在一起对比一下,也说说如果重做我们的底座,我会怎么选。
回头看我们线上最难查的两个问题,都和「长流程」有关:一个是首聊导览里,模型嘴上答应了却不执行;另一个是一次失败被写进了记忆,Agent 从此对这件事永久拒答。带着这两个问题去读 DeepSeek Harness 的子代理和长任务设计,答案其实就藏在它反复强调的两条原则里。这是 dsh 系列的第六篇。
做语音陪伴产品,取消是家常便饭:用户一张嘴,Agent 就得立刻闭嘴。可「停下来」远比看起来难,停不干净会留下迟到的旧消息、泄漏的连接;重试也一样,叠两层重试就成了重试风暴。DeepSeek Harness 在取消和重试上的设计非常克制,这是 dsh 系列的第五篇。
我们的底座里,自己写的 function calling 和 MCP 接进来的工具走的是同一条管线。但线上还是踩过两个和工具有关的坑:一个是工具缓存掩盖了真实的重试,一个是 few-shot 示例和 schema 对不上导致衔接失效。带着这两个坑去读 DeepSeek Harness 的工具管线,发现它对「工具」的边界划得非常清楚。
我们做回放评测时,最头疼的问题永远是同一个:线上那一轮,模型当时到底看到了什么?DeepSeek Harness 对这个问题的回答非常彻底,它把一条原则贯彻到了底:模型可见的,就必须被持久记录。这是 dsh 系列的第三篇。
做陪伴产品,最常见的场景不是一问一答,而是模型还在回,用户又发了一句;或者设备那边上报了一条健康数据,要不要现在就说?这些问题归根到底,是在问 Agent 的一次「回合」怎么界定。DeepSeek Harness 在这件事上想得非常细,这篇就来拆它的 Turn、Step 与 Inbox。
最近在读 pi-mono 的源码,其中最有意思的一块是上下文压缩。coding agent 干活久了,上下文窗口迟早要满,满了就得扔东西,而扔掉的每一条都可能是模型下一步要用的。所以压缩注定有损,所有设计都在回答一个问题:必须丢信息的前提下,怎么丢得最不疼?
前两天 DeepSeek 开源了 DeepSeek Harness(dsh),在网上刷到以后,我第一时间把它的文档和 ADR 翻了一遍。我们自己的 Agent 底座做了大半年,也是插件化的,所以读的时候一直在对照。最让我意外的是它的第一条原则:连 agent loop 本身都是一个插件。
最近在服务器上折腾 GPU 容器,想把需要显卡的服务也统一放进 docker 里跑。但是我们都知道,docker 容器默认是看不到宿主机显卡的,宿主机上 nvidia-smi 再正常,容器里也用不了。所以这里我们就需要用到 NVIDIA Container Toolkit 了。
最近在整理 RAG 相关的资料,一直绕不开一个老问题:VectorRAG 简单但检索太糙,GraphRAG 精细但重得离谱,到底该选哪个?直到看到三星 AI 中心华沙团队的一篇论文,他们提出的 UnWeaver 给了第三种答案:不建图,只拆实体。