关键词索引
es 数据库:是后台运行的数据库,不管 python 是否运行都会运行
但是实际 RAG 开源项目中使用 es 数据库的不多,企业中 60% 都不用
顾虑 1:es 本身部署是需要 8g 或以上内存的机器,10 亿条以内的文档检索都可以
顾虑 2:es 高版本(8.x)支撑全文检索(倒排,bm25)+ 向量检索(向量检索、混合检索、多路召回,但需要考虑成本--专人维护、版权--用作商用有限制)
elasticsearch 是用于全文检索的文档数据库-》查询、插入、删除、管理、性能调优的细节,如如何做分词、索引管理等
语义检索
用 sentencetransformer 加载 MTEB 榜单上的模型
gemma:是谷歌开源的大模型
wen2:是千问大模型
acge:还有一些事 bert 模型
可以加载 7b 的大模型去做编码,但是要考虑硬件问题
mteb 榜单可以反应模型在文本编码、检索和聚类上的精度,但并不是完全参考
使用 bge 或者 bce
文档切分可以同时设多个尺寸,最小的尺寸在 20 以上,如果设置为两个值意味着文章会被切分两次,一个值和两个值都很常见
提示词
prompt=“你是一个{domain}领域的专家,请帮我结合资料回答下面的问题。如果问题无法从资料中获取,则回答不知道
-提问
{question}
-相关资料
{related——document1}
{related——document2}
{related——document3}
”
文档返回
检索出来文本以后会将上下文甚至整页都返回给大模型,对于边界的文本,会扩展到下一页的内容
可以通过语义匹配判断一下前后页的内容是否相同,然后判断内容是否相同
也可以通过解析 pdf 目录解析标题段落信息来判断
但是不能给大模型过多的资料
- prompt 文字太多,大模型的返回速度也会越慢
- 最相关的信息会被埋没
给大模型资料会受到资料的长度和相关度大小的影响
重排序
多路召回之后使用重排序
一般不用大模型进行排序,效果不好,大模型对于定量化的逻辑做的不好
bert 模型
句子 1 [nsp] 句子 2 -》模型(模型内部做句子交叉)-》完成分类 概率打分
因为检索的时候是没有做句子交叉的,做一下句子交叉做相似度结果会更可信
先语义召回、全文召回然后做 rrf 合并,然后对合并结果重排序
重排序模型的输入
RAG 改进方向
大模型的版本
提示词模板
返回一个或多个资料输入大模型
query 改写(重要)
- 拆解:如果用户同时输入两个提问,需要拆解单独回答,否则大模型会重点回答第一个问题
- query 拓展:
- 语义补全
1.通过大模型进行改写
prompt=你是一个汽车知识服务的专家,请对用户的提问理解,并改为用户真实的困扰{question}
2.让大模型先回答,再让大模型的回答去检索知识库,即 HyDE
-
确定用户的意图(意图识别、分类),缩小检索范围
将用户的提问按照文件和章节进行 归类
-
扩展查询(语义检索)
用户提问检索得到知识段落,让 top10 的知识段落向量求均值,进行二次检索。
判断路由,有些问题模型可以执行,但是有一些不行
用户提问的类型:
- 汽车如何启动
- 帮我找到汽车的出场型号
- 帮我找到汽车的照片
- 帮我判断 xxx 是否合理
系统上线之后会收集到一些问题
对提问的类别进行肘部法进行聚类
路由就是针对用户提问的类别设置专用的回答方式
基于文本、基于数据库、非结构化数据(视频音频)
评价
偏向面试
不是绝对的唯一,还有很多其他的指标,如以下两个指标,他们的计算结果与 rags 的结果是正相关的。
用户提问检索到相关知识的召回率(从文档级别、从页码级别算召回率)
用户提问的回答与真实回答的语义相似度、字符交叉比
一般还是用客观的准确率和召回率
向量数据路
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于