rag实际工程中好用的技巧

rag fusion

这是一个论文来着我记得。而且在langchain官方教学里也有。思路是一个query生成多个同样语义但是表述不同的query,然后分别进去rag,得到多个回答,最后把多个回答fusion,即总结。

这个法子能很好滴增加正确文档的召回率。

稀疏向量、稠密向量、关键词一起用

稀疏向量是指维度极大的query embedding,这种向量做完对齐基本上是维度冗余的,但是在query极度像训练数据里的query时,就很容易匹配到正确的chunk。
稠密向量,就是bge那些。
关键词,可以是bm25,也可以是你用小模型抽出来的关键词,再按metadata搜索。

这三种各自有各自的优势,所以一起用吧,废文档靠后面相关性检查模块就好啦。

信息追问

这个机制是在llm参数量足够大,能力够强,然后能识别出给的context不足以回答问题的时候,引导llm生成三个追问问题的机制。完成这个机制只需要prompt就行,但是能极大提高用户体验。例如kimi也每次都会在答案后面给你生成一些追问问题,以前的ai医疗问答也会这么干,不如说追问是基操。

embedding微调的小技巧

有些bad case出现,是因为用户在query提了一个很稀有但是与他的询问没多大关系的词,这个稀有词极大地影响了embedding,导致召回失败。
首先,你得分从语义层面分割句子,让不相关的两句话拆开,尽量剔除无关句子。然后分割完你也不知道前面是问题还是后面是问题,所以都得拿去召回,并且还得分别获得信息,最后再fusion所有信息。
训练的时候,训练的query语义分割了,我们会认为一个query分割成几段,都是要得到同样的chunk,所以都要与chunk对齐。

作为一个产品,用户用你的东西检索,但是你后面有好多个数据库,全量检索的话,这rag基本等于废了。所以如何引导用户选择他感兴趣的库?而不是直接开问?

注册的时候就就得给用户几个引导性提问,就跟短视频平台一进去让你选的那些似的。
如果用户想切换了,其实完全可以让用户给出一些描述,他想问哪类问题,你先根据库的特征匹配一些,如果用户反复修改描述,就等于是你没找对,总之这个过程是收集正负例的过程。数据多了,就能做描述和数据库的匹配了,或者是query-db对齐,或者是query-query的对齐。没有现成的好办法。

多轮对话里,有时候用不到知识库,只是闲聊天。有时候召回得太杂,有些文档纯纯没用,还是塞进来了,llm很可能把没用的信息也融进输出。

对于区分闲聊天和检索,可以用意图识别or训练llm自动识别是否检索。前者好说,一个轻量级模型能做到。后者,你得走self-rag的路子(我看kimi就是用的self-rag)。
用selfrag架构要比意图识别好,把所有事都在一次生成里干完,是最快的。

还是召回无关文档的问题

假设你向量模型调得挺好,我可以说相关和无关的向量分数会有明显的分布差距。你找个阈值,一般设两段,一硬一软,例如0 8和0.6,低于0.6的直接扔,不到0.8的rerank往后排,过了的排前面。
还有,你知识库生成的时候先来生成一些QA对,直接query-Q匹配,然后拿召回的几个Q对应A来生成针对query的回答,注意此时的A就全是llm生成的了。

用户想查数据库,本质是个统计问题,例如想查xx年的总支出

这种问题就只能意图识别 or tools引导到对应的专门处理text2sql的llm了,注意这里面重写query使其规范是一个很重要的事,最好还让用户确认一下,否则用户写的乱七八糟也不好直接生成sql。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正点原子imx6ull-mini-Linux设备树下的LED驱动实验(4)

1&#xff1a;修改设备树文件 在根节点“/”下创建一个名为“alphaled”的子节点&#xff0c;打开 imx6ull-alientek-emmc.dts 文件&#xff0c; 在根节点“/”最后面输入如下所示内容 alphaled {#address-cells <1>;#size-cells <1>;compatible "atkalp…

Python 实现绘图软件:基于 tkinter 和面向对象编程

在 Python 中&#xff0c;我们可以使用 tkinter 模块来创建图形用户界面&#xff08;GUI&#xff09;应用程序。本文将介绍如何使用 tkinter 和面向对象编程的思想来实现一个简单的绘图软件。 一、代码分析 1. 导入模块 import tkinter from tkinter import colorchooser我们…

25.惰性队列

介绍 消费者由于各种原因而致使长时间不能消费消息造成堆积。比如有一百万条消息发送到mq中&#xff0c;消费者这时宕机了不能消费消息&#xff0c;造成了消息堆积。惰性队列就有必要了。 正常情况下&#xff0c;消息保存在内存中。消费者从内存中读取消息消费&#xff0c;速…

游戏制作中没想明白的事情

当一个备忘录&#xff0c;有的是还没有时间去深入研究&#xff0c;或者没有从头了解 什么是建模绑定&#xff1f;为什么人物建模&#xff0c;初始化都是双手打开的&#xff1f;平着放武器&#xff0c;但运行的时候武器会自动竖起来&#xff0c;这是怎么做到的&#xff1f; 思…

C++要点总结_04_循环语句

目录 4 循环语句4.1 while循环4.2 do...while4.3 for循环4.4 循环控制4.5 循环嵌套 4 循环语句 循环控制&#xff1a;控制程序重复执行&#xff0c;当不符合循环条件时停止循环。循环控制种类&#xff1a;while循环、do…while循环和for循环语句。 4.1 while循环 while循环:…

