RAG 处理流程

下面是处理流程图

User System EmbeddingModel Retriever Reranker LLM KnowledgeBase 输入问题(Query) 用嵌入模型编码Query Query向量 用Query向量检索 查找相似向量(原始使用嵌入模型编码) 返回Top K文档块 原始检索结果 对结果重排序(可选) 精排后文档 组合: Query + 相关文档 生成最终回答 返回答案 User System EmbeddingModel Retriever Reranker LLM KnowledgeBase

关键问题解释(嵌入模型不一致):

  1. 知识库编码阶段

    • 文档块使用嵌入模型A编码后存入向量数据库
    • 例如:text-embedding-ada-002bge-small
  2. 查询阶段

    • 用户Query可能被问答模型的嵌入模块B编码(如GPT的tokenizer)
    • 这时会出现嵌入空间不一致问题 → 检索质量下降

解决方案:

用户Query输入
是否独立嵌入模型?
使用知识库同款模型编码
(如bge-base)
⚙️ 复用问答模型嵌入层
向量相似度检索

各模型职责说明:

组件 作用 典型模型示例
嵌入模型 将文本转换为向量 text-embedding-ada-002, bge-base
检索器 计算向量相似度 FAISS, Annoy
重排序模型 精细化结果排序 cohere-rerank, bge-reranker
问答模型 生成最终答案 GPT-4, LLaMA-2

处理时机总结:

  1. 预处理阶段:知识库文档 → 嵌入模型 → 向量存储
  2. 查询阶段
    • 用户输入 → (可选)独立嵌入模型 → 检索
    • 原始结果 → (可选)重排序模型 → 精排
    • 排序后文档 + 问题 → 问答模型 → 生成答案

这种设计下,确保检索和生成阶段使用兼容的嵌入表示是关键,通常建议知识库编码和查询编码使用同款嵌入模型。

在RAG(Retrieval-Augmented Generation)流程中,问答模型生成答案时的输入是原始文本形式的用户问题(Query)和检索到的文档片段(原始文本)


问答模型的输入组成(文本形式):

  1. 用户原始问题

    • 直接保留用户输入的文本(例如:“量子纠缠的原理是什么?”)。
  2. 检索到的文档片段

    • 从向量数据库返回的是原始文本段落(如:“量子纠缠是指…<知识库原文>”),而不是向量。
    • 向量仅用于检索阶段,检索完成后即丢弃,后续不参与生成。
  3. 可能的模板格式化

    • 通常会将问题和文档组合成提示词(Prompt),例如:
      请根据以下信息回答问题:
      文档1: <检索结果1的文本>
      文档2: <检索结果2的文本>
      问题: <用户原始问题>
      

完整流程对比(检索阶段 vs. 生成阶段):

生成阶段 (文本空间)
检索阶段 (向量空间)
文本输入
向量化
查询向量
预存向量
相似度排序
上下文
问题
合成回答
原始文本片段
❓ 原始Query文本
问答模型
(如GPT-4)
生成答案
用户Query文本
嵌入模型编码
(如bge-base)
Query向量
️ 知识库向量
向量相似度计算
Top-K文本片段

关键点总结:

  1. 向量只用一次:仅在检索阶段计算相似度,之后丢弃。
  2. 问答模型的输入是纯文本:包括原始Query和检索到的文档文本。
  3. 两类模型完全解耦
    • 嵌入模型:负责检索阶段的向量表示(独立训练)。
    • 问答模型:负责文本生成(如GPT系列),不关心检索用的向量。

类比解释:

  • 检索阶段:像用ISBN号(向量)在图书馆找书,找到后ISBN就没用了。
  • 生成阶段:直接阅读书中的文本内容(原始文本)来回答问题。

你可能感兴趣的:(网络,自然语言处理,神经网络,深度学习,RAG)