返回首页

RAG知识库实战教程2026:从零搭建企业级AI知识库,含完整Python代码

知识库实战教程:从零搭建企业级知识库

什么是RAG

RAG(Retrieval-Augmented Generation)= 检索增强生成

原理:

用户提问 → 检索相关文档 → 把文档+问题一起给 → 生成回答

例子:
用户问:"公司的退货政策是什么?"
检索到:《退货政策文档》第3章
LLM根据文档生成: "根据公司政策,商品签收7天内可无理由退货..."

为什么需要RAG:

  • LLM不知道你的私有数据(公司文档、产品手册、内部知识)
  • 微调太贵且需要持续更新
  • RAG可以实时更新知识,成本低

商业价值:

  • 企业知识库问答系统:¥10000-¥50000/套
  • 客服机器人:替代人工客服,月省¥20000+
  • 文档搜索引擎:比传统搜索智能100倍
  • 培训助手:新员工培训自动化

方案1:RAGFlow(推荐)

安装

# Docker一键部署
docker compose -f docker-compose.yml up -d

# 或源码安装
git clone https://github.com/infiniflow/ragflow.git
cd ragflow
pip install -r requirements.txt

核心功能

RAGFlow特色:
├── 深度文档解析(PDF/Word/Excel/PPT)
├── 自动分块(智能切分,不是简单按字数)
├── 多种检索模式(向量/关键词/混合)
├── 可视化管理界面
└── 接口

使用流程

# 1. 创建知识库
import requests

BASE_URL = "http://localhost:9380"

# 创建Dataset
resp = requests.post(f"{BASE_URL}/api/v1/datasets", json={
    "name": "产品手册",
    "chunk_method": "intelligent",  # 智能分块
    "parser_config": {
        "layout_recognize": True,  # 自动识别文档结构
    }
})
dataset_id = resp.json()[""]["id"]

# 2. 上传文档
files = [
    "product_manual.pdf",
    "faq.docx",
    "price_list.xlsx",
]
for f in files:
    requests.post(
        f"{BASE_URL}/api/v1/datasets/{dataset_id}/documents",
        files={"file": open(f, "rb")}
    )

# 3. 检索+生成
resp = requests.post(f"{BASE_URL}/api/v1/chats", json={
    "question": "产品A的退货政策是什么?",
    "dataset_ids": [dataset_id],
})
print(resp.json()["data"]["answer"])

方案2:Dify(最简单)

安装

# Docker部署
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d

# 访问 http://localhost:3000

创建知识库应用

步骤:
1. 登录Dify Web界面
2. 创建"知识库" → 上传文档
3. 创建"应用" → 选择"聊天助手"
4. 关联知识库
5. 发布应用

全程无代码!

API调用

import requests

# Dify API
resp = requests.post(
    "http://localhost:3000/v1/chat-messages",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "inputs": {},
        "query": "产品A的退货政策是什么?",
        "response_mode": "streaming",
        "user": "user-123",
    }
)

方案3:自建RAG(最灵活)

核心代码

# rag_system.py - 500行搞定
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader
from langchain.chains import RetrievalQA
from langchain.llms import Ollama

class RAGSystem:
    def __init__(self, model_name="qwen2.5:14b"):
        self.embeddings = HuggingFaceEmbeddings(
            model_name="BAAI/bge-large-zh-v1.5"  # 中文
        )
        self.llm = Ollama(model=model_name)
        self.text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=500,
            chunk_overlap=50,
        )
        self.vectorstore = None
    
    def load_documents(self, file_paths: list[str]):
        """加载文档"""
        documents = []
        for path in file_paths:
            if path.endswith(".pdf"):
                loader = PyPDFLoader(path)
            elif path.endswith(".docx"):
                loader = Docx2txtLoader(path)
            else:
                continue
            documents.extend(loader.load())
        
        # 分块
        texts = self.text_splitter.split_documents(documents)
        
        # 向量化存储
        self.vectorstore = Chroma.from_documents(
            texts,
            self.embeddings,
            persist_directory="./chroma_db"
        )
        print(f"已加载 {len(texts)} 个文本块")
    
    def query(self, question: str) -> str:
        """查询"""
        if not self.vectorstore:
            return "请先加载文档"
        
        # 检索
        retriever = self.vectorstore.as_retriever(
            search_type="mmr",  # 最大边际相关性
            search_kwargs={"k": 5}
        )
        
        # 生成
        chain = RetrievalQA.from_chain_type(
            llm=self.llm,
            retriever=retriever,
            return_source_documents=True,
        )
        
        result = chain.invoke({"query": question})
        return result["result"]

# 使用
rag = RAGSystem()
rag.load_documents(["manual.pdf", "faq.docx"])
answer = rag.query("退货政策是什么?")
print(answer)

高级优化

1. 混合检索

# 向量 + 关键词混合检索
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever

# BM25关键词检索
bm25_retriever = BM25Retriever.from_documents(texts)
bm25_retriever.k = 5

# 向量检索
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# 混合
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, vector_retriever],
    weights=[0.4, 0.6]  # 关键词40%,向量60%
)

2. 重排序

from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank

# 用重排序
compressor = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=ensemble_retriever,
)

3. 多轮对话

from langchain. import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True,
)

chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=retriever,
    memory=memory,
)

商业化案例

案例1:企业知识库

客户:中型制造企业(500人)
需求:员工查询产品手册、流程规范、FAQ
技术:RAGFlow + Qwen2.5-14B
报价:¥30000(一次性)+ ¥3000/月(维护)

案例2:智能客服

客户:电商平台
需求:替代5个人工客服
技术:Dify + -4o
报价:¥20000(部署)+ ¥5000/月
节省:人工客服¥25000/月 → 客服¥5000/月

案例3:法律助手

客户:律师事务所
需求:查询法律法规、案例、合同模板
技术:自建RAG + 法律数据
报价:¥50000

下节预告

下一课:n8n/Dify自动化工作流——让AI帮你做重复性工作。

常见问题

什么是RAG

>什么是RAGRAG(Retrieval-Augmented Generation)= 检索增强生成 原理: 用户提问 → 检索相关文档 → 把文档+问题一起给LLM → 生成回答 例子: 用户问:"公司的退货政策是什么?" 检索到:《退货政策文档》第3章 LLM根据文档生成: "根据公司政策,商品签收7天内可无理由退货..." 为什么需要RAG: LLM不知道你的私有数据(公司文档、产品手册、内部知识) 微调太贵且需要持续更新 RAG可以实时更新知识,成本低 商业价值: 企业知识库问答系统:¥10000-¥50000/套 客服机器人:替代人工客服,月省

评论