最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python手寫一個智能PDF文檔助手

 更新時間:2026年03月26日 08:38:02   作者:我不是呆頭  
你是否想親手打造一個屬于自己的AI工具?是否想過用不到100行代碼就能實現(xiàn)一個智能聊天機器人,本文將帶你從零開始,手寫一個實用的AI小工具——智能PDF文檔助手,需要的朋友可以參考下

寫在前面

你是否想親手打造一個屬于自己的AI工具?是否想過用不到100行代碼就能實現(xiàn)一個智能聊天機器人

本文將帶你從零開始,手寫一個實用的AI小工具——智能PDF文檔助手!

通過這個項目,你將學會:

  • 如何調用OpenAI API
  • 如何處理PDF文檔
  • 如何構建一個完整的命令行工具
  • 如何優(yōu)化代碼結構和錯誤處理

項目簡介:智能PDF文檔助手

功能特性

項目亮點

功能說明
多格式支持支持PDF、TXT文件讀取
AI驅動使用GPT模型進行智能分析
快速響應流式輸出,實時查看結果
彩色輸出命令行美化,體驗更佳
進度顯示文件讀取進度可視化

環(huán)境準備

Python環(huán)境檢查

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

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

安裝依賴庫

創(chuàng)建 requirements.txt 文件:

openai>=1.0.0
pdfplumber>=0.10.0
python-dotenv>=1.0.0
colorama>=0.4.6
tqdm>=4.65.0

安裝命令:

# 創(chuàng)建虛擬環(huán)境(推薦)
python -m venv ai_assistant_env
# 激活虛擬環(huán)境
# Windows:
ai_assistant_env\Scripts\activate
# Mac/Linux:
source ai_assistant_env/bin/activate
# 安裝依賴
pip install -r requirements.txt

獲取OpenAI API Key

# 創(chuàng)建 .env 文件
echo OPENAI_API_KEY=your_api_key_here > .env
echo OPENAI_BASE_URL=https://api.openai.com/v1 >> .env

項目結構設計

核心代碼實現(xiàn)

配置文件 (config.py)

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

# 加載環(huán)境變量
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  # 每次處理的字符數(shù)
    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": "你是一個專業(yè)的文檔分析助手。"},
                {"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():
    """主函數(shù)"""
    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()

        # 執(zhí)行相應功能
        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回答:
這篇文章主要介紹了人工智能的發(fā)展歷程和應用場景...
?? 耗時: 2.35秒

?? 請輸入問題: 作者提到了哪些關鍵技術?
?? AI正在思考...
?? AI回答:
作者主要提到了以下幾項關鍵技術:
1. 深度學習
2. 自然語言處理
3. 計算機視覺
...
?? 耗時: 1.98秒

?? 請輸入問題: quit
?? 再見!

AI小工具開發(fā)技能分布

進階功能擴展

添加批量處理功能

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

開發(fā)經驗總結

常見問題及解決方案

問題解決方案
API調用超時添加重試機制,設置合理的timeout
內存占用過高分塊處理大文件,使用生成器
用戶體驗差添加進度條、彩色輸出、友好提示
代碼可維護性差模塊化設計,添加類型注解和文檔

最佳實踐

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

# 2. 添加異常處理
try:
    result = risky_operation()
except SpecificError as e:
    logger.error(f"操作失敗: {e}")
    # 執(zhí)行恢復操作
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文件處理技巧
? 了解了命令行工具的開發(fā)流程
? 獲得了一個實用的AI小工具

下一步建議:

  1. 嘗試添加新功能(如多格式支持、語音交互)
  2. 優(yōu)化用戶界面(如使用GUI框架)
  3. 部署到云端(如使用FastAPI構建Web服務)
  4. 開發(fā)更多AI小工具(如圖片識別、語音助手)

記住:最好的學習方式就是動手實踐!

以上就是使用Python手寫一個智能PDF文檔助手的詳細內容,更多關于Python智能PDF文檔助手的資料請關注腳本之家其它相關文章!

相關文章

  • Python logging設置和logger解析

    Python logging設置和logger解析

    這篇文章主要介紹了Python logging設置和logger解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 簡單介紹Python的輕便web框架Bottle

    簡單介紹Python的輕便web框架Bottle

    這篇文章主要介紹了Python的輕便web框架Bottle,因其注重輕便的設計,與Flask一樣,Bottle框架的人氣同樣也非常高,需要的朋友可以參考下
    2015-04-04
  • Python中__name__的使用實例

    Python中__name__的使用實例

    這篇文章主要介紹了Python中__name__的使用實例,并總結了兩種情況下__name__的值會是什么,需要的朋友可以參考下
    2015-04-04
  • 基于Python編寫圖片去水印小工具

    基于Python編寫圖片去水印小工具

    你有沒有注意到,某魚上有不少提供去水印的服務,收取1塊錢每張圖,最搞笑的是,很多人都沒意識到,去水印的技術其實非常簡單,所以本文來和大家講講如何使用Python編寫圖片去水印小工具吧
    2025-05-05
  • python中實現(xiàn)將多個print輸出合成一個數(shù)組

    python中實現(xiàn)將多個print輸出合成一個數(shù)組

    下面小編就為大家分享一篇python中實現(xiàn)將多個print輸出合成一個數(shù)組,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • tensorflow獲取預訓練模型某層參數(shù)并賦值到當前網絡指定層方式

    tensorflow獲取預訓練模型某層參數(shù)并賦值到當前網絡指定層方式

    今天小編就為大家分享一篇tensorflow獲取預訓練模型某層參數(shù)并賦值到當前網絡指定層方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 圖文詳解Python如何導入自己編寫的py文件

    圖文詳解Python如何導入自己編寫的py文件

    有時候自己寫了一個py文件,想要把它導入到另一個py文件里面,所以下面這篇文章主要給大家介紹了關于Python如何導入自己編寫的py文件的相關資料,需要的朋友可以參考下
    2021-11-11
  • python爬蟲獲取多頁天涯帖子

    python爬蟲獲取多頁天涯帖子

    本篇文章通過爬取多頁天涯帖子內容來教給大家深入理解python爬蟲相關知識,有興趣的參考學習下。
    2018-02-02
  • 關于TensorFlow新舊版本函數(shù)接口變化詳解

    關于TensorFlow新舊版本函數(shù)接口變化詳解

    今天小編就為大家分享一篇關于TensorFlow新舊版本函數(shù)接口變化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python如何繪制疫情圖

    python如何繪制疫情圖

    這篇文章主要介紹了python如何繪制疫情圖,幫助大家理解和學習用python繪制圖像,感興趣的朋友可以了解下
    2020-09-09

最新評論

盐源县| 固始县| 桂平市| 麦盖提县| 公安县| 准格尔旗| 安国市| 浦北县| 汉源县| 鄂尔多斯市| 邵阳市| 钦州市| 当雄县| 徐水县| 康保县| 赤壁市| 始兴县| 扬州市| 临邑县| 巴南区| 乐都县| 文山县| 岳西县| 尉氏县| 房产| 纳雍县| 普宁市| 奉化市| 芜湖县| 濮阳县| 博客| 昌邑市| 承德县| 浦县| 宣化县| 新乡县| 长乐市| 西乌| 永新县| 旌德县| 茌平县|