进阶
用 RAG + 向量数据库搭企业知识库 Agent
大模型「一本正经胡说」的根本原因是:它不知道你的私有数据。RAG(检索增强生成) 的解法是——先建一个向量数据库把你的文档存好,用户提问时先检索最相关的片段,再让模型「带着资料回答」。这是企业知识库 Agent 的底层技术。本教程从 0 搭一个 RAG 管线。
📚 本教程适合:开发者 / 算法同学,想给企业文档做一个「基于事实、不乱编」的问答后端。需要基础 Python。
Step 1:选向量数据库
1 选向量数据库
轻量本地用 Chroma;大规模用 Milvus / Qdrant;已在用 Postgres 就直接上 pgvector。本教程以 Chroma 演示。
Step 2:文档切分(Chunking)
2 文档切分(Chunking)
文档不能整篇塞进去,要切成语义完整的块。太大检索不准,太小丢上下文。
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
Step 3:向量化(Embedding)
3 向量化(Embedding)
用嵌入模型把每段文本变成向量。中文场景可选 bge / bge-m3 / OpenAI text-embedding。
from langchain_openai import OpenAIEmbeddings
emb = OpenAIEmbeddings(model="text-embedding-3-small")
vectors = emb.embed_documents([c.page_content for c in chunks])
Step 4:入库与建索引
4 入库与建索引
把向量和原文一起写入库,建立相似度索引。
import chromadb
client = chromadb.Client()
col = client.create_collection("kb")
col.add(ids=[str(i) for i in range(len(chunks))],
documents=[c.page_content for c in chunks],
embeddings=vectors)
Step 5:检索增强生成
5 检索增强生成
用户提问 → 向量化问题 → 检索 Top-K 片段 → 拼进提示词让模型回答。
hits = col.query(query_embeddings=[qvec], n_results=3)
context = "
".join(hits["documents"][0])
prompt = f"仅依据以下资料回答:
{context}
问题:{question}"
必须「仅依据资料」。提示词里明确限制,否则模型仍会用自己的「记忆」补窟窿,导致幻觉。
Step 6:重排(Rerank)提升精度
6 重排(Rerank)提升精度
向量检索召回的 Top-K 不一定最相关。加一层 Cross-Encoder Rerank,把最相关的提到最前,回答质量明显提升。
Step 7:封装为 API 服务
7 封装为 API 服务
把「检索 + 生成」包成一个 HTTP 接口(FastAPI / Worker),前端或企微机器人直接调用,就是个知识库 Agent 了。
常见问题速查
| 你遇到的现象 | 大概率原因 & 解决 |
|---|---|
| 答非所问 | chunk 太大/太小,调 size 与 overlap |
| 还是幻觉 | 提示词未限制「仅依据资料」,加强约束 |
| 检索不准 | 换更好的 embedding + 加 rerank |
| 中文效果差 | 用中文优化嵌入模型(bge-m3 等) |