跳到主要内容Python 智能 PDF 文档助手开发指南 | 极客日志PythonAI算法
Python 智能 PDF 文档助手开发指南
介绍如何使用 Python 和 OpenAI API 开发一个智能 PDF 文档助手。内容涵盖环境配置、项目结构设计、核心代码实现(PDF 读取、AI 交互)、使用示例及进阶功能扩展。通过该项目,读者可掌握命令行工具开发、API 调用及文档处理技巧。
指针猎手32 浏览 📖 写在前面
本文将带你从零开始,手写一个实用的 AI 小工具——智能 PDF 文档助手!
通过这个项目,你将学会:
- 如何调用 OpenAI API
- 如何处理 PDF 文档
- 如何构建一个完整的命令行工具
- 如何优化代码结构和错误处理
🎯 项目简介:智能 PDF 文档助手
功能特性
PDF 智能助手
核心功能
PDF 文档读取
AI 智能问答
内容摘要
关键信息提取
技术栈
Python 3.9+
OpenAI API
PyPDF2/pdfplumber
argparse 命令行
应用场景
快速文档理解
学习资料整理
工作报告生成
合同条款分析
项目亮点
| 功能 | 说明 |
|---|
| 📄 多格式支持 | 支持 PDF、TXT 文件读取 |
| 🤖 AI 驱动 | 使用 GPT 模型进行智能分析 |
| ⚡ 快速响应 | 流式输出,实时查看结果 |
| 🎨 彩色输出 | 命令行美化,体验更佳 |
| 📊 进度显示 | 文件读取进度可视化 |
🛠️ 环境准备
2.1 Python 环境检查
import sys
print(f"Python 版本:{sys.version}")
2.2 安装依赖库
创建 requirements.txt 文件:
openai>=1.0.0 pdfplumber>=0.10.0 python-dotenv>=1.0.0 colorama>=0.4.6 tqdm>=4.65.0
安装命令:
python -m venv ai_assistant_env
source ai_assistant_env/bin/activate
pip install-r requirements.txt
2.3 获取 OpenAI API Key
echo OPENAI_API_KEY=your_api_key_here > .env
echo OPENAI_BASE_URL=https://api.openai.com/v1 >> .env
📝 项目结构设计
pdf_ai_assistant/
main.py 主程序入口
config.py 配置文件
utils/ 工具函数
pdf_reader.py PDF 读取
ai_client.py AI 客户端
output.py 输出格式化
requirements.txt 依赖列表
.env 环境变量
README.md 项目说明
💻 核心代码实现
3.1 配置文件 (config.py)
""" 配置文件 - 管理所有配置项 """
import os
from dotenv import load_dotenv
load_dotenv()
class Config:
"""应用配置类"""
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL","https://api.openai.com/v1")
OPENAI_MODEL = os.getenv("OPENAI_MODEL","gpt-3.5-turbo")
MAX_FILE_SIZE = 10*1024*1024
CHUNK_SIZE = 1000
MAX_TOKENS = 2000
COLORS = {
"header": "\033[95m",
"okblue": "\033[94m",
"okgreen": "\033[92m",
"warning": "\033[93m",
"fail": "\033[91m",
"endc": "\033[0m",
}
@classmethod
def color_print(cls, color_type, message):
"""彩色打印"""
color = cls.COLORS.get(color_type, "")
print(f"{color}{message}{cls.COLORS['endc']}")
if not Config.OPENAI_API_KEY:
Config.color_print("fail", "❌ 请在.env 文件中设置 OPENAI_API_KEY")
exit(1)
3.2 PDF 读取模块 (pdf_reader.py)
""" PDF 文档读取模块 """
import pdfplumber
from tqdm import tqdm
from config import Config
class PDFReader:
"""PDF 文档读取器"""
def __init__(self, file_path):
self.file_path = file_path
self.content = ""
self.page_count = 0
def validate_file(self):
"""验证文件"""
if not self.file_path.endswith('.pdf'):
raise ValueError("❌ 仅支持 PDF 文件格式")
import os
file_size = os.path.getsize(self.file_path)
if file_size > Config.MAX_FILE_SIZE:
raise ValueError(f"❌ 文件过大,最大支持{Config.MAX_FILE_SIZE//1024//1024}MB")
def read_pdf(self):
"""读取 PDF 内容"""
try:
self.validate_file()
Config.color_print("okblue", f"📖 正在读取文件:{self.file_path}")
with pdfplumber.open(self.file_path) as pdf:
self.page_count = len(pdf.pages)
Config.color_print("okgreen", f"📄 共 {self.page_count} 页")
for page in tqdm(pdf.pages, desc="读取进度", unit="页"):
text = page.extract_text()
if text:
self.content += text + "\n\n"
Config.color_print("okgreen", f"✅ 读取完成!共 {len(self.content)} 字符")
return self.content
except Exception as e:
Config.color_print("fail", f"❌ 读取失败:{str(e)}")
raise
def get_summary(self):
"""获取文档摘要(前 500 字)"""
return self.content[:500]+"..." if len(self.content)>500 else self.content
3.3 AI 客户端模块 (ai_client.py)
""" OpenAI API 客户端模块 """
from openai import OpenAI
from config import Config
import time
class AIClient:
"""AI 助手客户端"""
def __init__(self):
self.client = OpenAI(
api_key=Config.OPENAI_API_KEY,
base_url=Config.OPENAI_BASE_URL
)
def ask(self, question, context=""):
"""向 AI 提问"""
try:
messages = [
{"role":"system","content":"你是一个专业的文档分析助手。"},
{"role":"user","content":f"文档内容:\n{context}\n\n问题:{question}"}
]
Config.color_print("okblue","🤖 AI 正在思考...")
start_time = time.time()
response = self.client.chat.completions.create(
model=Config.OPENAI_MODEL,
messages=messages,
max_tokens=Config.MAX_TOKENS,
stream=True
)
answer = ""
Config.color_print("okgreen","📝 AI 回答:")
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
answer += content
print(content, end="", flush=True)
print()
elapsed = time.time()- start_time
Config.color_print("okblue",f"⏱️ 耗时:{elapsed:.2f}秒")
return answer
except Exception as e:
Config.color_print("fail",f"❌ API 调用失败:{str(e)}")
raise
def summarize(self, content):
"""生成文档摘要"""
prompt = f"请为以下文档生成一个简洁的摘要(不超过 200 字):\n\n{content[:2000]}"
return self.ask(prompt, "")
def extract_keywords(self, content):
"""提取关键词"""
prompt = f"请从以下文档中提取 5-10 个关键词:\n\n{content[:2000]}"
return self.ask(prompt, "")
3.4 主程序入口 (main.py)
""" PDF 智能助手主程序 """
import argparse
import sys
from pdf_reader import PDFReader
from ai_client import AIClient
from config import Config
def print_banner():
"""打印欢迎界面"""
banner = """ ╔═══════════════════════════════════════╗ ║ 📚 PDF 智能文档助手 v1.0 📚 ║ ║ Powered by OpenAI GPT ║ ╚═══════════════════════════════════════╝ """
Config.color_print("header", banner)
def interactive_mode(reader, ai_client):
"""交互模式"""
Config.color_print("okgreen","\n🎯 进入交互模式(输入'quit'退出)")
context = reader.content[:3000]
while True:
try:
question = input("\n💬 请输入问题:").strip()
if question.lower() in ['quit','exit','q']:
Config.color_print("warning","👋 再见!")
break
if not question:
continue
ai_client.ask(question, context)
except KeyboardInterrupt:
Config.color_print("warning","\n👋 用户取消,再见!")
break
except Exception as e:
Config.color_print("fail",f"❌ 错误:{str(e)}")
def main():
"""主函数"""
parser = argparse.ArgumentParser(description="PDF 智能文档助手")
parser.add_argument("file",help="PDF 文件路径")
parser.add_argument("--summarize", action="store_true",help="生成文档摘要")
parser.add_argument("--keywords", action="store_true",help="提取关键词")
parser.add_argument("--ask", metavar="QUESTION",help="向 AI 提问")
args = parser.parse_args()
print_banner()
try:
reader = PDFReader(args.file)
content = reader.read_pdf()
ai_client = AIClient()
if args.summarize:
ai_client.summarize(content)
elif args.keywords:
ai_client.extract_keywords(content)
elif args.ask:
ai_client.ask(args.ask, content[:3000])
else:
interactive_mode(reader, ai_client)
except Exception as e:
Config.color_print("fail",f"\n❌ 程序异常:{str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()
📊 项目功能流程图
有参数
无参数
失败
成功
是
是
是
quit
问题
程序启动
检查命令行参数
执行指定功能
读取 PDF 文件
文件验证
显示错误信息
提取文本内容
初始化 AI 客户端
--summarize?
--keywords?
--ask?
生成摘要
提取关键词
单次提问
进入交互模式
等待用户输入
程序结束
AI 处理
🎯 使用示例
4.1 生成文档摘要
python main.py document.pdf --summarize
4.2 提取关键词
python main.py document.pdf --keywords
4.3 单次提问
python main.py document.pdf --ask"这篇文章的主要观点是什么?"
4.4 交互模式
python main.py document.pdf
💬 请输入问题:这篇文章讲了什么?
🤖 AI 正在思考...
📝 AI 回答:
这篇文章主要介绍了人工智能的发展历程和应用场景...
⏱️ 耗时:2.35 秒
💬 请输入问题:作者提到了哪些关键技术?
🤖 AI 正在思考...
📝 AI 回答:
作者主要提到了以下几项关键技术:
1. 深度学习
2. 自然语言处理
3. 计算机视觉 ...
⏱️ 耗时:1.98 秒
💬 请输入问题:quit
👋 再见!
📈 AI 小工具开发技能分布
25% 20% 20% 15% 10% 10%
开发 AI 小工具所需技能分布
Python 编程基础
API 调用与集成
数据处理能力
错误处理与调试
用户体验设计
文档与测试
🚀 进阶功能扩展
5.1 添加批量处理功能
def batch_process(file_list, func):
"""批量处理多个文件"""
results = []
for file in tqdm(file_list, desc="批量处理"):
try:
reader = PDFReader(file)
content = reader.read_pdf()
result = func(content)
results.append({"file":file,"result": result,"status":"success"})
except Exception as e:
results.append({"file":file,"result":str(e),"status":"failed"})
return results
5.2 添加导出功能
def export_to_markdown(content, output_file):
"""导出为 Markdown 格式"""
with open(output_file,'w', encoding='utf-8') as f:
f.write("# 文档摘要\n\n")
f.write(content)
Config.color_print("okgreen",f"✅ 已导出到:{output_file}")
5.3 添加记忆功能
class ConversationMemory:
"""对话记忆管理"""
def __init__(self, max_history=5):
self.history = []
self.max_history = max_history
def add(self, question, answer):
"""添加对话记录"""
self.history.append({"question": question,"answer": answer })
if len(self.history)> self.max_history:
self.history = self.history[-self.max_history:]
def get_context(self):
"""获取上下文"""
context = ""
for item in self.history:
context += f"Q: {item['question']}\nA: {item['answer']}\n\n"
return context
💡 开发经验总结
常见问题及解决方案
| 问题 | 解决方案 |
|---|
| API 调用超时 | 添加重试机制,设置合理的 timeout |
| 内存占用过高 | 分块处理大文件,使用生成器 |
| 用户体验差 | 添加进度条、彩色输出、友好提示 |
| 代码可维护性差 | 模块化设计,添加类型注解和文档 |
最佳实践
def process_file(file_path:str)->dict:
"""处理文件并返回结果字典"""
pass
try:
result = risky_operation()
except SpecificError as e:
logger.error(f"操作失败:{e}")
finally:
cleanup()
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
import unittest
class TestPDFReader(unittest.TestCase):
def test_validate_file(self):
reader = PDFReader("test.pdf")
🎓 结语
✅ 学会了如何调用 OpenAI API
✅ 掌握了 PDF 文件处理技巧
✅ 了解了命令行工具的开发流程
✅ 获得了一个实用的 AI 小工具
- 尝试添加新功能(如多格式支持、语音交互)
- 优化用户界面(如使用 GUI 框架)
- 部署到云端(如使用 FastAPI 构建 Web 服务)
- 开发更多 AI 小工具(如图片识别、语音助手)
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online