企业AI知识库怎么实现?RAG技术原理与Python代码教程(从0到1搭建)

企业AI知识库背后,是RAG技术

上一篇文章讲了企业AI知识库的服务怎么交付(诊断、整理、搭建、调优、培训),这篇从代码和技术层面拆开看:一个能让AI基于公司资料回答问题的知识库,底层到底怎么实现。

先给结论:企业AI知识库的核心技术叫 RAG(Retrieval-Augmented Generation,检索增强生成)。一句话解释——先检索、再生成:用户提问后,系统先从公司资料库里找出相关内容,再把这些内容连同问题一起交给大模型,让大模型「看着资料回答」,而不是凭空编。

💡 为什么不用「把资料全塞给AI」? 大模型一次能处理的文字量有限,公司资料动辄几十万字,塞不下;而且模型训练数据里没有你的产品规格和报价规则。RAG 的思路是:平时把资料切成小块存起来,提问时只把相关的几小块捞出来给AI看——省成本、答得准、还能告诉你依据来自哪份文档。

一、RAG的完整工作流程:6个环节

一个完整的RAG知识库,无论用什么框架,都是下面这6个环节:

环节 做什么 常用工具
1. 文档解析 把PDF、Word、TXT读成纯文本 pypdf、python-docx
2. 文本切块 把长文档切成500字左右的小块 RecursiveCharacterTextSplitter
3. 向量化 把每个文本块转成一串数字(向量) BGE-M3、OpenAI embedding、通义
4. 向量存储 把向量存进向量数据库,建索引 Chroma、FAISS、Milvus、pgvector
5. 检索 提问时把问题也转成向量,找相近的块 相似度检索 + BM25关键词检索
6. 生成 把检索结果+问题拼成Prompt,大模型作答 DeepSeek、通义千问、GLM

前4个环节是「建库」阶段,只做一次(之后资料更新时增量做);后2个环节是「问答」阶段,每次提问都实时执行。

二、先讲清楚两个关键概念

1. 文本切块(Chunking)。 向量化之前,要把长文档切成小块。为什么?因为检索的单位是「块」——切得太粗,一块里混着多个话题,检索精度下降;切得太细,上下文被切断,AI答不全。实践里常见的是按标题/段落切,每块300-800字,块与块之间保留少量重叠,防止关键信息被拦腰切断。

2. 向量化(Embedding)。 把「一句话」变成「一串数字」。比如「交期30天」可能变成一组几百维的浮点数,语义相近的句子,向量在空间里距离也近。这样「客户问交期多久」和资料里的「交期30天」就能通过距离计算匹配上。这一步依赖 embedding 模型,是决定检索准不准的核心。

三、embedding 模型怎么选

⚠️ 这里有个常见误区:DeepSeek 官方目前没有提供 embedding 接口。很多教程让读者用 DeepSeek 一路做到底,实际跑起来会发现没有向量化能力。正确的组合是:生成用 DeepSeek,向量化用专门的 embedding 模型。主流选择:

模型 部署方式 特点 适合谁
BGE-M3(BAAI开源) 本地部署 中文强、支持100+语言、免费、数据不出域 企业私有化知识库,推荐
OpenAI text-embedding-3 API调用 英文强、按量计费 英文资料为主的团队
通义/百炼 embedding API调用 中文好、国内可直连 国内云上部署

对国内外贸企业,BGE-M3 本地部署是更合适的选择:免费、中文效果好、客户资料不用发给第三方,正好契合知识库「数据不出域」的诉求。

四、完整代码:一个能跑的极简知识库

下面这段代码实现了「建库→问答」的完整闭环,依赖只有5个库,是理解RAG原理的骨架。生产环境在此基础上加工程化即可。

# pip install pypdf sentence-transformers faiss-cpu openai

import os
from pypdf import PdfReader
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
from openai import OpenAI

# ── 第 1 步:解析文档,切成小块 ──
def load_and_chunk(pdf_path, chunk_size=500, overlap=50):
    reader = PdfReader(pdf_path)
    text = "\n".join(page.extract_text() for page in reader.pages)
    chunks = []
    for i in range(0, len(text), chunk_size - overlap):
        chunks.append(text[i:i + chunk_size])
    return chunks

# ── 第 2 步:向量化(本地BGE模型,中文友好)──
model = SentenceTransformer("BAAI/bge-m3")
chunks = load_and_chunk("product_manual.pdf")
vectors = model.encode(chunks, normalize_embeddings=True)

# ── 第 3 步:存入向量库(FAISS 建索引)──
index = faiss.IndexFlatIP(vectors.shape[1])
index.add(np.array(vectors).astype("float32"))

