怎么理解Contextual-Retrieval ?(顺手讲一下prompt-cache)

news2024/11/27 14:30:54

最近这个其实提的人挺多的,Graph RAG的火爆已经是上上个月的事了,其实我之前就讲过,Graph RAG是解决什么问题的,它也没法绝对替代传统RAG

        之前关于Graph-RAG的文章

        你为什么要用GraphGAG?(qq.com)

        详解MS的GraphRAG的实现流程 (qq.com)

        不说Graph擅长得全局问题,和关系梳理,就说它有得干不了得传统RAG领域,其实传统RAG在自己得领域干得也不见得就咋好,Athropic最近推得Contextual Retreival 其实是个不错得改进方案。

        它具体能改善哪里呢?

        举个最简单得例子,你提了一个问题

       "What was the revenue growth for ACME Corp in Q2 2023?"

        其实最有用得一个答案是

         "The company's revenue grew by 3% over the previous quarter."

       然后你经过向量数据库,基本不可能选到这个答案为最优,因为上面所谓得The company和 previous quarter都不太能和ACME Q2 2023有太多语义上得关联,余弦或者欧式,你用啥距离都没用。

图片

       有人说用Hybrid RAG是不是能强点,比如上图,此时,你是加BM25 关键字,还是加Graph-RAG都没啥用,你懂得,因为回答是一系列得"The"指代,并没有和问题中得描述有关键字匹配,也没法建立节点和边得关系。

      我们进一步观察问题和答案,是不是这俩东西要是能有点关联性就好了啊,比如切出来得chunk,我给转换一下

original_chunk = "The company's revenue grew by 3% over the previous quarter."
contextualized_chunk = "This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million. The company's revenue grew by 3% over the previous quarter."

      如上面所示,原始得chunk,是两个"The",导致不管是embedding还是BM25都抓不出来它,那要是把original_chunk,通过某种手段,给转换成下面这种contextualized_chunk,把上下文信息给注入到chunk离,这下,如果还是刚才得问题,那必然是一问一个准。

     那这个带上下文信息得chunk是咋生成得?

    其实和你graph-rag一样,还得让大模型给你生成

    graph-rag是让大模型给你生成图,既点和边还有各种声明,contextualized retrieval,是让你切chunk得时候,再把文档给一起带过去,然后给你切得这块chunk,带上上下文得信息。

    其实单就原理来说,就这样,贼简单

   

图片

  上面这段操作给个prompt就能实现

<document> {{WHOLE_DOCUMENT}} </document> Here is the chunk we want to situate within the whole document <chunk> {{CHUNK_CONTENT}} </chunk> Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else.

  

图片

       A家自己测试发现用了Contextual Retrieval以后 RAG的错误率能直接下一半下去,这对于查询的命中率提升其实非常高了。

       然而细心的观众老爷也发现了吧,这玩意费token啊,这要没事给一个chunk加上下文,就要发一遍全文,谁受得了啊

      所以实际上项目里可实现的方法主要有2个

     1- 滑动窗口吧,别所有的chunk都给全文,根据chunk在切分的文章位置,发一些文章的部分过去,这样能省不少。

     2- prompt cache

    prompt cache 也是最近比较火feature,说白了就是inbund token省钱 

     咋省钱呢,因为你没用它算力,虽然占AI服务商推理显存了

图片

     模型推理就是个单向的前向传播,这块没什么可讲的

     那Transformer这东西推理实际上,是一个自回归,啥叫自回归呢,就是我要说:“我爱你”,第一次我是推出来个"我",然后我用start of token+"我",来推出来"我爱"。以此类推,最后推出来"start of token+我,爱,你+EOT"

     那你每次是不是推都要占算力,都要折腾一遍,于是乎空间换算力的又能省时间的东西KVcache就出来了,你第一遍推出来"我"。那你第二遍再做推理的时候就别再推"我"这个logit了,直接用就可以了,而“我”相关的放进显存中,下次推理直接用,以此类推。这也是最长用的推理加速方法,你们爱用的vllm类的推理加速最本质上就这么个简单的路子(不提及page attention和flash attention的话)

     但是KVcache这玩意它只能做到到单序列的,也就是反正你这句话用了就用了,下一句别想用,说白了,到下一句话,你还得刷新显存,那CPU到显存到再GPU,你害的来回折腾数据。快也就快一句话。

     那我要想快N多句呢?

     也不是不行,这就是prompt cache做的事,因为你没法跨序列(sequence)来搞注意力,这个不太现实,所以你就得整一个外挂(这外挂甚至可以不是显存,就是大内存就成,反正几千个token的logit被你一次读,你也不会感觉慢,要不凭啥给你便宜?)

