RAG 检索增强入门:让 AI 用上你的资料
RAG 检索增强入门:让 AI 用上你的资料
一、为什么需要 RAG?
大型语言模型(LLM)虽然强大,但存在知识截止、幻觉问题,且无法直接访问你的私有数据。RAG(Retrieval-Augmented Generation)通过检索外部知识库,将相关内容注入提示词,让模型基于这些信息生成答案,从而显著提升准确性和时效性,并支持私有化部署。
二、RAG 核心原理
RAG 的核心流程可概括为:**索引(Indexing)→ 检索(Retrieval)→ 生成(Generation)**。
1. **索引**:将文档(PDF、Word、网页等)切分成小块(chunk),然后通过嵌入模型(Embedding Model)将每块文本转换为向量,存入向量数据库。这一步相当于给资料建立“语义索引”。
2. **检索**:当用户提问时,先将问题转换为同样的向量,然后在向量数据库中查找最相似的 Top-K 个块。这通常使用余弦相似度或点积计算。
3. **生成**:将检索到的文本块与原始问题组合成提示词,交给 LLM 生成答案。模型可以引用这些资料,减少幻觉。
三、主流工具链
### 1. 嵌入模型
- **OpenAI Embeddings**:如 text-embedding-ada-002,质量高,但需付费。
- **开源模型**:BGE、M3E、Sentence-BERT 等,可本地部署,成本低。
### 2. 向量数据库
- **Faiss**:Facebook 开源的本地向量库,轻量,适合学习。
- **Chroma**:纯 Python,简单易用,适合原型开发。
- **Milvus**:分布式向量数据库,适合生产环境。
- **Weaviate/Qdrant**:支持云原生,功能丰富。
### 3. 编排框架
- **LangChain**:提供完整的 RAG 链式封装,快速搭建。
- **LlamaIndex**:专为数据连接和索引设计,灵活性高。
- **自研**:用 Flask/FastAPI 结合上述组件,可控性强。
四、最小实现思路(以 Python + Chroma + OpenAI 为例)
以下是一个简单可运行的流程,展示如何构建一个最小 RAG 系统。
### 步骤 1:准备文档并切分
```python
from langchain.text_splitter import RecursiveCharacterTextSplitter
documents = ["你的文本内容..."]
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.create_documents(documents)
```
注意:chunk_size 不宜过大(一般 300-800 字),否则检索精度下降;overlap 有助于保持上下文连贯。
### 步骤 2:生成向量并存储
```python
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(docs, embeddings, persist_directory="./db")
vectordb.persist()
```
### 步骤 3:检索
```python
question = "你的问题?"
retriever = vectordb.as_retriever(search_kwargs={"k": 3})
retrieved_docs = retriever.get_relevant_documents(question)
```
### 步骤 4:生成回答
```python
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever)
answer = qa_chain.run(question)
print(answer)
```
五、避坑指南
1. **切分策略**:不要固定大小切分,建议根据段落或句子切分,避免切断语义。使用递归字符分割器,并设置合适的 overlap。
2. **嵌入模型一致性**:索引和查询必须使用相同的嵌入模型,否则检索结果毫无意义。
3. **检索质量**:如果检索结果不佳,可尝试调整 Top-K 值(如 3-5),或使用混合检索(关键词+向量)。
4. **上下文长度限制**:检索到的多个 chunk 可能超出 LLM 的上下文窗口,需设置最大 token 数,或对检索结果进行重排(rerank)。
5. **数据更新**:向量数据库需要定期重新生成索引,否则知识过期。建议设计增量更新机制。
6. **隐私与安全**:如果资料敏感,请使用本地嵌入模型和本地向量库,避免数据外泄。
六、扩展与优化
- **引入重排序模型**:使用 Cross-Encoder 对检索结果的关联度进行排序,可显著提升答案质量。
- **多路召回**:同时使用向量检索和关键词检索,融合结果。
- **对话记忆**:在多轮对话中,将历史对话也作为上下文输入,增强连贯性。
- **评估系统**:构建一个评估集,用 RAGAS 等框架量化检索和生成质量。
结语
RAG 让 LLM 真正“接地气”,能够利用你的私有资料。从最小实现开始,逐步优化检索策略和生成逻辑,你就能打造一个强大的知识助手。希望本文能为你打开 RAG 的大门,勇敢实践吧!