# ── 第 4 步:提问 → 检索 ──
def retrieve(question, top_k=3):
    q_vec = model.encode([question], normalize_embeddings=True)
    scores, ids = index.search(np.array(q_vec).astype("float32"), top_k)
    return [chunks[i] for i in ids[0]]

# ── 第 5 步:检索结果 + 问题 交给大模型生成 ──
client = OpenAI(api_key=os.environ["DEEPSEEK_API_KEY"],
                base_url="https://api.deepseek.com")

def ask(question):
    context = "\n\n".join(retrieve(question))
    resp = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content":
             "你是公司知识库助手,只能根据提供的资料回答,资料里没有就如实说明。"},
            {"role": "user", "content": f"资料:\n{context}\n\n问题:{question}"}
        ]
    )
    return resp.choices[0].message.content

print(ask("我们产品的交期是多少天?"))

这段代码麻雀虽小五脏俱全:PDF解析、切块、BGE向量化、FAISS检索、DeepSeek生成,一次跑通。注意两点:① 用 BGE 做向量化、DeepSeek 只做生成;② 系统提示词要求AI「只能根据资料回答」,这是防止AI编造答案的关键。

五、生产环境:换成LangChain组合拳

上面是教学版,真实企业知识库通常用 LangChain 把各环节串起来,好处是:支持更多文档格式(Word/Excel/网页)、自带混合检索、方便换模型。核心代码如下:

# pip install langchain langchain-community chromadb sentence-transformers

from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

# 1. 加载多格式文档
loaders = [PyPDFLoader("报价单.pdf"), Docx2txtLoader("产品手册.docx")]
docs = [d for loader in loaders for d in loader.load()]

# 2. 按结构切块:优先按标题切,每块约500字
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, chunk_overlap=50, separators=["\n## ", "\n### ", "\n", "。"])
chunks = splitter.split_documents(docs)

# 3. 本地BGE向量化 + Chroma存储(数据留在自己机器上)
embeddings = HuggingFaceBgeEmbeddings(
    model_name="BAAI/bge-m3", encode_kwargs={"normalize_embeddings": True})
vector_db = Chroma.from_documents(chunks, embeddings,
                                  persist_directory="./kb_store")

# 4. 检索 + DeepSeek生成,封装成问答链
llm = ChatOpenAI(model="deepseek-chat",
                 api_key=os.environ["DEEPSEEK_API_KEY"],
                 base_url="https://api.deepseek.com")
qa = RetrievalQA.from_chain_type(
    llm=llm, retriever=vector_db.as_retriever(search_kwargs={"k": 3}))
print(qa.invoke("客户问交期,怎么回复?"))

LangChain 版和教学版的差别:文档格式更多、切块更智能(优先按标题切,语义完整)、存储用 Chroma(可持久化、重启不丢)、问答封装成标准接口。这套组合就是目前企业私有化知识库的主流架构。

六、准确率不够?调这四个旋钮

知识库跑起来不难,难的是「答得准」。实践中影响准确率的四个关键点,按优先级排:

旋钮 怎么调 典型问题
资料质量 删除过期/重复文档,规范表述 资料本身矛盾,AI怎么答都对不上
切块策略 按标题切、500字左右、留重叠 答非所问、信息被切断
检索数量 top_k 从3调到5,看是否漏关键信息 答案缺关键参数
混合检索 向量检索+BM25关键词检索合并 型号、货号等精确词匹配不上

还有一个进阶手段:检索后加一道 重排序(Rerank),让模型对捞出来的候选块再精排一遍,能再提升一截准确率,代价是增加一点延迟和成本。

七、老板视角:技术路线怎么选

技术讲完,回到决策层面。三条路线各有适用场景:

  • 纯本地部署(BGE-M3 + Chroma + DeepSeek API)——数据完全不出域,向量化免费,适合资料敏感的工厂;成本主要是服务器和模型API调用,每月几十到几百元。
  • 云上托管(通义百炼、Dify云端版等)——免运维、上线快,适合先跑通场景验证价值。
  • 混合方案——敏感资料本地、公开资料上云,兼顾成本与安全。

对多数外贸工厂来说,难点不在写代码,而在资料整理和持续维护——这也是为什么很多企业选择专业团队交付:技术栈是现成的,资料梳理和调优才是真正的功夫。

📖 相关阅读

🚀 技术不用自己啃,直接交付落地

Podcore AI 帮你搭建企业AI知识库——资料整理、RAG部署、问答调优一条龙,数据不出域。

📞 13560386440(张小姐,微信同号)

立即免费咨询 →

🤖 本文由AI辅助生成