基于博文 Advanced RAG Techniques: an Illustrated Overview 的学习和练习的记录。
中文内容可以查看博主@宝玉的译文 高级 RAG 技术:图解概览 [译]
系列笔记:
RAG 学习笔记(一)
RAG 学习笔记(二)
搜索索引
- 向量存储索引
- 层次索引
- 假设问题和HyDE
- 丰富上下文
- 融合检索或混合搜索
向量存储索引
搜索索引 是RAG pipeline 中的关键组成部分,用于存储前面文本块向量化后的数据。
搜索索引类型:
- 平面索引(flat index):最简单的实现,可以通过计算查询文本的向量和所有文本块向量的距离,来获取最相关的查询结果。
- 向量索引(vector index):在1万个元素的量级上可以进行高效检索,基于近似最近邻居算法,如聚类、树结构或 HNSW 算法。这类索引有: faiss、nmslib 或 annoy。
- 托管服务:如 OpenSearch、ElasticSearch 和向量数据库,它们自动处理前文提到的数据摄取流程,例如 Pinecone、Weaviate 和 Chroma。
可以将文本的元数据与向量存储到一起,使用元数据过滤器可以按照日期或来源等条件进行信息检索。
LlamaIndex 支持多种向量存储索引
层次索引
场景:
需要从有许多文档中进行高效的检索,找到相关的信息,然后整合到一个答案中,并带有参考来源。
实现:
创建两个索引:
- 一个索引由文档摘要构成
- 一个索引由文本块构成
分两步搜索:
- 先从文档摘要索引中过滤相关文档
- 在这些文档的范围内,在文本块中进行搜索
假设问题和 HyDE
假设问题法:
- 使用 LLM 为每个文本块生成一个问题,然后将问题 embedding 为向量
- 搜索时,先使用问题搜索,找到相似问题的索引
- 然后找到这些问题对应的文本块,使用文本块作为上下文发送给 LLM 来获取答案。
优点:
查询和假设问题之间的语义相似度更好,对比直接搜索文本块,该方法的质量更高。
另外一种方法叫 HyDE,与假设问题方法逻辑相反:
- 根据输入问题生成回答,然后使用回答文本的向量和问题向量来提高搜索的质量。