欢迎光临
我们一直在努力

保姆级教程|Python+DeepSeek-V4-Pro实现AI客服Demo 支持OCR扫描PDF+全格式RAG知识库(附完整源码)

一、前言

当下大模型开发学习中,AI对话问答是最热门的入门实践方向。相比于固定话术的传统问答程序,大模型驱动的对话Demo具备上下文记忆、自然语言理解、智能应答、场景适配等能力,非常适合新手练习大模型API调用、RAG知识库开发、OCR图文识别等核心技术。

DeepSeek 是国内高性能大模型服务平台,提供高稳定、低延迟的官方API服务,完全兼容OpenAI调用规范,接入简单、学习成本低。本文将手把手带大家基于 Python + DeepSeek API搭建一套功能完整的AI智能对话客服Demo。

项目最终实现:多轮上下文对话、流式打字输出、自定义问答人设、RAG私有知识库、TXT/PDF/Word/扫描PDF/图片全格式文档解析(本地OCR),全套代码开箱即用,零基础可搭建,适合大模型全流程技术学习。

二、项目技术栈与核心功能

2.1 核心技术栈

  • 运行环境:Python 3.8+(全平台兼容)

  • 大模型服务:DeepSeek Official API(最新 DeepSeek-V4-Pro)

  • 调用框架:OpenAI 兼容SDK(零改造快速接入,适合API学习)

  • RAG向量知识库:langchain、faiss-cpu、sentence-transformers(本地轻量化检索学习)

  • 文档解析依赖:PyPDF2、python-docx(常规文档解析学习)

  • OCR图文识别依赖:pytesseract、pdf2image、pillow(扫描件/图片解析实践)

  • 核心特性:本地私有化部署、数据零上传、无泄露风险、低模型幻觉,纯技术学习向

2.2 项目功能亮点

  • ✅ 自定义问答人设,适配日常咨询、知识答疑等学习场景

  • ✅ 完整多轮对话记忆,上下文连贯,告别单轮问答割裂问题

  • ✅ 流式实时输出,模拟真人打字效果,交互体验优秀

  • ✅ 全格式知识库支持:TXT、Word、普通PDF、扫描PDF、JPG、PNG

  • ✅ 智能双模解析:可复制文本高速解析、空白扫描文档自动触发OCR

  • ✅ 批量自动切片、向量化入库,无需手动整理文档内容

  • ✅ 全流程本地化:OCR识别、文档解析、向量检索均本地完成,学习环境下保护文件内容

  • ✅ 支持模型参数自定义:创意度、最大输出字数、思考模式自由调节

  • ✅ 轻量化无冗余代码,适合二次修改调试、技术拓展学习

三、前置环境准备(保姆级零报错配置)

本项目新增本地OCR扫描文档识别能力,可适配扫描手册、拍照文档、图片资料,是学习OCR+大模型结合开发的优质案例。部署前需完成「API密钥获取、Python依赖安装、系统OCR组件配置」三步操作。

