人工智能小白到高手:RAG通过重排(Reranking)提升信息检索的质量

发布于 2025-4-1 00:54
浏览
0收藏

RAG(检索增强生成)是一种很厉害的技术,能帮助企业开发更智能的 AI 应用。

这类 AI 不仅能结合实时数据,还能利用企业自己的数据,生成更自然、更有互动感的对话。

RAG 的核心思路是让 AI 在回答问题时,不是光靠自己“想”,而是先去查找外部的、可靠的专业知识,把这些信息当作参考,让回答更准确、更有依据。

但问题在于,AI 找到的资料是否靠谱,直接决定了它给出的答案是否可信。

所以,优化 RAG 的搜索过程非常重要,能有效提升 AI 生成内容的可靠性。

一个提升搜索质量的方法是“重新排序”,可以帮助 AI 先筛选出最相关的内容,再生成更靠谱的答案。

1. RAG 是怎么工作的?

RAG 的流程可以简单分成两个步骤:

  • 检索(Retrieval)– AI 先根据问题去数据库或外部数据源里查找相关的文档或段落,就像人在搜索引擎里输入问题找答案一样。
  • 生成(Grounded Generation)– AI 拿到这些相关资料后,再基于它们生成答案,并在回答里附上参考来源,让信息更可信。

RAG 如何找到最相关的文档?

RAG 里常用的一种检索方式叫向量检索,它的思路是理解用户问题的真正意思,而不是单纯匹配关键词。向量检索会把问题和文档转换成“向量”(一种数学表示),然后在这个向量空间里计算相似度,比如用余弦相似度或者欧几里得距离,找到最贴近问题的文档。

不过,这种方式虽然高效,能应对超大规模的数据,但也有个缺点——因为信息被压缩成固定长度的向量,有些重要细节可能会丢失。这就导致,检索出来的文档可能不总是最合适的,影响 AI 最终的回答质量。

重排(Reranking) 通过对初步检索的结果进行二次排序,确保最相关的内容排名靠前,提升信息检索的质量。

人工智能小白到高手:RAG通过重排(Reranking)提升信息检索的质量-AI.x社区image-20250328194524197

2. 重排(Reranking)的作用是什么?

通过 RAG,我们对许多文本文件进行语义搜索——这些文件的数量可能从几万到几百万不等,甚至更多。

为了确保大规模快速搜索,我们通常使用向量搜索。我们将文本转换为嵌入向量,放入向量空间中,并使用余弦相似度等相似性指标来比较这些向量与查询向量的接近程度。

简单来说,最开始的检索过程通常是为了,而不是追求完美的准确性。所以,AI 一开始找到的那批文档可能会比较宽泛,既有高度相关的内容,也可能夹杂一些不太相关的信息。

那能不能不考虑准确性,而通过增加文档数量,送给LLM,从而提升回答的可靠性呢?

