CNN/Daily Mail
收藏RAG System Optimization for CNN/Daily Mail 数据集概述
目标
该项目的目标是:
- 开发一个针对CNN/Daily Mail数据集的检索增强生成(RAG)系统。
- 使用RAGAS基准测试RAG系统的性能。
- 实施优化技术以提高RAG系统的性能。
数据准备
项目使用了CNN/Daily Mail数据集。该数据集可通过Hugging Face数据集库获取。使用datasets库加载数据集,并提取RAG系统所需的必要字段。
python dataset = load_dataset("cnn_dailymail", "3.0.0", split="validation[:1000]")
上述代码加载了CNN/Daily Mail数据集验证集的前1000个示例。加载数据的函数可在src/rag_pipeline/load_docs.py中找到。
为了加快加载速度,提取了article列作为页面内容,并保存到CSV文件中。
RAG系统设置
基本RAG系统
使用ChromaDB向量存储库的经验,决定将其用于RAG系统的初始设置。
设置基本RAG系统的步骤如下:
- 加载文档:从CSV文件加载数据集,然后仅检索
article列作为页面内容以获取文档。 - 分割文档:使用langchain的
RecursiveChararacterTestSplitter将文档分割成小块。 - 创建向量存储库:使用
langchain_chroma从分割的文档创建向量存储库。 - 设置LLM:使用OpenAI的gpt-3.5-turbo进行测试设置,随后升级到gpt-4o。
- 创建可用于检索文档和生成答案的RAG链。RAG链简单地使用langchain的
RetrievalQA。
使用最佳实践推进RAG系统
遵循以下步骤设置RAG系统,使其可重用和可扩展:
-
创建一个
RAGSystem类,用于设置RAG系统。该类可在src/rag_pipeline/rag_system.py中找到。 -
添加加载文档、分割文档、创建向量存储库、设置LLM、创建RAG链等方法和类。
-
使用示例:
python from src.rag_pipeline.rag_system import RAGSystem
rag_system = RAGSystem( model_name = "gpt-4o", embeddings = embeddings,
这里可以添加更多参数来自定义RAG系统
)
rag_system.initialize()
创建自定义RAG链
创建了一个自定义RAG链,用于检索文档和生成答案,以允许对RetrievalQA链进行自定义。自定义RAG链可在src/rag_pipeline/rag_utils.py中找到。
创建自定义RAG链的步骤如下:
- 定义辅助函数:定义了两个辅助函数,
format_docs用于将文档列表格式化为连接字符串,ragas_output_parser用于从文档列表中提取页面内容。 - 自定义生成器LLM的提示模板:在设置(
misc/settings.py)中创建自定义提示模板GENERATOR_TEMPLATE。该模板与语言模型(llm)和字符串输出解析器组合,形成RAG链的生成器组件。 - 创建上下文检索器:设置一个名为
context_retriever的LangchainRunnableParallel对象,用于处理相关文档的检索。它将检索器与format_docs函数结合,以获取和格式化上下文,同时保持问题不变。 - 过滤数据集:创建一个名为
filter_langsmith_dataset的LangchainRunnableLambda对象,用于过滤输入,确保只有问题是字典时才进行处理。注意,此函数最初用于RAGAS+LangSmith评估,但适用于任何数据集。 - 构建RAG链:最终的RAG链被构建为一个Langchain
RunnableParallel对象。它执行以下操作:- 通过过滤器处理问题 - 检索和格式化上下文 - 使用生成器生成答案 - 使用ragas_output_parser提取上下文。 - 返回RAG链:函数返回构建的RunnableParallel对象,表示为LangSmith集成设置的完整RAG链。
优化技术
为了解决识别出的改进领域,计划实施不同的优化技术。计划实施的技术包括:
- 提示工程:尝试不同的提示格式,引导模型生成更事实准确和相关的答案。这可以提高answer_correctness、faithfulness和answer_relevancy。
- 使用混合检索:结合密集(例如神经网络)和稀疏(例如BM25)检索模型,可以利用两种方法的优势,提高文档检索性能。
- 使用多查询检索器:通过生成多个查询,这可以帮助找到由于措辞细微差异或向量表示不完美而可能遗漏的文档。
- 尝试不同的嵌入模型:使用先进的嵌入模型,如BERT或其他基于Transformer的模型,可以提高检索文档的质量,从而改善答案生成。
- 重排序机制:在初始检索后,根据相关性分数对检索到的文档进行重排序。这可以帮助优先考虑最相关的文档,提高answer_correctness和answer_relevancy。
- 改进的分块策略:优化块大小和重叠参数可以帮助捕获更多上下文相关和连贯的文档部分,从而提高检索上下文的质量。
优化技术的结果
提示工程
尝试了不同的提示格式,引导模型生成更事实准确和相关的答案。
结果:显著提高了答案的正确性、忠实度和相关性。详细结果可在这里找到。
混合检索
实施了结合密集和稀疏检索模型的混合检索机制,以提高文档检索性能。
结果:轻微提高了答案的相关性,但略微降低了上下文精度和忠实度。详细结果可在这里找到。
使用多查询检索器
- 实施了一个多查询检索器,生成多个查询以检索文档。
- 多查询检索器使用llm(gpt-3.5-turbo)基于问题生成
n个查询。 - 然后使用RAG系统的基础检索器为每个查询检索文档。
- 每个查询检索到的文档随后被组合和排序。
结果:显著提高了答案的相关性,略微降低了上下文精度。详细结果可在这里找到。