图片

第一幅图是普通的推理,第二幅是加kv cache了,第三幅就外挂一个cache,这个cache就可以在多个序列之间cache已经算出来的logit,那它咋识别的?

答案是PML

图片

    像上图所示 PML明确定义可重用的文本段,称为提示模块(prompt modules)。PML确保在重用注意力状态时位置的准确性,并为用户提供了一个接口来访问他们的提示中的缓存状态。

      说白了,假如你用system prompt给LLM写一段贼老长的COS play 提示词,你就给它放倒prompt modules里,LLM通过PML,或者有些LLM原生可区分 prompt中的重用,或者API,就实现了prompt caching的能力

      对于AI provider,其实这么做能省钱,省卡,对于user来说,这样能省钱,我们看一下对比

图片

Claude的cache命中,直接省9/10的input token费用,但是需要注意的是,如果你要玩prompt caching,Athropic要多收你点前,写cache它们这边比较贵

图片

OpenAI就比较粗暴,就是减1半

但是OpenAI这个不需要你在API里写啥,你达到1024以上它就自动给你开,prompt caching来给你省钱,超过1024往上的,是每128个单位上一个台阶,这是自动的好处

因为没用PML,所以OpenAI自动也有自动的坏处

图片

坏处就是你肯定尽量前面的东西要长得一样,不如中间差一个也不给你存,所以最好就用在system Prompt上面(其实一般也就用在system prompt上)

     

图片

而Anthropic要用的话,就需要明确制定了,明确制定的好处是,可以做成类PML的灵活的机制,但是也麻烦。

