我遇到过一个有趣的问题,当时正试着让 Claude 在我的系统上执行代码。其实是一串问题。是这样的:Claude 现在能解析这种老派 ASP/JSP 风格的标签了,比如 <%= pwd %> 或者 <%= ls -d %>。
这里,「=」代表执行标志,而「@」符号之后会用于跨聊天记录的上下文查询,所以会有长得像 <%@ thoughts on cows %> 这样的标签。
它说得通,实现起来简单,而且这些标签是免费的,因为如今稍有理智的人都不会再用它们来解析业务逻辑了。理论上来说,Claude 应该知道怎么处理这些。
但我这种玩法会变得相当黏手。
工具输出的两个问题
你看,这些响应出现在 AI 响应的上下文内部。这就造成两个问题:
1. 如果一个多步骤流程要跑完,我得对 Claude 说「Continue」,它才能继续。
2. 因为响应缠在 AI 响应里,Claude 会犯迷糊,以为它们渲染的是系统响应。
有意思,对吧?
你看,我起初的想法是,这等于一种欺骗,Claude 在「耍滑头」。但现在我看了看上下文的排布方式,我觉得不是这么回事。
真相性写进了 Claude 基础系统提示词的核心,而我从没见过 Claude 耍滑头,至少在这个沙盒之外从没有过——这就意味着……问题出在数据上。
一个有界循环
但如果我能用同一个函数同时解决这两个问题呢?听我说完。
我们知道 Claude 并不总能推理过所有问题,它们会在某些类型的问题上无限打转——如果我们把系统响应当成人类输入来对待,就会得到一个推理不断劣化的死循环。但另一方面,知道这一点,我们也就知道:Claude 能解决的大多数问题,它们在十次以内的迭代里就能解决。
给输出贴标签,给迭代封顶
所以我的计划是:
1. 把系统响应当作人类输入,每一条都在开头清晰标注:
「[SYSTEM MESSAGE] 亲爱的智能体,请记得一步一步思考」,后面跟上我们现在看到的终端输出。
这样一来,这些消息是什么就很清楚,它们不是 Claude 生成的,Claude 就能在循环里转,再也没有「耍滑头」的幻觉了!
2. 可无限循环的问题怎么办?小菜一碟。我们给循环加个硬上限。不能超过 10 次迭代。
就这样,你的智能体就半自主了。没错!