【RAG】001.1-RAG相关核心概念
@[toc]
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与生成模型的混合架构,旨在提升生成的准确性和可信度。其核心概念可归纳为以下六个方面:
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与生成模型的混合架构,旨在提升生成的准确性和可信度。其核心概念可归纳为以下六个方面:
1. 双模块架构
基本概述
- 检索模块(Retrieval) 从外部知识库(如文档、数据库)中实时检索与输入相关的信息。 关键技术:倒排索引、稠密向量检索(如BERT嵌入)、近似最近邻搜索(ANN,如FAISS)。
- 生成模块(Generation) 基于检索到的上下文,生成连贯且准确的答案。 典型模型:GPT、T5、Llama等预训练语言模型(LLM),负责融合检索结果与用户输入生成最终响应。
双模块关系分析
1、功能上互补(检索模块:实时数据、私域数据;生成模块:优化最终表达效果);
2、流程上的串行依赖(用户输入 ➔ 检索模块提取关键信息 ➔ 生成模块整合结果并输出);
3、 数据流动的特性(检索模块从海量数据中提取片段(如100篇文档 → 10个相关段落),生成模块进一步压缩为简洁答案(如10个段落 → 1段总结));
4、性能优化的耦合性(当检索召回率达到一定阈值后,生成质量的提升会趋于平缓;实时检索(高延迟)与预索引缓存(快速响应,但可能过时)之间的平衡需协同设计);
5、协同升级路径(独立优化:检索侧:改进Embedding模型、索引结构(如ColBERT的细粒度匹配);生成侧:微调模型适应检索结果格式(如标记引用来源) -- 联合优化:端到端训练检索器与生成器(如RA-DIT模型),让生成模块反馈指导检索模块学习;构建动态评估机制:根据生成结果的反向传播误差调整检索策略);
总结分析
检索与生成的耦合既是RAG的优势也是挑战:
- 理想状态: 检索模块提供精准、紧凑的上下文,生成模块聚焦语义融合与逻辑表达,形成"1+1>2"的协同效应。
- 常见瓶颈: 若模块间对齐不足(如检索结果与生成目标偏差),可能导致性能甚至低于单一模块(如纯生成模型)。
在实践中,需根据场景需求调整模块权重------高频更新领域(如新闻摘要)强调检索实时性;逻辑复杂任务(如数学推理)则需生成模块更强的推断能力。
2. 知识库构建
基本概述
- 文档预处理 数据清洗、分块(Chunking)以适配模型输入长度,如滑动窗口或语义分割。
- 嵌入模型(Embedding Model) 将文本转化为向量表示(如OpenAI的text-embedding-ada-002),质量直接影响检索相关性。
- 向量数据库 持久化存储文档向量,支持高效检索(如Elasticsearch、Pinecone、Milvus)。
文档预处理
目标 :将原始文档处理成适合模型处理的标准化文本单元。
关键操作:
- 数据清洗
- 去除无关内容(广告、页眉页脚、特殊字符)。
- 标准化格式(统一编码、标点、大小写)。
- 处理缺失值或噪声(如扫描文档的OCR错误修正)。
- 分块(Chunking)
- 分块策略 :
- 固定长度滑动窗口:按固定token数(如512)分割,重叠部分(如10%)避免语义断裂。
- 语义分割:基于自然段落、标题或句子边界(使用NLP工具,如Spacy)。
- 自适应分块:混合规则(如先按段落分,过长再按句子分)。
- 注意事项 :
- 块大小需适配模型输入限制(如GPT-3.5的4k token)。
- 保留上下文关联(例如表格与解释文本需在同一块)。
- 分块策略 :
工具示例:
- Python库:
NLTK
、Spacy
、LangChain
的RecursiveCharacterTextSplitter
。
嵌入模型(Embedding Model)
目标 :将文本转化为高维向量 ,捕捉语义信息以支持相似性检索。
关键点:
- 模型选择
- 通用场景:OpenAI
text-embedding-ada-002
(1536维,低成本高效果)。 - 领域适配:微调开源模型(如
BAAI/bge-small-en
、Sentence-BERT
)。 - 多语言支持:
paraphrase-multilingual-MiniLM-L12-v2
。
- 通用场景:OpenAI
- 嵌入质量优化
- 输入处理:去除停用词、保留关键实体。
- 维度权衡:更高维度(如1024)可能提升精度,但增加计算成本。
- 归一化 :对向量做L2归一化,提升余弦相似度计算效率。
评估指标:
- 检索任务中的
Recall@k
、MRR
(Mean Reciprocal Rank)。
向量数据库
目标:高效存储和检索向量,支持近似最近邻(ANN)搜索。
选型对比:
工具 | 特点 | 适用场景 |
---|---|---|
Pinecone | 全托管服务,支持动态更新,低延迟 | 云原生、快速迭代项目 |
Milvus | 开源,高可扩展性,支持分布式和GPU加速 | 大规模自建知识库(10亿+向量) |
FAISS | Facebook开源,轻量级,需手动管理存储 | 小规模或研究场景 |
Elasticsearch | 支持混合检索(文本+向量),生态成熟 | 需结合传统关键词检索的复杂需求 |
核心功能需求:
- 索引类型:HNSW(图结构)、IVF(倒排文件)等平衡速度与精度。
- 过滤支持:支持元数据过滤(如按日期、作者筛选)。
- 持久化:避免内存数据库重启数据丢失。
优化技巧:
- 分区索引(Sharding)提升并行查询能力。
- 量化(如PQ)减少内存占用。
总结流程
- 预处理:原始文档 → 清洗 → 分块 → 纯文本块。
- 向量化:文本块 → 嵌入模型 → 向量(+元数据)。
- 存储与检索:向量 → 数据库索引 → ANN查询 → 返回Top-K相关结果。
通过合理设计分块策略、选择领域适配的嵌入模型和数据库,可显著提升知识库的检索准确性和响应速度。
3. 检索优化策略
基本概述
- 查询重写(Query Rewriting) 扩展用户查询关键词(如HyDE生成假设文档提升检索效率)。
- 多模态检索 支持文本、图像、表格等多类型数据的联合检索(如CLIP模型)。
- 动态上下文选择 根据生成需求筛选最相关的检索片段,避免信息过载。
查询重写(Query Rewriting)
核心思想
查询重写的目标是弥补用户表达与知识库表达之间的语义鸿沟,通过扩展、改写或重构用户的原始查询,使其能够更好地匹配到相关文档。
主要方法
-
查询扩展 :
- 同义词扩展:将查询中的关键词扩展为同义词集合
- 相关词扩展:基于共现关系添加相关词汇
- 实体识别与扩展:识别查询中的实体并添加相关属性
-
HyDE (Hypothetical Document Embedding) :
- 工作原理:根据用户查询生成一个"假设性文档",即系统假设这样的文档能够完美回答用户问题
- 检索过程:使用这个假设文档的嵌入而非原始查询嵌入进行检索
- 优势:能够捕获更丰富的语义信息,特别是对于复杂问题
-
基于历史的查询重写 :
- 利用用户之前的查询和交互历史来优化当前查询
- 考虑会话上下文进行查询扩展
多模态检索
多模态检索支持在不同类型数据(文本、图像、音频等)中进行统一检索。
核心技术
-
统一嵌入空间 :
- CLIP (Contrastive Language-Image Pre-training):将图像和文本映射到同一嵌入空间
- 多模态Transformer:处理多种输入模态并生成统一表示
-
跨模态检索方法 :
- 文本到图像:用文本查询检索相关图像
- 图像到文本:用图像查询检索相关文本描述
- 混合模态检索:同时处理多种模态的查询
-
多模态索引结构 :
- 支持高效存储和检索不同模态数据的索引结构
- 向量数据库的多模态扩展
动态上下文选择
动态上下文选择是指根据当前生成任务的需求,智能地选择最相关的检索结果作为上下文。
关键策略
-
相关性排序 :
- 基于语义相似度对检索结果进行排序
- 考虑查询与文档片段的多维度匹配度
-
信息密度评估 :
- 评估文档片段包含的信息密度
- 优先选择信息丰富且非冗余的片段
-
上下文长度管理 :
- 根据模型上下文窗口大小动态调整包含的文档数量
- 在信息完整性和上下文长度之间寻找平衡
-
多样性采样 :
- 确保选择的上下文片段覆盖查询的不同方面
- 避免信息冗余和单一视角
4. 生成增强技术
基本概述
- 上下文融合(Context Fusion) 检索内容与用户输入的整合方式(如注意力机制、分隔符标记)。
- 可控生成(Controlled Generation) 通过提示工程(Prompt Engineering)或参数约束(Temperature、Top-k)确保输出符合检索结果。
- 溯源与可解释性 标注生成内容的来源文档,提升可信度(如引用标记)。
上下文融合(Context Fusion)
上下文融合是指将检索到的知识与用户输入 有效整合的过程,这是RAG系统中至关重要的环节。
主要融合方法
-
基于分隔符的简单拼接
-
使用特殊标记或分隔符将检索内容与用户查询区分开
-
常见格式:
ini系统提示: 根据提供的上下文回答问题 上下文: [检索片段1] [检索片段2] ... 用户问题: [用户输入]
-
优点:实现简单,适用于基础场景
-
缺点:对于复杂问题可能无法充分利用检索内容
-
-
注意力机制增强融合
- 利用Transformer架构中的注意力机制动态关注相关信息
- 实现方式:
- 交叉注意力:让模型在生成过程中动态关注检索内容的不同部分
- 自注意力增强:通过特殊标记增强模型对检索内容的关注度
-
检索内容预处理
- 根据相关性排序检索片段
- 为每个片段添加元信息(如来源、可信度)
- 去除冗余信息,提取核心内容
-
多轮融合策略
- 先使用检索内容生成初步回答
- 再基于初步回答和原始检索内容生成最终回答
- 有助于提高回答的连贯性和准确性
实现示例
python
def context_fusion(query, retrieved_documents):
# 对检索文档进行排序和预处理
sorted_docs = sort_by_relevance(query, retrieved_documents)
processed_docs = []
for i, doc in enumerate(sorted_docs[:5]): # 取前5个最相关文档
# 添加文档元信息
doc_with_meta = f"[文档{i+1}] 来源: {doc.source}\n{doc.content}\n"
processed_docs.append(doc_with_meta)
# 构建融合提示
context = "\n".join(processed_docs)
prompt = f"""请基于以下参考信息回答用户问题。如果参考信息不足以回答问题,请说明无法回答。
参考信息:
{context}
用户问题: {query}
回答:"""
return prompt
可控生成(Controlled Generation)
可控生成技术确保模型输出紧密依据检索内容,避免"幻觉"问题。
关键控制方法
-
提示工程(Prompt Engineering)
- 指令明确化:明确要求模型基于检索内容回答
- 角色设定:将模型设定为"研究助手"等需要严谨引用的角色
- 思维链(Chain-of-Thought):引导模型先分析检索内容再回答
- 示例引导:提供遵循检索内容回答的范例
-
解码策略调整
- Temperature:降低temperature(如0.1-0.3)增加确定性
- Top-k/Top-p采样:限制候选词范围,减少创造性发散
- 惩罚重复:增加重复惩罚参数,避免无意义重复
- 最小长度控制:确保回答充分利用检索信息
-
约束解码(Constrained Decoding)
- 词汇约束:限制生成内容必须使用检索文档中的关键术语
- 语法约束:确保生成内容遵循特定结构(如包含引用)
- 基于规则的后处理:对不符合要求的生成内容进行修正
-
迭代优化生成
- 生成-验证-修正循环:先生成初步回答,验证与检索内容一致性,再修正
- 自我批评:让模型评估自己的回答是否忠实于检索内容
实现示例
python
def controlled_generation(llm, prompt, retrieved_docs):
# 提取检索文档中的关键实体和术语
key_entities = extract_key_entities(retrieved_docs)
key_terms = extract_key_terms(retrieved_docs)
# 构建增强提示
enhanced_prompt = f"""{prompt}
重要提示:
1. 你的回答必须基于提供的参考信息
2. 使用参考信息中的关键术语: {', '.join(key_terms[:10])}
3. 不要添加参考信息中不存在的事实
4. 如果无法从参考信息中找到答案,请明确说明
请先思考参考信息中的关键点,然后再回答问题。"""
# 设置生成参数以增加可控性
generation_params = {
"temperature": 0.2, # 低温度增加确定性
"top_p": 0.85, # 适度限制词汇选择范围
"max_tokens": 500, # 足够长度以包含完整回答
"presence_penalty": 0.2, # 轻微鼓励多样性
"frequency_penalty": 0.5 # 减少重复
}
# 生成回答
response = llm.generate(enhanced_prompt, **generation_params)
# 验证回答是否包含关键实体
if not contains_key_entities(response, key_entities):
# 如果缺少关键实体,添加提醒并重新生成
verification_prompt = f"""你的回答缺少一些重要信息。请确保包含以下关键实体:
{', '.join(key_entities[:5])}
原始回答: {response}
请修改回答以包含这些关键信息:"""
response = llm.generate(verification_prompt, **generation_params)
return response
溯源与可解释性
溯源机制使RAG系统能够标注生成内容的来源,提高透明度和可信度。
主要溯源技术
-
内联引用标记
- 在生成内容中直接插入引用标记(如[1], [2])
- 文末提供完整引用信息(来源文档、页码等)
- 适用于学术风格或需要高可信度的应用场景
-
高亮源文本
- 将直接引用自检索内容的文本以不同颜色或样式显示
- 用户可直观区分哪些内容来自知识库
-
证据追踪
- 记录生成过程中使用的每个检索片段
- 提供交互式界面允许用户查看特定陈述的来源
- 支持点击展开原始上下文
-
置信度评分
- 为生成内容的不同部分提供置信度评分
- 基于检索内容的支持程度评估可信度
- 明确标识可能存在不确定性的部分
实现方法
python
def generate_with_attribution(query, retrieved_docs, llm):
# 为每个检索文档分配引用ID
docs_with_ids = []
for i, doc in enumerate(retrieved_docs):
doc_id = f"[{i+1}]"
doc_with_id = {
"id": doc_id,
"content": doc.content,
"source": doc.source,
"metadata": doc.metadata
}
docs_with_ids.append(doc_with_id)
# 构建带引用指导的提示
docs_text = "\n\n".join([f"{d['id']} {d['content']}" for d in docs_with_ids])
prompt = f"""请基于以下参考文档回答用户问题。在回答中使用方括号引用(如[1])标明信息来源。
参考文档:
{docs_text}
用户问题: {query}
回答(包含引用):"""
# 生成带引用的回答
response = llm.generate(prompt, temperature=0.2)
# 添加引用详情
references = "\n\n参考来源:\n"
for doc in docs_with_ids:
references += f"{doc['id']} {doc['source']}"
if 'page' in doc['metadata']:
references += f", 页码: {doc['metadata']['page']}"
if 'date' in doc['metadata']:
references += f", 日期: {doc['metadata']['date']}"
references += "\n"
# 组合最终回答
final_response = response + references
# 记录溯源信息用于后续查询
attribution_map = {
"response": response,
"references": docs_with_ids,
"query": query
}
return final_response, attribution_map
综合应用
最先进的RAG系统通常将上述三种技术有机结合:
- 通过精心设计的上下文融合策略将检索内容与用户查询整合
- 使用可控生成技术确保输出严格基于检索内容
- 实现完善的溯源机制使用户能够验证生成内容的来源
这种综合应用不仅提高了RAG系统的准确性和可靠性,还增强了用户对系统的信任度,特别适用于需要高精度信息的专业领域,如医疗、法律和学术研究。
5. 评估指标
基本概述
- 检索质量 召回率(Recall@k)、命中率(Hit Rate)、MRR(平均倒数排名)。
- 生成质量 BLEU、ROUGE(文本匹配度),Factual Accuracy(事实准确性)。
- 系统性能 响应延迟、吞吐量、资源消耗(如GPU内存占用)。
检索质量
评估向量检索模块返回结果的准确性,直接影响生成阶段的知识输入。
-
召回率(Recall@k)
- 定义:在前k个检索结果中,包含所有真实相关文档的比例。
- 公式 :
\\text{Recall@k} = \\frac{\\text{相关文档被检索到的数量}}{\\text{总相关文档数量}}
- 用途:衡量检索的覆盖能力,k通常取5或10。
-
命中率(Hit Rate)
- 定义:前k个结果中至少包含一个相关文档的查询占比。
- 公式 :
\\text{Hit Rate} = \\frac{\\text{至少命中一次的查询数}}{\\text{总查询数}}
- 用途:适合高相关文档稀疏的场景(如问答系统)。
-
平均倒数排名(MRR, Mean Reciprocal Rank)
- 定义:对每个查询,取第一个相关文档的排名倒数,再求所有查询的平均值。
- 公式 :
\\text{MRR} = \\frac{1}{N} \\sum_{i=1}\^{N} \\frac{1}{\\text{rank}_i}
- 用途:强调排名靠前的结果质量(如客服场景要求首条即准确)。
优化方向:
- 调整嵌入模型(如换用
bge-large
提升语义捕捉)。 - 优化分块策略(避免信息割裂导致相关文档分散)。
生成质量
评估大模型基于检索结果生成答案的准确性和流畅性。
-
文本匹配度指标
- BLEU:通过n-gram重叠率衡量生成文本与参考文本的相似性,侧重表面匹配。
- ROUGE :
ROUGE-L
:基于最长公共子序列(LCS)评估流畅性。ROUGE-N
:统计n-gram共现频率。
- 局限性:依赖参考文本,无法直接评估事实正确性。
-
事实准确性(Factual Accuracy)
- 评估方法 :
- 人工标注:专家判断生成内容与检索文档的一致性。
- 自动校验 :
- 使用NLI(自然语言推理)模型(如
DeBERTa
)判断生成是否蕴含检索内容。 - 实体/关系抽取对比(如检查生成答案中的日期、人名是否与检索一致)。
- 使用NLI(自然语言推理)模型(如
- 关键点:避免模型幻觉(Hallucination),即生成未检索到的信息。
- 评估方法 :
优化方向:
- 检索增强:提高检索相关性以约束生成内容。
- 提示工程:在Prompt中明确要求"仅基于检索内容回答"。
系统性能
评估系统在生产环境中的效率和资源消耗。
-
响应延迟(Latency)
- 端到端延迟:从用户输入到生成答案的总时间(通常需<2秒)。
- 关键瓶颈 :
- 检索耗时(ANN搜索速度)。
- 生成耗时(大模型推理速度)。
-
吞吐量(Throughput)
- 定义:单位时间(如每秒)处理的查询数量(QPS)。
- 优化手段 :
- 批量处理(Batching)检索和生成请求。
- 缓存高频查询结果。
-
资源消耗
- GPU内存占用:影响并发能力,尤其大模型推理时(如7B模型需约20GB显存)。
- CPU/磁盘I/O:向量数据库查询时的资源开销。
监控工具:
- Prometheus + Grafana(实时监控延迟、吞吐)。
- NVIDIA DCGM(GPU利用率分析)。
总结与权衡
- 检索 vs. 生成:高Recall@k可能提升生成质量,但会增加延迟。
- 质量 vs. 性能 :更复杂的嵌入模型(如
bge-large
)提高准确性,但显存占用更高。 - 评估策略 :
- 离线测试:使用标注数据集计算Recall@k、Factual Accuracy。
- 线上A/B测试:对比不同配置的用户满意度(如点击率、停留时间)。
通过多维度指标的综合分析,可针对性优化RAG系统的薄弱环节,实现高效可靠的知识增强生成。
6. 应用场景与挑战
- 典型场景:开放域问答、文档摘要、客服自动化、代码生成。
- 关键挑战 :
- 检索噪声(无关内容干扰生成)
- 长文本上下文处理(模型输入长度限制)
- 幻觉(Hallucination)控制:生成内容偏离检索事实的缓解策略(如自检模块、强化学习微调)。
7. 拓展方向
- 主动检索(Active Retrieval):生成过程中动态触发多次检索(想法:比如推理能力,让大模型推理检索目标)。
- 端到端训练:联合优化检索器和生成器(如DPR+GPT的联合训练)。
- 多跳推理(Multi-hop QA):通过迭代检索解决复杂问题。
理解这些概念有助于设计高效、可靠的RAG系统,尤其在减少生成错误与提升信息可信度方面具有显著优势。
8. 大模型常见术语
以下是大模型(Large Language Models, LLMs)相关的关键术语及其解释,按类别分类整理:
1. 基础概念
- 大模型(Large Language Model, LLM)
参数量巨大(通常数十亿以上)的深度学习模型,基于海量文本训练,能处理文本生成、问答等任务(如GPT-4、PaLM)。 - 生成式AI(Generative AI)
能够生成文本、图像、代码等内容的人工智能,LLM是其在文本领域的代表。 - 基座模型(Foundation Model)
通过大规模预训练得到的通用模型,可作为下游任务的基础(如BERT、GPT-3)。
2. 模型架构
- Transformer
基于自注意力机制(Self-Attention)的神经网络架构,是LLM的核心(如GPT、BERT均基于此)。 - 自注意力(Self-Attention)
计算输入序列中每个词与其他词的相关性权重 ,捕捉长距离依赖。 - 解码器(Decoder)
单向模型(如GPT)的结构,仅关注左侧上下文,适合生成任务。 - 编码器(Encoder)
双向模型(如BERT)的结构,可捕捉全文上下文,适合理解任务。
3. 训练相关
- 预训练(Pre-training)
在大规模无标注数据上训练模型,学习通用语言表示(如预测下一个词)。 - 微调(Fine-tuning)
在预训练模型基础上,用特定领域数据调整参数以适应下游任务。 - 指令微调(Instruction Tuning)
通过自然语言指令调整模型,使其更好地遵循用户意图(如ChatGPT)。 - 人类反馈强化学习(RLHF)
通过人类偏好数据优化模型输出(如ChatGPT的对话对齐)。
4. 关键技术
- 提示工程(Prompt Engineering)
设计输入提示(Prompt)以引导模型生成期望输出(如"Few-shot Learning")。 - 思维链(Chain-of-Thought, CoT)
让模型分步推理,提升复杂问题解答能力(如数学题)。 - 上下文学习(In-Context Learning)
通过示例(而非参数更新)让模型学习任务(如给出输入-输出样本)。
5. 评估与优化
- 困惑度(Perplexity)
衡量模型预测不确定性的指标,值越低表示模型越准确。 - 参数效率(Parameter Efficiency)
减少参数量但保持性能的技术(如LoRA、适配器)。 - 灾难性遗忘(Catastrophic Forgetting)
模型在新任务训练后遗忘旧任务知识的现象。
6. 部署与应用
- 推理(Inference)
模型根据输入生成输出的过程,涉及计算资源优化。 - 量化(Quantization)
降低模型参数精度以减少内存占用(如FP32→INT8)。 - AI对齐(AI Alignment)
确保模型目标与人类价值观一致(如避免有害输出)。
7. 其他重要概念
- 多模态(Multimodal)
处理文本、图像、音频等多种数据类型的模型(如GPT-4V)。 - 开源模型(Open-source Models)
公开代码和权重的模型(如LLaMA、Falcon)。 - AI安全(AI Safety)
研究如何防止LLM的滥用或意外风险(如深度伪造、偏见)。
示例模型
- GPT系列:生成式预训练模型(OpenAI)。
- BERT:双向编码器模型(Google)。
- LLaMA:Meta开源的轻量化LLM。