从 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 存储写入向量库
文档分块
常见的分块策略可以分成四种
- 规则分块按固定长度切分,并设置重叠窗口。优点是实现简单、稳定;缺点是容易把一个完整语义切断。
- 结构分块按标题、段落、分隔符、目录层级来切。这种方式更符合人类阅读结构,通常比纯长度切分效果更好,尤其适合长文档。
- 语义分块通过 embedding 相似度或句间语义变化来决定切分边界。
- 分层分块先做粗粒度 chunk,再做细粒度 chunk。其实和 skill 的渐进式披露非常像
二,RAG 增强策略
混合检索
混合检索很简单就是利用向量检索和关键词检索两种方式的优点,进行混合检索,从而使召回的结果更加符合query的预期结果,现在的主要实现有两种
- 利用 es,milvus 等向量库的内部机制进行融合
- 分向量检索,关键词检索,把两路召回的结果利用 RRF 算法或者 rerank 模型进行归一化融合
query改写
query改写也是一种很常见的 rag 优化策略
- 语义改写,把口语化和模糊的query改写成更标准的检索语句
- 回退改写,query太短时做信息扩展,生成多个可检索的子 query
- 问题拆解,把复杂问题拆成多个子问题,进行并行检索
- HyDE,假设文档改写,先根据query生成假设的文档语义,然后根据这个语义进行检索
agentic rag
agentic rag 是现在很多智能体采用的方式,将 rag 检索作为一个 tool 让 agent 进行调用,生成检索参数,根据返回的信息决定要不套进一步的检索,这个可以说的细节很多,后面单独开一篇来讲这个
父子索引(上下文增强)
简单来说就是从在已有chunk 的基础上做一次 summery ,在检索时优先召回 summery,之后再根据 summery 下钻到更细粒度的 chunk 从而可以提高召回的准确率,上下文也更加完整
这个也是上下文自适应 rag 中的一个部分,主要是应对长文本检索的场景,后面也可以单独开一篇来写
知识图谱
什么是知识图谱,简单点说,知识图谱就是我们常说的 GraphRAG,是为了应对传统 rag 再显式关系推理中比较弱的情况而出现的
抽取
利用 llm 进行抽取实体关系,抽取之前可以做增量缓存,只有没有抽取过的chunk才进行抽取
存储
实际进行三写:关系型存储,存储实体和关系,图数据库,按照定点和边的方式存储实体和关系,向量存储,存储实习向量还有关系向量
检索
常见的检索策略有四种
- lcoal:先根据实体向量召回候选实体,然后去图数据库反查邻接关系,然后根据节点度排序
- global:先根据关系向量索引召回关系,然后根据关系反推实体
- loacl 和 global 的混合检索
社区
将实体和关系按照连通性还有相关性分组,形成社区,可以看作一种子图,每个社区会有标题摘要等信息,检索时会先命中社区,然后再做进一步的检索,降低多跳推理的复杂性
总结
以上便是 agent 八股系列 rag 的第一篇了,上次发技术文章已经是很久之前了,主要是前段时间一直在忙转正,加上自己也有一点迷茫,所以没太有发文章的动力和精力
现在转正已经有了初步结果,自己的迷茫也已经自我消化,有了更多的时间可以和大家做技术分享,虽然现在 llm 对整个行业的冲击很大,这个岗位还能存续多久也是一个未知数,但是我个人一直坚持着技术人文主义
人要在时代变革中找清楚自己的角色定位,技术最终是服务于人,上限取决于人而不会替代人。
所以想继续和大家分享技术文章不是想让大家看到技术多么重要,而是明白作为一个初级开发者,在学习技术过程中提升自己的认知和视野,去成为更优秀的开发者或者说在这个时代成为一个更精彩的人
#AI求职记录#