【RAG】检索后排序 提高回答精度

问题: RAG中,有时,最合适的答案不一定排在检索的最前面

user_query = "how safe is llama 2"
search_results = vector_db.search(user_query, 5)

for doc in search_results['documents'][0]:
    print(doc+"\n")

response = bot.chat(user_query)
print("====回复====")
print(response)

方案:ReRank

  1. 检索时过召回一部分文本
  2. 通过一个排序模型对 query 和 document 重新打分排序

在这里插入图片描述

# !pip install sentence_transformers
from sentence_transformers import CrossEncoder

# model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2', max_length=512) # 英文,模型较小
model = CrossEncoder('BAAI/bge-reranker-large', max_length=512) # 多语言,国产,模型较大

user_query = "how safe is llama 2"
# user_query = "llama 2安全性如何"
scores = model.predict([(user_query, doc)
                       for doc in search_results['documents'][0]])
# 按得分排序
sorted_list = sorted(
    zip(scores, search_results['documents'][0]), key=lambda x: x[0], reverse=True)
for score, doc in sorted_list:
    print(f"{score}\t{doc}\n")
0.918857753276825	In this work, we develop and release Llama 2, a family of pretrained and fine-tuned LLMs, Llama 2 and Llama 2-Chat, at scales up to 70B parameters. On the series of helpfulness and safety benchmarks we tested, Llama 2-Chat models generally perform better than existing open-source models.

0.7791304588317871	We believe that the open release of LLMs, when done safely, will be a net benefit to society. Like all LLMs, Llama 2 is a new technology that carries potential risks with use (Bender et al., 2021b; Weidinger et al., 2021; Solaiman et al., 2023).

0.47571462392807007	We provide a responsible use guide¶ and code examples‖ to facilitate the safe deployment of Llama 2 and Llama 2-Chat. More details of our responsible release strategy can be found in Section 5.3.

0.47421783208847046	We also share novel observations we made during the development of Llama 2 and Llama 2-Chat, such as the emergence of tool usage and temporal organization of knowledge. Figure 3: Safety human evaluation results for Llama 2-Chat compared to other open-source and closed source models.

0.16011707484722137	Additionally, these safety evaluations are performed using content standards that are likely to be biased towards the Llama 2-Chat models. We are releasing the following models to the general public for research and commercial use‡: 1.

1. ReRank 的核心作用

在 RAG(检索增强生成)系统中,ReRank 用于优化初步检索结果,解决传统向量检索的两大痛点:

  1. 语义模糊性:向量检索可能返回语义相关但细节不匹配的文档。
  2. 精度天花板:仅依赖向量相似度无法捕捉复杂的语义关联。

示例场景
当用户查询 "how safe is llama 2" 时,向量检索可能返回包含 "llama 2 model architecture""safety guidelines for AI" 的文档,而 ReRank 会进一步识别与 "safety" 直接相关的内容。


2. 代码解析

(1) 安装依赖与导入库
# !pip install sentence_transformers
from sentence_transformers import CrossEncoder
  • sentence_transformers:提供预训练模型和工具,用于文本向量化、排序等任务。
  • CrossEncoder:交叉编码器模型,同时处理查询和文档,计算相关性得分。
(2) 加载 ReRank 模型
# 英文小模型(适合快速实验)
# model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2', max_length=512)

# 多语言大模型(中文优化,精度高)
model = CrossEncoder('BAAI/bge-reranker-large', max_length=512)
  • 模型选择
    • cross-encoder/ms-marco-MiniLM-L-6-v2: 轻量级英文模型,适合低资源场景。
    • BAAI/bge-reranker-large: 北京智源研究院的中英多语言模型,支持更长文本和复杂语义。
(3) 定义查询与待排序文档
user_query = "how safe is llama 2"
# user_query = "llama 2安全性如何"

# 假设 search_results 是初步检索结果
search_results = {
    'documents': [
        [
            "Llama 2 introduced safety fine-tuning to reduce harmful outputs.",
            "The model architecture of Llama 2 uses a transformer-based design.",
            "Safety in AI involves rigorous testing and ethical guidelines."
        ]
    ]
}
(4) 计算相关性得分并排序
# 生成 (query, doc) 对
pairs = [(user_query, doc) for doc in search_results['documents'][0]]

# 计算得分
scores = model.predict(pairs)

# 按得分从高到低排序
sorted_list = sorted(
    zip(scores, search_results['documents'][0]),
    key=lambda x: x[0],
    reverse=True
)

# 输出结果
for score, doc in sorted_list:
    print(f"{score:.4f}\t{doc}\n")

输出示例

0.8762	Llama 2 introduced safety fine-tuning to reduce harmful outputs.

0.2345	The model architecture of Llama 2 uses a transformer-based design.

0.1287	Safety in AI involves rigorous testing and ethical guidelines.

3. 关键技术:交叉编码器 vs 双编码器

