RAG 对时间视而不见 — 我构建了一个时间层来在生产中修复它

测试三周后,一名学习者告诉我,我的人工智能导师给了她错误的答案。并不是明显错误 - 只是过时到足以误导。就在那一刻,我意识到大多数 RAG 系统都悄悄忽略了一些事情:它们没有时间观念。我的系统检索到最相似的文档,而不是最新的文档。在不断变化的知识库中,这是一个严重的缺陷。修复方法不在检索器或模型中。它就在它们之间的间隙中。我构建了一个时间层,可以过滤过期的事实,增强对时间敏感的信号,并使系统更喜欢仍然真实的内容,而不仅仅是匹配的内容。文章《RAG 对时间视而不见——我构建了一个时间层来在生产中修复它》首先出现在《走向数据科学》上。

来源:走向数据科学

,一位学习者向我发送了错误答案的消息。

她向导师询问了我的生成式人工智能教程中的一个概念。反应看起来不错。但事实并非如此。两个月前我已经重写了该内容。我的 RAG 系统提取了六个月前的版本 - 并不是明显错误,只是错误到足以产生误导。

她以为自己误会了。她没有。我自己的系统正在用我已经替换的课程来教她。

我正在为我的技术教育平台 EmiTechLogic 构建一个由 RAG 驱动的助手 — 将内容库转变为直接从我自己的文章生成答案的系统。我在这里写了关于初始架构的文章。最初的架构是易于管理的。当真正的学习者接触实时系统时,真正的挑战就开始了。

当我拉取检索日志时,我确切地看到发生了什么。两个版本都在矢量商店中。旧的排名第一,因为它有更多的匹配标记和更高的余弦相似度得分。更新后的版本位居第二。有时第三。

我希望较新的文档会自动获胜。这不是余弦相似度的工作原理。

系统完全按照其设计目的进行操作,结果却出现了问题。

该模式也适用于其他查询。我更新了 Python 教程,修改了模型比较指南。旧版本不断首先出现。我正在构建的人工智能工具正在悄悄地向人们传授我已经替换的课程。

这是实践中的样子,相同的查询,相同的语料库,朴素的 RAG:

查询:API 速率限制是多少?我会收到 429 错误吗?

天真的抹布

1. [policy_v1] 年龄=540d |已过期 |模拟=0.447

“API 速率限制设置为每分钟 100 个请求......”2. [announcement_today] 年龄=0d |有效 |模拟=0.3293. [tutorial_old] 年龄=600d |已过期 | sim=0.303我认为新鲜度将在管道中的某个地方处理。事实并非如此。没有人想到要添加它。TL;DR完整代码:https://github.com/Emmimal/temporal-rag/其中: