Day22:RAG 王炸进阶!多格式文档 (PDF/Word)+ 多文档知识库搭建
引言:
哈喽各位 AI 特工! 之前咱们的 RAG 只能啃TXT纯文本,像个只会吃白米饭的小朋友~
今天直接进化成饕餮巨兽 !PDF、Word、TXT 通吃,批量文档一键入库,打造属于你的企业级私有知识库!
保姆级教程 + 完整可跑代码,看完直接写进简历,面试直接封神!
🎯 今日核心任务(人话翻译版)
-
万能文件读取器:不管是 PDF、Word、TXT,一键提取文本(告别复制粘贴)
-
智能分块大师:告别生硬切文本,中文专属递归分块,语义不断裂
-
多文档知识库:100 份文档批量入库,RAG 精准检索不迷路
-
双模型适配:通义千问在线版 + 本地 Qwen:7b 全覆盖
🧠 核心概念(一秒听懂,拒绝晦涩)
-
DocumentLoader:你的万能文件搬运工 LangChain 自带的神器,不用自己写解析代码! 读 PDF:自动提取文字,跳过图片 / 水印 读 Word:直接拿正文,无视格式排版 读 TXT:基础操作,轻松拿捏
-
TextSplitter:你的金牌切菜师傅 之前生硬切文本会把一句话砍成两半!递归分块:优先按段落→句号→问号分割,保证每一块文本语义完整,RAG 检索精准度直接拉满!
-
多文档知识库 把所有文件解析→分块→向量化→存入向量库以后提问,模型自动从所有文档里找答案,真正的私有 AI 助手!
🛠️ 环境一键安装(复制即跑)
打开终端,执行命令,所有依赖一次性搞定:
json
# 核心依赖:多格式解析 + 向量库 + 模型对接
pip install langchain langchain-community langchain-core pypdf python-docx chromadb dashscope -i https://pypi.tuna.tsinghua.edu.cn/simple/
-
pypdf:解析 PDF 文件 -
python-docx:解析 Word 文件 -
其余都是咱们老朋友啦~
📂 第一步:准备测试文件
在项目文件夹新建 3 个文件(测试多格式):
-
lpr公告.txt(之前的 LPR 利率文案) -
金融知识.pdf(随便一个 PDF 文档) -
贷款政策.docx(随便一个 Word 文档)
💻 实战核心代码(完整版,直接复制)
方案 A:通义千问在线版(推荐新手,无本地模型压力)
json
"""
RAG多格式文档+多文档知识库搭建 | 通义千问版
支持:TXT / PDF / DOCX 全格式解析
"""
import os
from langchain_community.document_loaders import TextLoader, PyPDFLoader, Docx2txtLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# ===================== 配置区 =====================
# 通义千问API Key
os.environ["DASHSCOPE_API_KEY"] = "你的通义千问API Key"
# 向量库存储路径
PERSIST_DIRECTORY = "./multi_doc_db"
# 支持的文件格式
FILE_PATH_LIST = [
"lpr公告.txt",
"金融知识.pdf",
"贷款政策.docx"
]
# ===================== 1. 多格式文档批量加载 =====================
def load_all_documents(file_list):
"""批量加载TXT/PDF/DOCX文件"""
documents = []
for file_path in file_list:
try:
# 根据后缀自动选择加载器
if file_path.endswith(".txt"):
loader = TextLoader(file_path, encoding="utf-8")
elif file_path.endswith(".pdf"):
loader = PyPDFLoader(file_path)
elif file_path.endswith(".docx"):
loader = Docx2txtLoader(file_path)
else:
print(f"❌ 不支持的格式:{file_path}")
continue
docs = loader.load()
documents.extend(docs)
print(f"✅ 成功加载:{file_path} | 页数:{len(docs)}")
except Exception as e:
print(f"❌ 加载失败 {file_path}:{str(e)}")
return documents
# 加载所有文档
all_docs = load_all_documents(FILE_PATH_LIST)
# ===================== 2. 中文专属智能分块 =====================
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300, # 每块300字符(适合中文阅读)
chunk_overlap=50, # 重叠50字符,防止语义断裂
separators=["\n\n", "\n", "。", "!", "?", " "] # 中文优先分割符
)
# 执行分块
split_docs = text_splitter.split_documents(all_docs)
print(f"\n🎉 分块完成!总文档块数量:{len(split_docs)}")
# ===================== 3. 构建多文档向量库 =====================
print("\n🔧 正在构建多文档知识库...")
embedding = DashScopeEmbeddings(model="text-embedding-v3")
vector_db = Chroma.from_documents(
documents=split_docs,
embedding=embedding,
persist_directory=PERSIST_DIRECTORY
)
vector_db.persist()
print("✅ 多文档知识库构建完成!")
# ===================== 4. RAG问答系统 =====================
# 初始化通义千问大模型
llm = Tongyi(model="qwen-plus", temperature=0.1)
# 专业Prompt
prompt = """
你是专业金融AI助手,严格按照参考资料回答,不编造、不胡说。
参考资料:{context}
用户问题:{question}
"""
PROMPT = PromptTemplate(template=prompt, input_variables=["context", "question"])
# 构建检索链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_db.as_retriever(search_kwargs={"k": 3}),
chain_type_kwargs={"prompt": PROMPT}
)
# ===================== 测试提问 =====================
if __name__ == "__main__":
question = "2026年3月的1年期LPR是多少?"
result = qa_chain.run(question)
print("\n" + "="*50)
print(f"🤖 问题:{question}")
print(f"✅ 答案:{result}")
print("="*50)
方案 B:本地大模型版(无 API Key,离线可用)
只需要替换模型和 Embedding 部分,其余代码完全一致!
json
# 替换Embedding为本地模型
from langchain_community.embeddings import HuggingFaceEmbeddings
embedding = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5",
model_kwargs={'device': 'cpu'}
)
# 替换LLM为本地Qwen:7b
from langchain_community.llms import Ollama
llm = Ollama(model="qwen:7b", temperature=0.1)
✨ 效果演示(直接看成果)
运行日志:
json
✅ 成功加载:lpr公告.txt | 页数:1
✅ 成功加载:金融知识.pdf | 页数:2
✅ 成功加载:贷款政策.docx | 页数:1
🎉 分块完成!总文档块数量:12
🔧 正在构建多文档知识库...
✅ 多文档知识库构建完成!
==================================================
🤖 问题:2026年3月的1年期LPR是多少?
✅ 答案:2026年3月20日1年期LPR为3.00%
==================================================
核心亮点:
-
全自动解析:不用手动复制文本,文件丢进去就行
-
智能分块:中文语义不断裂,检索精准度拉满
-
多文档兼容:100 份文件也能一键入库
-
双模型支持:在线 / 本地自由切换
⚠️ 新手避坑指南(99% 的人都踩过)
-
Word 文件报错 :只支持
.docx,不支持.doc(老版本 Word) -
PDF 乱码:扫描版 PDF 无法解析(只能解析文字版)
-
分块太大 / 太小 :
chunk_size300 字符最适合中文,别乱改 -
向量库冲突 :每次新增文件,必须重新构建向量库
🧠 今日醍醐灌顶总结
今天咱们直接把 RAG 从玩具级 升级到生产级!
-
学会了万能文件解析:PDF/Word/TXT 通吃
-
学会了智能分块:中文专属优化,检索更准
-
学会了多文档知识库:真正的私有 AI 知识库
这就是企业级 AI Agent 的核心能力!面试、毕设、工作全能用,直接写进简历,含金量拉满!