ReRank重排序提升RAG系统效果

01. ReRank 重排序

在完成对问题的改写、不同数据库查询的构建以及路由逻辑、向量数据库索引方面的优化后,我们可以考虑进一步优化 筛选阶段,一般涵盖了 重排序、纠正性RAG 两种策略,其中 重排序 是使用频率最高,性价比最高,通常与 混合检索 一起搭配使用,也是目前主流的优化策略(Dify、Coze、智谱、绝大部分开源 Agent 项目都在使用)。

重排序 的核心思想见字知其意,即对检索到的文档 调整顺序,除此之外,重排序 一般还会增加 剔除无关/多余数据 的步骤,在前面的课时中,我们学习的 RRF 算法其实就是重排序中最基础一种。

运行流程如下:

并且 重排序 的逻辑是输入 文档列表,输出的仍然是 文档列表,和 DocumentTransformer 类似,不过在 LangChain 中 重排序 是一个 DocumentCompressor 组件(压缩组件),如果需要查找 重排序 组件,可以在 文档转换/检索器集成 列表中查找,一些高频使用的组件还进行了单独的封装,例如:LongContextReorder 、Cohere Reranker 等。

在 LangChain 中,使用重排工具很简单,可以单独使用,也可以利用 ContextualCompressionRetriever 检索器进行二次包装合并,并传递检索器+重排工具,这样检索输出得到的结果就是经过重排的了。

02. Cohere 重排序

目前可用的重新排序模型并不多,一种是选择 Cohere 提供的在线模型,可以通过 API 访问,此外还有一些开源模型,如:bge-rerank-base 和 bge-rerank-large 等,体验与评分最好的是 Cohere 的在线模型,不过它是一项付费服务(注册账号提供免费额度),并且由于 Cohere 服务部署在海外,国内访问速度并没有这么快。

对于学习,我们可以使用 Cohere 的在线模型,如果是部署企业内部的服务,可以使用 bge-rerank-large,链接如下:

  1. Cohere 在线模型:Enterprise AI: Private, Secure, Customizable | Cohere
  2. bge-rerank-large 开源模型:https://huggingface.co/BAAI/bge-reranker-large

安装依赖:

pip install langchain-cohere

