乐于分享
好东西不私藏

我把公司300份文档喂给AI,它成了比老员工还懂业务的专家:RAG技术 + DeepSeek + 向量数据库,让AI基于你自己的精准回答问题

我把公司300份文档喂给AI,它成了比老员工还懂业务的专家:RAG技术 + DeepSeek + 向量数据库,让AI基于你自己的精准回答问题

图:把你的所有文档变成一个能回答任何问题的AI

————————————————————————————————

上个月,公司来了个新人。

入职第一天,主管丢给他一个共享文件夹——里面有300多份文档:产品手册、技术规范、客户案例、历史合同、会议纪要、培训资料……

「先把这些看完。」主管说。

新人花了整整两周,才勉强看完一半。遇到具体问题时,还是得去问老员工。

后来我帮他搭了一个AI私有知识库。

把那300份文档全部喂进去之后,AI能秒级检索任何一份文档的内容,精准回答业务问题,甚至能告诉你答案出自哪份文档的第几页。

新人再也不用翻文档了,问AI就行。老员工也省去了大量重复答疑的时间。

这篇文章,我把整个搭建过程从零开始手把手教给你。

【项目概览】

项目信息

详情

项目名称

AI私有知识库(RAG系统)

核心功能

上传文档自动切分向量化语义检索→AI精准回答+来源引用

使用工具

DeepSeek V4 + LangChain + ChromaDB + BGE向量模型

开发周期

1个周末(约14小时)

使用成本

DeepSeek API每月约10-20元,本地部署零成本

编程要求

Python基础即可,代码可直接复制运行

适合人群

知识管理者、企业培训、技术文档管理、客服团队

表:项目基本信息

一、RAG是什么?为什么它比直接问AI100

你可能有疑问:直接把文档内容复制粘贴给ChatGPT不就行了?

不行。原因有三个:

▸ 上下文限制:ChatGPT最多接收几万字,300份文档远超限制

▸ 回答不准:没有原文对照,AI容易「幻觉」编造内容

▸ 无法溯源:你不知道AI的回答来自哪份文档,无法验证

RAGRetrieval-Augmented Generation,检索增强生成)完美解决了这三个问题。

图:RAG检索增强生成的三步流程

RAG工作原理,三步说清楚】

