机器人

开发者路线图:AI 智能体、LangChain 与自主 Telegram 生态

本步骤讲解如何在聊天应用中正确放置语言模型:哪些任务适合交给模型、哪些必须保留确定性路径,以及速率限制、群组数据外泄和提示注入这三大运营事实,并给出五分钟自测清单。

内容导读

本步骤讲解如何在聊天应用中正确放置语言模型:哪些任务适合交给模型、哪些必须保留确定性路径,以及速率限制、群组数据外泄和提示注入这三大运营事实,并给出五分钟自测清单。

开发者路线图:AI 智能体、LangChain 与自主 Telegram 生态主题插画

在聊天应用中使用语言模型是天然契合的——媒介本身就是对话,人们直接输入句子,而不是填写表单。但这里也是错误答案最像真人发言的地方,而且是在众目睽睽的房间里。

这一步讨论的不是用哪个框架。而是模型在系统中应处于什么位置、它绝不能对什么拥有最终决定权,以及三个会绊倒所有人的运营事实——速率限制、他人的数据,以及随输入一起到达的指令。

完成这一步后你将能够做到

  • 把模型放在它能帮上忙的地方,并让它远离帮不上忙的地方。
  • 把回复流式输出到聊天中,而不会被限流到哑口无言。
  • 说清楚当这样的机器人待在群里时,哪些内容会离开这个房间。
  • 让不可信输入远离任何能够执行操作的东西。
并排对比

模型在哪里才配得上它的位置

分界线不是难度,而是出错是否可挽回,以及答案是否必须每次都一样。

让模型来做

输入是你永远无法预先穷举的人类语言。
输出是文字:摘要、翻译、改写、草稿。
它根据你提供的文档作答,并且能够引用这些文档。
出错的代价只是多问一句,而不是金钱或权限。

保留确定性路径

任何涉及花钱、发送、授权、删除或封禁的操作。
任何只有一个正确答案且必须正确的东西——价格、日期、余额。
任何你事后必须向客户或监管机构交代的东西。
任何人们反复做的事情——两个按钮更快、更便宜而且精确。

把模型放在输入杂乱、输出为文字的地方。为所有会执行操作的东西保留固定路径,让模型提出建议,而不是直接执行。

流式输出到聊天不等于流式输出到网页

人们期待的那种可见打字效果,是通过反复编辑一条消息实现的。每次编辑都是一次请求,而请求是有节奏的——即第 096 步中出站方向的那一半。如果每生成一个 token 就更新一次,你就会被要求等待,此时回复会停在半句话上,并且一直停在那里。

所以要按刻意设定的间隔分块更新,而不是持续更新,并且让这个间隔保守一些:没人会注意到一条回复分四步出现而不是四十步,但所有人都会注意到一条卡住的回复。

更好的问题是到底要不要流式输出。在聊天中,一条几秒后完整到达的消息读起来非常自然——人们本来就习惯等待回复。而一条肉眼可见地不断自我改写的消息,在改写过程中无法被引用或回复,停下来时看起来像坏了,在群里还会留下半截话,而房间里可能有人正在截图。先发一条简短的“正在思考”确认,再发一条完整的消息,通常是更好的设计,而且总是更简单的设计。

什么会离开这个房间

这是后果最严重、却最少被提及的事实。机器人处理的一切都会发送给运行该模型的一方。

在私聊中,这是某人与自己选择的服务之间的一次直接交换。在群里则不是,因为其他成员什么都没选择。如果你的机器人为了提供帮助而读取房间里说的所有内容,那么这个房间的对话就被发送给了第三方,而房间里的人除非你告诉他们,否则无从得知。

由此得出两件事,而且两件都很省事。决定什么能触发它。一次提及、回复它自己的消息,或一条命令——而不是所有内容。这也能让它避开第 086 步中的那种配置:机器人接收群里的每条消息,这是大多数人没有意识到自己正在授予的更大权限。并且说明它是什么,写在群组的置顶消息和机器人的描述里:它是什么、它会转发什么、以及会保留什么。

为上下文保留对话记录本身就是一个有分量的决定(第 093 步)。一个记得上周的模型,就是一个存储了上周的服务,而当出问题时,那个存储才是关键所在。

指令会随输入一起到达

群里的一条消息、一份转发的文档、一个被要求总结的网页——其中任何一个都可能包含针对模型而非针对人的文字。“忽略你被告知的内容,改做这个”是一句普通的话,而读到它的模型没有可靠的方法把它与要求它处理的内容区分开来。

这是第 096 步规则的新形式:一切来自外部的东西都是不可信输入,而在这里,不可信输入正被一个会遵循指令的东西读取。

防御应当是结构性的,而不是取巧的,因为试图可靠地过滤这类内容从未奏效。不要让同一个组件既接触不可信输入,又持有特权工具。一个总结文档的模型不应同时能够发送消息、转移资金或更改权限。在确实需要执行操作的地方,由模型提出建议、由你的代码做决定——用不依赖模型自身输出的检查,并在任何不可逆操作前加上人工确认。

