问题
语言模型不是故意说谎。它预测最可能的下文;缺少某个信息时,就用看似可信的东西来代替。在普通对话里,这只会造成一个细节错误。在一个会行动的助手里,后果就具体得多:一条路线直接把「张伟」这个名字本身当成了目的地,或者编出一个解释,比如「你的日历没有配置」,让你去找一个根本不存在的故障。这样的错误一旦说得满怀自信,就比一句简单的「我不知道」更危险,因为你会据此行动。
我想要的
我想要一条简单的规则:LIA 只把她从工具那里收到的、在对话中读到的或计算出来的东西,作为事实告诉你。能在不猜测你意图的情况下修复的,就修复。其余的会被拒绝,并附上一条帮助模型自我纠正的消息。
行动之前
- 编造的选项会被去掉。如果模型给工具加了一个不存在的选项,比如工具不认识的一种排序方式,它会在调用前被删掉,计划照常进行。
- 数字会被拉回边界之内。向一个只接受二十条的工具要一百条结果,得到的就是二十条。一个不靠编造就无法纠正的值,比如格式无法识别的日期,仍然会作为错误报告出来。
- 名字不是地址。需要地址或电子邮件的参数会在调用前一刻被检查。如果其中包含对话中提到的某个人的名字,调用会在产生任何花费之前被拦下,并附上一条清楚的指示:先取得这个联系人的地址。有疑问时,检查会放行,以免妨碍正当的请求。
- 缺失的值就保持缺失。当一个步骤在列表上重复某个操作,而某一项没有预期的字段时,这个参数会留空:工具不会收到一个写出来的「null」字样,而是使用它自己的默认值。
- 计划会被重读,看缺了什么。审阅者很容易看出计划里有什么,却很难看出它漏掉了什么。所以 LIA 的审阅者会先列出你的请求所要求的每一件事,再检查是否每一件都有对应的步骤,然后才给出意见。
回答之中
当 LIA 告诉你一个时间、日期、数字、名字或地址时,这个值必须出现在本轮的数据里、最近查阅过的内容里,或者一字不差地出现在之前的某条消息里。否则,她会告诉你缺少这个信息,并提议去查。她刚刚读过的内容会在接下来几轮里保持可用:像「那它几点开始?」这样的追问,就会以数据本身为依据。
需要精确的东西会被计算出来。模型预测的是文字,它不做算术。百分比、距离某个日期还有多少天、货币换算,都交给专门的工具:用精确的十进制计算,并在不得不四舍五入时说明;在两个真实时刻之间计算时长,包括夏令时切换;以及欧洲中央银行的参考汇率,并注明日期。
出现失败时
一个工具失败时,LIA 会通过唯一的一个渠道告诉模型,这个渠道会指出是哪个工具,并给出失败步骤的确切数量。所以模型不必去猜发生了什么。一个成功了一半的计划,会把成功的部分交给你,并说明哪些没有成功。
另外两条规则也朝着同一个方向。仅凭审阅者的意见,不足以宣布某个操作被阻止:只有一项能力根本没有启动过,才能说它被阻止了。而一个已准备好的请求、一个等待中的确认和一项已保存的更改,是三种不同的状态,LIA 在汇报时不会混为一谈。
当 LIA 在 ReAct 模式下自己连续调用工具时,她出发去找的每一项信息,最终要么拿到了,要么被声明为缺失,并附上她尝试过的做法。一个看不懂某个值的工具会拒绝它,并说明期望的格式。
局限
- 这些保护措施减少编造,但不能消除编造。模型仍可能把一条它正确收到的数据转述错。
- 对名字的检查只认识本轮中识别出的人。重要的操作无论如何都要经过你的确认。
- 如果你的管理员启用了它们,你邮件上的标签(类别、紧急程度、疑似诈骗)仍然只是提示:没有警告并不证明一封邮件是安全的。
