保姆级教程|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

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

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

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

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

3.2 批量安装Python依赖库

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

bash 复制代码
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,重启后依次执行校验命令,输出版本号即配置成功:

bash 复制代码
tesseract -v
pdfinfo -v
④ 代码路径兜底(Windows专属防错)

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

python 复制代码
# Windows系统固定路径兜底(Mac/Linux请注释此行)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
3.3.2 Mac 系统一键配置

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

bash 复制代码
brew install tesseract poppler

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

3.3.3 Linux 系统一键配置(Ubuntu/Debian)
bash 复制代码
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)

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

python 复制代码
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 标准化使用步骤

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

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

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

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

6.3 OCR识别优化规则

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

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

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

七、项目核心学习优势

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

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

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

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

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

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

八、项目运行效果演示

Plain 复制代码
===========================================================================
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 临时配置(当前终端生效)

bash 复制代码
set DEEPSEEK_API_KEY=你的DeepSeek_API密钥

9.2 Mac/Linux 临时配置

bash 复制代码
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数值

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

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

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

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

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

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

十二、项目总结

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

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

相关推荐
程序猿阿森1 小时前
Python 闭包与装饰器:从入门到精通
开发语言·python·面试
老大白菜2 小时前
Qwen3.8-27B 本地推理 + DeepSeek Harness 配置
python·qwen·deepseek·harness
SpaceAIGlobal2 小时前
AI PPT生成工具哪些支持PDF文档导入?
人工智能·ai·pdf·powerpoint·办公
hyunbar7772 小时前
Tools、Function Calling、MCP 都在说什么?
人工智能
智能运维指南2 小时前
智能体自治运维选型指南:2026年企业如何从“AI辅助”走向“AI自治”
大数据·运维·人工智能
桃西西呀2 小时前
dsh能接生产吗?fail-closed 沙箱到底保不保底
人工智能
weixin_531670892 小时前
Interlude起来:Swift原生Mac软件有什么优势?原生Mac应用和Electron应用有什么区别?
人工智能·macos·mac·swift
樊小肆2 小时前
DeepSeeker-Code源码导读06-工具协议CustomTool
人工智能·agent
贵慜_Derek2 小时前
DeepSeek Harness 背后的 Cordis:插件卸载与 Agent 自我进化,为什么都要「时空可组合」?
人工智能·agent·deepseek
clawdashi2 小时前
2026 办公 Agent 选型指南:按场景分五类,一次讲清
前端·人工智能