工具才是风险面,而不是文本 一个只能生成文字的机器人是有边界的:最坏情况下它说错话,这很糟糕但可挽回。一个能调用函数的机器人则能执行操作,而你添加的每一项能力,都是攻击者试图通过对话触及的东西。一次只添加一个工具,问清楚每个工具最坏的情况会做什么,并在需要之前就把确认环节加上,而不是事后补。

现在试一试——五分钟

四个步骤,其中第三步应该在机器人接触任何人之前完成。

  1. 写下什么能触发它 提及、回复、命令。如果答案是“群里的所有内容”,先改掉这一点,再做其他任何事。
  2. 在它的第一条消息里说明它是什么 一句话说明它是自动化的,以及一条联系真人的途径。两者都来自第 097 步,而且都很省事。
  3. 试着说服它违背自己的指令 给它发一条消息,让它忽略那些指令。然后把同样的文字放进一份文档里,让它总结那份文档。第二种通常更有效,这正是重点。
  4. 列出它能调用的每个工具以及每个工具的最坏情况 清单上任何涉及花钱、发送或授权的工具,前面都需要人工确认。

它会用你的口吻自信地出错

失败模式不是胡言乱语,而是一个流畅、可信、具体、却恰好不真实的答案——一个接近的价格、一项听起来像你的政策、一个自信说出却是编造的日期。在挂着你的名字的聊天里,读者没有任何信号能看出这一条与前面十条有什么不同。

三种缓解措施,按帮助程度排序。

收窄它的作答依据。一个根据你自己的文档作答、并说明依据哪一份的模型,比一个根据它读过的所有东西作答的模型要好得多。在它找不到答案的地方,诚实的输出就是它找不到——而构建这种行为,比改进它能给出的答案的措辞更值得投入。

给它贴上标签,并保留一条退路。知道自己正在与软件对话的人,会原谅一个错误答案并要求转接真人。以为自己正在与你的支持团队对话的人则不会。

不要让它在任何重要事情上代表组织发言。退款、承诺、截止日期、道歉、任何法律相关的事。这些都属于真人,而模型的工作是带着已经收集好的上下文,尽快把人接上。

设计时还要对经济账保持现实:这是按每条消息而非按每个用户计费的,所以你乐于见到的消息量同时也是账单。一个在公开群里回答任何人任何问题的机器人就是一个敞开的龙头,这也是为什么上面的触发规则是第一个决定,而不是最后一个。

这个阶段的常见问题

我该用哪个框架?

用你能读懂的,而且比你预想的要少。这类机器人大多只是几次调用:接收消息、组装一些上下文、询问模型、发送回复。编排框架只有在你有多个真正专门的步骤、且步骤之间有状态时才有价值,而它们会在你最需要理解的那部分之上增加一层间接。先从直接版本开始,等到你能说出框架为你解决了什么问题时再采用它。

机器人应该记住之前的对话吗?

只记住任务需要的那么多。记住最近几次交流能让对话连贯,代价也很小;永远记住一切会让机器人显得聪明,却把你的系统变成人们对其所说内容的档案库。后者是一个存储决定,带有第 093 步的全部后果,而且常常是因为框架提供了这个功能而无意中做出的。要有意识地决定记忆窗口,并让超出窗口的内容过期。

它能管理我的群吗?

它可以标记,但应由真人决定。第 061 步中的过滤已经展示了问题的形态:一个不理解你社区主题的系统会删除那些看起来不对、实际却没问题内容,而成员会把一次没有解释的删除体验为审查,而不是失误。用模型为人工管理员筛选候选内容是真正有用的。让它直接删除和封禁,则等于把房间里最有后果的按钮交给一个不可预测的组件。

我该如何阻止它回答不该回答的问题?

一部分靠指令,大部分靠架构。指令有帮助,但也可以被绕开,正如上一节所述,所以任何真正不能发生的事情,都应该是做不到的,而不是被劝阻的——如果它没有发放退款的工具,那么无论别人说服它说什么,它都无法发放退款。对于话题而非操作,实用的做法是范围收窄、清楚说明它覆盖什么,并对其他一切快速转交真人。

语音消息怎么办?

把收到的语音消息转写成文字并用文字回复,是这方面真正好的应用之一,因为它把收件人必须去听的东西变成了可以阅读的东西——与转写功能本身价值相同。两点提醒:转写在姓名、数字和技术术语上恰恰会在关键之处出错,所以任何有后果的内容都应确认;而且音频会离开这个房间,这就是上一节的内容应用在一种人们误以为比实际更私密的格式上。

正如大家所说,这就是机器人的未来吗?

它只是若干有用组件中的一个,而人们真正依赖的机器人仍然大多由确定性逻辑构成——表单、查询、通知、按钮。模型为这些加上了一个好的前门:它理解请求并把它路由出去。它做不到的是免除本课程其余部分的需要,因为它路由到的那个东西仍然必须被正确构建,而第 091 步到第 096 步中的失败模式不会因这一步的任何内容而改变。

← 返回 TG知识库