用了 DeepSeek Harness 之后,我开始重新理解 Agent

DeepSeek Harness 发布那几天,我的技术群基本没法聊别的,全是截图和转发。刷屏归刷屏,真到自己上手,还是得老老实实搭环境。装起来倒不难,几条命令的事。跑通官方 demo 的那一刻,说实话有点上头——它自己规划、自己调工具、自己收尾,跑得比我想象的顺。

但 demo 永远是 demo。等我把需求换成自己项目里的活儿,问题就一个个冒出来了。

模型不背这个锅

我让它做一件很具体的事:读几个目录、汇总信息、然后写一份报告。结果它卡在一个地方反复横跳——调同一个工具,参数换来换去,就是拿不到正确结果。第一反应很自然:这模型是不是不行?

后来我把日志翻出来一条条看,发现问题根本不在模型。是我给工具写的 description 太含糊,参数描述也模棱两可,模型只能靠猜。它猜错了,又没有像样的报错信息喂回去,于是就在原地打转。

对比一下我前后两次的工具定义就清楚了。

1
2
3
# 之前:说了等于没说
name: read_files
description: 读取文件
1
2
3
4
5
6
7
# 之后:把参数和返回都交代清楚
name: read_files
description: >
  读取指定路径的文件内容。path 必须是相对于项目根目录的路径,
  支持 * 和 ** 通配符。返回文件正文;文件不存在时返回明确错误。
parameters:
  path: 文件路径,支持通配符,相对项目根目录

改动很小,效果天差地别。这不是 DeepSeek 的模型笨,是 Harness 的工具定义和错误回传没设计好。

上下文不是无限大的

另一个让我抓狂的点是长任务。前几步它还挺清醒,跑到中间就开始丢目标,越跑越偏。我一开始也以为是模型的"注意力"问题。后来发现,是它没对上下文做管理——工具返回的一大坨原始输出,不加裁剪全塞回去,没几步就把有效的目标信息挤没了。

模型记不住,很多时候不是模型记不住,是没给它记的空间。

权限和兜底,比想象中重要

还有一次,它在本地环境里跑命令,差点把一个目录给删了。当然最后没删成,但那一瞬间后背发凉。回头想,这事不怪模型——是我没给它设边界,也没做二次确认。

一个靠谱的 Harness,得管住三件事:权限边界、失败重试、人工确认点。这三样做好了,模型的"能力"才能真正使出来;做不好,模型越强,闯的祸越大。

折腾完这一轮,我对 Agent 的理解变了。

以前我觉得 Agent = 模型 + 一堆工具。现在我觉得 Agent 更像一个工程系统:模型是内核,但决定它能不能稳定干活的是外面那层 Harness——上下文怎么管、工具怎么描述、结果怎么回传、错误怎么兜底、权限怎么卡、记忆怎么存。

模型决定上限,Harness 决定下限。上限谁都能宣传,下限才是能不能落地的关键。

以后大家拼的,真不一定只是"谁的模型更强",而是谁能把模型、工具、上下文、记忆、权限、执行环境组合得更好。工程能力,很可能和模型能力一样重要。