Day22:RAG 王炸进阶!多格式文档 (PDF_Word)+ 多文档知识库搭建

Day22:RAG 王炸进阶!多格式文档 (PDF/Word)+ 多文档知识库搭建

引言:

哈喽各位 AI 特工! 之前咱们的 RAG 只能啃TXT纯文本,像个只会吃白米饭的小朋友~

今天直接进化成饕餮巨兽 !PDF、Word、TXT 通吃,批量文档一键入库,打造属于你的企业级私有知识库

保姆级教程 + 完整可跑代码,看完直接写进简历,面试直接封神!

🎯 今日核心任务(人话翻译版)

  1. 万能文件读取器:不管是 PDF、Word、TXT,一键提取文本(告别复制粘贴)

  2. 智能分块大师:告别生硬切文本,中文专属递归分块,语义不断裂

  3. 多文档知识库:100 份文档批量入库,RAG 精准检索不迷路

  4. 双模型适配:通义千问在线版 + 本地 Qwen:7b 全覆盖

🧠 核心概念(一秒听懂,拒绝晦涩)

  1. DocumentLoader:你的万能文件搬运工 LangChain 自带的神器,不用自己写解析代码! 读 PDF:自动提取文字,跳过图片 / 水印 读 Word:直接拿正文,无视格式排版 读 TXT:基础操作,轻松拿捏

  2. TextSplitter:你的金牌切菜师傅 之前生硬切文本会把一句话砍成两半!递归分块:优先按段落→句号→问号分割,保证每一块文本语义完整,RAG 检索精准度直接拉满!

  3. 多文档知识库 把所有文件解析→分块→向量化→存入向量库以后提问,模型自动从所有文档里找答案,真正的私有 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 个文件(测试多格式):

  1. lpr公告.txt(之前的 LPR 利率文案)

  2. 金融知识.pdf(随便一个 PDF 文档)

  3. 贷款政策.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%
==================================================

核心亮点:

  1. 全自动解析:不用手动复制文本,文件丢进去就行

  2. 智能分块:中文语义不断裂,检索精准度拉满

  3. 多文档兼容:100 份文件也能一键入库

  4. 双模型支持:在线 / 本地自由切换


⚠️ 新手避坑指南(99% 的人都踩过)

  1. Word 文件报错 :只支持.docx,不支持.doc(老版本 Word)

  2. PDF 乱码:扫描版 PDF 无法解析(只能解析文字版)

  3. 分块太大 / 太小chunk_size 300 字符最适合中文,别乱改

  4. 向量库冲突 :每次新增文件,必须重新构建向量库


🧠 今日醍醐灌顶总结

今天咱们直接把 RAG 从玩具级 升级到生产级

  • 学会了万能文件解析:PDF/Word/TXT 通吃

  • 学会了智能分块:中文专属优化,检索更准

  • 学会了多文档知识库:真正的私有 AI 知识库

这就是企业级 AI Agent 的核心能力!面试、毕设、工作全能用,直接写进简历,含金量拉满!

相关推荐
孟陬2 小时前
国外技术周刊 #4:这38条阅读法则改变了我的人生、男人似乎只追求四件事……
前端·人工智能·后端
zhangshuang-peta2 小时前
什么是 MCP:模型上下文协议到底解决了什么问题
人工智能·ai agent·mcp
工边页字2 小时前
cursor接上figma mcp ,图形图像模式傻瓜式教学(包教包会版)
前端·人工智能·ai编程
志栋智能2 小时前
AI超自动化运维,让IT运维自动化门槛更低
运维·网络·人工智能·安全·自动化
鱼樱2 小时前
大模型开发实践-milvus向量数据库搭建
人工智能
无风听海2 小时前
typing._alias 深度解析
python
DS随心转插件2 小时前
ChatGPT和Gemini怎么复制文字不乱码
人工智能·ai·chatgpt·deepseek·ai导出鸭
YMWM_2 小时前
jetson thor上的显存
人工智能·jetson thor
wzl202612132 小时前
基于企微API与数据中台,构建用户分层与沉默用户召回体系
大数据·人工智能·企业微信
不懒不懒2 小时前
【基于 CNN 的食物图片分类:数据增强、最优模型保存与学习率调整实战】
开发语言·python