RAG核心思想:不要什么都塞进模型参数里,而是在需要的时候,从外部知识库把相关信息找出来,再交给 LLM。它可以减少幻觉,因为模型回答问题时,可以参考真实的外部资料,而不是完全依赖参数中记住的知识。
用户问题
↓
先去知识库找资料
↓
找到相关内容
↓
把内容放进 Prompt
↓
LLM 根据这些内容回答
RAG
├── Retrieval
│ 检索,找到相关知识
│
└── Generation
生成,llm根据知识生成答案
一个完整的RAG系统
用户问题
↓
Query
↓
┌──────────┐
│ Retriever │
└─────┬────┘
↓
相关文档 Chunks
↓
┌──────────┐
│ LLM │
└─────┬────┘
↓
Answer
1.准备知识库
假设:
docs/
├── handbook.pdf
├── product.md
├── architecture.md
└── faq.txt
我们需要把这些数据加载进来,统一文本
2.chunking
当我们只需要局部知识的时候,如果把这个文档全部扔进去是不是太浪费了,所以我们需要把文档进行切分,分为chunk1,2...n;分别代表各个部分。它不能太大,也不能太小,太大的话和整个文档有什么区别,太小的话可能会将语义给拆散了。甚至有点会有重叠。
3.embedding
Embedding 就是把文本转换成一个能够表达语义的向量,然后比较两个向量的相似度,方向越接近,相似度越高。
4.Vector Database
保存 Embedding
快速相似度搜索
【离线 Indexing】
Documents
↓
Document Loader
↓
Chunking
↓
Embedding Model
↓
Vector Database
│
│
│
↓
──────────────────────────────
【在线 Query】
User Question
↓
Query Embedding
↓
Vector Search
↓
Top-K Chunks
↓
Prompt Construction
↓
LLM
↓
Answer
事实上embedding相似不不代表一定真正相关所以我们需要使用reranker将top-k进行缩小,reranker擅长更加精确的判断query和chunk是否真的相关。
Retriever
↓
重点解决 Recall(真正相关的东西,你找到了多少?)
Reranker
↓
进一步提升 Precision(你找出来的东西,有多少是真的相关?)
RAG
│
┌─────────────┴─────────────┐
↓ ↓
Offline Indexing Online Query
↓ ↓
Documents Question
↓ ↓
Chunking Query Embedding
↓ ↓
Embedding Retrieval
↓ ↓
Vector Database Top-K
↓
Reranker
↓
Context
↓
LLM
↓
Answer