[DeepRetrieval] 用DeepSeek-R1-Zero的思路教会模型怎么用搜索引擎找文本
前段时间很火的 DeepSeek-R1-Zero,通过这种方式既然能增强模型的推理能力,那是否可以在RAG的方面上增强文本的召回呢? 今天带来一篇关于这个方面工作的技术报告来分享一下。
技术报告: https://arxiv.org/pdf/2503.00223
原文链接:https://zhuanlan.zhihu.com/p/27829104729
做RAG相关的工作,深知retrieval quality是当前RAG的瓶颈,在DeepSeek-R1-Zero的"RL from Scratch"模式出来之后,我一直在思考一个问题:
“我们是否能训练一个模型让它在与搜索引擎交互的环境里学会怎么抽取到更多想要的信息呢?”
针对这个问题,我们近期做了一些尝试:直接通过试错来训练LLM进行Information Retrieval(信息检索),而无需监督数据(之前的方法需要通过从更大的模型例如ChatGPT/Claude蒸馏augmented query)。
DeepRetrieval 通过使用检索召回率作为奖励信号,让模型学习生成能够最大化信息检索性能的有效查询:
DeepRetrieval。LLM生成增强查询,该查询用于检索文档。计算召回率并作为奖励来更新模型。
关键创新点
- 直接优化:通过直接优化召回率,模型学习生成对检索有效的查询,而非匹配预定义模式的查询
- 无需监督数据:与需要昂贵监督数据生成的方法不同,DeepRetrieval通过直接试错学习
- 结构化推理:与R1一样,采用两阶段生成方法,包含分开的思考和回答组件,允许模型在提交最终查询前思考问题空间
方法论
DeepRetrieval基于最近在LLM强化学习领域的进展,将这一范式应用到信息检索中的查询增强任务。其方法直接受到DeepSeek-R1-Zero的启发,后者证明了RL可以用于训练具有高级推理能力的模型,而无需依赖监督数据。
问题定义
在信息检索任务中,我们有一个文档集合D和用户查询q。系统的目标是返回与q相关的文档子集Dq⊂D。在查询增强过程中,原始查询q被转换为更有效的增强查询q'。
传统方法通过提供(q, q')对作为训练数据来学习这种增强过程。相比之下,DeepRetrieval使用强化学习,让模型通过试错学习生成有效的增强查询。
强化学习框架
我们将查询增强任务表述为一个强化学习问题:
- 状态:用户的原始查询q
- 动作:模型生成的增强查询q'
- 奖励:使用q'检索文档时获得的召回率
模型经过训练以最大化预期奖励,即生成能够获得高召回率的增强查询。这种直接优化最终目标的方法与监督方法不同,后者优化的是与人工生成或更大模型生成的增强查询的相似度。
模型架构与输出结构
我们使用Qwen-2.5-3B-Instruct作为基础LLM。该模型接收user query作为输入并生成augmented query。模型结构首先在<think>
部分生成推理步骤,然后在<answer>
部分以JSON格式给出最终增强查询。这种结构化生成允许模型在最终确定响应前考虑查询的各个方面并探索不同的增强策略。
奖励机制
我们的奖励函数旨在直接优化检索性能,流程如下:
- 模型针对user query,这里用的是医学领域常用的PICO query来生成augmented query
- 增强查询在文档集合(PubMed或http://ClinicalTrials.gov)上执行
- 计算召回率(检索相关文档的比例)
- 基于以下因素计算综合奖励:
- 格式正确性(JSON结构,适当标签)
- 检索召回率,更高召回率获得更大奖励
具体而言,我们的奖励函数使用了基于召回率性能的分层评分系统,如下表所示:
表1:基于召回率性能的奖励层级。更高的召回率获得显著更大的奖励,激励模型生成更有效的查询。
召回率 | ≥ 0.7 | ≥ 0.5 | ≥ 0.4 | ≥ 0.3 | ≥ 0.1 | ≥ 0.05 | < 0.05 |
---|---|---|---|---|---|---|---|
奖励 | +5.0 | +4.0 | +3.0 | +1.0 | +0.5 | +0.1 | -3.5 |
此外,正确格式获得+1分,不正确格式获得-4分。如果格式不正确(缺少标签,不当的JSON结构等),则完全不计算答案奖励,只有格式惩罚。这种奖励结构强烈鼓励模型生成格式良好且最大化召回率的查询,同时遵守所需的输出格式。
实验结果
我们在两个医学文献检索任务上评估了DeepRetrieval方法:
- 发布物搜索:从PubMed检索相关医学发布物
- 试验搜索:从http://clinicaltrials.gov检索相关临床试验
这些数据集对信息检索系统特别具有挑战性,因为医学文献中的专业术语和复杂关系。
PS:我们正在更加general的IR dataset上以及更普遍使用的search engines (google, bing, ...) 做尝试,敬请期待后续更多的结果!
训练动态
下图展示了DeepRetrieval的训练动态,揭示了性能指标在训练过程中的稳定提升。平均奖励显示一致的上升趋势,开始为负但迅速转为正并在整个训练过程中继续提高。同时,错误答案率显著下降,表明模型正在学习生成能够检索相关文档的结构良好的查询。
DeepRetrieval在PubMed任务上训练时的reward curve
最显著的趋势是所有召回阈值的系统性改进。获得高召回值(≥0.5, ≥0.7)的查询比例稳步增加,最高召回层级(≥0.7)从接近零增长到训练结束时约0.25。中等召回率(≥0.4, ≥0.3)显示更强增长,达到约0.6-0.7,而较低召回阈值(≥0.1, ≥0.05)迅速接近并稳定在0.8-0.9附近。
主要结果
下表展示了我们的实验主要结果。DeepRetrieval在发布物搜索上达到60.82%的召回率,在试验搜索上达到70.84%的召回率,显著优于所有基线模型。
Performance Table
从我们的结果中可以得出几个关键观察:
- 卓越性能:DeepRetrieval大幅优于之前的distillation-based方法(publication search 60.82% vs 24.68%,trial search 70.84% vs 32.11%),尽管使用更小的模型(3B vs 7B)。
- 成本效益:与之前的distillation-based方法相比,DeepRetrieval不需要监督数据,使其显著更具成本效益。
- 泛化能力:在publication和trial search任务上的一致表现表明我们的方法在不同检索场景中泛化良好。
- 结构化生成的有效性:
<think>
/<answer>
结构允许模型在最终确定其响应前推理复杂查询,提高整体质量。
接下来的工作
虽然我们的初步结果很有希望,但仍有几个明显的limitation和future work:
- evaluate on general IR datasets:我们当前的实验集中在医学文献检索上。关键的下一步是在MS MARCO、TREC和BEIR等标准IR基准上评估DeepRetrieval,测试其在更general的IR task上的有效性。
- test with more retrievers: 目前的工作都是基于搜索引擎调query rewriter,我们会尝试在dense/sparse retrievers上做更多尝试
- compare with s.o.t.a. models:与IR domain最新的方法进行额外比较将进一步验证。
- parameter study:研究性能如何随着更大模型扩展可能提供模型大小和检索性能之间权衡的洞见。
- reward engineering:探索融合其他metrics (e.g., nDCG) 进一步改进。
我们的最终期望是能针对 每种搜索引擎/retriever 去train一个plug-in的query加强组件 (如 "DeepRetrieval-Google", "DeepRetrieval-Contriever"等等),届时会开源给大家,即下即用。
项目代码已开源 (基于verl框架):GitHub - pat-jj/DeepRetrieval: DeepRetrieval - Hacking 🔥Real Search Engines and Text/Data Retrievers with LLM + RL
相关文章:
[DeepRetrieval] 用DeepSeek-R1-Zero的思路教会模型怎么用搜索引擎找文本
前段时间很火的 DeepSeek-R1-Zero,通过这种方式既然能增强模型的推理能力,那是否可以在RAG的方面上增强文本的召回呢? 今天带来一篇关于这个方面工作的技术报告来分享一下。 技术报告: https://arxiv.org/pdf/2503.00223 原文链接…...
⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal
⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C实现)Binary Tree Inorder Traversal ⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C实现)Binary Tree Preorder Traversal Given the root of a binary tree, return the postorder traver…...
【LeetCode 热题100】 234. 回文链表的算法思路及python代码
234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&…...
Grid布局示例代码
示例一 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Grid Layout Example</title><styl…...
【K8S】ImagePullBackOff状态问题排查。
ImagePullBackOff 是在使用 Kubernetes(K8s)时经常遇到的一种错误状态,下面为你详细介绍其含义、可能的原因及解决办法。 含义 当你在 K8s 集群中创建一个 Pod 时,Kubelet 会尝试从指定的镜像仓库拉取所需的容器镜像。如果拉取镜…...
在 Kubernetes(k8s)部署过程中常见的问题
在 Kubernetes(k8s)部署过程中,常见的问题主要包括以下几类,以下是具体示例及简要说明: 1. 资源配额不足(Resource Quota) 现象:Pod 处于 Pending 状态,事件日志显示 Insufficient CPU/Memory。 原因: 节点(Node)资源不足,无法满足 Pod 的 requests 或 limits。 命…...
微信小程序状态管理与计算属性同时使用:miniprogram-computed 和 mobx-miniprogram
两个框架扩展提供的 ComponentWithStore 与 ComponentWithComputed 方法无法结合使用。如果需要在一个组件中既想使用 mobx-miniprogram-bindings 又想使用 miniprogram-computed解决方案是: 使用旧版 API 自定义组件仍然使用 Component 方法构建组件,将…...
Redis设置开机自启报错start-limit-hit
Redis设置开机自启报错start-limit-hit 问题:在银河麒麟服务器上编译安装了redis后设置systemctl开机自启报错start-limit-hit 如何解决? 因为开机自启的需求是后面新增的,所以一开始使用的是命令启动,使用命令启动就会直接在前台…...
[数据结构]排序之 归并排序(有详细的递归图解)
一、非递归 基本思想: 归并排序( MERGE-SORT )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法( Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#x…...
pdf文件分页按需查看
pdf预览本来打算粗暴点,一次性查看全部,但是一个pdf四五百页导致手机端查看超出内存直接崩掉,崩掉会导致页面疯狂刷新,所以不得不进行优化 解决思路大致如下: canvas转为blob格式以图片的形式加载在页面(B…...
栈/堆/static/虚表
在 C 里,栈空间主要用来存放局部变量、函数调用信息等。下面为你介绍栈空间在 C 里的运用方式。 1. 局部变量的使用 在函数内部定义的变量会被存于栈空间,当函数执行结束,这些变量会自动被销毁。 #include <iostream>void exampleFu…...
计算机网络技术服务管理基于Spring Boot-SSM
目录 一、引言 二、用户需求分析 三、功能介绍 3.1.资源管理: 3.2.故障管理: 3.3.性能管理: 3.4.安全管理: 3.5.配置管理: 3.6.日志管理: 3.7.用户管理࿱…...
Redisson 分布式锁原理
加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey,itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…...
LLM(5):了解 GPT 架构
1.6 对 GPT 架构的更深入了解 GPT 最初由 OpenAI 的 Radford 等人在论文《通过生成式预训练提高语言理解能力》 中提出。GPT-3 是该模型的扩展版本,具有更多的参数,并且使用了更大的数据集进行训练。此外,ChatGPT 中提供的原始模型是通过在大…...
Android Zygote 启动流程梳理
和你一起终身学习,这里是程序员Android 本篇文章主要介绍 Android Zygote 启动分析 知识点,通过阅读本篇文章,您将收获以下内容: 一、Android 系统基本服务二、虚拟机创建和第一个Java 程序引导三、Dalvik 虚拟机基本配置四、Zygote 启动流程…...
华为OD机试-绘图机器-双指针(Java 2025 A卷 100分)
题目描述 绘图机器的绘图笔初始位置在原点 (0, 0)。机器启动后按照以下规则绘制直线: 尝试沿着横坐标正向绘制直线,直到给定的终点 E。期间可以通过指令在纵坐标轴方向进行偏移,offsetY 为正数表示正向偏移,为负数表示负向偏移。给定的横坐标终点值 E 以及若干条绘制指令,…...
ESP32(1)基于ESP32的lwIP了解
ESP32-S3 是一款集成了 Wi-Fi 和蓝牙功能的微控制器,而 lwIP(轻量级 IP)是一个为嵌入式系统设计的开源 TCP/IP 协议栈。通过使用 lwIP 库, ESP32-S3 可以实现与外部网络的通信,包括发送和接收数据包、处理网络连接等。…...
C语言预处理详解
目录 (一)预处理符号 (二)define定义常量和宏 (三)#符号和##符号 (四)undef符号的条件编译 (五)头文件的包括 (一)预处理符号 在…...
python实现接口自动化
代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码: 优点:代码灵活方便缺点:学习成本高 工具: 优点:易上手缺点:灵活度低,有局限性。 总结: 功能脚本:工…...
当Anaconda的安装路径与我想创建的conda虚拟环境路径不一致时,应该怎么操作?
我的anaconda安装在该路径:D:\Program\anaconda3 , 如果我想在F盘创建一个虚拟环境 应该怎么做呢? 若你想在 F 盘创建 Anaconda 虚拟环境,可使用 conda create 命令,并通过 --prefix 参数指定环境路径。以下是详细步骤࿱…...
MongoDB慢日志查询及索引创建
MongoDB 的慢日志(Slow Query Log)对于运维和程序员来说都非常重要,因为它直接关系到数据库的性能和应用程序的稳定性。以下分享介绍下MongoDB慢日志查询及索引创建相关的一些笔记。 一,准备 1. 使用 db.currentOp() 实时监控 …...
C语言指针(详细总结)
目录 1.初始C指针 几个重要的概念: 指针的加减 &与* 二级指针 2.指针与数组 指针数组 数组指针变量 一维数组与二维数组传参的本质 编辑编辑 编辑 3.指针与函数 函数指针数组 4.指针与结构体 5.野指针以及常见的内存管理错误 常见的内存错…...
服务器部署Kong和Konga过程
前言 最近在想怎么将一个接口给外部提供服务,并且可以根据和对放的关系,设置不同的期限或者服务大小?并且有友好的可视化页面! 这让我了解到了 API 网关,所以我开始研究 Kong 和 Konga 的使用。 实际上我最开始研究的apisix,但是部署了好久因为etcd不支持 http 无法连接…...
stm32第五天按键的基础知识
一:按键连接示意图 按键控制LED灯 软件设计流程 初始化系统 o 初始化GPIO外设时钟 o 初始化按键和LED的引脚 • 检测按键输入电平来控制LED灯 o SW2控制灯开 。 SW3控制灯关 1:key.c工程 #include"key.h" #include"stm32f10x.h"v…...
高主频CPU+RTX4090:AI生图性能优化超150%
概述:消费级高主频CPU搭配 RTX 4090显卡可以显著提高AI生图的性能,相比于企业级CPU具有更大的吞吐量和更优的成本效益。 引言:在AI图像生成过程中,CPU与GPU的协同效应对系统的整体性能至关重要。测试表明,与RTX 4090显…...
自学Python创建强大AI:从入门到实现DeepSeek级别的AI
人工智能(AI)是当今科技领域最热门的方向之一,而Python是AI开发的首选语言。无论是机器学习、深度学习还是自然语言处理,Python都提供了丰富的库和工具。如果你梦想创建一个像DeepSeek这样强大的AI系统,本文将为你提供…...
主流区块链
文章目录 主流链1. Solana特点:适用场景:工具链: 2. Binance Smart Chain (BSC)特点:适用场景:工具链: 3. Avalanche特点:适用场景:工具链: 4. Polkadot特点:…...
DevEco Studio的使用
目录 1.创建ArkTS工程 2.ArkTS工程目录结构(Stage模型) 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择…...
Oracle 公布 Java 的五大新功能
Java 增强提案包括语言增强和性能优化,从 JDK 25 中的稳定值 API 开始。 随着JDK(Java 开发工具包)24刚刚全面上市,Oracle 提前透露了不久的将来即将推出的 Java 功能,包括增强原始装箱到空限制值类类型。 3 月 18 日…...
checkpoint机制
1、什么是checkpoint 将缓冲池中的脏页刷新到磁盘,并更新redo log的checkpoint位点,确保数据库在发生故障时可以快速恢复到一致的状态。 2、checkpoint执行过程 确保需要刷新的脏页:从缓冲池中选取一部分需要刷新的页数据页刷新࿱…...
MySQL函数大全(持续更新)
MySQL常用函数 一、字符串函数 函数功能 CONCAT(s1, s2, ...) 拼接字符串 CONCAT_WS(sep, s1, s2, ...) 指定分隔符拼接字符串 SUBSTRING(str, start, length) 截取字符串 LEFT(str, length) 从左边截取指定长度字符串 RIGHT(str, length) 从右边截取指定长度字符串 LENGTH(s…...
商业智能BI分析中,汽车4S销售行业的返厂频次有什么分析价值?
买过车的朋友会发现,同一款车不管在哪个4S店去买,基本上价格都相差不大。即使有些差别,也是带着附加条件的,比如要做些加装需要额外再付一下费用。为什么汽车4S销售行业需要商业智能BI?就是因为在汽车4S销售行业&#…...
51单片机程序变量作用域问题
问题: //为什么下面这个程序可以运行 #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" unsigned int result 0; void main(){LCD_Init();while(1){LCD_ShowNum(1,1,result,3);Delay(200);result;}; } //但是这样会报错&a…...
力扣算法ing(33 / 100)
3.20 146.LRU缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值&…...
基于springboot的母婴商城系统(018)
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本母婴商城系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…...
【数学建模】模糊综合评价模型详解、模糊集合论简介
模糊综合评价模型详解 文章目录 模糊综合评价模型详解1. 模糊综合评价模型概述2. 模糊综合评价的基本原理2.1 基本概念2.2 评价步骤 3. 模糊综合评价的数学模型3.1 数学表达3.2 模糊合成运算 4. 模糊综合评价的应用领域5. 模糊综合评价的优缺点5.1 优点5.2 缺点 6. 模糊综合评价…...
BSCAN2-1:load design
1. DFT Flow Using Tessent Shell Tessent BoundaryScan 具有一个基本的高层次流程顺序。下图展示了将 Tessent BoundaryScan 插入设计所需的高层次步骤顺序。图中的每个步骤都链接到有关可测试性设计(DFT)流程的更详细信息,包括示例。 Desi…...
Pytorch中layernorm实现详解
平时我们在编写神经网络时,经常会用到layernorm这个函数来加快网络的收敛速度。那layernorm到底在哪个维度上进行归一化的呢? 一、问题描述 首先借用知乎上的一张图,原文写的也非常好,大家有空可以去阅读一下,链接放…...
Redis HyperLogLog
Redis HyperLogLog HyperLogLog 是 Redis 提供的一种基数估算(Cardinality Estimation)数据结构,专门用于统计去重元素的数量(近似值)。 1. HyperLogLog 特点 ✅ 节省内存:无论存储的元素有 10 个 还是 …...
【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统
使用FileBeatLogstashES搭建ELK日志系统,架构图如下: 1、 使用docker快速创建ES服务和Kibana服务 前置条件:需要在linux上提前安装好docker和docker-compose 1.1、在linux创建好一个用于存放docker-compose配置文件的文件夹 我的目录是/app/…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(10)
1.问题描述: 离线推送,锁屏的时候没有弹出消息,只有下拉在通知中心里面显示。请问是否是正常的? 解决方案: 检查一下是否存在图片风控:https://developer.huawei.com/consumer/cn/doc/harmonyos-referen…...
Django之旅:第二节--启动运行django
1、确保app已配置完(settings.py文件里面配置) INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,app.apps.AppConfig #配置已经注册好的app…...
Redis Sentinel(哨兵模式)高可用性解决方案
一、概述 Redis Sentinel(哨兵模式)是Redis的高可用性(High Availability, HA)解决方案,它通过哨兵系统和Redis实例的协同工作,确保了Redis服务的高可用性和数据的持久性。哨兵系统由一个或多个哨兵进程组…...
Redis缓存与数据库 数据一致性保障
为什么要保证数据一致性 只要使用redis做缓存,就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。比如将商品的库存缓存在Redis,若库存数量不对,则下单时…...
Grid 布局实现三栏布局
使用 CSS Grid 布局实现三栏布局(左右固定 100px,中间自适应)的核心原理是通过网格模板精确控制列宽分配。以下是具体实现方法及优化技巧: 一、基础实现 父容器设置 为外层容器添加 display: grid 使其成为网格容器,并通过 grid-template-columns 定义列宽 css .contain…...
如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?
大白话如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同? 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里,列表是一种用来组织信息的方式。有序列表就是带有编号的列表,它可以让内容按照一定的顺序呈现&#…...
springboot第三站(1) web开发引入
目录 1.简介 2.SpringBoot对静态资源的映射规则 3.模版引擎 1.简介 使用SpringBoot; 1)、创建SpringBoot应用,选中我们需要的模块; 2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定…...
nginx 简单实践:负载均衡【nginx 实践系列之四】
〇、前言 本文为 nginx 简单实践系列文章之三,主要简单实践了负载均衡,仅供参考。 注意:可以使用测试域名,但前提是要修改 hosts 文件 路径和重启:Linux(/etc/hosts)(重启命令&#…...
CentOS 7.9 安装 Python 3.10 详细步骤及常见问题解决
一、环境准备与依赖安装 更新系统与开发工具 sudo yum update -y sudo yum groupinstall "Development Tools" -y sudo yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel \ readline-devel tk-devel libffi-devel gdbm-devel db4-de…...
计算机网络-1-1计算机网络体系结构
第一章计算机网络体系结构 绪论 《计算机网络》学什么?——数据如何通过网络正确、可靠地从A传送到B 【考纲内容】 (一)计算机网络概述 计算机网络的概念、组成与功能;计算机网络的分类; 计算机网络的性能指标 (二)计算机网…...