General understanding about RAG
什么是RAG
全称 retrieval augment generation,根据用户输入的数据生成初始化context,给机器人初始化的时候,规定对应的知识,这样能够帮助llm在回答的时候,生成response的时候有一个范围。当用户给定的输入比较模糊的时候,能够自动帮助生成更加准确的输入。这是没有加入retrieval模型时,用户和llm的交互,加入之后就演变成了下图
但是普通的retrieval模型的获取的context的准确也许不是很高,还需要有很多其他的技巧,那么我将就rag模型的类型,retrieve的方式,以及dataset的存储做一些调研。
框架解析
什么时候该使用RAG
第一次请求的时候会给ai一个instrument query,这个是作为一个system的role,也可以作为一次完整的回答的assistant role
- 实例基于assistant的prompt
1
2
3[{"role": "system", "content": "你是一位公司的 HR 助理。"},#第一个prompt
{"role": "user", "content": "公司的远程办公政策是什么?"}, #用户的问题
{"role": "assistant", "content": "公司的远程办公政策规定,员工可以每周最多远程办公 3 天,但需要提前向主管报备。"}] #rag补充的上下文- 再次提问的时候,基于system增加的prompt
1
2
3
4
5
6
7[{"role": "system", "content": "你是一位公司的 HR 助理。"},
{"role": "user", "content": "公司的远程办公政策是什么?"},
{"role": "assistant", "content": "公司的远程办公政策规定,员工可以每周最多远程办公 3 天,但需要提前向主管报备。"},
# 用户的 follow-up 问题
{"role": "user", "content": "那对于实习生也是这样吗?"},
# rag产生额外的检索信息
{"role": "system", "content": "实习生的远程办公政策有所不同,每周最多可以远程办公 2 天,并且需要由导师审批。"}]每一次请求时候是否也需要?需要,因为这样可以增强每次context的实时性,让数据更加符合当前场景下的回答
rag的内容还可以作为什么的信息添加到每一次context?
RAG type
基于图的RAG,会将数据看做是一个个的节点,在通过不同的数据关系,将节点相联系起来
- 这些节点之前没有数据关系,如何整理成图数据?
混合式的RAG
模块化的RAG
新式的RAG - Phasing Out N-to-1: Upgrading Multi-path Knowledge Retrieval,前者为通用的rag模式,用户的数据都在一个DB中去查找数据,评价相似性的方式也单一,这样会导致最后产生的context有可能会不完整;这是dify提出另一种multi-path的rag,基于多数据库,多种相似性评价的方式来retrieve数据,提高提供的context的完整性,相关性以及准确性
- recursive,主要针对的是多级跳跃的方式来检索数据,递归的过程由LLM自身来完成,自动地构建当前查询的知识图谱
- page based,基于阅读的方式来检索用户查询内容和document或manual的关系,如果当前page关联到了另外的page,llm就会继续查询
- 检索的是自己的训练模型中的数据还是从一个external的database?
- information-centric based,基于以事件相关性方式来检索相关联的数据,不断构建知识图谱,然后再整理和当前查询的相关性的,输入给llm,最后把这些数据更新到向量数据库中,可以实时更新数据库
- 这些数据的来源是哪里呢?
- 如何评判相关性?
- central concept based,基于概念的方式来检索query的相关数据,主要模拟人用browser查询数据的方式来构建产生最后回答的context,但是这个过程全部都是llm来完成
- llm要在自己的数据库中查询数据?
- page based,基于阅读的方式来检索用户查询内容和document或manual的关系,如果当前page关联到了另外的page,llm就会继续查询
Dataset vectoring
向量数据库,Qdrant, Pinecone, pgvector, Weaviate
- 数据分块,基于不同的文件,分块的颗粒度不一样。如果是文档的数据库,那么可以以一个paragraph或者sentence为一个输入进行chunk;如果是以对话系统的为基础的retrieval系统,那么可以以每一轮对话作为一个需chunk的对象
- 是否是以不同机器人类型做data chunk的基础
- 是否有准备好的向量数据库,bright data
- 如何自己准备vector dataset?
- 首先要将文档拆分,专业名词为chunk;基于不同的方式,最简单的就是
<span style='color:red'>
基于固定长度的chunking,这里可以使用langchain提供的langchain-text-splitters、以及llamaindex提供的SentenceSplitter,比较简单,也会比较快。为了保证数据更能保持原有的结构特性,还可以使用<span style='color:red'>
递归的方式来chunk,先按照给定的分隔符分割句子,如果分割的长度满足要求,则不会继续,否则继续按照分隔符分割。同样langchain也提供了对应的类库 Recursively split by character。<span style='color:red'>
Document based chunking的但是会考虑文档的原有结构,langchain和llamaindex分别都提供方法。基于<span style='color:red'>
semantic的方式来分割文档,llama提供了基于语义分割的方法Semantic Chunker - 这样将文档向量化的存入到数据库中,是否还会保留原有文档的结构性?章节性?
- 首先要将文档拆分,专业名词为chunk;基于不同的方式,最简单的就是
- 数据Embedding
- 简单任务:TF-IDF、Word2Vec、FastText。
- 高质量语义表示:BERT、RoBERTa、Sentence-BERT。
- 长文本处理:Longformer。
- 句子级别任务:Sentence-BERT、SimCSE。
- 图结构任务:TextGCN
- Embedding以后存入数据库的时候,为了保证数据的结构,可以使用元数据来存储数据,其中包括了当前chunk的id、所属的段落、句子以及前后chunk。
- 数据查询,使用高效的索引结构(如FAISS、Annoy、HNSW)存储向量,以支持快速检索
Data retrieval approaches
当前主流的数据retrieval分为三种种,基于数据相似性【为了initial retrieval】,基于关键字和rerank
- similarity search的方式,如何从knowledge base中获取当前提问最匹配的相关信息,最常见的方法就是把当前的句子向量化,然后和knowledge base中的数据做余弦相似性,越相关的数据值越大
- 关键字🌰,”我想要做一个巧克力蛋糕“,巧克力,蛋糕都是关键字,通过相似性,与这些keyword相关的文档都会被检索出来,交由llm生成数据的时候,会因为缺乏聚焦而产生幻觉
- rerank通过ML的方式来深度分析数据,从而找出相关性高的文档
- 上述三种方式,都可以获取到对应文档,但是各自单独使用的时候都会有一些缺陷,为了解决上述的问题,data retrieval提出了 two-stage的框架,第一步是通过关键字获取数据,而第二则会通过rerank模型来筛选出与用户的query更有相关性的document,最后再交由llm来生成对应的response,相关性的代表模型reranking model
Type
- Cross-Encoders
- Multi-Vector Models
- LLM-Based Rerankers
优化延迟和相关性
需要注意initial candidates的数量、rerank depth以及将每次rerank的结果cache起来
处理长文档
因为rerank模型一般都有输出的长度限制,在初始化数据的时候,就将文档的大小分开、在chunk的阶段就进行rerank、对于拿到的文档进行chunk,然后把每个chunk的relevance分数做一个聚总
Any approach to improve the precision of each response
- 如何避免输出的overfit
其他能够达到rag效果的方式
- fine-tune
开源框架
references
- rag basic demo
- recursive retrieval
- Phasing Out N-to-1: Upgrading Multi-path Knowledge Retrieval
- Reranking Explained: Why It Matters for RAG Systems
- Five Levels of Chunking Strategies in RAG| Notes from Greg’s Video
- https://zilliz.com/learn/guide-to-chunking-strategies-for-rag
- https://www.sagacify.com/news/a-guide-to-chunking-strategies-for-retrieval-augmented-generation-rag
- Title: General understanding about RAG
- Author: Xiao Qiang
- Created at : 2025-03-17 21:17:38
- Updated at : 2025-03-17 21:20:36
- Link: http://fdslk.github.io/tech/ai/rag/2025/03/17/rag-general-understanding/
- License: This work is licensed under CC BY-NC-SA 4.0.
预览: