Bootstrap

人工标注提升 RAG 查询的准确性

背景与原理

RAG(Retriever-Augmented Generation)流程中,回答的准确性依赖两个关键步骤:

  1. 检索器:从知识库中找到与查询最相关的内容。
  2. 生成器:基于检索内容生成最终答案。

如果检索器返回的结果相关性低,则生成器生成的答案可能不准确(即幻觉问题)。通过人工标注,我们可以:

  • 为知识库的内容打上标签或修订,从而提升检索器的匹配能力。
  • 为检索结果进行相关性评分,优化检索器的排序规则。

完整流程:如何通过人工标注提升 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. 注意事项与总结

注意事项
  1. 标注一致性
    • 制定明确的标注标准,避免不同标注员对同一数据的评分不一致。
  2. 定期检查知识库
    • 确保知识库内容最新,避免过时数据影响检索器性能。
  3. 隐私保护
    • 确保知识库和用户查询的数据符合隐私法规(如 GDPR)。
完整流程总结
  1. 准备知识库并进行 库内标注
  2. 利用检索器获取结果并进行 检索结果标注
  3. 使用标注数据微调检索器,优化排序规则。
  4. 应用主动学习优先标注“不确定”数据,进一步提升系统效率。
;