使用Python手写一个智能PDF文档助手

 更新时间:2026年03月26日 08:38:02   作者:我不是呆头  
你是否想亲手打造一个属于自己的AI工具?是否想过用不到100行代码就能实现一个智能聊天机器人,本文将带你从零开始,手写一个实用的AI小工具——智能PDF文档助手,需要的朋友可以参考下

写在前面

你是否想亲手打造一个属于自己的AI工具?是否想过用不到100行代码就能实现一个智能聊天机器人

本文将带你从零开始,手写一个实用的AI小工具——智能PDF文档助手!

通过这个项目,你将学会:

  • 如何调用OpenAI API
  • 如何处理PDF文档
  • 如何构建一个完整的命令行工具
  • 如何优化代码结构和错误处理

项目简介:智能PDF文档助手

功能特性

项目亮点

功能说明
多格式支持支持PDF、TXT文件读取
AI驱动使用GPT模型进行智能分析
快速响应流式输出,实时查看结果
彩色输出命令行美化,体验更佳
进度显示文件读取进度可视化

环境准备

Python环境检查

# 检查Python版本
import sys
print(f"Python版本: {sys.version}")

# 推荐版本:Python 3.9 或更高
# 下载地址:https://www.python.org/downloads/

安装依赖库

创建 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
# 激活虚拟环境
# Windows:
ai_assistant_env\Scripts\activate
# Mac/Linux:
source ai_assistant_env/bin/activate
# 安装依赖
pip install -r requirements.txt

获取OpenAI API Key

# 创建 .env 文件
echo OPENAI_API_KEY=your_api_key_here > .env
echo OPENAI_BASE_URL=https://api.openai.com/v1 >> .env

项目结构设计

核心代码实现

配置文件 (config.py)

"""
配置文件 - 管理所有配置项
"""
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class Config:
    """应用配置类"""

    # OpenAI配置
    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  # 10MB
    CHUNK_SIZE = 1000  # 每次处理的字符数
    MAX_TOKENS = 2000  # AI最大响应长度

    # 颜色配置
    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)

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

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正在思考...")

            # 调用API
            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, "")

主程序入口 (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]  # 使用前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:
        # 读取PDF
        reader = PDFReader(args.file)
        content = reader.read_pdf()

        # 初始化AI客户端
        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()

项目功能流程图

使用示例

生成文档摘要

python main.py document.pdf --summarize

提取关键词

python main.py document.pdf --keywords

单次提问

python main.py document.pdf --ask "这篇文章的主要观点是什么?"

交互模式

python main.py document.pdf

交互模式示例输出:

💬 请输入问题: 这篇文章讲了什么?
🤖 AI正在思考...
📝 AI回答:
这篇文章主要介绍了人工智能的发展历程和应用场景...
⏱️ 耗时: 2.35秒

💬 请输入问题: 作者提到了哪些关键技术?
🤖 AI正在思考...
📝 AI回答:
作者主要提到了以下几项关键技术:
1. 深度学习
2. 自然语言处理
3. 计算机视觉
...
⏱️ 耗时: 1.98秒

💬 请输入问题: quit
👋 再见!

AI小工具开发技能分布

进阶功能扩展

添加批量处理功能

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

添加导出功能

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}")

添加记忆功能

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
        })
        # 保留最近N条记录
        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
内存占用过高分块处理大文件,使用生成器
用户体验差添加进度条、彩色输出、友好提示
代码可维护性差模块化设计,添加类型注解和文档

最佳实践

# 1. 使用类型注解
def process_file(file_path: str) -> dict:
    """处理文件并返回结果字典"""
    pass

# 2. 添加异常处理
try:
    result = risky_operation()
except SpecificError as e:
    logger.error(f"操作失败: {e}")
    # 执行恢复操作
finally:
    cleanup()

# 3. 使用日志记录
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

# 4. 编写单元测试
import unittest

class TestPDFReader(unittest.TestCase):
    def test_validate_file(self):
        reader = PDFReader("test.pdf")
        # 测试代码...

结语

恭喜你!

如果你已经跟随这篇文章完成了项目,那么你已经:

✅ 学会了如何调用OpenAI API
✅ 掌握了PDF文件处理技巧
✅ 了解了命令行工具的开发流程
✅ 获得了一个实用的AI小工具

下一步建议:

  1. 尝试添加新功能(如多格式支持、语音交互)
  2. 优化用户界面(如使用GUI框架)
  3. 部署到云端(如使用FastAPI构建Web服务)
  4. 开发更多AI小工具(如图片识别、语音助手)

记住:最好的学习方式就是动手实践!

以上就是使用Python手写一个智能PDF文档助手的详细内容,更多关于Python智能PDF文档助手的资料请关注脚本之家其它相关文章!

相关文章

  • Python3中map(),reduce(),filter()的详细用法

    Python3中map(),reduce(),filter()的详细用法

    这篇文章主要介绍了Python3中map(),reduce(),filter()的详细用法,Python3中的map()、reduce()、filter() 这3个一般是用于对序列进行操作的内置函数,它们经常需要与 匿名函数 lambda 联合起来使用
    2022-08-08
  • 使用Python在Word文档中创建图表的方法

    使用Python在Word文档中创建图表的方法

    在现代办公自动化场景中,将数据可视化为图表并嵌入 Word 文档已成为一项常见需求,本文将深入探讨如何使用 Python 在 Word 文档中创建各种类型的图表,并对其进行样式定制和数据配置,需要的朋友可以参考下
    2026-03-03
  • 解决selenium模块利用performance获取network日志请求报错的问题(亲测有效)

    解决selenium模块利用performance获取network日志请求报错的问题(亲测有效)

    这篇文章主要介绍了解决selenium模块利用performance获取network日志请求报错的问题(亲测有效),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • python 录制系统声音的示例

    python 录制系统声音的示例

    这篇文章主要介绍了python 录制系统声音的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • Python队列、进程间通信、线程案例

    Python队列、进程间通信、线程案例

    这篇文章主要介绍了Python队列、进程间通信、线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python从视频中提取音轨的实用脚本开发与应用

    Python从视频中提取音轨的实用脚本开发与应用

    在当今数字化的时代,视频内容无处不在,有时候,我们可能只对视频中的音频部分感兴趣,下面小编就和大家详细讲讲如何使用Python脚本提取视频中的音轨吧
    2025-12-12
  • Python SQLite3 查询结果返回字典的常见错误及完整解决方案

    Python SQLite3 查询结果返回字典的常见错误及完整解决方案

    在使用Python的sqlite3模块查询数据库时,默认情况下fetchall()返回的结果只包含值(tuple 格式),不包含字段名(键),这在实际开发中很不方便,,下面通过本文介绍Python SQLite3 查询结果返回字典的常见错误及解决方案,感兴趣的朋友一起看看吧
    2026-02-02
  • Python验证码截取识别代码实例

    Python验证码截取识别代码实例

    这篇文章主要介绍了Python验证码截取识别代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python批量处理工作簿和工作表的实现示例

    Python批量处理工作簿和工作表的实现示例

    本文主要介绍了使用Python批量处理工作簿和工作表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python PyQt5运行程序把输出信息展示到GUI图形界面上

    Python PyQt5运行程序把输出信息展示到GUI图形界面上

    这篇文章主要介绍了Python PyQt5运行程序把输出信息展示到GUI图形界面上,本文通过截图实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论