特性双编码器 (Bi-Encoder)交叉编码器 (Cross-Encoder)
工作原理分别编码查询和文档,计算余弦相似度同时编码查询和文档,直接计算相关性得分
速度快(适合大规模检索)慢(适合对少量候选文档重排序)
精度较低(独立编码损失细节)较高(联合编码捕捉细粒度交互)
典型应用初步检索(如向量数据库)精细化排序(如 ReRank)

4. 如何选择 ReRank 模型?

模型名称语言支持精度速度适用场景
cross-encoder/ms-marco-MiniLM-L-6-v2英文英文简单查询,资源受限环境
BAAI/bge-reranker-large中英多语言复杂查询、多语言混合、高精度需求

5. 实际应用中的优化建议

  1. 分块策略

    • 文档分块时保留上下文(如使用 sliding windowoverlap),避免关键信息被截断。
  2. 截断文本

    • 根据模型 max_length(如 512 token)截断输入,优先保留头部和尾部关键信息。
  3. 混合排序

    • 将向量检索得分与 ReRank 得分加权融合,平衡精度与效率:
      final_score = 0.7 * rerank_score + 0.3 * retrieval_score
      
  4. 异步处理

    • 在高并发场景下,将 ReRank 部署为独立服务,避免阻塞主流程。

6. 完整流程示例

# 1. 初步检索(向量数据库)
from vector_db import search  # 假设的向量数据库接口
search_results = search(user_query, top_k=50)

# 2. 重新排序
pairs = [(user_query, doc) for doc in search_results['documents']]
scores = model.predict(pairs)
reranked_docs = [doc for _, doc in sorted(zip(scores, search_results['documents']), reverse=True)]

# 3. 截断 Top-K 文档输入大模型
context = "\n".join(reranked_docs[:5])
prompt = f"基于以下上下文回答:{context}\n\n问题:{user_query}"
response = llm.generate(prompt)

总结

通过 ReRank 技术,RAG 系统的答案精度可提升 20-30%(尤其在复杂查询场景)。通过 BAAI/bge-reranker-large 模型实现精细化排序,核心步骤包括:

  1. 加载交叉编码器模型。
  2. 对初步检索结果生成 (query, doc) 对。
  3. 计算相关性得分并排序。

在实际应用中,需权衡 精度、延迟、成本,选择适合的模型和分块策略。

一些 Rerank 的 API 服务

### RAG 检索增强生成的知识检索实现方式 RAG(Retrieval-Augmented Generation)是一种结合信息检索和文本生成的人工智能技术,其核心在于利用外部数据源来提升大模型的生成质量。具体来说,RAG 的知识检索功能可以通过以下几个方面实现: #### 1. 数据预处理与存储 为了支持高效的检索操作,需要先对背景知识进行预处理并将其存储在一个结构化的数据库中。这通常涉及以下步骤: - **向量化**:使用嵌入模型(如 BERT 或 Sentence Transformers),将文档或语料转化为高维向量表示[^3]。 - **构建向量数据库**:将上述向量存入专用的向量数据库(如 FAISS、Pinecone 或 Milvus)。这种数据库能够快速执行近似最近邻搜索(ANN),从而找到与查询最相似的文档。 #### 2. 查询向量化 当用户提交一个问题时,系统会首先对该问题进行编码,同样通过嵌入模型得到对应的向量表示。这一过程确保了后续可以比较查询向量与已有的文档向量之间的相似度。 #### 3. 相似性匹配 基于查询向量,系统会在预先建立好的向量数据库中寻找与其最为接近的一组候选文档。常用的相似性衡量方法包括余弦距离、欧几里得距离以及内积等指标。 #### 4. 结果筛选与排序 尽管初步检索可能返回多个潜在相关的结果,但仍需进一步优化以提高精度。例如,可以根据置信得分阈值过滤掉不充分的相关项;或者采用重排名机制重新评估各选项的重要性。 #### 5. 上下文融合与生成 最终选定的相关文档会被传递至大型语言模型 (LLM),连同原始提问共同构成输入序列。这样做的目的是让 LLM 不仅理解当前对话意图,还能充分利用额外提供的上下文中蕴含的事实依据来进行更加精确的回答生成[^1]。 下面是一个简单的 Python 示例代码展示如何集成这些组件完成基本的功能框架: ```python from sentence_transformers import SentenceTransformer import pinecone # 初始化 Pinecone 客户端和服务环境变量配置省略... pinecone.init(api_key="your_api_key", environment="your_env") index_name = 'rag-index' model = SentenceTransformer('all-MiniLM-L6-v2') def embed(texts): """Generate embeddings for given texts.""" return model.encode(texts).tolist() def query(query_text, top_k=3): """Perform a similarity search against the index with provided text.""" vector = embed([query_text])[0] results = pinecone.Index(index_name).query( queries=[vector], top_k=top_k, include_metadata=True ) return [(match['id'], match['score']) for match in results] if __name__ == "__main__": user_query = input("Enter your question here:") retrieved_docs = query(user_query) print(f"Top {len(retrieved_docs)} relevant documents found:", retrieved_docs) ``` 此脚本展示了从获取用户请求到调用 Pinecone API 执行实际查找的过程,并打印出前几个关联程度较高的条目及其对应评分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星星点点洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值