第一步:检索(Retrieval

你提问「产品A的退货政策是什么?」,系统不是把所有文档都塞给AI,而是先从知识库中「检索」出与退货政策最相关的3-5个文档片段。

第二步:增强(Augmented

把检索到的文档片段和你的问题一起,组装成一段完整的Prompt,发送给AI

AI看到的是:「根据以下文档内容回答问题——[文档片段1][文档片段2][文档片段3]——用户问题:产品A的退货政策是什么?」

第三步:生成(Generation

AI基于你提供的真实文档内容生成回答,并标注信息来源。

因为AI看到的是真实文档,不是凭空想象,所以回答准确、可溯源、无幻觉。

RAG vs 直接问AI 对比】

对比维度

直接问AI

RAG知识库

准确性

容易编造内容(幻觉)

基于真实文档,准确率高

可溯源

无法知道答案来源

标注出处文档和页码

文档容量

受上下文窗口限制

可处理数万份文档

更新维护

无法更新知识

新增文档即可更新

隐私安全

数据上传到云端

可完全本地部署

响应速度

长文档时较慢

秒级响应

表:RAG vs 直接问AI对比

二、环境准备:30分钟搞定

搭建之前,需要准备Python环境和几个核心库。

步骤1:安装Python3.10-3.12

访问 python.org/downloads,下载对应系统的安装包。

安装时务必勾选「Add Python to PATH」。

验证安装:打开终端,输入:

1

python –version

2

应显示 Python 3.10.x 或更高版本

步骤2:安装核心依赖库

打开终端,复制以下命令运行(建议使用虚拟环境):

1

创建虚拟环境(推荐)

2

python -m venv rag_env

3

4

激活虚拟环境

5

# Windows:

6

rag_env\Scripts\activate

7

# Mac/Linux:

8

source rag_env/bin/activate

9

10

安装核心依赖

11

pip install langchain langchain-community langchain-text-splitters

12

pip install chromadb sentence-transformers

13

pip install openai pypdf python-docx

14

pip install unstructured

这几个库的作用:

▸ langchainRAG框架,串联检索、增强、生成全流程

▸ chromadb:向量数据库,存储文档的向量表示

▸ sentence-transformers:中文向量模型,把文本转成AI能理解的数字

▸ openai:调用DeepSeek API(兼容OpenAI接口)

▸ pypdf / python-docx:解析PDFWord文档

▸ unstructured:解析各种格式文档(PPTHTML等)

步骤3:获取DeepSeek API Key

打开 platform.deepseek.com,注册并完成实名认证。

进入「API Keys」页面,点击「创建 API Key」,复制保存。

20266月最新价格:DeepSeek V4 Pro531日起永久降价75%,每月成本约10-20元。

如果想完全免费,可以用Ollama本地部署DeepSeek,零API成本。

三、核心搭建:六步完成知识库

图:知识库搭建的六个步骤

步骤1:准备文档

把你要导入知识库的文档放到一个文件夹里。支持的格式:

▸ PDF(产品手册、技术文档、合同)

▸ Word/DOCX(培训资料、会议纪要)

▸ TXT/Markdown(笔记、知识沉淀)

▸ Excel/CSV(数据表格)

▸ PPT/PPTX(演示文稿)

【文档准备技巧】

▸ 文件命名规范:YYYYMMDD_类型_领域_主题(如 20260615_手册_产品_A功能说明.pdf

▸ 删除无用的封面、目录页、空白页

▸ 确保文档内容可选中(扫描件需要先OCR

▸ 单份文档建议不超过50页,太长会影响检索精度

步骤2:文档加载与解析

1

from langchain_community.document_loaders import (

2

PyPDFLoader,

3

Docx2txtLoader,

4

TextLoader,

5

UnstructuredPowerPointLoader,

6

)

7

import os

8

9

def load_documents(folder_path: str):

10

“””加载文件夹中的所有文档“””

11

documents = []

12

for filename in os.listdir(folder_path):

13

filepath = os.path.join(folder_path, filename)

14

15

if filename.endswith(‘.pdf’):

16

loader = PyPDFLoader(filepath)

17

elif filename.endswith(‘.docx’):

18

loader = Docx2txtLoader(filepath)

19

elif filename.endswith(‘.txt’) or filename.endswith(‘.md’):

20

loader = TextLoader(filepath)

21

elif filename.endswith(‘.pptx’):

22

loader = UnstructuredPowerPointLoader(filepath)

23

else:

24

continue

25

26

docs = loader.load()

27

给每个文档添加来源标记

28

for doc in docs:

29

doc.metadata[‘source’] = filename

30

documents.extend(docs)

31

32

print(f”共加载 {len(documents)} 个文档片段“)

33

return documents

步骤3:文档切分(关键步骤)

文档太长不能直接存入向量数据库,需要切分成小块。切分方式直接影响检索质量。

1

from langchain_text_splitters import RecursiveCharacterTextSplitter

2

3

def split_documents(documents):

4

“””将文档切分成适合检索的小块“””

5

splitter = RecursiveCharacterTextSplitter(

6

chunk_size=500, 每块最大500字符

7

chunk_overlap=100, 块之间重叠100字符

8

separators=[“\n\n”, “\n”, ““, ““, ““, ““, ” “]

9

)

10

chunks = splitter.split_documents(documents)

11

print(f”切分为 {len(chunks)} 个知识块“)

12

return chunks

【切分参数说明】

▸ chunk_size=500:每块500字符,约200-300个中文字。太小会丢失上下文,太大会降低检索精度

▸ chunk_overlap=100:块之间重叠100字符,确保不会在句子中间断裂

▸ separators:优先在段落、句子处切分,保持语义完整

步骤4:向量化与存储

把文字转成AI能理解的「向量」(一串数字),存入向量数据库。

1

from langchain_community.embeddings import HuggingFaceEmbeddings

2

from langchain_community.vectorstores import Chroma

3

4

def build_vector_store(chunks, persist_dir=”./chroma_db”):

5

“””将知识块向量化并存储“””

6

使用中文向量模型

7

embedding = HuggingFaceEmbeddings(

8

model_name=”BAAI/bge-small-zh-v1.5″

9

)

10

11

构建向量数据库

12

vectorstore = Chroma.from_documents(

13

documents=chunks,

14

embedding=embedding,

15

persist_directory=persist_dir

16

)

17

18

print(f”向量数据库已构建,共 {len(chunks)} 条记录“)

19

return vectorstore

【关于向量模型】

▸ BAAI/bge-small-zh-v1.5:北京智源研究院开源的中文向量模型,首次使用会自动下载(约100MB

▸ ChromaDB:轻量级向量数据库,数据存储在本地文件夹,无需安装额外服务

▸ 向量化只需执行一次,后续新增文档增量更新即可

步骤5:构建RAG问答链

这是整个系统的核心——把检索和生成串联起来。

1

from langchain_community.llms import OpenAI

2

from langchain.chains import RetrievalQA

3

from langchain.prompts import PromptTemplate

4

5

# RAG专用Prompt模板

6

RAG_PROMPT = PromptTemplate(

7

template=”””你是一个专业的知识库助手。请根据以下文档内容回答用户问题。

8

如果文档中没有相关信息,请明确说明「知识库中未找到相关信息」,不要编造。

9

回答时请标注信息来源。

10

11

相关文档内容:

12

{context}

13

14

用户问题:{question}

15

16

回答格式:

17

1. 直接回答问题

18

2. 标注来源:[文档名称]

19

“””

20

input_variables=[“context”, “question”]

21

)

22

23

def create_rag_chain(vectorstore, api_key: str):

24

“””创建RAG问答链“””

25

配置DeepSeek作为生成模型

26

llm = OpenAI(

27

model=”deepseek-chat”,

28

openai_api_key=api_key,

29

openai_api_base=”https://api.deepseek.com”,

30

temperature=0.1, 低温度,减少幻觉

31

)

32

33

创建检索器(每次检索最相关的5个片段)

34

retriever = vectorstore.as_retriever(

35

search_kwargs={“k”: 5}

36

)

37

38

构建RAG

39

qa_chain = RetrievalQA.from_chain_type(

40

llm=llm,

41

chain_type=”stuff”,

42

retriever=retriever,

43

chain_type_kwargs={“prompt”: RAG_PROMPT},

44

return_source_documents=True

45

)

46

return qa_chain

步骤6:运行问答

1

初始化RAG系统

2

api_key = “your-deepseek-api-key”

3

4

加载已有向量数据库(无需重新构建)

5

embedding = HuggingFaceEmbeddings(

6

model_name=”BAAI/bge-small-zh-v1.5″

7

)

8

vectorstore = Chroma(

9

persist_directory=”./chroma_db”,

10

embedding_function=embedding

11

)

12

13

创建问答链

14

qa_chain = create_rag_chain(vectorstore, api_key)

15

16

开始提问

17

question = “产品A的退货政策是什么?

18

result = qa_chain({“query”: question})

19

20

输出结果

21

print(“回答:“, result[“result”])

22

print(“\n来源文档:“)

23

for doc in result[“source_documents”]:

24

print(f” – {doc.metadata[‘source’]} (相似度: {doc.metadata.get(‘score’, ‘N/A’)})”)

四、实战效果:四个真实问答场景

图:AI知识库在实际工作中的四个应用场景

场景一:新人入职培训

提问:「公司年假制度是怎样的?入职第一年有几天?」

AI回答:

根据《员工手册2026版》第三章第12条:

▸ 入职第一年:年假5

▸ 入职满1年不满10年:年假10

▸ 入职满10年不满20年:年假15

▸ 入职满20年以上:年假20

年假不可跨年累积,需在当年1231日前使用完毕。

来源:员工手册2026.pdf

场景二:技术问题排查

提问:「产品BAPI接口超时怎么处理?」

AI回答:

根据《产品B技术文档v3.2》第7章故障排查:

▸ 检查网络连接:确认服务器可达,ping延迟低于100ms

▸ 调整超时参数:在配置文件中将timeout30s调整为60s

▸ 启用重试机制:设置max_retries=3backoff_factor=2

▸ 如仍超时:联系技术支持,提供request_id和日志截图

来源:产品B技术文档v3.2.pdf

场景三:客户咨询响应

提问:「客户问我们有没有ISO认证,怎么回答?」

AI回答:

根据《公司资质清单2026》:

▸ ISO 9001质量管理体系认证:已通过,有效期至20273

▸ ISO 27001信息安全认证:已通过,有效期至202612

▸ ISO 27701隐私信息管理认证:已通过,有效期至20276

认证证书电子版存放在共享盘/公司资质/ISO证书/目录下。

来源:公司资质清单2026.xlsxISO证书扫描件.pdf

场景四:历史决策追溯

提问:「去年Q2为什么放弃了X项目?」

AI回答:

根据《2025Q2项目评审会议纪要》:

X项目于20256月正式终止,原因包括:

▸ 市场调研显示目标市场规模不足预期(实际规模为预估的35%

▸ 竞品已占据80%市场份额,进入壁垒过高

▸ ROI测算为-23%,不符合公司投资回报标准

来源:2025Q2项目评审会议纪要.docx

五、进阶优化:让知识库越来越好用

优化一:混合检索(语义+关键词)

纯语义检索有时候会遗漏精确匹配的内容。混合检索同时使用语义相似度和关键词匹配,效果更好。

1

# ChromaDB支持混合检索

2

retriever = vectorstore.as_retriever(

3

search_type=”mmr”, 最大边际相关性

4

search_kwargs={“k”: 5, “fetch_k”: 10}

5

)

优化二:多轮对话记忆

默认情况下,每次提问都是独立的。开启对话记忆后,AI能记住上下文。

1

from langchain.chains import ConversationalRetrievalChain

2

from langchain.memory import ConversationBufferMemory

3

4

memory = ConversationBufferMemory(

5

memory_key=”chat_history”,

6

return_messages=True

7

)

8

9

qa_chain = ConversationalRetrievalChain.from_llm(

10

llm=llm,

11

retriever=retriever,

12

memory=memory

13

)

14

15

多轮对话

16

result1 = qa_chain({“question”: “产品A的定价是多少?“})

17

result2 = qa_chain({“question”: “那产品B呢?“}) # AI知道你在问定价

优化三:自动新增文档

知识库搭建好后,新增文档不需要从头来。只需增量更新:

1

def add_new_documents(vectorstore, new_folder: str):

2

“””增量添加新文档“””

3

加载新文档

4

new_docs = load_documents(new_folder)

5

切分

6

new_chunks = split_documents(new_docs)

7

增量添加到向量数据库

8

vectorstore.add_documents(new_chunks)

9

print(f”已新增 {len(new_chunks)} 个知识块“)

优化四:搭建Web界面

Streamlit快速搭建一个网页问答界面,5分钟搞定:

1

import streamlit as st

2

3

st.title(“AI私有知识库“)

4

st.caption(“基于RAG技术,支持PDF/Word/PPT等格式“)

5

6

用户输入

7

question = st.text_input(“请输入你的问题:“)

8

9

if st.button(“提问“) and question:

10

with st.spinner(“正在检索和生成回答…”):

11

result = qa_chain({“query”: question})

12

st.success(“回答生成完成!“)

13

st.write(“**回答:**”, result[“result”])

14

st.write(“**来源文档:**”)

15

for doc in result[“source_documents”]:

16

st.write(f” – {doc.metadata[‘source’]}”)

运行命令:streamlit run app.py,浏览器自动打开问答界面。

六、避坑指南:我踩过的6个坑

问题描述

解决方案

1:切分太大

检索结果不精准,AI回答跑题

chunk_size设为300-500chunk_overlap设为50-100

2:中文模型选错

用英文向量模型处理中文,效果很差

必须用中文向量模型(bge-small-zh-v1.5

3:扫描件PDF

PDF是图片格式,无法提取文字

先用OCR工具转成可选中文字的PDF,或用unstructuredhi_res策略

4:检索结果太少

AI回答不完整,遗漏关键信息

增大k值到8-10,或使用MMR混合检索

5:回答太啰嗦

AI输出一大段,找不到重点

Prompt中明确要求「回答不超过200字,分点列出」

6:首次加载慢

向量模型首次下载需要几分钟

首次运行后模型会缓存到本地,后续秒级加载

表:6个常见坑及解决方案

写在最后

这个知识库搭好后,我最大的感受是:找信息这件事,终于不需要「人」来做了。

以前新人入职,老员工要花大量时间答疑。现在问AI就行,回答精准、有来源、秒级响应。

以前写方案,要翻半天历史文档找参考。现在一句话就能检索到所有相关案例。

以前客户问了个冷门问题,要翻好几份文档才能回答。现在AI直接给出答案和出处。

RAG技术不新,但2026DeepSeek降价75%后,搭建成本已经低到几乎为零。

真正稀缺的,不是技术,是愿意花一个周末把知识库搭起来的人。

300份文档,一个周末,一个能回答任何业务问题的AI专家。

这笔时间投入,值得。

2026年最值钱的知识管理方式,不是建更多的文件夹,而是让AI替你记住一切。」

————————————————————————————————