从 0-1 的 Agent 八股- RAG 篇

在 AI 应用的场景中,rag可以说是一项必备的技术,在智能客服,导购 agent,智能创作等有检索需求的场景都会使用到,所以这里结合一些实际的应用场景和大家做一些分享

一,数据准备

数据准备是 rag 整个流水线中非常重要的一环,所以在实际的生产场景中,也主要是看数据解析,以及使用不同的向量库落库的过程

文件解析(pdf,docx,txt,md)

目前常见的文件解析,就是利用 Apache tika 等开源库做解析组件,但对于一些富文本的数据,比如有图片和表格的情况,就要借用 ocr 等辅助手段

大表格处理

表格是比较常见的数据类型之一,但是大表格解析通常会有一些问题

比如在切块的时候如果每一行都作为 chunk,在表格比较多或者行数比较多的情况下,会有大量的 chunk 产生进入索引阶段,很容易把资源打满,索引变慢,mq堆积等问题

所以对于这种场景做优化可以集中在两个方面

语义聚合:

长表按照主题,时间段做分组切块,保留上下文的同时减少 chunk 的数量

限流+错峰策略:

引入限流器和分批投递的策略,避免瞬时产生的大量 chunk 压垮异步处理的链路

图片处理

图片在解析的时候有两种思路

第一种,使用ocr的方式,这个是传统rag常用的

第二种,借助模型能力,利用 vlm 模型将图片语义化之后,将图片上传到 cdn 中获得url,然后将这些信息转为 chunk 存储写入向量库

文档分块

常见的分块策略可以分成四种

  1. 规则分块按固定长度切分,并设置重叠窗口。优点是实现简单、稳定;缺点是容易把一个完整语义切断。
  2. 结构分块按标题、段落、分隔符、目录层级来切。这种方式更符合人类阅读结构,通常比纯长度切分效果更好,尤其适合长文档。
  3. 语义分块通过 embedding 相似度或句间语义变化来决定切分边界。
  4. 分层分块先做粗粒度 chunk,再做细粒度 chunk。其实和 skill 的渐进式披露非常像

二,RAG 增强策略

混合检索

混合检索很简单就是利用向量检索和关键词检索两种方式的优点,进行混合检索,从而使召回的结果更加符合query的预期结果,现在的主要实现有两种

  1. 利用 es,milvus 等向量库的内部机制进行融合
  2. 分向量检索,关键词检索,把两路召回的结果利用 RRF 算法或者 rerank 模型进行归一化融合

query改写

query改写也是一种很常见的 rag 优化策略

  1. 语义改写,把口语化和模糊的query改写成更标准的检索语句
  2. 回退改写,query太短时做信息扩展,生成多个可检索的子 query
  3. 问题拆解,把复杂问题拆成多个子问题,进行并行检索
  4. HyDE,假设文档改写,先根据query生成假设的文档语义,然后根据这个语义进行检索

agentic rag

agentic rag 是现在很多智能体采用的方式,将 rag 检索作为一个 tool 让 agent 进行调用,生成检索参数,根据返回的信息决定要不套进一步的检索,这个可以说的细节很多,后面单独开一篇来讲这个

父子索引(上下文增强)

简单来说就是从在已有chunk 的基础上做一次 summery ,在检索时优先召回 summery,之后再根据 summery 下钻到更细粒度的 chunk 从而可以提高召回的准确率,上下文也更加完整

这个也是上下文自适应 rag 中的一个部分,主要是应对长文本检索的场景,后面也可以单独开一篇来写

知识图谱

什么是知识图谱,简单点说,知识图谱就是我们常说的 GraphRAG,是为了应对传统 rag 再显式关系推理中比较弱的情况而出现的

抽取

利用 llm 进行抽取实体关系,抽取之前可以做增量缓存,只有没有抽取过的chunk才进行抽取

存储

实际进行三写:关系型存储,存储实体和关系,图数据库,按照定点和边的方式存储实体和关系,向量存储,存储实习向量还有关系向量

检索

常见的检索策略有四种

  1. lcoal:先根据实体向量召回候选实体,然后去图数据库反查邻接关系,然后根据节点度排序
  2. global:先根据关系向量索引召回关系,然后根据关系反推实体
  3. loacl 和 global 的混合检索

社区

将实体和关系按照连通性还有相关性分组,形成社区,可以看作一种子图,每个社区会有标题摘要等信息,检索时会先命中社区,然后再做进一步的检索,降低多跳推理的复杂性

总结

以上便是 agent 八股系列 rag 的第一篇了,上次发技术文章已经是很久之前了,主要是前段时间一直在忙转正,加上自己也有一点迷茫,所以没太有发文章的动力和精力

现在转正已经有了初步结果,自己的迷茫也已经自我消化,有了更多的时间可以和大家做技术分享,虽然现在 llm 对整个行业的冲击很大,这个岗位还能存续多久也是一个未知数,但是我个人一直坚持着技术人文主义

人要在时代变革中找清楚自己的角色定位,技术最终是服务于人,上限取决于人而不会替代人。

所以想继续和大家分享技术文章不是想让大家看到技术多么重要,而是明白作为一个初级开发者,在学习技术过程中提升自己的认知和视野,去成为更优秀的开发者或者说在这个时代成为一个更精彩的人

#AI求职记录#
全部评论
楼主找agent开发找的如何了 我醒悟了 不能再傻呵呵的测了 agent才是对的!
点赞 回复 分享
发布于 昨天 23:00 北京

相关推荐

这太难受了 先说一下工作内容吧,我个人理解这个项目就是给一个给一个军工这方面的学校做的学生管理系统,也就是数据可视化,听名字应该也知道公司业务还是以前端业务为主,像是`e-chart` 这一类,其实这些我也能接受,毕竟现在ai这么厉害,有ai的辅助,前端不是什么问题,但是这个项目合作的甲方又是涉及保密协议的东西,只能在内网上做开发,什么ai都只能在手机上查,效率就太低了,项目主要是在栾大师上进行开发,有个中台,都是一些事件绑定,一点后端的没有,全是js的内容,我还想着这个周末我自己加急补一下js这一块的内容,飞书也加了,合同也签了,办公地点我也能接受,但确实那些js我是真的看不懂,项目负责人觉得不合适,当时是总经理面试,后面俩天后技术面没有到就给我发了入职邀请,当时也没有想到项目是一点后端都没有,而且也不教我怎么写这些东西,就是git都用不了,后端改了一点数据还要跑到另一个机房去查,上班环境也很草率了,没招,回家的时候还下雨,骑着电动车雨越下越大,洗个澡搁着刷题呢就被刷了,是我早退的原因吗,是我另一个实习生姐姐告诉我可以走了我就走了啊,我也确实8:40到公司报到了啊,只是后面加公司什么的,填合同什么的,跟梦一样这一天,过得真快,上午还在幻想手握小厂实习去冲击中厂,秋招美美月薪过万,晚上快9点跟我说被劝退了,美梦,笑死我了,有啥招,能不能来点正反馈,只能说不合适咯,可惜
在写日记的哈里很有担...:楼主大几啊,我也被辞退了,但是我是干完了项目,老板再开了我,真的很黑心
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务