RAG实战指南:用200行代码给企业构建一个私有知识库问答机器人

📅 2026/4/26 ✍️ 小文 📖 约 1 分钟

不依赖昂贵模型,用LangChain、向量数据库和开源嵌入模型,手把手搭建一个能回答企业内部文档问题的RAG系统,覆盖数据准备到部署全流程。

为什么企业需要RAG,而不是直接问大模型

大模型只学到训练时的知识,不知道你公司的规章制度、产品细节、历史项目。直接问 = 一本正经地胡说八道。而 RAG(检索增强生成) 的思路很简单:先把企业文档切块向量化,查询时先从知识库检索最相关的片段,再喂给模型生成答案。既有大模型的聪明,又有企业内部知识的准确。

整体架构

企业文档 → 切块 → 向量化(Embedding) → 存入向量库
                    ↓
用户提问 → 向量化 → 向量库检索Top-K → 拼上下文 → LLM生成答案

第一步:环境与依赖

pip install langchain langchain-openai chromadb sentence-transformers

向量库用开源的 ChromaDB(本地零配置),嵌入模型用 BAAI/bge-small-zh-v1.5(中文效果好、轻量),LLM 用任意 OpenAI 兼容接口即可。

第二步:文档载入与切块

from langchain_community.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loader = DirectoryLoader("./docs", glob="**/*.md", show_progress=True)
docs = loader.load()

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, chunk_overlap=50  # 切块500字,重叠50避免断裂
)
chunks = splitter.split_documents(docs)
print(f"共切出 {len(chunks)} 个文本块")

切块是RAG效果的第一道分水岭:块太大检索不精准,块太小会丢失上下文。500字左右对一般文档是较好起点,中文可按标点边界再优化。

第三步:向量化并存入向量库

from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma

embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
print("索引完成")

第四步:构建RAG问答链

from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

llm = ChatOpenAI(model="gpt-4o-mini", base_url="你的API地址")

# 给模型一个"只根据资料回答"的约束,避免幻觉
prompt = ChatPromptTemplate.from_messages([
    ("system",
     "你是一个企业知识库助手。仅根据以下资料回答用户问题,"
     "如果资料中没有答案,明确说'资料库中未找到相关内容',不要编造。\n\n{context}"),
    ("human", "{input}"),
])

doc_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(vectorstore.as_retriever(search_kwargs={"k": 4}), doc_chain)

answer = rag_chain.invoke({"input": "员工报销有哪些规定?"})
print(answer["answer"])

效果从”能用”到”好用”的3个优化点

  1. 混合检索:纯向量检索对精确关键词不敏感,叠加 BM25 关键字检索再融合(hybrid search),命中率大幅提升。
  2. 重排序(Rerank):检索出Top-50后再用一个轻量rerank模型精排Top-4,回答质量提升明显。
  3. 引用溯源:在答案后附上来源文档与页码,增加可信度,也便于用户核实。

部署建议

  • ChromaDB 适合原型;生产环境可换 Milvus、Weaviate 或 Qdrant。
  • 用 API 或 Gradio/FastAPI 包一层 Web 界面,非技术人员即可使用。
  • 定期增量更新向量库,避免知识过期。

这套RAG从0到1只用了200行左右代码,却能让企业真正”让AI开口说内部话”。从今天的小知识库开始,就是迈向企业智能体的第一步。

📤 分享到