1、检索精度优化策略
1. 数据预处理优化
- 目标:减少噪声,提升文本质量。
- 方法:
- 去除冗余模板(如重复条款)。
- 消除空白与格式不一致(合并空行、统一缩进)。
- 删除无关信息(页眉、页脚、版权声明)。
1.分块策略调整:
- 动态分块:根据文本结构(如段落、标题)动态调整块大小。
- 重叠分块:相邻块间保留10%-20%的重叠内容,避免上下文断裂。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64,
separators=["\n\n", "\n", ".", " "]
)
2.元数据增强:
- 为每个文本块添加来源、时间戳、作者等元数据,支持检索时过滤。
class Document:
def __init__(self, content, metadata):
self.content = content
self.metadata = metadata # e.g., {"source": "manual_v1", "date": "2023-01"}
2. 向量化模型优化
- 模型选型:
- 通用场景:
sentence-transformers/all-mpnet-base-v2
(高精度)。 - 多语言场景:
paraphrase-multilingual-mpnet-base-v2
。 - 轻量级:
all-MiniLM-L6-v2
(速度优先)。
- 通用场景:
- 领域微调:
from sentence_transformers import SentenceTransformer, InputExample, losses model = SentenceTransformer('all-mpnet-base-v2') train_examples = [InputExample(texts=["医疗术语A", "医疗术语B"])] train_loss = losses.MultipleNegativesRankingLoss(model) model.fit(train_objectives=[(train_examples, train_loss)], epochs=3)
3. 索引与检索优化
- 混合检索:
- 结合语义检索(向量)与关键词检索(BM25),提升召回率。
from rank_bm25 import BM25Okapi from sklearn.feature_extraction.text import CountVectorizer corpus = [doc.content for doc in documents] bm25 = BM25Okapi(corpus) tokenized_query = query.split() bm25_scores = bm25.get_scores(tokenized_query)
- 重排序(Reranking):
- 使用交叉编码器优化Top-K结果。
from sentence_transformers import CrossEncoder reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2") pairs = [[query, doc] for doc in retrieved_docs] rerank_scores = reranker.predict(pairs) sorted_docs = [doc for _, doc in sorted(zip(rerank_scores, retrieved_docs, reverse=True)]
4. 查询优化
- 核心思想:生成多个语义相关的子查询,覆盖向量空间不同区域。
- 指令模板:
# 输入大模型的指令示例
你是一个AI语言模型助手。
生成五个不同版本的用户问题,以便从向量数据库中检索相关文档。
原始问题:{查询原文}
效果:提高检索全面性,避免遗漏关键信息。
1.查询扩展:
- 通过同义词库或LLM生成查询变体。
def expand_query(query):
synonyms = {"价格": ["售价", "费用"], "优点": ["优势", "好处"]}
expanded = [query]
for word in query.split():
if word in synonyms:
expanded.extend([query.replace(word, syn) for syn in synonyms[word]])
return expanded
2.意图识别:
- 使用分类模型区分查询类型(如事实型、开放型)。
from transformers import pipeline
classifier = pipeline("text-classification", model="facebook/bart-large-mnli")
intent = classifier(query, candidate_labels=["事实查询", "建议请求"])
2、RAG效果评估方法
1. 检索阶段评估
- 离线评估指标:
指标 计算方式 工具示例 Recall@K Top-K结果中相关文档占比 trec_eval
MRR 首个相关文档排名的倒数均值 自定义脚本 NDCG@K 考虑排序的相关性加权评分 ir_measures
- 在线评估:
- 用户点击率(CTR)、答案采纳率。
2. 生成阶段评估
- 自动指标:
from bert_score import score P, R, F1 = score([generated], [reference], lang="zh")
- 人工评估维度:
- 准确性:答案是否包含正确事实。
- 相关性:是否围绕问题展开。
- 流畅性:语言是否自然。
3. 端到端评估框架
- 测试集构建:
test_cases = [ { "question": "特斯拉2023年Q4交付量?", "expected_answer": "48.45万辆", "docs": ["特斯拉Q4交付48.45万辆..."] } ]
- 自动化流水线:
def evaluate_rag(test_case): retrieved = retriever(test_case["question"]) generated = llm.generate(retrieved, test_case["question"]) accuracy = 1 if test_case["expected_answer"] in generated else 0 return {"accuracy": accuracy, "retrieved_docs": retrieved}
3、优化效果对比(示例)
优化策略 | Recall@5 | BERTScore | 人工评分(1-5) |
---|---|---|---|
基础RAG | 0.62 | 0.75 | 3.2 |
+混合检索 | 0.78 | 0.82 | 4.1 |
+重排序 | 0.81 | 0.85 | 4.4 |
+查询扩展 | 0.85 | 0.88 | 4.6 |
4、持续改进流程
- 监控:实时记录检索与生成指标。
- 反馈循环:收集用户对错误答案的反馈,加入训练数据。
- 定期迭代:每季度更新嵌入模型与索引。
🔗 下一步行动:尝试将查询扩展与自查询结合,观察召回率提升效果!