很遗憾不行,LLMs 对我们可以传递给他们的文本量有一定限制——我们称这个限制为上下文窗口。而且填满上下文的效果,在目前(202503)性能也不是最佳,研究表明,随着大量的 tokens 被放入上下文窗口,LLM的召回能力(LLM's recall performance )会下降,而且在太长的上下文中,LLMs也不容易遵循指令。

太长的上下文可能会导致模型难以聚焦关键信息,特别是在文档位于中间时,准确率下降最明显。这可能是因为模型在处理长上下文时,信息容易被稀释或受到干扰。

人工智能小白到高手:RAG通过重排(Reranking)提升信息检索的质量-AI.x社区image-20250328211333286

解决此问题的方法是通过检索大量文档来尽可能多的找到相关文档,最大化检索的召回率,然后通过减少进入LLM的文档数量来提升LLM的响应准确度。

为此,我们会对检索到的文档进行重新排序,仅保留与我们的LLM最相关的文档——这就是我们使用重排序的原因。

人工智能小白到高手:RAG通过重排(Reranking)提升信息检索的质量-AI.x社区image-20250328212513439

通过重新排序(reranking) 后,把这些文档按相关性重新筛选和排列,减少无关内容的干扰。

如果没有重新排序,AI 可能得自己在一堆信息里“扒拉”出有用的内容,这不仅降低了回答的准确性和连贯性,还可能让 AI 产生“幻觉”(也就是编造出和真实情况不符的信息)。

通过重新排序,AI 能更专注于最有用的资料,最终生成的回答也会更加精准和可靠。

还有一种情况是。

在RAG里可能会使用混合检索来实现了多个检索技术之间的互补。

混合检索能够结合不同检索技术的优势获得更好的召回结果,但在不同检索模式下的查询结果需要进行合并和归一化(将数据转换为统一的标准范围或分布,以便更好地进行比较、分析和处理),然后再一起提供给大模型。

这时候也需要对已召回的文档结果再一次进行语义重排序,优化排序结果。

人工智能小白到高手:RAG通过重排(Reranking)提升信息检索的质量-AI.x社区image-20250328200611481

重排序模型会计算候选文档列表与用户问题的语义匹配度,根据语义匹配度重新进行排序,从而改进语义排序的结果。其原理是计算用户问题与给定的每个候选文档之间的相关性分数,并返回按相关性从高到低排序的文档列表。

重排序在混合检索、单一检索模式下,都可以有效帮助改进文档的召回效果。

3. 重排(Reranking) 的基本流程

  • 初步检索:使用向量搜索或其他搜索获取相关文档。
  • 重排序:按照新计算的相关性分数调整排名,确保最相关的文档靠前。

相比向量搜索,重排(Reranking) 具有更高的计算成本,但能极大提升检索质量,尤其适用于高精准度要求的场景,如法律、金融、医疗等专业领域。

4. 用代码实现一个简单的基本流程

我们要使用 openai 的嵌入模型生成文档的嵌入向量,使用cohere的重排模型做两阶段重排。

在documents变量中保存测试使用的文档列表

import chromadb
from openai import OpenAI
import cohere

# 设置 API Key(替换成你的)
OPENAI_API_KEY = "hk-iwtbie118cf1b4a91e427"
COHERE_API_KEY = "myRKkiGg24uQqXZfe"

co = cohere.ClientV2(COHERE_API_KEY)

# 初始化 ChromaDB(本地存储)
chroma_client = chromadb.PersistentClient(path="./chroma_db")
collection = chroma_client.get_or_create_collection("my_documents",
    metadata={"hnsw:space": "cosine"})

# 文档数据
documents = [
    # 与大语言模型高度相关的文档
    "大语言模型(LLM)是基于Transformer架构的深度学习模型,能够理解和生成人类语言",
    "ChatGPT是OpenAI开发的大语言模型,通过强化学习和人类反馈训练,具有优秀的对话能力",
    "大语言模型通过自监督学习从海量文本中学习语言规律和知识,形成强大的语义理解能力",
    "大语言模型的涌现能力使其在没有专门训练的情况下也能完成复杂任务,如推理和编程",
    "大语言模型的参数规模从数十亿到数万亿不等,参数量越大通常性能越强",

    # 与AI技术相关但与大语言模型关联度较低的文档
    "人工智能技术正在各行各业引发革命性变革,提高生产效率和创新能力",
    "机器学习是人工智能的核心技术,通过数据训练算法模型来完成特定任务",
    "深度学习是机器学习的一个分支,使用多层神经网络处理复杂数据和任务",
    "人工智能伦理问题日益受到关注,包括隐私保护、算法偏见和责任归属等方面",
    "人工智能的发展经历了从规则系统到统计学习再到深度学习的多次范式转变",

]
doc_ids = [f"doc{i}"for i in range(1, len(documents) + 1)]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

生成嵌入向量保存到向量数据库:

# 获取 OpenAI 嵌入向量
def get_embedding(text):
    print(f"Getting embedding for : {text}")
    client = OpenAI(
        api_key=OPENAI_API_KEY,  # 如果您没有配置环境变量,请在此处用您的API Key进行替换
        base_url="https://api.openai-hk.com/v1",  # 百炼服务的base_url
    )
    response = client.embeddings.create(model="text-embedding-3-small", input=text)
    # response = client.embeddings.create(model="text-embedding-ada-002", input=text)
    # print(response)
    return response.data[0].embedding
    
# 计算所有文档的嵌入,并存入 ChromaDB
for doc, doc_id in zip(documents, doc_ids):
    embedding = get_embedding(doc)
    collection.add(
        ids=[doc_id],
        documents=[doc],
        embeddings=[embedding]
    )

print("✅ 嵌入数据已存入 ChromaDB")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

在向量数据库中通过余弦相似度做一阶段检索:

# 用户查询
query_text = "大语言模型的工作原理和技术特点"

query_embedding = get_embedding(query_text)
print(f"用户问题:{query_text}")

# 从 ChromaDB 搜索最相似的 5 条结果
results = collection.query(
    query_embeddings=[query_embedding],
    n_results=5,
    include=["documents", "distances"]
)

retrieved_docs = results["documents"][0]  # 获取返回的文档列表
distances = results["distances"][0]  # 获取相似度距离
print("\n🔍 ChromaDB 搜索结果(未重排):")
for i, (doc, distance) in enumerate(zip(retrieved_docs, distances), 1):
    similarity = 1 - distance  # 将距离转换为相似度
    print(f"{i}. 相似度: {similarity:.4f} - {doc}")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

🔍 ChromaDB 搜索结果(未重排):

  1. 相似度: 0.7058 - 大语言模型的涌现能力使其在没有专门训练的情况下也能完成复杂任务,如推理和编程
  2. 相似度: 0.7017 - 大语言模型的参数规模从数十亿到数万亿不等,参数量越大通常性能越强
  3. 相似度: 0.6908 - 大语言模型通过自监督学习从海量文本中学习语言规律和知识,形成强大的语义理解能力
  4. 相似度: 0.6731 - 大语言模型(LLM)是基于Transformer架构的深度学习模型,能够理解和生成人类语言
  5. 相似度: 0.5491 - ChatGPT是OpenAI开发的大语言模型,通过强化学习和人类反馈训练,具有优秀的对话能力

通过重排模型对一阶段检索结果,做二阶段重排,可以看到文档:“大语言模型(LLM)是基于Transformer架构的深度学习模型,能够理解和生成人类语言”

在通过排序后,与查询的相似度是最高的,排到了第一位,其他的文档也有了相似度的变化。

经过重新排序,LLM获得了更加相关的信息。这自然会显著提升 RAG 的性能。这意味着RAG在最大化相关信息的同时,尽量减少输入到我们的LLM中的噪声。

# 使用 Cohere Reranker 进行重排序
response = co.rerank(query=query_text, documents=retrieved_docs, model="rerank-v3.5")
reranked_results = []
reranked_scores = []
for item in response.results:
    original_doc = retrieved_docs[item.index]  # 使用索引获取原始文档
    reranked_results.append(original_doc)
    reranked_scores.append(item.relevance_score)

print("\n🎯 经过 Reranker 重新排序的最终结果:")
for i, (doc, score) in enumerate(zip(reranked_results, reranked_scores), 1):
    print(f"{i}. 相似度: {score:.4f} - {doc}")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.


经过 Reranker 重新排序的最终结果:

  1. 相似度: 0.7699 - 大语言模型(LLM)是基于Transformer架构的深度学习模型,能够理解和生成人类语言
  2. 相似度: 0.6999 - 大语言模型通过自监督学习从海量文本中学习语言规律和知识,形成强大的语义理解能力
  3. 相似度: 0.5974 - 大语言模型的涌现能力使其在没有专门训练的情况下也能完成复杂任务,如推理和编程
  4. 相似度: 0.4884 - 大语言模型的参数规模从数十亿到数万亿不等,参数量越大通常性能越强
  5. 相似度: 0.4183 - ChatGPT是OpenAI开发的大语言模型,通过强化学习和人类反馈训练,具有优秀的对话能力

总结

重新排序(reranking) 通过对第一次检索结果进行二次排序,显著提升检索质量,使最相关的内容排在前面。

相比传统向量检索,它能更准确理解查询意图,减少无关文档,提高搜索、推荐系统和 RAG 任务的精准度。

虽然计算成本较高,但在高精度任务中优势明显。

本文转载自​​AI取经路​​,作者:AI取经路

已于2025-4-1 10:06:56修改
收藏
回复
举报


回复
相关推荐