【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
- 检索时过召回一部分文本
- 通过一个排序模型对 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 用于优化初步检索结果,解决传统向量检索的两大痛点:
- 语义模糊性:向量检索可能返回语义相关但细节不匹配的文档。
- 精度天花板:仅依赖向量相似度无法捕捉复杂的语义关联。
示例场景:
当用户查询 "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. 实际应用中的优化建议
-
分块策略:
- 文档分块时保留上下文(如使用
sliding window或overlap),避免关键信息被截断。
- 文档分块时保留上下文(如使用
-
截断文本:
- 根据模型
max_length(如 512 token)截断输入,优先保留头部和尾部关键信息。
- 根据模型
-
混合排序:
- 将向量检索得分与 ReRank 得分加权融合,平衡精度与效率:
final_score = 0.7 * rerank_score + 0.3 * retrieval_score
- 将向量检索得分与 ReRank 得分加权融合,平衡精度与效率:
-
异步处理:
- 在高并发场景下,将 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 模型实现精细化排序,核心步骤包括:
- 加载交叉编码器模型。
- 对初步检索结果生成
(query, doc)对。 - 计算相关性得分并排序。
在实际应用中,需权衡 精度、延迟、成本,选择适合的模型和分块策略。
一些 Rerank 的 API 服务
- Cohere Rerank:支持多语言
- Jina Rerank:目前只支持英文
相关文章:
【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_qu…...
7.2 奇异值分解的基与矩阵
一、奇异值分解 奇异值分解(SVD)是线性代数的高光时刻。 A A A 是一个 m n m\times n mn 的矩阵,可以是方阵或者长方形矩阵,秩为 r r r。我们要对角化 A A A,但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形…...
Windows控制台函数:控制台输出函数WriteConsoleA()
目录 什么是 WriteConsoleA? 函数签名 参数详解 返回值 一个最简单的例子 跟 ReadConsoleA 对比 再试一个有趣的例子 为什么传地址给 lpNumberOfCharsWritten? 注意事项 什么是 WriteConsoleA? WriteConsoleA 是一个 Windows API 函…...
采用内存局部性分配有什么好处?
内存分配时的局部性分配(Locality of Allocation)是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处,主要体现在以下几个方面: 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…...
【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
使用阿里云操作系统控制台排查内存溢出
引言 操作系统控制台是阿里云最新推出的一款智能运维工具,专为提升运维效率、优化服务器管理而设计。它集成了多种运维管理功能,包括操作系统助手、插件管理器以及其他实用工具,为用户提供一站式的运维解决方案。无论是个人开发者还是企业运…...
3.3.2 Proteus第一个仿真图
文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍:使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径,之后一直点“下一步”直到完成 2 添加元器件 点击元…...
MyBatis-Plus 与 Spring Boot 的最佳实践
在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…...
深入了解Linux —— 调试程序
前言 我们已经学习了linux下许多的工具,vim、gcc、make/makefile等; 已经能够在linux写代码,并且进行编译运行,让程序在linux下跑起来。 但是,如果我们在写代码的时候遇见了错误;但是我们并不知道错误在哪&…...
Hive-优化(语法优化篇)
列裁剪与分区裁剪 在生产环境中,会面临列很多或者数据量很大时,如果使用select * 或者不指定分区进行全列或者全表扫描时效率很低。Hive在读取数据时,可以只读取查询中所需要的列,忽视其他的列,这样做可以节省读取开销…...
物联网(Internet of Things, IoT)中的网络层简介
物联网(Internet of Things, IoT)中的网络层是物联网架构中的关键组成部分,负责设备之间的数据传输和通信。网络层的主要任务是将感知层(传感器、设备等)收集到的数据通过互联网或其他通信网络传输到应用层(数据处理和分析平台)。以下是物联网网络层的知识简介: 1. 物联…...
C++ 提供了多种数据类型组合方式
C 提供了多种数据类型组合方式,允许开发者将基本类型组合成更复杂的数据结构,以满足不同场景的需求。以下是主要的组合方式及其示例: 1. 数组(Array) 同类型元素的集合,可以是静态或动态。 int staticArr…...
八字排盘宝 2025.1.8 | 多模式排盘工具,精准解析八字信息,轻量易用
八字排盘宝是一款轻量高效的排盘工具,实现多模式排盘功能,界面简洁易用,适合命理爱好者和专业人士。支持多种排盘方式,精准解析八字信息,提供快速、便捷的命理分析体验,是日常排盘和命理学习的得力助手。 …...
MySQL面试篇——性能优化
MySQL性能优化 在MySQL中,如何定位慢查询 慢查询表象:页面加载过慢、接口压测响应时间过长(超过1s)。造成慢查询的原因通常有:聚合查询、多表查询、表数据量过大查询、深度分页查询 方案一:开源工具 调试工…...
c#财务软件专业版企业会计做账软件财务管理系统软件
本软件为绍兴客户开发的仿某碟财务软件专业版 功能:可以按会计科目做账录入会计凭证、结转损益、期末结账、拉资产负债表 github下载:https://github.com/oyangxizhe/financial.git...
常见 JVM 工具介绍
1. jps(Java Virtual Machine Process Status Tool) 功能:列出当前用户的所有 Java 进程及其 PID。 常用场景:快速定位目标 Java 应用的进程 ID。 常用命令: bash复制 jps -l # 显示主类全名 jps -v # 显示 JVM 启…...
【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现
项目介绍 本课程演示的是一款Python爬虫人口老龄化大数据分析平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...
生成对抗网络(GAN)原理与应用
目录 一、引言 二、GAN的基本原理 (一)生成器(Generator)的工作机制 (二)判别器(Discriminator)的工作机制 (三)对抗训练的过程 三、GAN在AIGC生图中的应…...
Linux安装升级docker
Linux 安装升级docker Linux 安装升级docker背景升级停止docker服务备份原docker数据目录移除旧版本docker安装docker ce恢复数据目录启动docker参考 安装找到docker官网找到docker文档删除旧版本docker配置docker yum源参考官网继续安装docker设置开机自启配置加速测试 Linux …...
clickhouse源码分析
《ClickHouse源码分析》 当我们谈论数据库时,ClickHouse是一个不容忽视的名字。它是一个用于联机分析处理(OLAP)的列式数据库管理系统(DBMS),以其快速的数据查询能力而闻名。对于想要深入了解这个高效工具…...
IDEA 基础配置: maven配置 | 服务窗口配置
文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...
【redis】type命令和定时器的两种实现方式(优先级队列、时间轮)
type——返回 key 对应的数据类型 此处 Redis 所有的 key 都是 string,但是 key 对应的 value 可能会存在多种类型 none —— key 不存在string ——字符串list ——列表set ——集合zset ——有序集合hash ——哈希表stream ——Redis 作为消息队列的时候&#x…...
高并发下订单库存防止超卖策略
文章目录 什么是超卖问题?推荐策略:Redis原子操作(Redis incr)乐观锁lua脚本利用Redis increment 的原子操作,保证库存数安全update使用乐观锁LUA脚本保持库存原子性 什么是超卖问题? 在并发的场景下,比如商城售卖商品…...
task01
1:大模型能够专业的回答各种问题,并且擅长文本处理,代码编写,可以减少一部分人类的工作。 本节学习了大模型提示词的三要素,角色,背景,输出样式,在kimi上我复现了教材的任务…...
【Kotlin】Kotlin基础笔记
一、数据类型 1.1 变量声明与类型推导 变量声明 使用 val 声明不可变变量(相当于常量);使用 var 声明可变变量。 val a 10 // 类型自动推断为 Int,不可变 var b: Double 5.0 // 显示声明为 Double,可变变量…...
DeepSeek教我写词典爬虫获取单词的音标和拼写
Python在爬虫领域展现出了卓越的功能性,不仅能够高效地抓取目标数据,还能便捷地将数据存储至本地。在众多Python爬虫应用中,词典数据的爬取尤为常见。接下来,我们将以dict.cn为例,详细演示如何编写一个用于爬取词典数据…...
祛魅 Manus ,从 0 到 1 开源实现
背景介绍 Manus 是最近一个现象级的大模型 Agent 工具,自从发布以来,被传出各种神乎其神的故事,自媒体又开始炒作人类大量失业的鬼故事,Manus 体验码也被炒作为 10w 的高价。 之后又出现反转,被爆出实际体验效果不佳…...
C++入门——输入输出、缺省参数
C入门——输入输出、缺省参数 一、C标准库——命名空间 std C标准库std是一个命名空间,全称为"standard",其中包括标准模板库(STL),输入输出系统,文件系统库,智能指针与内存管理&am…...
Spring Boot应用开发:从零到生产级实战指南
Spring Boot应用开发:从零到生产级实战指南 Spring Boot应用开发:从零到生产级实战指南一、Spring Boot的核心价值二、快速构建第一个Spring Boot应用2.1 使用Spring Initializr初始化项目2.2 项目结构解析2.3 编写第一个REST接口 三、Spring Boot的核心…...
【2025前端高频面试题——系列一之MVC和MVVM】
前端高频面试题——系列一之MVC和MVVM 前言一、MVC的基本逻辑二、MVVM的基本逻辑总结 提示:片尾总结了要点,硬背的话直接跳到最后 前言 相信持续关注我文章的小伙伴知道我之前就MVC和MVVM做过较为详细的讲解,但是我发现,他依旧是…...
