📚 目录
- 什么是 RAG?
- RAG 的系统架构图解
- 构建流程概览
- 核心模块详解
- 文档预处理与嵌入
- 向量数据库(Retriever)
- 检索器设计
- 语言模型与 Prompt 构造
- 技术选型推荐
- 实战:用 LangChain + OpenAI 构建 RAG
- 扩展能力(多模态 / 多轮对话 / 实时抓取)
- 常见问题与优化策略
- 出站链接与参考资料
1️⃣ 什么是 RAG?
RAG 是一种让大语言模型(如 GPT)结合外部知识库进行生成的技术。它的关键目标是:回答时不完全依赖模型内部参数,而是先查询资料、再作答。
优点:
- 可访问外部信息(时效性强)
- 不易“幻觉”编造信息
- 支持自定义知识库(如公司内网、文档集)
2️⃣ RAG 的系统架构图解
┌────────────┐
│ 用户查询 │
└────┬───────┘
↓
┌────────────────────┐
│ Query Embedding │ ← 编码输入查询
└────────────────────┘
↓
┌────────────────────┐
│ 向量数据库(如 FAISS)│ ← 检索相似文档
└────────────────────┘
↓
┌────────────────────┐
│ 文档上下文拼接 Prompt│ ← 构造上下文提示
└────────────────────┘
↓
┌────────────────────┐
│ 语言模型(如 GPT) │ ← 生成答案
└────────────────────┘
↓
┌────────────┐
│ 返回答案 │
└────────────┘
3️⃣ 构建流程概览
- 准备知识库(PDF、网页、数据库等)
- 拆分文档(chunking)
- 将文档嵌入为向量(embedding)
- 将向量存入向量数据库(如 FAISS、Milvus)
- 用户查询向量化后检索相关 chunk
- 构造 prompt + 检索结果作为上下文
- 调用大语言模型生成答案
4️⃣ 核心模块详解
🔹 a. 文档预处理与 Chunking
- 文档格式支持:PDF、Markdown、HTML、TXT、Word
- 工具推荐:
langchain.document_loaders
、unstructured
、pdfplumber
- Chunk 策略:按字数 or 按句子滑动窗口(常见如 500 token + 100 重叠)
🔹 b. 向量数据库(Retriever)
功能: 存储和检索文档 embedding 向量
向量库 | 特点 |
---|---|
FAISS | 本地部署轻量级,适合中小项目 |
Milvus | 高性能分布式,适合企业级 |
Weaviate | 内置 REST API,支持元数据过滤 |
Qdrant | 实时向量插入,适合增量更新 |
🔹 c. 文本嵌入(Embedding)
将文本转成高维向量以供检索
常见模型:
- OpenAI 的
text-embedding-3-small
- Cohere
- BGE (
bge-large-zh
,中文推荐) - HuggingFace 模型如
sentence-transformers
🔹 d. Prompt 构造与语言模型调用
Prompt 模板示例:
已知以下资料,请用中文简洁回答用户问题。
资料:
{{ context }}
问题:
{{ question }}
常用模型接口:
- OpenAI GPT-4 / GPT-3.5
- Claude(Anthropic)
- 本地模型(如 ChatGLM、Mistral)
5️⃣ 技术选型推荐
模块 | 工具/模型 |
---|---|
文档解析 | Unstructured、LangChain |
Chunk 切片 | LangChain TextSplitter |
嵌入模型 | OpenAI Embedding、BGE |
向量数据库 | FAISS(轻量)或 Qdrant |
检索策略 | Top-k + 相似度阈值 |
语言模型 | GPT-4 / Claude / 本地 LLM |
应用框架 | LangChain、LlamaIndex |
6️⃣ 实战:LangChain + OpenAI 构建一个简易 RAG 系统
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载文档
loader = TextLoader("your-doc.txt")
docs = loader.load()
# 切片
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 嵌入 & 存入 FAISS
embedding_model = OpenAIEmbeddings()
db = FAISS.from_documents(chunks, embedding_model)
# 检索 + QA Chain
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=db.as_retriever(),
return_source_documents=True
)
# 提问
qa.run("请解释什么是RAG?")
7️⃣ 扩展能力
扩展方向 | 描述 |
---|---|
多轮对话记忆 | LangChain 的 ConversationBuffer |
多模态支持 | 图文检索,结合 CLIP 或 Gemini |
实时抓取 | 接入搜索引擎或自定义爬虫接口 |
权限控制 | 检索时按用户权限过滤文档 |
8️⃣ 常见问题与优化策略
问题 | 解决方式 |
---|---|
检索结果无关 / 不准 | 训练自定义 embedding、改进 chunk 切割策略 |
上下文太长 LLM 报错 | 使用 Token Trimmer 截断远离主题内容 |
响应慢 | 本地化模型、前置缓存 embedding |
中文理解差 | 用 bge-large-zh 、Chinese-LLaMA 等中文模型 |
9️⃣ 出站链接与参考资料
如果你需要构建一个企业内部文档问答系统、法律文献问答工具、产品知识库助理,我可以根据你的业务类型进一步定制构建方案,包括数据预处理模板、向量库部署建议、本地大模型适配等。需要的话请继续告诉我。
发表回复