1. 什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和大模型生成的AI架构,主要用于提升大模型的知识准确性和上下文理解能力。
核心思想:
检索(Retrieval): 从外部知识库(如数据库、文档、网页)获取相关信息。 生成(Generation): 将检索到的信息输入大模型(如GPT),让其基于这些信息生成更准确、可控的回答。 为什么需要 RAG?
解决知识“遗忘”问题:基础大模型的知识可能过时,RAG可以引入最新信息。 降低幻觉(Hallucination) :模型可能会编造信息,而RAG提供了可验证的外部数据,提高可信度。 支持私有数据:可以让大模型使用企业内部文档,而不需要重新训练。
2. RAG 的核心组件
- 数据存储(知识库)
结构化数据:SQL数据库、NoSQL数据库(MongoDB) 非结构化数据:PDF、网页、文本文件 向量数据库(RAG的关键):存储文本嵌入(embeddings)并支持高效检索。
- 嵌入模型(Embeddings)
把文本转换成向量表示,方便搜索。 常见嵌入模型: OpenAI Embeddings(text-embedding-ada-002) BAAI BGE(中文推荐) Cohere、Hugging Face 的 embedding 模型
- 向量数据库(Vector Database)
存储和查询文本向量,检索相关信息。 主流向量数据库: FAISS(轻量、本地) Weaviate、ChromaDB(开源) Pinecone、Milvus(云端)
- 检索(Retrieval)
基于相似度的检索(Top-K 近邻搜索) 语义搜索(通过 embeddings 计算相似度) 混合搜索(Hybrid Search) :结合关键字搜索 + 语义搜索
- 生成(LLM Response)
用大模型(如GPT-4、Claude、Llama)结合检索到的信息,生成回答。
3. RAG 的工作流程
(1)数据准备
收集和清理数据(PDF、数据库、网页) 预处理数据(去重、拆分文本) 用嵌入模型将数据转换成向量,并存入向量数据库 (2)查询处理
用户输入问题 对用户问题进行嵌入计算,转成向量 在向量数据库中查找最相关的文档(Top-K) (3)信息融合
结合检索到的文档,构建 Prompt 让 LLM(大模型)基于上下文生成答案 示例(简化版):
用户问:"如何优化库存管理?" RAG 先从数据库找出相关库存管理文档 把这些文档的关键信息交给 GPT-4 进行总结 GPT-4 生成精准回答,并附带信息来源
4. RAG 进阶优化
✅ 1. Chunking(文本分块)
长文档拆成小段(比如每 500 个 Token 一块),避免检索不到核心内容。 ✅ 2. 多模态 RAG
除了文本,还可以检索 图片、表格、代码 等数据。 ✅ 3. RAG + 记忆
让模型记住用户的历史提问,提高连续对话能力(如Chatbot)。 ✅ 4. RAG + 评分机制
用 ReRanker 对检索的内容排序,提高相关性。 ✅ 5. RAG + 反馈优化
让用户反馈答案是否有用,并用 Reinforcement Learning 进一步优化 RAG。
5. RAG 实践(动手实验)
使用 LangChain 搭建一个 RAG 系统 LangChain 是一个专门用于 LLM 应用开发的 Python 框架,它支持 RAG 组件的集成。
安装依赖
pip install langchain openai faiss-cpu tiktoken
代码示例(RAG 小系统)
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import TextLoader
from langchain.llms import OpenAI
# 1. 加载文档并拆分
loader = TextLoader("data.txt")
documents = loader.load()
# 2. 转换为向量并存入FAISS数据库
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(documents, embeddings)
# 3. 用户查询 & 检索相关文档
query = "如何优化库存管理?"
retrieved_docs = vectorstore.similarity_search(query, k=3)
# 4. 结合检索结果,构造 Prompt 并调用 GPT
context = "\n\n".join([doc.page_content for doc in retrieved_docs])
prompt = f"根据以下内容回答问题:\n{context}\n\n问题: {query}"
llm = OpenAI()
response = llm(prompt)
print(response)
这个代码实现了:
加载文本数据 计算文本向量,存入 FAISS 向量数据库 根据用户问题检索相关文档 调用 GPT 生成答案