企业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云端版等)——免运维、上线快,适合先跑通场景验证价值。
- 混合方案——敏感资料本地、公开资料上云,兼顾成本与安全。
对多数外贸工厂来说,难点不在写代码,而在资料整理和持续维护——这也是为什么很多企业选择专业团队交付:技术栈是现成的,资料梳理和调优才是真正的功夫。
📖 相关阅读
- 企业AI知识库怎么做?从资料整理到智能问答,完整实施路径与交付成果
- AI私有化部署是什么?2026年企业AI落地,数据安全与成本这样平衡
- 外贸公司知识管理怎么做?用AI知识库把客户和产品经验沉淀下来
- 企业AI知识库工具怎么选?2026年主流AI知识库评测对比
🤖 本文由AI辅助生成
