AI洞察
首页 / AI教程 / 进阶
技术

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 的大门,勇敢实践吧!