RAG(检索增强生成)入门指南
1. 什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和大模型生成的AI架构,主要用于提升大模型的知识准确性和上下文理解能力。
核心思想:
- 检索(Retrieval): 从外部知识库(如数据库、文档、网页)获取相关信息。
- 生成(Generation): 将检索到的信息输入大模型(如GPT),让其基于这些信息生成更准确、可控的回答。
📌 为什么需要 RAG?
- 解决知识“遗忘”问题:基础大模型的知识可能过时,RAG可以引入最新信息。
- 降低幻觉(Hallucination) :模型可能会编造信息,而RAG提供了可验证的外部数据,提高可信度。
- 支持私有数据:可以让大模型使用企业内部文档,而不需要重新训练。
2. RAG 的核心组件
🔹 1. 数据存储(知识库)
- 结构化数据:SQL数据库、NoSQL数据库(MongoDB)
- 非结构化数据:PDF、网页、文本文件
- 向量数据库(RAG的关键):存储文本嵌入(embeddings)并支持高效检索。
🔹 2. 嵌入模型(Embeddings)
-
把文本转换成向量表示,方便搜索。
-
常见嵌入模型:
- OpenAI Embeddings(text-embedding-ada-002)
- BAAI BGE(中文推荐)
- Cohere、Hugging Face 的 embedding 模型
🔹 3. 向量数据库(Vector Database)
-
存储和查询文本向量,检索相关信息。
-
主流向量数据库:
- FAISS(轻量、本地)
- Weaviate、ChromaDB(开源)
- Pinecone、Milvus(云端)
🔹 4. 检索(Retrieval)
- 基于相似度的检索(Top-K 近邻搜索)
- 语义搜索(通过 embeddings 计算相似度)
- 混合搜索(Hybrid Search) :结合关键字搜索 + 语义搜索
🔹 5. 生成(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 生成答案
进阶实战版敬请期待,真实的用python代码手搓一个rag并跑起来,并包含上述进阶内容。