背景与原理
RAG(Retriever-Augmented Generation)流程中,回答的准确性依赖两个关键步骤:
- 检索器:从知识库中找到与查询最相关的内容。
- 生成器:基于检索内容生成最终答案。
如果检索器返回的结果相关性低,则生成器生成的答案可能不准确(即幻觉问题)。通过人工标注,我们可以:
- 为知识库的内容打上标签或修订,从而提升检索器的匹配能力。
- 为检索结果进行相关性评分,优化检索器的排序规则。
完整流程:如何通过人工标注提升 RAG 准确率
1. 搭建环境
确保你已安装以下依赖库:
pip install transformers sentence-transformers numpy pandas sklearn
pip install pinecone-client
2. 数据准备与知识库标注
2.1 准备知识库数据
以 FAQ 系统为例,知识库数据如下:
knowledge_base = [
{"question": "什么是机器学习?", "answer": "机器学习是让计算机从数据中学习的一种方法。"},
{"question": "云计算的优点是什么?", "answer": "云计算提供按需服务,节省成本。"},
{"question": "深度学习与机器学习的关系是什么?", "answer": "深度学习是机器学习的一个分支。"}
]
2.2 添加分类标签
为每条数据添加标签,帮助模型更好地理解内容分类:
for item in knowledge_base:
if "机器学习" in item["question"]:
item["tags"] = ["AI", "机器学习"]
elif "云计算" in item["question"]:
item["tags"] = ["云计算", "IT基础设施"]
elif "深度学习" in item["question"]:
item["tags"] = ["AI", "深度学习"]
print(knowledge_base)
输出:
[
{"question": "什么是机器学习?", "answer": "机器学习是让计算机从数据中学习的一种方法。", "tags": ["AI", "机器学习"]},
{"question": "云计算的优点是什么?", "answer": "云计算提供按需服务,节省成本。", "tags": ["云计算", "IT基础设施"]},
{"question": "深度学习与机器学习的关系是什么?", "answer": "深度学习是机器学习的一个分支。", "tags": ["AI", "深度学习"]}
]
2.3 向量化知识库
利用 sentence-transformers
将知识库向量化,结合标签信息生成更语义化的向量。
from sentence_transformers import SentenceTransformer
# 加载模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 生成向量
embeddings = [
model.encode(f"{item['question']} Tags: {', '.join(item['tags'])}")
for item in knowledge_base
]
print("向量化完成,生成嵌入向量:", embeddings)
2.4 将向量存入 Pinecone 向量数据库
Pinecone 是一个流行的向量数据库,用于存储和检索嵌入向量。
import pinecone
# 初始化 Pinecone
pinecone.init(api_key="YOUR_API_KEY", environment="us-west1-gcp")
# 创建索引
index_name = "faq-index"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=len(embeddings[0]))
# 连接索引
index = pinecone.Index(index_name)
# 插入数据
for i, item in enumerate(knowledge_base):
index.upsert([(str(i), embeddings[i])])
print("向量已存入 Pinecone 数据库")
3. 检索结果标注
3.1 执行检索
从 Pinecone 中检索相关文档:
query = "机器学习的定义是什么?"
query_embedding = model.encode(query)
# 检索最相关的文档
results = index.query(query_embedding, top_k=3, include_metadata=True)
print("检索结果:", results)
3.2 手动标注相关性
对检索结果进行人工评分,记录相关性。评分规则:
- 5 分:完全相关
- 4 分:高度相关
- 3 分:部分相关
- 2 分:略微相关
- 1 分:无关
示例标注:
manual_scores = [
{"query": "机器学习的定义是什么?", "document": "机器学习是让计算机从数据中学习的一种方法。", "relevance": 5},
{"query": "机器学习的定义是什么?", "document": "深度学习是机器学习的一个分支。", "relevance": 4},
{"query": "机器学习的定义是什么?", "document": "云计算提供按需服务,节省成本。", "relevance": 1}
]
4. 用人工标注优化检索器
4.1 微调检索器模型
将标注数据用于训练检索器。例如,利用 BERT 模型微调查询与文档的匹配。
from transformers import BertForSequenceClassification, Trainer, TrainingArguments
# 加载 BERT 模型
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
# 微调模型
trainer = Trainer(
model=model,
args=TrainingArguments(output_dir="./results", num_train_epochs=3),
train_dataset=your_labeled_data
)
trainer.train()
5. 主动学习优化
5.1 什么是主动学习?
主动学习的目的是:
- 让模型自动找到“不确定”的数据。
- 这些数据优先进行人工标注,减少标注工作量。
5.2 测量不确定性
不确定性可以通过检索结果的相似度分数衡量。以下代码找到分数最低的结果:
import numpy as np
similarity_scores = [0.9, 0.7, 0.3]
uncertain_indices = np.argsort(similarity_scores)[:2]
print(f"最不确定的数据索引: {uncertain_indices}")
输出:
最不确定的数据索引: [2, 1]
5.3 人工标注后更新模型
标注完成后,将这些数据重新用于训练或优化模型:
# 假设新增的标注数据
new_labeled_data = [
{"query": "什么是深度学习?", "document": "深度学习是机器学习的一个分支。", "relevance": 5}
]
# 合并新数据并重新训练模型
all_data.extend(new_labeled_data)
trainer.train()
6. 注意事项与总结
注意事项
- 标注一致性:
- 制定明确的标注标准,避免不同标注员对同一数据的评分不一致。
- 定期检查知识库:
- 确保知识库内容最新,避免过时数据影响检索器性能。
- 隐私保护:
- 确保知识库和用户查询的数据符合隐私法规(如 GDPR)。
完整流程总结
- 准备知识库并进行 库内标注。
- 利用检索器获取结果并进行 检索结果标注。
- 使用标注数据微调检索器,优化排序规则。
- 应用主动学习优先标注“不确定”数据,进一步提升系统效率。