RAG 应用的复杂度层级
总的来说,这个仓库作为一个全面的指南,帮助理解和实现不同复杂度层级的RAG应用。无论你是刚开始学习基础知识的初学者,还是想要深化专业知识的有经验开发者,你都能在这里找到有价值的见解和实用知识,助力你的学习之旅。让我们一起开启这段激动人心的探索,充分发掘RAG应用的全部潜力。
第一层:基础知识
欢迎来到RAG应用的基础层级!在这里,我们将从基础开始,为你探索检索增强生成(Retrieval-Augmented Generation)领域奠定基础。这个层级旨在向你介绍使用RAG模型的核心概念和基本技术。完成这部分内容后,你将对如何遍历文件系统进行文本生成、如何分块和批处理文本、以及如何与嵌入API交互有扎实的理解。让我们一起深入探索RAG应用的激动人心的功能吧!
- 递归遍历文件系统生成文本。
- 利用生成器进行文本分块。
- 使用生成器批量请求并异步发送到嵌入API。
- 将数据存储在LanceDB中。
- 实现一个命令行界面,用于查询、嵌入问题、生成文本块和生成回答。
处理流程
[此处省略代码部分]
搜索流程
[此处省略代码部分]
回答流程
[此处省略代码部分]
第二层:进阶技巧
在这一层,我们深入探讨检索增强生成(RAG)应用的世界。这个层级是为那些已经掌握基础知识并准备探索更高级技巧和优化方法的人设计的。在这里,我们专注于通过更好的异步编程、改进的分块策略以及处理流程中的强大重试机制来提高RAG应用的效率和有效性。
在搜索流程中,我们引入了一些复杂的方法,如更优的排序算法、查询扩展和重写,以及执行并行查询,以提高搜索结果的质量和相关性。
此外,回答流程也得到了改进,以提供更有结构和信息量的回答,包括引用特定文本块和采用流式响应模型以实现更好的交互。
处理
- 更好的异步编程
- 更好的分块策略
- 更好的重试机制
搜索
- 更好的排序(使用Cohere)
- 查询扩展/重写
- 并行查询
[此处省略代码部分]
回答
- 引用特定文本块
- 使用流式响应模型实现更好的结构
[此处省略代码部分]
第三层:可观察性
在第三层,重点转向关键的可观察性实践。这个阶段强调实施全面的日志记录机制的重要性,以监控和衡量应用程序的多方面性能。建立强大的可观察性允许你快速定位和解决任何瓶颈或问题,确保最佳功能。以下我们列出了几种对实现这一目标至关重要的关键日志类型。
扩展广泛事件跟踪
广泛事件跟踪
记录查询如何被重写
- 在处理投诉时,我们应该能快速理解查询是否被正确重写
查询 | 重写后的查询 | 延迟 | ... |
---|---|---|---|
... | ... | ... | ... |
示例:我们曾发现对于包含"最新"的查询,它选择的日期实际上是当前日期。通过包含考虑"最新"为一周或更长时间的少量示例,我们能够快速修复这个问题。
- 训练模型
我们还可以利用所有正面示例来研究如何训练一个更好地进行查询扩展的模型。
记录引用
通过记录引用,我们可以快速了解模型是否引用了正确的信息,哪些文本块很受欢迎,审查并了解模型是否引用了正确的信息。此外,我们还可能在未来构建一个模型,以理解哪些文本块更重要。
查询 | 重写后的查询 | ... | 引用 |
---|---|---|---|
... | ... | ... | [1,2,4] |
有几种方法可以实现这一点。例如,在引用某些内容时,你不仅可以包含展示给语言模型的内容,还可以包含被引用的内容。如果某些内容被展示给语言模型但未被引用,我们可以将其作为数据集的一部分。
查询 | 重写后的查询 | ... | 来源 | 被引用 |
---|---|---|---|---|
... | ... | ... | [1,2,4] | [1,2] |
记录平均余弦相似度分数和重排序分数
通过附加这些小型元数据,我们将能够非常轻松地识别可能表现不佳的查询。
查询 | 重写后的查询 | ... | 平均余弦相似度分数 | 重排序分数 |
---|---|---|---|---|
法国的首都是什么? | 法国的首都是什么? | ... | 0.9 | 0.8 |
谁最后修改了文件? | 谁最后修改了文件? | ... | 0.2 | 0.1 |
在这里你可能会发现"哦,显然我无法回答关于文件修改的问题",因为这甚至不在我的索引中。
记录搜索的用户级元数据
通过包含其他组信息,我们可以快速识别某个特定群体是否有不好的体验
示例可能包括:
- 组织ID
- 用户ID
- 用户角色
- 注册日期
- 设备类型
- 地理位置
- 语言
这可以帮助你了解很多关于应用程序使用方式的不同信息。也许使用不同设备的人会提出较短的查询,而这些查询表现不佳。或者当新组织注册时,他们提出的问题类型没有得到语言模型的良好服务。将来我们会讨论其他指标,但仅通过实施平均余弦相似度分数和自由排序分数,你就可以免费获得这些信息,无需额外工作。
只需构建一些按这些属性分组并查看平均分数的简单仪表板,你就可以学到很多。我的建议是每周在站会时审查这些内容,查看一些示例,并找出我们可以如何改进我们的系统。当我们看到较差的分数时,我们可以查看查询和重写后的查询,试图理解到底发生了什么。
拥有用户
到这个阶段,你肯定应该有用户了。你已经通过理解查询、重写查询以及监控用户如何实际使用你的系统为成功做好了准备。接下来的几个步骤将围绕改进特定指标以及实现这一目标的不同方法。
第四层:评估
在这个阶段,评估对于理解我们系统的性能和有效性至关重要。主要来说,我们处理两个不同的系统:搜索系统和问答(QA)系统。通常会看到很多人关注评估QA系统,因为它直接与最终用户的查询进行交互。然而,同样重要的是不要忽视搜索系统。搜索系统作为骨干,获取相关信息,QA系统在此基础上构建答案。全面的评估策略应该包括这两个系统,单独评估它们,并评估它们在为用户查询提供准确、相关答案方面如何良好集成和互补。
评估搜索系统
这里的目标是加强我们对各个层级(K)的精确度和召回率等关键指标的关注。通过全面记录所有引用数据,我们有坚实的基础来使用语言模型对搜索系统的有效性进行深入评估。
对于数据集可能有限的情况,转向合成数据是一种实用的方法。这种方法涉及选择随机文本块或文档,然后提示语言模型生成这些文本可以回答的问题。这个过程对于验证搜索系统准确识别和检索负责生成这些问题的文本块的能力至关重要。
[此处省略代码部分] return { "召回率@5": (如果text_chunk在search_results前5个结果中则为1,否则为0), ... }
平均召回率 = sum(测试() for _ in range(n)) / n
你的代码实际上不应该是这样的,但这基本上概括了我们可以综合生成问题并将其用作评估的一部分的想法。你可以尝试发挥创意。但最终它将取决于你实际编写生成提示的能力。
### 评估回答系统
这要棘手得多,但通常人们会使用类似的框架来评估问题。在这里,我建议花更多时间构建一个实际包含答案的数据集。
```python
def 测试():
text_chunk = 抽样文本块(n=...)
问题, 答案 = 询问AI(f"为{text_chunk.text}生成问题和答案")
ai_答案 = rag应用(问题)
return 询问AI(f"对于问题{问题},给定{答案}是正确答案,回答{ai_答案}是否正确?")
评估回答系统:反馈
建立反馈机制以获得更好的分数也很重要。我建议建立一个点赞、点踩评级系统,而不是五星评级系统。我现在不会详细讨论,但这是我强烈推荐的。
合成数据的目的
合成数据的目的是帮助你快速获得一些指标。它将帮助你建立这个评估流程,希望随着你获得更多用户和更多真实问题,你将能够使用我们拥有的一系列测试来了解我们在哪些方面表现良好,在哪些方面表现不佳。精确度、召回率、平均排名分数等。
第5级:了解短处
在这一点上,你应该能够使用合成数据和生产数据构建一个极其多样化的数据集。我们还应该有一套可以用来评估答案质量的分数。
org_id | 查询 | 重写 | 答案 | 召回率@k | 精确度@k | 平均排名分数 | 重排序分数 | 用户反馈 | 引用 | 来源 | ... |
---|---|---|---|---|---|---|---|---|---|---|---|
org123 | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
现在我们可以通过进行探索性数据分析来了解我们的表现如何。我们可以查看平均排名分数和重排序分数,看看是否有任何模式。我们可以查看引用,看看是否有任何模式。我们可以查看用户反馈,看看是否有任何模式。我们可以查看来源,看看是否有任何模式。我们可以查看查询,看看是否有任何模式。
聚类查询
我们可以使用聚类来了解查询中是否存在任何模式。我们可以使用聚类来了解引用中是否存在任何模式。我们可以使用聚类来了解来源中是否存在任何模式。我们可以使用聚类来了解用户反馈中是否存在任何模式。
我们稍后会更深入地讨论,但总的想法是我们还可以引入聚类主题。我发现通常有两种不同类型的聚类我们会检测到。
- 主题
- 能力
主题由文本块和查询的性质捕获。能力由来源的性质或我们拥有的额外元数据捕获。
能力可能更像是:
- 询问文档元数据的问题,如"谁最后修改了文件"
- 需要对文档进行摘要的问题,如"这份文档的主要观点是什么"
- 需要时间线信息的问题,如"过去3个月发生了什么"
- 比较和对比的问题,如"这两份文档之间有什么区别"
这些都是你在聚类和探索数据集时可能会发现的东西。
即将讨论的主题
随着我们继续探索RAG应用的深度,以下领域将在后续级别中讨论,每个级别都旨在提高RAG系统的复杂性和功能:
第6级:高级数据处理
- 查找段落和路由:高效识别和引导数据段的技术。
- 处理表格:解释和操作表格数据的策略。
- 处理图像:将图像数据整合到RAG应用中的方法。
第7级:查询增强
- 构建时间线查询:跨不同时间框架制定查询,用于动态数据分析。
- 添加额外元数据:利用元数据来丰富查询上下文并提高响应准确性。
第8级:摘要技术
- 摘要和摘要索引:从大型数据集开发简明摘要,以帮助快速洞察。
第9级:结果建模
- 建模业务结果:应用RAG技术预测和建模业务结果,促进战略决策制定。