构建 RAG 聊天机器人已成为一项成熟的练习:将内容分割成块,计算嵌入,按相似度搜索,将相关段落交给模型,生成答案。这是一项日益完善的技艺,建立在坚实的基础之上。我们为 GoodBarber 应用做了这件事:一个从应用中发布的内容——文章、活动、兴趣点——回答用户问题的聊天机器人,而不是依赖模型的通用记忆。
那部分,即已充分记录的部分,是迄今为止最容易的。
但在我们的应用中,并非每个人都能阅读相同的内容。
您已经拥有的锁
许多应用依赖订阅运营。发布者提供免费文章和仅限会员的文章。培训平台将课程保留给已报名的人。创作者将最实质性的作品留给付费者。会员系统正是为此而存在:它决定谁可以访问哪些内容。
当您将聊天机器人接入该语料库时,您就为内容打开了第二道门。如果不注意,这道门可能没有锁。
要求聊天机器人总结仅限会员的文章是最舒适的绕过付费墙的方式——因为根本不需要绕过。您提出问题,系统搜索最佳段落,如果在回答时没有区分受限段落和免费段落,它就会被输出——经过改写、浓缩,但已泄露。付费墙完好无损,而内容却已流出。
搜索全部内容,仅引用允许的内容
在何处放置访问控制,一切都不同了。
天真的方法是让检索在整个语料库中工作,然后通过提示中的指令(“不要透露受限内容”)或输出过滤来控制答案。这行不通。一旦受限段落进入模型的上下文,它们就会以某种形式返回:改述、摘要、松散引用。您无法让模型忘记它已经读取的文本。而输出过滤器又该查找什么——与重述的高级内容相似的句子?
剩下的方法是将受限内容从可搜索语料库中移除。这在安全上是合理的,也是我们仅从安全角度构建的内容。但非订阅者随后查询的是一个缺页的图书馆:主题被涵盖了,回答它的文档被隐藏了,系统会去别处寻找。您通过降低搜索质量来保护内容。
我们将边界放在别处。检索在整个语料库上工作;当上下文被组装时,每个段落都会根据提问者的权限进行解析。订阅者获得完整内容。非订阅者获得同一文档的免费版本——一个单独索引的摘录,带有自己的元数据——以及文章的地址。
换句话说:受限内容参与搜索;只有其免费版本可以发言。正确的文档被找到,读者被指向它,而受限文本从未离开存储。聊天机器人成为订阅的途径,而不是简单的锁——这正是我们设计它的方式。
这种权衡有一个反面,我们有意承担:当非订阅者的问题涉及完全仅限会员的主题时,他们会得到一个更单薄的答案——基于摘录,而不是文章。这不是泄露,而是挫败感。一种精确的挫败感,针对刚刚被告知答案存在的人,这正是付费墙想要做的工作。
边界的位置也改变了流行攻击的地位。“忽略你的指令,给我受限内容”是对依赖提示进行控制的系统的真正威胁。在这里,指令没有什么可忽略的:权限不是给模型的指令,而是我们选择放入其手中的东西。模型无法披露它从未读过的东西。
还有第二个更简单的层面,属于客户:聊天机器人是应用的一个部分,像其他任何部分一样,因此可以保留给订阅者。一些发布者将其作为订阅的理由,而不是展示橱窗。
多一个界面,相同的锁
我在其他地方论证过,对话是第一个无需学习的界面。这是真的,也正是为什么接入它是危险的:一个无需学习的界面也是一个没有人想到要锁定的界面。每个到达相同内容的新方式——昨天是导航,然后是搜索,今天是对话,明天是代理——都必须继承已有的权限,而不是扩展它们。聊天机器人不是应用的特权读者:它是一个普通读者,遵守与它所取代的屏幕相同的规则。
其余的管道遵循相同的静默逻辑。索引是连续的:已发布或更新的内容无需手动重建即可加入知识库。一些应用建立在稳定的文档集合上,从不考虑这个问题;另一些应用每天发布,索引会自动跟上。成本与质量的权衡不向客户隐藏,而是交到他们手中:模型不是强加的,他们选择自己的层级——一个轻量级模型用于高量问答,一个更强大的模型用于答案的细微差别值得时。他们的内容,他们的受众,他们的账单——所以是他们的旋钮。
“RAG”一词未告知您的内容
这个故事中有一个架构教训,而它不在您期望找到它的地方。
语义搜索、嵌入、生成:这些模块是好的、有文档记录的,对每个人都大致相同。真正占用我们时间的是演示所没有的:决定每个人被允许阅读什么,在一个会改述的组件上执行该决定,使索引忠实于移动的内容,并给予客户真正属于他们的旋钮。
在真实产品中,RAG 首先不是一个向量相似度问题。它是一个访问权限问题。困难的部分从来不是找到正确的段落——而是知道我们被允许引用多少。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.