mysql数据库基础语法(未完)

数据库的超级用户是root 一、注释 &#xff08;1&#xff09;“-- ”减号减号空格 注意不要省略空格 &#xff08;2&#xff09;“#” 井号 二、数据库操作 1、创建 CREATE DATABASE [IF NOT EXISTS] <数据库名> [CHARACTER SET utf8] 2、删除 DROP DATABASE …

深入理解CSRF与SSRF攻击原理及防御措施

一、CSRF攻击原理及实例 CSRF简介 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;即跨站请求伪造&#xff0c;是一种常见的网络攻击手段。攻击者利用已登录用户的cookie&#xff0c;在用户不知情的情况下&#xff0c;伪造请求执行特定操作。 CSRF攻击实…

KamaCoder 100. 岛屿的最大面积 + Leetcode 695. Max Area of Island

题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均…

XYCTF2024 WP

Pwn&#xff1a; hello_world(签到)&#xff1a; 这里的printf没有格式化字符串漏洞&#xff0c;但是我们依旧可以填充栈来利用printf泄露栈上信息 根据我们能填充的字节数来看&#xff0c;我们无法泄露出libc_start_main128的地址&#xff0c;但是可以泄露libc_start_call_m…

一款免费且功能强大的硬件检测工具,绿色小巧免安装!

HWiNFO是一款免费功能强大且广泛使用的硬件信息检测和监控工具&#xff0c;适用于Windows系统。它能够提供详细的硬件信息&#xff0c;包括CPU、主板、内存、硬盘、显卡等组件的详细规格和性能数据。此外&#xff0c;HWiNFO还支持实时监控硬件状态&#xff0c;如温度、电压和风…

计算机的错误计算(四十六)

摘要 再谈浮点运算的不确定性。 计算机的错误计算&#xff08;十&#xff09;、&#xff08;十一&#xff09;以及&#xff08;三&#xff09;探讨了浮点数的表示误差与浮点运算的一些性质。 下面再谈浮点运算的不确定性。 1. 确保两台不同机器上得到完全相同的浮点运算结果是…

042—pandas 数据透视并指定列的排序

数据透视和对列的重新排序是数据分析和报告过程中常用的工具和技术。它们可以帮助你更好地理解和分析数据,从而支持决策和洞察力的发现。透视和重新排序数据可以为数据可视化提供更好的输入。通过对数据进行透视,你可以将数据重新排列成适合绘图的形式,以更清晰地展示趋势、…

【React Hooks原理 - useTransition】

概述 在上一篇中我们介绍了useDeferredValue的基本原理&#xff0c;本文主要介绍一下useTransition这个Hook&#xff0c;之所以在这里提到useDeferredValue&#xff0c;是因为这两个Hook都是在React18引入的进行渲染优化的Hooks&#xff0c;在某些功能上是重叠的&#xff0c;主…

面试面到自闭,字节软件测试岗五轮面试,四个小时灵魂拷问...

准备过程 我自己是本科毕业后在老东家干了两年多&#xff0c;老东家算是一家”小公司”(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身)&#xff0c;毕业这两年多我也没有在大厂待过&#xff0c;因此找坑的时候是非常非常虚的。迫于心慌&#xff0c;我好好思考了一阵来…

<设计模式> 工厂模式

工厂模式 模式介绍&#xff1a;将对象的创建过程封装在工厂类中&#xff0c;客户端代码只需要关心从工厂获取对象的过程&#xff0c;而不需要了解对象的创建细节。这样做的好处包括提高了代码的灵活性和可扩展性&#xff0c;降低了对象之间的耦合度。主要解决接口选择的问题。…

Android 性能优化(二):LeakCanary【用于分析代码是否存在内存泄漏】程序无响应

目录 1&#xff09;内存相关的五种常见问题 2&#xff09;内存溢出和内存泄漏 3&#xff09;LeakCanary是什么? 4&#xff09;LeakCanary如何使用&#xff0c;如何分析&#xff1f; 5&#xff09;LeakCanary监测的内容 提问&#xff1a;程序有时候很卡&#xff0c;经常会出现…

前端开发:Vue2.0桌面组件库-Element

引入Element的步骤&#xff1a; 1.在vscode终端中执行命令&#xff08;需要联网&#xff09; 下载成功 2.在main.js中导入element.ui组件库。 同上&#xff0c;自定义的组件需要先在根组件中引入。 3.访问官网&#xff0c;复制调整代码

变阻器的主要特性和参数有哪些?

变阻器的主要特性和参数有很多&#xff0c;下面将详细介绍几个重要的特性和参数&#xff1a; 1. 电阻范围&#xff1a;滑动变阻器的电阻范围是指其最大电阻值和最小电阻值之间的范围&#xff0c;这个范围通常由制造商指定&#xff0c;用户在选择变阻器时需要根据实际需求选择合…

基于 SSM 的汽车租赁系统

基于 SSM 的电器网上订购系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Spring、JSP、MyBatis 工具&#xff1a;MyEclipse/IDEA、Tomcat 引言 汽车租赁是在约定时间内&#xff0c;租赁经营人将租赁汽车&#xff08;包括载货汽车和载客汽车&#x…