3.1 获取 DeepSeek API Key

  • 访问官方平台:DeepSeek 开放平台,完成注册并登录

  • 进入【API密钥管理】页面,生成专属 API Key

  • 核心注意:密钥仅展示一次,立即复制保存,严禁公开泄露,避免被盗用扣费

  • 平台提供免费测试额度,完全满足个人学习、项目调试使用,当前全线适配 DeepSeek-V4-Pro,综合能力、文档解析能力大幅升级,适合技术实践学习。

  • 3.2 批量安装Python依赖库

    一键安装所有RAG、文档解析、OCR识别依赖,采用清华镜像加速,解决超时、安装失败问题:

    pip install openai langchain faiss-cpu sentence-transformers PyPDF2 python-docx pytesseract pdf2image pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

    3.3 系统OCR核心组件安装(全系统统一规范)

    OCR识别依赖两大必备组件:Tesseract-OCR(文字识别引擎)、Poppler(PDF转图片工具)。以下为全系统统一规范安装、路径配置、校验教程,彻底解决新手配置报错、中文乱码、识别为空等问题,适配零基础学习。

    3.3.1 Windows 系统完整配置(Win10/Win11通用)
    ① Tesseract-OCR 安装与配置

    官方下载地址:Tesseract-OCR 官方发布页

    推荐版本:最新稳定版 tesseract-ocr-w64-setup-5.5.3.20260724.exe(64位专属)

    安装核心规范(必看):

    • 安装路径统一默认:C:\\Program Files\\Tesseract-OCR(禁止中文、空格、自定义路径)

    • 组件勾选:核心运行程序、增强脚本数据、简体中文+英文语言包

    • 勾选「自动添加系统环境变量」,简化配置流程

    兜底环境变量配置(自动配置失效时手动补充):

    系统Path变量新增路径:C:\\Program Files\\Tesseract-OCR

    ② Poppler 工具安装与配置(PDF转图片必备)

    官方发布页:poppler-windows 官方Release

    稳定兼容版直链:poppler-24.08.0-0-w64.zip

    统一解压规范:

    • 解压至纯英文无空格路径:C:\\poppler

    • 核心配置路径(唯一有效路径):C:\\poppler\\Library\\bin

    • 将上述 bin 路径添加至系统Path环境变量

    ③ 配置校验(百分百生效验证)

    关闭所有终端、IDE,重启后依次执行校验命令,输出版本号即配置成功:

    tesseract -v
    pdfinfo -v

    ④ 代码路径兜底(Windows专属防错)

    在项目代码中取消注释以下配置,固定引擎路径,彻底规避路径找不到报错:

    # Windows系统固定路径兜底(Mac/Linux请注释此行)
    pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

    3.3.2 Mac 系统一键配置

    安装Homebrew后,终端执行一键命令,自动安装组件、配置环境、适配中文:

    brew install tesseract poppler

    校验命令:tesseract -v,输出版本号即可正常使用。

    3.3.3 Linux 系统一键配置(Ubuntu/Debian)

    sudo apt update
    sudo apt install tesseract-ocr tesseract-ocr-chi-sim poppler-utils -y

    自动安装简体中文语言包、OCR引擎、PDF解析工具,零额外配置。

    3.3.4 中文识别异常专属修复方案
    • 中文乱码/识别为空:确认安装时勾选简体中文语言包

    • 兜底修复:下载 chi_sim.traineddata 中文模型,放入 Tesseract-OCR/tessdata 目录

    • 代码强制双语识别:固定参数 OCR_LANG = "chi_sim+eng"

    3.3.5 全局配置规范总结(新手必记)
    • 所有组件禁止安装在中文、空格、特殊字符路径

    • 环境变量修改后,必须重启终端/IDE 方可生效

    • 扫描PDF解析失败,90%为Poppler路径配置错误

    • Windows优先开启代码路径兜底,一劳永逸解决报错

    四、全格式RAG+OCR知识库原理

    传统RAG知识库仅支持可复制文本文档,无法适配扫描件、拍照文档,是新手学习大模型知识库开发的常见难点。本项目升级智能双模解析架构,全自动区分文档类型,非常适合入门学习:

    核心流程:读取本地文档 → 优先常规文本解析 → 无有效文本自动触发OCR图文识别 → 文本清洗智能切片 → 本地向量化入库 → 语义相似度检索 → 大模型精准答疑

    核心优势:全流程本地化处理,文档数据无需上传云端,适合本地技术练习;自动适配所有主流文档格式,无需人工分类、格式转换,降低学习门槛。

    五、完整可运行源码(全格式OCR+RAG智能问答Demo)

    以下代码整合所有功能,统一编码规范、路径配置、异常捕获,兼容全平台,开箱即用,无冗余代码,适合新手学习参考。

    import os
    import shutil
    from openai import OpenAI
    from langchain.embeddings import SentenceTransformerEmbeddings
    from langchain.vectorstores import FAISS
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.document_loaders import TextLoader, PyPDFLoader, Docx2txtLoader
    from langchain.schema import Document

    # OCR识别依赖
    import pytesseract
    from pdf2image import convert_from_path
    from PIL import Image

    # ====================== 全局统一配置(全路径规范固定)======================
    # DeepSeek API 客户端初始化
    client = OpenAI(
    api_key=os.environ.get("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com/v1"
    )

    # 向量模型与文件路径统一配置
    EMBEDDING_MODEL = "all-MiniLM-L6-v2"
    FAISS_DB_PATH = "deepseek_rag_db"
    KNOWLEDGE_DIR = "knowledge_base"
    OCR_LANG = "chi_sim+eng"

    # Windows系统Tesseract路径兜底(Mac/Linux注释此行)
    # pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

    # 自动创建知识库目录
    if not os.path.exists(KNOWLEDGE_DIR):
    os.mkdir(KNOWLEDGE_DIR)
    with open(os.path.join(KNOWLEDGE_DIR, "使用说明.txt"), "w", encoding="utf-8") as f:
    f.write("支持格式:TXT、DOCX、PDF、扫描PDF、JPG、PNG\\n放入文件后输入 update 即可更新知识库\\n")

    class DeepSeekRAGChatDemo:
    def __init__(self):
    # 统一问答人设提示词
    self.system_prompt = """
    你是专业耐心的智能问答助手,严格遵循以下规则应答:
    1. 优先依据知识库内容回答,无资料不编造、不幻觉
    2. 知识库无匹配内容,使用通用知识友好回复并主动告知
    3. 语气通俗简洁、耐心友好,拒绝冗余专业术语
    4. 无法解答礼貌说明,全程使用中文应答
    """
    .strip()

    # 初始化对话上下文
    self.chat_history = [{"role": "system", "content": self.system_prompt}]
    # 初始化向量模型与知识库
    self.embedding = SentenceTransformerEmbeddings(model_name=EMBEDDING_MODEL)
    self.vector_db = self.init_rag_db()

    def ocr_scan_pdf(self, file_path):
    """OCR解析扫描版/图片型PDF文档"""
    docs = []
    try:
    pages = convert_from_path(file_path)
    for idx, page in enumerate(pages):
    text = pytesseract.image_to_string(page, lang=OCR_LANG).strip()
    if text:
    docs.append(Document(page_content=text, metadata={"source": file_path, "page": idx + 1}))
    except Exception as e:
    print(f"[扫描PDF解析失败] {file_path}{str(e)}")
    return docs

    def ocr_image(self, file_path):
    """OCR解析JPG/PNG图片文档"""
    docs = []
    try:
    img = Image.open(file_path)
    text = pytesseract.image_to_string(img, lang=OCR_LANG).strip()
    if text:
    docs.append(Document(page_content=text, metadata={"source": file_path}))
    except Exception as e:
    print(f"[图片OCR解析失败] {file_path}{str(e)}")
    return docs

    def load_all_documents(self):
    """批量加载解析全格式文档(智能双模识别)"""
    documents = []
    file_count = 0

    for file_name in os.listdir(KNOWLEDGE_DIR):
    file_path = os.path.join(KNOWLEDGE_DIR, file_name)
    if os.path.isdir(file_path):
    continue

    # 1. TXT文本文档
    if file_name.endswith(".txt"):
    loader = TextLoader(file_path, encoding="utf-8")
    documents.extend(loader.load())
    file_count += 1

    # 2. PDF双模解析(文本优先,无文本自动OCR)
    elif file_name.endswith(".pdf"):
    loader = PyPDFLoader(file_path)
    pdf_docs = loader.load()
    text_content = "".join([d.page_content.strip() for d in pdf_docs])
    if not text_content:
    pdf_docs = self.ocr_scan_pdf(file_path)
    documents.extend(pdf_docs)
    file_count += 1

    # 3. Word文档
    elif file_name.endswith((".docx", ".doc")):
    loader = Docx2txtLoader(file_path)
    documents.extend(loader.load())
    file_count += 1

    # 4. 图片文档OCR解析
    elif file_name.endswith((".jpg", ".jpeg", ".png")):
    documents.extend(self.ocr_image(file_path))
    file_count += 1

    print(f"[系统] 本次共解析 {file_count} 个文档/图片文件")
    return documents

    def init_rag_db(self):
    """初始化/重建本地FAISS向量知识库"""
    # 加载已有知识库
    if os.path.exists(FAISS_DB_PATH):
    return FAISS.load_local(FAISS_DB_PATH, self.embedding, allow_dangerous_deserialization=True)

    # 加载并切片文档
    documents = self.load_all_documents()
    if not documents:
    print("[系统提示] 知识库暂无有效文档,请放入文件后执行 update 更新!")
    return None

    text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50, separator="\\n")
    split_docs = text_splitter.split_documents(documents)

    # 构建并保存向量库
    vector_db = FAISS.from_documents(split_docs, self.embedding)
    vector_db.save_local(FAISS_DB_PATH)
    print(f"[系统] 知识库构建完成,总文本片段数:{len(split_docs)}")
    return vector_db

    def search_knowledge(self, query: str, top_k=2):
    """语义检索匹配私有知识库内容"""
    if not self.vector_db:
    return "暂无私有知识库数据,将使用通用知识作答"
    results = self.vector_db.similarity_search(query, k=top_k)
    return "\\n".join([doc.page_content.strip() for doc in results])

    def chat_stream(self, user_input: str):
    """流式对话+RAG知识库增强应答"""
    rag_text = self.search_knowledge(user_input)
    prompt = f"【私有知识库内容】\\n{rag_text}\\n【用户问题】\\n{user_input}"
    self.chat_history.append({"role": "user", "content": prompt})

    try:
    stream = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=self.chat_history,
    temperature=0.7,
    max_tokens=2048,
    stream=True,
    extra_body={"thinking_mode": "normal"}
    )

    full_reply = ""
    print("[智能问答]:", end="", flush=True)
    for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
    print(content, end="", flush=True)
    full_reply += content

    self.chat_history.append({"role": "assistant", "content": full_reply})
    print("\\n")

    except Exception as e:
    print(f"[系统异常] 应答失败:{str(e)}\\n")

    def clear_history(self):
    """清空本轮对话上下文记忆"""
    self.chat_history = [{"role": "system", "content": self.system_prompt}]
    print("[系统] 已清空对话历史,可重新提问\\n")

    def update_knowledge(self):
    """强制更新重建知识库"""
    if os.path.exists(FAISS_DB_PATH):
    shutil.rmtree(FAISS_DB_PATH)
    self.vector_db = self.init_rag_db()
    print("[系统] 全格式OCR知识库更新完成\\n")

    if __name__ == "__main__":
    service = DeepSeekRAGChatDemo()
    print("=" * 75)
    print("DeepSeek 全格式OCR智能问答Demo启动成功 | 支持文本/扫描PDF/图片/Word")
    print("指令说明:直接提问咨询 | clear清空对话 | update更新知识库 | exit退出程序")
    print("=" * 75 + "\\n")

    while True:
    user_input = input("[用户]:").strip().lower()
    if user_input == "exit":
    print("[系统] 程序已退出,感谢使用!")
    break
    elif user_input == "clear":
    service.clear_history()
    elif user_input == "update":
    service.update_knowledge()
    elif not user_input:
    print("[系统提示] 输入内容不能为空,请重新输入\\n")
    else:
    service.chat_stream(user_input)

    六、知识库使用规范(统一操作流程)

    6.1 支持文件格式

    • 文本格式:.txt、.docx、.doc、可复制文本PDF

    • 扫描图片格式:扫描版PDF、图片型PDF、JPG、JPEG、PNG截图

    6.2 标准化使用步骤

  • 将学习文档、测试资料、文本素材,统一放入项目 knowledge_base 文件夹

  • 控制台输入 update 指令,系统自动完成解析、OCR识别、切片入库

  • 直接提问文档内相关问题,程序优先匹配知识库精准应答

  • 新增/修改/删除文档后,重复执行 update 即可更新知识库

  • 6.3 OCR识别优化规则

    • 默认开启「中文+英文」双语识别,适配绝大多数学习类文档

    • 智能容错:单文件识别失败不影响整体知识库构建,自动跳过损坏文件

    • 文本PDF优先高速解析,空白内容自动切换OCR模式,兼顾速度与兼容性

    七、项目核心学习优势

    7.1 双模智能解析,零人工干预

    彻底解决传统RAG仅支持文本文档的学习痛点,系统自动判别PDF类型,可复制文本高速解析、扫描图片PDF自动OCR识别,无需手动分类转换格式,是学习多模态文档解析的优质案例。

    7.2 全本地化部署,学习安全可控

    文档解析、OCR识别、向量检索全部在本地设备完成,本地处理文件内容,适合个人技术练习,规避文件内容上传泄露问题。

    7.3 适配DeepSeek-V4-Pro模型能力

    新版模型对OCR碎片化文本、不规整排版文档适配性极强,可自动梳理错乱内容、提取核心信息,大幅提升扫描文档的问答准确率,适合学习大模型文本纠错、语义理解能力。

    八、项目运行效果演示

    ===========================================================================
    DeepSeek 全格式OCR智能问答Demo启动成功 | 支持文本/扫描PDF/图片/Word
    指令说明:直接提问咨询 | clear清空对话 | update更新知识库 | exit退出程序
    ===========================================================================

    [系统] 本次共解析 5 个文档/图片文件
    [系统] 知识库构建完成,总文本片段数:32

    [用户]:设备日常维护规范有哪些?
    [智能问答]:您好!设备日常维护需遵循以下规范:
    1. 每日开机前检查电源、线路、机身外观,排查破损、漏电隐患;
    2. 设备运行禁止超负荷工作,定时停机散热;
    3. 每日下班清理机身灰尘、杂物,保持设备整洁;
    4. 每月完成整机巡检,紧固零件、排查线路老化问题。

    [用户]:扫描件中的售后报修流程是什么?
    [智能问答]:设备售后报修完整流程:用户故障反馈 → 客服信息登记 → 技术初审 → 上门/寄修服务 → 故障确认 → 维修验收完结。

    [用户]:update
    [系统] 本次共解析 6 个文档/图片文件
    [系统] 全格式OCR知识库更新完成

    [用户]:clear
    [系统] 已清空对话历史,可重新提问

    [用户]:exit
    [系统] 程序已退出,感谢使用!

    九、API密钥安全配置(学习最佳实践)

    严禁在代码中明文写入API Key,极易造成密钥泄露、恶意扣费,统一使用系统环境变量配置,适合学习开发规范:

    9.1 Windows 临时配置(当前终端生效)

    set DEEPSEEK_API_KEY=你的DeepSeek_API密钥

    9.2 Mac/Linux 临时配置

    export DEEPSEEK_API_KEY=你的DeepSeek_API密钥

    永久配置可写入系统环境变量文件,重启终端即可全局生效。

    十、常见报错一站式排查(全场景覆盖)

    10.1 OCR识别为空/失效

    原因:Tesseract未安装、环境变量未配置、未加载中文语言包 解决方案:重装完整版Tesseract,配置系统环境变量,开启代码路径兜底,确认 chi_sim 语言参数正确。

    10.2 PDF转图片报错、poppler not found

    原因:Poppler未安装或配置路径错误 解决方案:严格按照规范解压至 C:\\poppler,仅配置 Library\\bin 路径至环境变量,重启终端生效。

    10.3 中文乱码、识别不全

    原因:缺失中文训练模型 解决方案:补充 chi_sim.traineddata 模型至tessdata目录,固定双语识别参数。

    10.4 通用运行报错

    • API key is required:未配置环境变量密钥,重新设置DEEPSEEK_API_KEY

    • Insufficient Balance:账号额度不足,前往DeepSeek平台领取免费额度或充值

    • Word解析失败:老旧 .doc 格式转为 .docx 后重新入库

    • 响应缓慢:切换 deepseek-chat 轻量模型,调低检索top_k数值

    十一、项目二次学习拓展方向

  • Web接口拓展:基于Flask/FastAPI封装接口,练习前后端交互开发

  • 智能去重优化:新增文本相似度去重,学习RAG知识库优化技巧

  • 机器人对接学习:适配公众号、小程序问答对接,拓展大模型应用场景

  • 对话记忆优化:新增对话摘要、超时清空功能,学习大模型上下文优化

  • 高精度OCR升级:可拓展对接云端OCR接口,学习复杂场景图文识别优化

  • 十二、项目总结

    本项目完成了基础大模型对话 → 文本RAG知识库 → 多格式文档解析 → OCR扫描件识别的全流程技术实践。基于最新DeepSeek-V4-Pro大模型,搭配本地FAISS向量检索+私有化OCR识别,解决了传统大模型Demo幻觉严重、格式适配单一、无法识别扫描文档的常见问题。

    整套项目代码轻量化、部署简单、零学习门槛,全程本地运行,非常适合新手练习大模型API调用、RAG检索、OCR图文识别等核心技术,是入门大模型应用开发的优质实践案例。

    赞(0)
    未经允许不得转载:171主机测评 » 保姆级教程|Python+DeepSeek-V4-Pro实现AI客服Demo 支持OCR扫描PDF+全格式RAG知识库(附完整源码)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址