General understanding about RAG

Xiao Qiang Lv4

什么是RAG

全称 retrieval augment generation,根据用户输入的数据生成初始化context,给机器人初始化的时候,规定对应的知识,这样能够帮助llm在回答的时候,生成response的时候有一个范围。当用户给定的输入比较模糊的时候,能够自动帮助生成更加准确的输入。这是没有加入retrieval模型时,用户和llm的交互Image,加入之后就演变成了下图Image但是普通的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要在自己的数据库中查询数据?

Dataset vectoring

向量数据库,QdrantPineconepgvector, 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
      • 这样将文档向量化的存入到数据库中,是否还会保留原有文档的结构性?章节性?
  • 数据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

  • 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.
Comments
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.2.2