第 18 期 - RAG 效果提升方法综述
摘要
大模型落地存在缺少垂直领域知识、有幻觉和应用门槛、重复建设等问题,RAG 是一种解决方案。本文介绍了多篇 RAG 优化论文及工程实践经验,包括 RAPTOR、Self - RAG、CRAG、Dense X Retrieval 等论文中的方法,以及 Chunking 优化、Query 重写、Hybrid Retrieval 等工程实践经验
一、大模型落地的问题
大模型落地存在诸多问题:
- 缺少垂直领域知识:虽然大模型涵盖大量人类知识,但在垂直场景下存在短板,需要专业化服务解决特定问题。
- 存在幻觉、应用有门槛:使用大模型时会有幻觉、合规问题,难以很好地落地,缺乏配套工作,如管理非结构化文本、测试、运营和管理等。
- 存在重复建设:各业务孤立探索,资产无法沉淀,存在低水平重复建设,对公司来说 ROI 低。
二、RAG 简介
RAG(Retrieval - Augmented Generation)即检索增强生成,它结合检索系统和生成模型提高语言生成的准确性和相关性。其优势在于生成响应时能引入外部知识,对处理需要专业知识或大量背景信息的问题有效。随着大型语言模型(LLMs)发展,RAG 技术不断进化。目前大部分公司倾向于使用 RAG 进行信息检索,一些公司会使用微调的 Embedding Model 增强检索能力,也有公司会选择知识图谱或者 ES 等非向量数据库的 RAG 方法,而第三方开发者会使用集成好的 RAG 框架或 LLMOps 里内建的 RAG 工具。
三、相关优化论文
(一)RAPTOR
- 树形结构构建:
- 文本分块:将检索语料库分割成短的、连续的文本块。例如在代码实现中,可能需要按照一定的规则对原始文本进行切割。
- 嵌入和聚类:使用 SBERT(基于 BERT 的编码器)将文本块嵌入,再用高斯混合模型(GMM)进行聚类。
- 摘要生成:对聚类后的文本块用语言模型生成摘要,再重新嵌入、聚类和生成摘要,直到无法进一步聚类,构建出多层次树形结构。
- 查询方法:
- 树遍历:从树的根层开始,逐层选择与查询向量余弦相似度最高的节点,直到到达叶节点,将选中节点文本拼接形成检索上下文。
- 平铺遍历:将整个树结构平铺成单层,同时比较所有节点,选出与查询向量余弦相似度最高的节点,直到达到预定义的最大 token 数。
- 实验结果:RAPTOR 在多个任务上优于传统检索增强方法,与 GPT - 4 结合后,在 QuALITY 基准上准确率提高 20%,源代码将在 GitHub 上公开,实验使用了 NarrativeQA、QASPER 和 QuALITY 等问答数据集。
# 这里可能是实现 RAPTOR 相关功能的代码示例,比如文本分块等操作
text = "原始文本内容"
text_blocks = split_text(text) # 假设这是自定义的文本分块函数
embedded_blocks = embed_text_blocks(text_blocks) # 嵌入文本块的函数
clustered_blocks = cluster_blocks(embedded_blocks) # 聚类函数
# 后续的摘要生成等操作类似
(二)Self - RAG
- 主要过程:
- 输入相关判断:输入为接收输入提示(x)和之前生成的文本(y<t),模型(M)预测是否需要检索(Retrieve)。
- 检索相关操作(Retrieve 为是时):
- 检索相关文本段落:使用检索器(R)基于((x, y<t))检索相关文本段落(D)。
- 相关性预测:模型(M)预测相关性(ISREL)。
- 支持性和有用性预测:模型(M)预测支持性(ISSUP)和有用性(ISUSE)并排序。
- 非检索相关操作(Retrieve 为否时):
- 生成下一个段落:模型(M)基于(x)生成(y_t)。
- 有用性预测:模型(M)基于(x, y_t)预测有用性(ISUSE)。
- 与传统 RAG 对比:传统 RAG 先检索固定数量文档再生成回答,易引入无关或虚假信息,SELF - RAG 通过自反思机制按需检索相关文档并评估段落质量,提高准确性和可靠性。
# 以下是 Self - RAG 可能的伪代码示例
def self_rag(input_prompt, previous_text):
if should_retrieve(input_prompt, previous_text):
retrieved_paragraphs = retrieve_paragraphs(input_prompt, previous_text)
relevance_scores = predict_relevance(retrieved_paragraphs, input_prompt, previous_text)
supportiveness_scores = predict_supportiveness(retrieved_paragraphs, input_prompt, previous_text)
usefulness_scores = predict_usefulness(retrieved_paragraphs, input_prompt, previous_text)
sorted_paragraphs = sort_paragraphs(relevance_scores, supportiveness_scores, usefulness_scores)
else:
new_paragraph = generate_paragraph(input_prompt)
usefulness_score = predict_usefulness(new_paragraph, input_prompt)
return result
(三)CRAG
- 核心思想:大语言模型生成过程会有虚假信息,RAG 依赖检索文档的相关性和准确性,所以提出 CRAG 框架提高生成过程的鲁棒性。
- 具体方法:
- 输入和输出:x 为输入问题,D 为检索到的文档集合,y 为生成的响应。
- 评估步骤:计算每个问题 - 文档对的相关性得分 scorei,再得出最终置信度判断 Confidence。
- 动作触发:根据置信度为 CORRECT、INCORRECT、AMBIGUOUS 分别进行不同知识检索操作。
- 生成步骤:使用生成器 G 基于输入问题 x 和处理后的知识 k 生成响应 y。
- 关键组件:
- 检索评估器:基于置信度分数触发不同知识检索操作。
- 知识重组算法:对高相关性检索结果分解再重组,先分解成细粒度知识片段,计算相关性得分,过滤不相关片段并重组。
- 网络搜索:当检索文档不佳时,引入网络搜索补充知识,重写输入查询,通过搜索 API 生成 URL 链接获取内容并提取相关知识。
- 实验结果:在四个数据集上的实验表明 CRAG 可显著提高 RAG 方法性能。
# 假设的 CRAG 部分实现代码
def crag(input_question):
retrieved_docs = retrieve_docs(input_question)
scores = calculate_scores(input_question, retrieved_docs)
confidence = calculate_confidence(scores)
if confidence == "CORRECT":
knowledge = extract_internal_knowledge()
elif confidence == "INCORRECT":
knowledge = obtain_external_knowledge()
else:
knowledge = combine_internal_external_knowledge()
response = generate_response(input_question, knowledge)
return response
(四)Dense X Retrieval
- 命题定义:命题是文本中的原子表达,包含独立事实,以简洁、自包含自然语言形式呈现,具有独立意义、最小化、上下文自包含的特点。
- 具体方法:
- 分割段落为命题(A 部分):将段落按照一定规则分割成独立命题,创建新的检索语料库 FactoidWiki。
- 比较不同粒度的检索单元(C 部分):对不同粒度检索单元(段落、句子、命题)在开放域问答任务中进行实证比较,比较指标如 Recall@5 和 EM@100。
- 命题检索的优势:命题检索能提高密集检索的精确性和问答任务的准确性,直接提取相关信息更有效地回答问题,但将段落和句子分解为命题会增加存储。
# 可能的段落命题分割代码示例
def split_to_propositions(paragraph):
propositions = []
# 按照定义中的规则进行分割
# 如先拆分复合句等操作
return propositions
四、其他优化方法
(一)Chunking 优化
- 主要观点:文本切割是优化语言模型应用性能的关键,切割策略应根据数据类型和任务性质定制。传统切割方法有局限,语义切割和基因性切割更高级。使用多向量索引可提供更丰富文本表示,工具和技术选择要基于数据理解和任务需求。
- 五种文本切割的层次:
- 字符级切割:按固定字符数量切割文本。
- 递归字符切割:考虑文本物理结构逐步递归切割。
- 文档特定切割:针对不同类型文档用特定分隔符切割。
- 语义切割:利用语言模型嵌入向量分析文本意义和上下文确定切割点。
- 基因性切割:创建 Agent 决定切割方式。
(二)Query 重写
- 基本步骤:
- 生成子查询:输入问题分解成多个子查询。
- 文档检索:每个子查询分别检索相关文档。
- 文档合并和重新排序:合并子查询的检索结果文档并重新排序后输出答案。
- 其它 Query 分解的策略:
- 递归回答方法:将问题、先前问答响应和当前问题上下文继续传递,对复杂查询有效。
- 并行回答方法:分解用户提示为多个部分并行解决,组合结果回答用户查询。
- 分析 Query 结构(分词、NER):分词便于处理,NER 识别命名实体有助于理解查询内容。
- 纠正 Query 错误(纠错):自动纠正查询中的拼写或语法错误。
- 联想 Query 语义(改写):进行语义改写提高检索效果,如 HyDE 方法,还有 RAG - Fusion 技术。
- 扩充 Query 上下文(省略补全、指代消解):扩展查询上下文使查询更完整明确。
(三)Hybrid Retrieval(混合检索)
- 稀疏检索(Sparse Retrieval):基于倒排索引,对文本进行词袋或 TF - IDF 表示,按关键词重要性排序文档,速度快、可解释性强,但处理语义问题效果有限。
- 稠密检索(Dense Retrieval):利用深度神经网络将查询和文档映射到低维稠密向量空间,通过向量相似度度量相关性,能捕捉语义信息,但构建向量索引成本高、检索速度慢。混合检索结合两者优势提高检索效果和效率。
(四)Small to Big 检索策略
- 基本思想:先从小粒度文本单元(如句子、段落)开始检索,逐步扩大检索范围到更大文本单元(如文档、文档集合),直到获取足够相关信息。
- 优点:
- 提高检索效率:快速锁定相关信息位置,避免在大量无关文本中全文搜索。
- 提高检索准确性:逐步扩大检索范围获取更完整上下文信息,减少检索不准问题。
- 减少无关信息:有效过滤不相关文本,减少对后续生成任务的干扰。
(五)Embeding & Rerank 模型优化效果评估
RAG 评估系统在模型开发、优化和应用过程中很重要,通过统一评估标准可比较不同 RAG 模型或优化方法的差异,识别最佳实践。
五、结语
RAG 系统实际应用需要工程和算法等多方面参与努力,理论上有很多方法,但实践中需要大量实验对比、验证和优化,还会遇到如异构数据源加载和处理、知识展示形态等细节问题,建立自动化评估机制、模型持续迭代和大小模型训练支持也很重要,过程充满挑战和机遇。
扩展阅读
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有