一、前言
当下大模型开发学习中,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识别依赖,采用清华镜像加速,解决超时、安装失败问题:
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 标准化使用步骤
-
将学习文档、测试资料、文本素材,统一放入项目
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碎片化文本、不规整排版文档适配性极强,可自动梳理错乱内容、提取核心信息,大幅提升扫描文档的问答准确率,适合学习大模型文本纠错、语义理解能力。
八、项目运行效果演示
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数值
十一、项目二次学习拓展方向
-
Web接口拓展:基于Flask/FastAPI封装接口,练习前后端交互开发
-
智能去重优化:新增文本相似度去重,学习RAG知识库优化技巧
-
机器人对接学习:适配公众号、小程序问答对接,拓展大模型应用场景
-
对话记忆优化:新增对话摘要、超时清空功能,学习大模型上下文优化
-
高精度OCR升级:可拓展对接云端OCR接口,学习复杂场景图文识别优化
十二、项目总结
本项目完成了基础大模型对话 → 文本RAG知识库 → 多格式文档解析 → OCR扫描件识别的全流程技术实践。基于最新DeepSeek-V4-Pro大模型,搭配本地FAISS向量检索+私有化OCR识别,解决了传统大模型Demo幻觉严重、格式适配单一、无法识别扫描文档的常见问题。
整套项目代码轻量化、部署简单、零学习门槛,全程本地运行,非常适合新手练习大模型API调用、RAG检索、OCR图文识别等核心技术,是入门大模型应用开发的优质实践案例。