新手必看!用Python手把手教你写第一个AI小工具

新手必看!用Python手把手教你写第一个AI小工具
在这里插入图片描述

欢迎文末添加好友交流,共同进步!

“ 俺はモンキー・D・ルフィ。海贼王になる男だ!”

在这里插入图片描述


📖 写在前面

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

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

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

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

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

功能特性

PDF智能助手

核心功能

PDF文档读取

AI智能问答

内容摘要

关键信息提取

技术栈

Python 3.9+

OpenAI API

PyPDF2/pdfplumber

argparse命令行

应用场景

快速文档理解

学习资料整理

工作报告生成

合同条款分析

项目亮点

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

🛠️ 环境准备

2.1 Python环境检查

# 检查Python版本import sys print(f"Python版本: {sys.version}")# 推荐版本:Python 3.9 或更高# 下载地址:https://www.python.org/downloads/

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

2.3 获取OpenAI API Key

访问OpenAI官网

注册/登录账号

进入API管理页面

创建新的API密钥

复制并保存Key

创建.env文件

配置API_KEY

# 创建 .env 文件echoOPENAI_API_KEY=your_api_key_here > .env echoOPENAI_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()classConfig:"""应用配置类"""# 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",# 结束}@classmethoddefcolor_print(cls, color_type, message):"""彩色打印""" color = cls.COLORS.get(color_type,"")print(f"{color}{message}{cls.COLORS['endc']}")# 验证配置ifnot 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 classPDFReader:"""PDF文档读取器"""def__init__(self, file_path): self.file_path = file_path self.content ="" self.page_count =0defvalidate_file(self):"""验证文件"""ifnot 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")defread_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)}")raisedefget_summary(self):"""获取文档摘要(前500字)"""return self.content[:500]+"..."iflen(self.content)>500else self.content 

3.3 AI客户端模块 (ai_client.py)

""" OpenAI API客户端模块 """from openai import OpenAI from config import Config import time classAIClient:"""AI助手客户端"""def__init__(self): self.client = OpenAI( api_key=Config.OPENAI_API_KEY, base_url=Config.OPENAI_BASE_URL )defask(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)}")raisedefsummarize(self, content):"""生成文档摘要""" prompt =f"请为以下文档生成一个简洁的摘要(不超过200字):\n\n{content[:2000]}"return self.ask(prompt,"")defextract_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 defprint_banner():"""打印欢迎界面""" banner =""" ╔═══════════════════════════════════════╗ ║ 📚 PDF智能文档助手 v1.0 📚 ║ ║ Powered by OpenAI GPT ║ ╚═══════════════════════════════════════╝ """ Config.color_print("header", banner)definteractive_mode(reader, ai_client):"""交互模式""" Config.color_print("okgreen","\n🎯 进入交互模式(输入'quit'退出)") context = reader.content[:3000]# 使用前3000字作为上下文whileTrue:try: question =input("\n💬 请输入问题: ").strip()if question.lower()in['quit','exit','q']: Config.color_print("warning","👋 再见!")breakifnot question:continue ai_client.ask(question, context)except KeyboardInterrupt: Config.color_print("warning","\n👋 用户取消,再见!")breakexcept Exception as e: Config.color_print("fail",f"❌ 错误: {str(e)}")defmain():"""主函数""" 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()

📊 项目功能流程图

有参数

无参数

失败

成功

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 添加批量处理功能

defbatch_process(file_list, func):"""批量处理多个文件""" results =[]forfilein 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 添加导出功能

defexport_to_markdown(content, output_file):"""导出为Markdown格式"""withopen(output_file,'w', encoding='utf-8')as f: f.write("# 文档摘要\n\n") f.write(content) Config.color_print("okgreen",f"✅ 已导出到: {output_file}")

5.3 添加记忆功能

classConversationMemory:"""对话记忆管理"""def__init__(self, max_history=5): self.history =[] self.max_history = max_history defadd(self, question, answer):"""添加对话记录""" self.history.append({"question": question,"answer": answer })# 保留最近N条记录iflen(self.history)> self.max_history: self.history = self.history[-self.max_history:]defget_context(self):"""获取上下文""" context =""for item in self.history: context +=f"Q: {item['question']}\nA: {item['answer']}\n\n"return context 

💡 开发经验总结

常见问题及解决方案

问题解决方案
API调用超时添加重试机制,设置合理的timeout
内存占用过高分块处理大文件,使用生成器
用户体验差添加进度条、彩色输出、友好提示
代码可维护性差模块化设计,添加类型注解和文档

最佳实践

# 1. 使用类型注解defprocess_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 classTestPDFReader(unittest.TestCase):deftest_validate_file(self): reader = PDFReader("test.pdf")# 测试代码...

📚 学习资源推荐

推荐资源

视频教程

文章教程

项目灵感


🎓 结语

恭喜你!🎉

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

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

下一步建议:

  1. 尝试添加新功能(如多格式支持、语音交互)
  2. 优化用户界面(如使用GUI框架)
  3. 部署到云端(如使用FastAPI构建Web服务)
  4. 开发更多AI小工具(如图片识别、语音助手)
记住:最好的学习方式就是动手实践!

如果这篇文章对你有帮助,欢迎点赞、收藏、关注!

有问题欢迎在评论区交流,看到必回~


✍️ 坚持用清晰易懂的图解+可落地的代码,让每个知识点都简单直观!💡 座右铭:“道路是曲折的,前途是光明的!”

Read more

GLM-4.6V-Flash-WEB Web界面使用指南,拖图就出结果

GLM-4.6V-Flash-WEB Web界面使用指南,拖图就出结果 你不需要配置环境、不用写一行推理代码、甚至不用打开终端——只要把一张截图拖进浏览器窗口,几秒钟后,它就能告诉你图里写了什么、画了什么、哪里有问题。这不是未来预告,而是你现在就能在本地跑起来的真实体验。 GLM-4.6V-Flash-WEB 是智谱AI最新开源的轻量级视觉语言模型,专为Web端实时交互而生。它不像某些“实验室模型”那样只存在于论文和Benchmark表格里,而是真正做到了:部署快、启动快、响应快、上手更快。一块RTX 3090,一个浏览器,一次拖拽,结果即刻呈现。 本文不讲训练原理,不列参数表格,不堆技术术语。我们只聚焦一件事:怎么用好它的Web界面?从零开始,到稳定产出,每一步都清晰可操作。 1. 为什么说“拖图就出结果”不是宣传话术? 很多多模态模型标榜“支持图文理解”,但实际用起来才发现:要装依赖、改路径、调精度、修CUDA版本、

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.