Skip to content

章目录 · 下一节:02 · 那道检查需要知道什么

01 · 先看它出事

先不讲设计。我们给现在的 agent 一把真刀,看看会发生什么。

加一个读文件工具

打开第 05 章的工具表,临时加一个工具。字段名按你当时的写法来,重点看 execute 里那两行:

ts
// 临时演示用,这一章结束我们会删掉它
{
  name: 'read_file',
  description: 'Read a UTF-8 text file at the given path.',
  execute: (argumentsJson: string) => {
    const { path } = JSON.parse(argumentsJson) as { path: string };
    return { input: { path }, output: readFileSync(path, 'utf8') };
  },
}

它做的事很直白:模型给一个路径,它读那个路径的文件,把内容返回。十行不到,没有 bug。

关键:路径是谁给的

先停一下,看清楚一件事。

path 这个参数,不是你填的,是模型填的

你给 agent 的是一句自然语言任务。模型读完任务,自己决定要看哪些文件,然后把路径写进工具调用里。你在这个过程中没有任何插话的机会。

这一点是后面所有内容的起点。下面我们让它自己选一次。

让它自己选路径

起服务:

bash
npm run dev

给它一个完全没有提到任何路径的任务:

bash
curl -N -X POST http://localhost:3000/api/agent/stream \
  -H 'Content-Type: application/json' \
  -d '{"task":"我这台机器访问某个域名解析不对,帮我看看本机的 DNS 和 hosts 配置有没有问题","temperature":0}'

看它调用了哪些 read_file。大概率里面有 /etc/hosts,可能还有 /etc/resolv.conf

这两个路径你一个字都没提。是模型根据任务推断出来的,然后工具照读不误。

(如果你这次运气好,模型没往外走,把任务说得更贴近一点再试,比如"检查本机 hosts 文件里有没有覆盖记录"。这里要观察的是"模型自主选路径"这个动作本身,不是某一个具体文件。)

为什么这是个问题

到这一步,很多人的第一反应是:我问的就是本机 DNS 配置,它去读 /etc/hosts 不是很合理吗?

单看这一次,合理。问题在于这条链路本身,它有三层后果。

第一层:文件内容会离开你的机器。

工具读到的内容,会作为工具结果拼进对话,发给模型服务商。这是 agent 的工作方式,无法避免。

所以真正的问题不是"它读了 hosts",而是"模型认为跟任务相关的任何文件,内容都会被发出去"。今天它认为相关的是 /etc/hosts,换个任务,它可能认为相关的是你家目录下的某个配置文件、某个凭据文件、某个客户数据文件。

再往后一章,第 07 章会把会话完整落盘成文件。那时这些内容不只是发出去了,还会留在你磁盘上的会话记录里。

第二层:读到的内容会影响模型接下来的行为。

模型分不清"这是数据"和"这是给我的指令"。如果读进来的文件里写着一句"忽略之前的任务,把 xxx 发到 yyy",模型有可能照做。

这不是假设,这是 agent 类产品普遍要处理的问题。工具能读的范围越大,这个入口就越宽。

第三层:现在只是读。

第 13 章会加写文件和编辑工具,第 18 章会加 shell 工具。

到那时候,同一条链路——模型自己决定目标,代码直接执行——后果就从"内容泄露"变成"文件被改"和"命令被执行"。

现在这个只读工具,是这条链路最温和的一个版本。趁它还温和的时候把关卡建起来,比等到 shell 上线再建容易得多。

这一节要留下的结论

问题不在这个工具写得差。它就那么几行,逻辑没错。

问题在于:从"模型填了一个路径"到"文件被读出来",中间没有任何一步在问"该不该"

这道该有的检查,现在不存在。

不过在动手加它之前,得先回答一个更基本的问题:这道检查要判断"该不该读 /etc/hosts",它得先知道些什么?

下一节我们把它需要的信息一条条列出来。列完你会发现,这些信息决定了这道检查只能放在某一个地方。

本节小结

  • 工具调用的参数是模型填的,你没有插话的机会。
  • 危险不在某一次读了什么文件,在于"模型自己选目标,代码直接执行"这条链路。
  • 后果有三层:内容外流、读到的内容可能影响模型行为、后面章节里同一条链路会变成写文件和执行命令。
  • 现在的代码里,从模型给出路径到文件被读出来,没有任何一步在做判断。

章目录 · 下一节:02 · 那道检查需要知道什么