在实现过程中,除了最终的生成阶段以外,RAG通常还包括两个典型的阶段——索引阶段和检索阶段。
索引阶段旨在对文档进行预处理,以支持后续检索过程中的高效搜索。这一过程根据所采用的信息检索方法而异,在LLM开发中,我们常使用向量搜索(vector search)技术,也称作语义搜索(semantic search)技术。在此阶段,文本文档经由嵌入模型(embedding model)转换为数字向量,这些向量能够捕捉文本的深层语义特征,并通过余弦相似度或其他相似性度量标准来查找和排序与查询最相关的文档。
对于向量搜索,索引阶段包括清理文档、丰富其内容(添加额外数据和元数据)、将文档分割成更小的片段、执行嵌入操作,以及最终将这些嵌入向量存储在向量数据库中。索引工作一般在离线状态下完成,即不需要用户等待其完成。这可以通过定时任务机制定期更新索引,或通过专门的应用程序仅处理索引任务。然而,当用户上传自定义文档并希望立即访问LLM时,索引过程则需要在线进行,并集成到应用程序中。
图1-2展示了RAG索引阶段的工作流程。
图1-2 RAG索引阶段的工作流程
如图1-2所示,索引阶段涉及多个核心概念。简而言之,在RAG的索引阶段,文档(document)被输入系统后,首先通过文本分割器(text splitter)分解为较小的片段,即文本片段(segment)。每个片段随后经过嵌入模型处理,转换成能表达其语义信息的数值向量——嵌入(embedding)。这些嵌入向量随后被存储在嵌入存储(embedding store)中,这是一种专用于存储和管理向量数据的数据库。通过这种方式,文档的语义内容得以有效转换和存储,从而为检索阶段的高效搜索和生成任务打下了坚实的基础。
检索阶段通常在线上进行,当用户提交一个问题时,系统需要利用已索引的文档来生成回答。此过程会根据所使用的信息检索方法有所不同。在采用向量搜索技术的情况下,它涉及将用户的查询嵌入,并在嵌入存储中执行相似性搜索。随后,系统从搜索结果中选取与原始文档相关的片段,作为上下文信息注入提示词中,发送给LLM以获取响应。
图1-3展示了RAG检索阶段的工作流程。
图1-3 RAG检索阶段的工作流程
如图1-3所示,RAG检索阶段的工作流程包括以下几个关键概念。
● 用户查询(query):流程始于用户提交的查询。
● 查询嵌入(query embedding):查询被输入系统中,通过嵌入模型处理,转换成数字向量。
● 嵌入存储:在嵌入存储中执行搜索,该存储包含了索引阶段生成的所有文档嵌入向量。
● 相关文本片段(relevant segment):通过比较查询嵌入与嵌入存储中的嵌入向量,系统识别出最相关的文档片段。
● 提示词注入:相关文档片段随后被提取并与用户查询一起注入提示词,提供给LLM以生成最终的响应或完成特定任务。
整个检索阶段确保了用户查询的语义内容能够与文档内容有效匹配,从而支持生成更精准和上下文敏感的回答。