?令人敬畏的检索增强生成(RAG)
该存储库包含精选的精彩列表以及有关生成式人工智能中检索增强生成(RAG)应用程序的一般信息。
检索增强生成 (RAG) 是生成人工智能中的一项技术,从外部源检索额外的上下文以丰富大型语言模型 (LLM) 的生成过程。这种方法允许法学硕士纳入他们仅从预训练数据中可能缺乏的最新、特定或敏感信息。
内容
- RAG 的一般信息
- 方法
- ?促进 RAG 的框架
- 技巧
- 指标
- ?数据库
RAG 的一般信息
在传统的 RAG 方法中,采用基本框架来检索丰富 LLM 提示上下文的文档。例如,当查询翻新房屋的材料时,法学硕士可能拥有有关翻新的一般知识,但缺乏有关特定房屋的具体细节。实施 RAG 架构可以快速搜索和检索相关文档(例如蓝图),以提供更多定制的响应。这确保了法学硕士将具体信息纳入改造需求,从而提高其答复的准确性。
典型的 RAG 实施遵循以下关键步骤:
- 划分知识库:将文档语料库分成更小的、可管理的块。
- 创建嵌入:应用嵌入模型将这些文本块转换为向量嵌入,捕获其语义。
- 存储在向量数据库中:将嵌入保存在向量数据库中,从而实现基于语义相似性的快速检索。
- 处理用户查询:使用应用于文本块的相同模型将用户的查询转换为嵌入。
- 检索相关数据:根据语义相似性在向量数据库中搜索与查询嵌入紧密匹配的嵌入。
- 增强提示:将最相关的文本块纳入法学硕士的提示中,为生成响应提供有价值的上下文。
- 生成响应: LLM 利用增强提示来提供准确且针对用户查询量身定制的响应。
方法
RAG 实现的复杂性各不相同,从简单的文档检索到集成迭代反馈循环和特定领域增强功能的高级技术。方法可能包括:
- 纠正 RAG (CRAG):在整合到 LLM 响应之前纠正或细化检索到的信息的方法。
- 检索增强微调 (RAFT):专门针对增强的检索和生成任务微调 LLM 的技术。
- 自反射 RAG:根据模型性能反馈动态调整检索策略的模型。
- RAG Fusion:结合多种检索方法以改进上下文集成的技术。
- 时间增强检索(TAR):在检索过程中考虑时间敏感数据。
- Plan-then-RAG (PlanRAG):涉及对复杂任务执行 RAG 之前的规划阶段的策略。
- GraphRAG:一种使用知识图来增强上下文集成和推理的结构化方法。
- FLARE - 一种结合主动检索增强生成来提高响应质量的方法。
- 上下文检索 - 通过在检索之前向文档块添加相关上下文来改进检索,从而增强从大型知识库检索到的信息的相关性。
?促进 RAG 的框架
- Haystack - LLM 编排框架,用于构建可定制的、可用于生产的 LLM 应用程序。
- LangChain - 与法学硕士合作的通用框架。
- Semantic Kernel - Microsoft 的 SDK,用于开发生成式 AI 应用程序。
- LlamaIndex - 用于将自定义数据源连接到 LLM 的框架。
- Cognita - 用于构建模块化和生产就绪应用程序的开源 RAG 框架。
- Verba - 开箱即用的 RAG 开源应用程序。
- Mastra - 用于构建 AI 应用程序的 Typescript 框架。
技巧
数据清洗
- 数据清理技术:用于细化输入数据并提高模型性能的预处理步骤。
提示
- 策略
- 标记和标签:向检索到的数据添加语义标签或标签以增强相关性。
- 原因和行动 (ReAct) (ReAct):集成推理功能,根据检索到的上下文指导 LLM 响应。
- 思维链(CoT):鼓励模型在提供答案之前逐步思考问题。
- 验证链(CoVe):提示模型验证其推理的每一步的准确性。
- 自洽:生成多个推理路径并选择最一致的答案。
- 零样本提示:设计无需任何示例即可指导模型的提示。
- Few-Shot Prompting:在提示中提供一些示例来演示所需的响应格式。
- 缓存
- 提示缓存:通过存储和重用预先计算的注意力状态来优化 LLM。
分块
- 固定大小分块
- 将文本划分为大小一致的片段以进行高效处理。
- 根据大小和重叠将文本拆分为块。
- 示例:按字符分割(LangChain)。
- 示例:SentenceSplitter (LlamaIndex)。
- 递归分块
- 使用递归算法对复杂文档结构进行分层分段。
- 示例:按字符递归分割(LangChain)。
- 基于文档的分块
- 根据元数据或格式提示对文档进行分段,以进行有针对性的分析。
- 示例:MarkdownHeaderTextSplitter (LangChain)。
- 示例:使用 OpenCLIP 等模型处理图像和文本嵌入。
- 语义分块
- 代理分块
嵌入
- 选择嵌入模型
- MTEB 排行榜:探索 Hugging Face 评估模型嵌入的基准。
- 自定义嵌入:为特定领域或任务开发定制嵌入,以增强模型性能。自定义嵌入可以捕获特定领域的术语和细微差别。技术包括在您自己的数据集上微调预训练模型,或使用 TensorFlow 或 PyTorch 等框架从头开始训练嵌入。
检索
- 检索方法
- 矢量存储扁平索引
- 简单而有效的检索形式。
- 内容被矢量化并存储为平面内容矢量。
- 层次索引检索
- 将数据按层次结构缩小到不同级别。
- 按层次顺序执行检索。
- 假设性问题
- 用于增加数据库块和查询之间的相似性(与 HyDE 相同)。
- LLM 用于为每个文本块生成特定问题。
- 将这些问题转换为向量嵌入。
- 在搜索过程中,将查询与该问题向量索引进行匹配。
- 假设文档嵌入 (HyDE)
- 用于增加数据库块和查询之间的相似性(与假设问题相同)。
- LLM 用于根据查询生成假设响应。
- 将此响应转换为向量嵌入。
- 将查询向量与假设响应向量进行比较。
- 从小到大检索
- 通过使用较小的块进行搜索和使用较大的块进行上下文来改进检索。
- 较小的子块引用较大的父块
- 重新排名:通过重新排序最初检索的文档,优先考虑与查询语义最相关的文档,增强 RAG 管道中的搜索结果。
指标
搜索指标
这些指标用于衡量嵌入之间的相似性,这对于评估 RAG 系统检索和集成外部文档或数据源的效率至关重要。通过选择适当的相似性指标,您可以优化 RAG 系统的性能和准确性。或者,您可以开发适合您的特定领域或利基的自定义指标,以捕获特定领域的细微差别并提高相关性。
余弦相似度
- 测量多维空间中两个向量之间角度的余弦。
- 对于比较文本嵌入非常有效,其中向量的方向代表语义信息。
- 通常在 RAG 系统中用于测量查询嵌入和文档嵌入之间的语义相似性。
点积
- 计算两个数字序列的相应条目的乘积之和。
- 相当于向量归一化后的余弦相似度。
- 简单高效,常与硬件加速一起使用进行大规模计算。
欧氏距离
- 计算欧几里得空间中两点之间的直线距离。
- 可以与嵌入一起使用,但由于“维数灾难”,在高维空间中可能会失去有效性。
- 常用于降维后的 K 均值等聚类算法。
杰卡德相似度
- 用交集的大小除以集合并集的大小来衡量两个有限集之间的相似性。
- 在比较标记集时很有用,例如在词袋模型或 n-gram 比较中。
- 不太适用于法学硕士产生的连续嵌入。
注意:余弦相似度和点积通常被视为衡量高维嵌入之间相似度的最有效指标。
响应评估指标
这些指标评估 RAG 系统生成的答案的质量和相关性,评估它们的准确性、上下文适当性和可靠性。通过应用这些评估指标,您可以深入了解系统的性能并确定需要改进的领域。
工具
这些工具可以帮助评估 RAG 系统的性能,从跟踪用户反馈到记录查询交互以及随着时间的推移比较多个评估指标。
- LangFuse :用于跟踪 LLM 指标、可观察性和提示管理的开源工具。
- Ragas :帮助评估 RAG 管道的框架。
- LangSmith :用于构建生产级 LLM 应用程序的平台,可让您密切监控和评估您的应用程序。
- Hugging Face Evaluate :用于计算 BLEU 和 ROUGE 等指标以评估文本质量的工具。
- 权重和偏差:跟踪实验、记录指标并可视化性能。
?数据库
下面列出了几个适合检索增强生成 (RAG) 应用程序的数据库系统。它们涵盖了一系列 RAG 用例,有助于有效存储和检索向量以生成响应或建议。
基准测试
分布式数据处理和服务引擎:
- Apache Cassandra:分布式 NoSQL 数据库管理系统。
- MongoDB Atlas:具有集成矢量搜索功能的全球分布式多模型数据库服务。
- Vespa:专为实时应用程序设计的开源大数据处理和服务引擎。
具有矢量功能的搜索引擎:
- Elasticsearch:提供矢量搜索功能以及传统搜索功能。
- OpenSearch:分布式搜索和分析引擎,源自 Elasticsearch。
矢量数据库:
- Chroma DB:人工智能原生开源嵌入数据库。
- Milvus:用于人工智能应用程序的开源矢量数据库。
- Pinecone:无服务器矢量数据库,针对机器学习工作流程进行了优化。
- Oracle AI 矢量搜索:在 Oracle 数据库中集成矢量搜索功能,以基于矢量嵌入进行语义查询。
关系数据库扩展:
- Pgvector:PostgreSQL 中矢量相似性搜索的开源扩展。
其他数据库系统:
- Azure Cosmos DB:具有集成矢量搜索的全球分布式多模型数据库服务。
- Couchbase:分布式 NoSQL 云数据库。
- Lantern:一个具有隐私意识的个人搜索引擎。
- LlamaIndex:采用简单的内存向量存储来进行快速实验。
- Neo4j:图形数据库管理系统。
- Qdrant:一个专为相似性搜索而设计的开源矢量数据库。
- Redis Stack:用作数据库、缓存和消息代理的内存数据结构存储。
- SurrealDB:针对时间序列数据优化的可扩展多模型数据库。
- Weaviate:开源云原生矢量搜索引擎。
矢量搜索库和工具:
- FAISS:一个用于高效相似性搜索和密集向量聚类的库,旨在处理大规模数据集并针对最近邻居的快速检索进行了优化。