在 weaviate 向量数据库中,使用 Cohere 在线模型集成重排序示例代码(使用 weaviate 数据库的 DatasetDemo 集合,存储了 项目API文档.md 文档的内容,示例如下

import dotenv

import weaviate

from langchain.retrievers import ContextualCompressionRetriever

from langchain_cohere import CohereRerank

from langchain_openai import OpenAIEmbeddings

from langchain_weaviate import WeaviateVectorStore

from weaviate.auth import AuthApiKey

dotenv.load_dotenv()

# 1.创建向量数据库与重排组件

embedding = OpenAIEmbeddings(model="text-embedding-3-small")

db = WeaviateVectorStore(

    client=weaviate.connect_to_wcs(

        cluster_url="https://mbakeruerziae6psyex7ng.c0.us-west3.gcp.weaviate.cloud",

        auth_credentials=AuthApiKey("ZltPVa9ZSOxUcfafelsggGyyH6tnTYQYJvBx"),

    ),

    index_name="DatasetDemo",

    text_key="text",

    embedding=embedding,

)

rerank = CohereRerank(model="rerank-multilingual-v3.0")

# 2.构建压缩检索器

retriever = ContextualCompressionRetriever(

    base_retriever=db.as_retriever(),

    base_compressor=rerank,

)

# 3.执行搜索并排序

search_docs = retriever.invoke("关于LLMOps应用配置的信息有哪些呢?")

print(search_docs)

print(len(search_docs))

输出内容:

[Document(metadata={'source': './项目API文档.md', 'start_index': 2324.0, 'relevance_score': 0.9298237}, page_content='json { "code": "success", "data": { "id": "5e7834dc-bbca-4ee5-9591-8f297f5acded", "name": "LLMOps聊天机器人", "icon": "https://imooc-llmops-1257184990.cos.ap-guangzhou.myqcloud.com/2024/04/23/e4422149-4cf7-41b3-ad55-ca8d2caa8f13.png", "description": "这是一个LLMOps的Agent应用", "published_app_config_id": null, "drafted_app_config_id": null, "debug_conversation_id": "1550b71a-1444-47ed-a59d-c2f080fbae94", "published_app_config": null, "drafted_app_config": { "id": "755dc464-67cd-42ef-9c56-b7528b44e7c8"'), Document(metadata={'source': './项目API文档.md', 'start_index': 0.0, 'relevance_score': 0.7358315}, page_content='LLMOps 项目 API 文档\n\n应用 API 接口统一以 JSON 格式返回,并且包含 3 个字段:code、data 和 message,分别代表业务状态码、业务数据和接口附加信息。\n\n业务状态码共有 6 种,其中只有 success(成功) 代表业务操作成功,其他 5 种状态均代表失败,并且失败时会附加相关的信息:fail(通用失败)、not_found(未找到)、unauthorized(未授权)、forbidden(无权限)和validate_error(数据验证失败)。\n\n接口示例:\n\njson { "code": "success", "data": { "redirect_url": "https://github.com/login/oauth/authorize?client_id=f69102c6b97d90d69768&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Foauth%2Fauthorize%2Fgithub&scope=user%3Aemail" }, "message": "" }'), Document(metadata={'source': './项目API文档.md', 'start_index': 675.0, 'relevance_score': 0.098772585}, page_content='json { "code": "success", "data": { "list": [ { "app_count": 0, "created_at": 1713105994, "description": "这是专门用来存储LLMOps信息的知识库", "document_count": 13, "icon": "https://imooc-llmops-1257184990.cos.ap-guangzhou.myqcloud.com/2024/04/07/96b5e270-c54a-4424-aece-ff8a2b7e4331.png", "id": "c0759ca8-2d35-4480-83a8-1f41f29d1401", "name": "LLMOps知识库", "updated_at": 1713106758, "word_count": 8850 } ], "paginator": { "current_page": 1, "page_size": 20, "total_page": 1, "total_record": 2 } }')]

通过 LangSmith 观察该检索器的运行流程,可以发现,原始检索器找到了 4 条数据,但是经过重排序后,只返回了相关性高的 3 条(可设置),有一条被剔除了,这也是 压缩器 和 文档转换器 的区别(不过在旧版本的 LangChain 中,两个没有区别,所以在很多文档转换器的文档中都可以看到压缩器的存在)。

Rerank提升RAG信息利用效率的方法主要体现在其对检索结果的处理上,涉及多个步骤和不同技术手段: - **特征提取**:为了能够对初步检索的结果进行有效排序,需要从这些结果中提取出对排序有帮助的特征。这些特征可以是文本的统计特征、语义特征等。通过提取合适的特征,能够更准确地衡量检索结果与用户查询的相关性,为后续的排序提供基础。 - **排序模型训练**:选择合适的排序模型并进行训练是关键步骤。根据实际应用场景需求,Rerank可采用基于统计的方法(如BM25)或深度学习方法(如Cross - Encoder)。基于统计的方法依靠文本的统计特性来计算相关性,而深度学习方法则能够更好地捕捉文本的语义信息。通过大量的数据对排序模型进行训练,使其能够学习到不同特征与相关性之间的关系,从而提高排序的准确性。 - **重新排序**:利用训练好的排序模型对初步检索的结果进行重新排序。将提取的特征输入到排序模型中,模型会根据学习到的规则对结果进行打分和排序,将与用户查询更相关的结果排在前面。这样在后续的生成过程中,模型可以优先使用相关性高的信息,提高生成内容的质量和相关性,减少不相关信息的干扰,进而优化资源利用,提升信息利用效率。 - **结合Prompt引导**:利用Prompt来引导大语言模型(LLM)完成特定任务,例如自动识别查询的类型,再生成更清晰的检索Query。通过对原始查询进行分类和改写,使得检索的目标更加明确,能够从海量信息中更精准地定位到相关内容,进一步提高RAG信息利用效率。例如,可将原始查询分为上下文依赖型、对比型、模糊指代型、多意图型、反问型等类型,然后根据不同类型进行针对性的处理,让检索结果更符合用户需求。 ```python # 示例代码:利用Prompt引导LLM改写查询 def auto_rewrite_query(query, conversation_history="", context_info=""): instruction = """ 你是一个智能的查询分析专家。请分析用户的查询,识别其属于以下哪种类型: 1. 上下文依赖型 - 包含"还有"、"其他"等需要上下文理解的词汇 2. 对比型 - 包含"哪个"、"比较"、"更"、"哪个更好"、"哪个更"等比较词汇 3. 模糊指代型 - 包含"它"、"他们"、"都"、"这个"等指代词 4. 多意图型 - 包含多个独立问题,用"、"或"?"分隔 5. 反问型 - 包含"不会"、"难道"等反问语气 说明:如果同时存在多意图型、模糊指代型,优先级为多意图型>模糊指代型 """ # 构造Prompt prompt = f"{instruction}\n原始问题: {query}\n" response = llm(prompt) return parse_to_json(response) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI Echoes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值