有了prompt cache,现在做Contextual-Retrieval  也省了不少的钱(其实做graph-RAG也一样省钱

图片

图片

      以上工作都做完了,如果再精细化,后面可以跟个rerank,把抽出来的一对带着cotext的chunk再拿rerank模型比如cohere做一次语义排序,然后发给LLM,能效果更好一点。

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

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

相关文章

Pr 视频效果:元数据和时间码刻录

视频效果/视频/元数据和时间码刻录 Video/Metadata & Timecode Burn-in 元数据和时间码刻录 Metadata & Timecode Burn-in效果是一种在视频画面上叠加显示剪辑元数据或时间码的工具。它允许在导出视频时&#xff0c;将需用的元数据信息直接刻录在画面上&#xff0c;方便…

情绪识别数据集(包含25w张图片) yolo格式类别:八种训练数据已划分, 识别精度:90%

情绪识别数据集(包含25w张图片) yolo格式 类别&#xff1a;Anger、Contempt、Disgust、Fear、Happy、Neutral、Sad、Surprise 八种 训练数据已划分&#xff0c;配置文件稍做路径改动即可训练。 训练集&#xff1a;171010 验证集&#xff1a;54060 测试集&#xff1a;27550 共计…

软考《信息系统运行管理员》- 4.3 信息系统软件运维的过程

4.3 信息系统软件运维的过程 文章目录 4.3 信息系统软件运维的过程日常运维日常运维的内容日常运行例行测试维护例行测试流程的关键点例行维护流程的关键点 定期测试维护 缺陷诊断与修复信息系统软件缺陷的概念信息系统软件缺陷的分类信息系统软件缺陷诊断与修复流程缺陷诊断与…

Excel中使用SQL语句的四种方法

总结在 Excel 中使用 SQL 语句的四种方法&#xff0c;各种方法都有各自的适用场景&#xff0c;可以选择自己熟悉的或喜欢方式。本文以在 Excel 中操作 MS SQL 数据库的数据为例进行说明。MS SQL 的数据如下&#xff0c;使用微软 SQLExpress 版本。 方法 1&#xff1a; Excel 现…

2024年软件设计师中级(软考中级)详细笔记【3】数据结构(下)(分值5分)

上午题第3章数据结构下部目录 前言第3章 数据结构【下】(5分)3.5 查找3.5.1 查找的基本概念【考点】3.5.2 静态查找表的查找方法3.5.3 动态查找表3.5.4 哈希表3.5.4.1 哈希表的定义3.5.4.2 哈希函数的构造方法3.5.4.3 处理冲突的方法 3.6 排序3.6.1 排序的基本概念3.6.2 简单排…

第二阶段:mysql(学完就隐藏版)

第一章&#xff1a;部署数据库系统&#xff08;注意关闭防火墙&#xff0c;selinux安装&#xff09; 安装mysql配置的相关文件&#xff1a;yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm&#xff08;centos9&#xff1a;yum install http…

前端高频面试题2024/9/22(偏项目问题--通用后台管理系统)

文章目录 一.前端项目概述1.系统登录注册模块1.对注册的密码进行加密 &#xff08;使用加密中间件bcrypt.js&#xff09;2.登录成功后返回token3.前端登录页面有用到弹性布局&#xff0c;ref和reactive4.登录头像&#xff1a;文件上传 2.系统设置模块2.系统首页模块&#xff08…

Golang | Leetcode Golang题解之第472题连接词

题目&#xff1a; 题解&#xff1a; type trie struct {children [26]*trieisEnd bool }func (root *trie) insert(word string) {node : rootfor _, ch : range word {ch - aif node.children[ch] nil {node.children[ch] &trie{}}node node.children[ch]}node.isE…

ES-入门-http-多条件查询范围查询

must 表示多个条件需要同时满足 在postman 对应的参数配置如下 {"query": {"bool": {"must" : [{"match" :{"category":"小米"}},{"match":{"price":3999.00}}]}} } 如下图查询的结果是需…

JAVA科技赋能共享台球室无人系统小程序源码

科技赋能共享台球室无人系统 —— 智慧台球新体验 &#x1f3b1; 科技引领&#xff0c;台球室迎来无人新纪元 在这个日新月异的科技时代&#xff0c;共享经济的浪潮席卷而来&#xff0c;为我们的生活带来了诸多便利。而今天&#xff0c;我要为大家介绍的&#xff0c;正是科技…

便民医疗服务小程序后端springboot 服务 vue3 开发的后端 系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

基于Springboot+Vue的智能推荐旅游平台 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

初学Qt之环境安装与 hello word

环境&#xff1a; Qt Creator 4.11.0 (Community) Qt 5.14.0 目录 1.Qt环境配置 1.1 下载Qt 5.14.0 1.2 注册Qt账号 1.3 安装Qt 1.4 配置环境变量 2.创建项目 2.1 创建一个项目 2.2 初始代码解析 2.3 可视化GUI ​编辑 2.4 hello word 2.4.1 可视化hello word …

探索光耦:光耦助力高速电吹风安全与性能的革命性提升

在消费者对家电产品智能化与安全性需求日益增长的今天&#xff0c;高速电吹风作为个人护理领域的明星产品&#xff0c;正经历着前所未有的技术创新。其中&#xff0c;光耦&#xff08;光电耦合器&#xff09;的引入&#xff0c;无疑为电吹风的性能优化与安全保障开辟了新路径。…

Java基础(下)

泛型 Java 泛型&#xff08;Generics&#xff09; 是 JDK 5 中引入的一个新特性。使用泛型参数&#xff0c;可以增强代码的可读性以及稳定性。 编译器可以对泛型参数进行检测&#xff0c;并且通过泛型参数可以指定传入的对象类型 ArrayList<Person> persons new Arra…

【linux】冯诺依曼架构

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.冯诺依曼体系结构02.操作系统&#xff08;Operator System&#xff09;如何理解“管理”操作系统中实现“管理的先描述再组织” 03.系统调用与库函数系统调用库函数 01.冯诺依…

SSM(5)(动态sql <if>、<where>、返回主键值)

返回主键值&#xff1a; 方法一&#xff1a; useGeneratedKeys 为ture 声明 返回主键 keyProperty 表示要返回的值 封装到对象的属性中 但是这一种方法不支持Orcal数据库。 <insert id"save2" parameterType"com.findyou.entity.User" useGenerated…

[软件工程]—TFTP协议简要解析

TFTP协议简要解析 1.TFTP基本概念 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;&#xff1a;是一个很小且易于实现的文件传送协议&#xff1a; TFTP使用客户服务器方式和使用UDP数据包&#xff0c;因此TFTP需要有自己的差错改正机制。TFTP只支持文件传输而不…

基于STM32 ARM+FPGA+AD的电能质量分析仪方案设计(一)硬件设计

电能质量分析系统硬件设计 3.1 电能质量分析系统设计要求 本系统实现对电能质量的高精度测量&#xff0c;根据国家相关电能质量分析仪器规定 标准以及对市场电能质量分析仪的分析&#xff0c;指定以下设计目标。 &#xff08; 1 &#xff09;电能质量参数测量精度&#xf…

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云监控告警平台(附配置告警至QQ、钉钉)

文章目录 一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据 3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa …