新手必看!用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

Neo4j插件apoc安装及配置(实战经历,一步到位)

Neo4j插件apoc安装及配置(实战经历,一步到位)

目录 apoc插件安装 安装验证 出现的问题 Neo4j版本:Neo4j 5.x apoc版本:同上对应 Neo4j 4.x版本同样适用 apoc插件安装 1.首先查看Neo4j版本(在Neo4j Desktop或命令行中执行): CALL dbms.components() YIELD name, versions RETURN versions;  结果如下: 2.然后去GitHub上下载这个插件 * 访问 APOC GitHub Releases------------ https://github.com/neo4j/apoc/releases/ * 下载与Neo4j版本一致的apoc-x.x.x.x-all.jar文件(例如Neo4j 5.12.0 → APOC 5.

uniapp-x的HarmonyOS鸿蒙应用开发:tabbar底部导航栏的实现

uniapp-x的HarmonyOS鸿蒙应用开发:tabbar底部导航栏的实现

假期期间,百无聊赖。空闲时间够多了吧?有时候感觉特别的百无聊赖。不睡懒觉,电影不看,手机不刷,游戏不玩,也无处可去。那么做什么呢? 于是翻出来之前做过的“爱影家”影视app项目,找个跨多端的技术栈实战学习一把。我先后尝试了kuikly、flutter 、arkui-x等框架,结果。。。,额,这几个没少踩坑做不动了。真想向天问一下,跨平台框架开发哪家强?最后尝试了下uni-app x,被惊艳到了。果然dcloud很给力啊。且uni-app-x的性能很给力。还停留在uniapp只擅长小程序吗?唯独被诟病的是:uniapp-x的uts语法很难受啊,写法跟ts差异很大,且大模型不认识uts语法。 可以体验打包后的hello uni-app x这个demo项目,地址是:https://hellouniappx.dcloud.net.cn/ 可以看到组件很全面啊,我先后体验了android端,鸿蒙端和小程序端,界面UI效果一致,且鸿蒙端运行相当流畅。可以看到组件还是很丰富的。浏览器端的体检们可以直接访问:https://hellouniappx.

基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭:行百里者,半于九十。 📋📋📋本文内容如下:🎁🎁🎁  ⛳️赠与读者 👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。      或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎 💥第一部分——内容介绍 基于 Q-learning 的三维无人机动态避障导航方法研究 摘要 针对低空复杂三维环境下无人机自主飞行的安全与路径优化问题,本文提出一种基于 Q-learning 强化学习的无人机导航与避障方法。该方法在离散化

VR跨设备同步:提示工程如何让内容一致?

VR跨设备同步:提示工程如何让内容一致? 一、一场“找不同”的VR聚会:同步问题的痛与惑 上周末,我和三个朋友凑了四台不同的VR设备——Quest 3、Valve Index、Pico 4、Oculus Rift S,打算一起体验热门的VR密室逃脱《迷室: VR》。我们的目标很简单:合力破解密码锁,打开通向终点的门。但游戏开始10分钟后,场面彻底失控: * 我戴着Quest 3站在密码锁前,朋友A的Valve Index画面里,我还在房间门口“飘着”; * 我转动密码盘输入“123”,朋友B的Pico 4里,密码数字显示的是“456”; * 我抓起桌上的钥匙,朋友C的Oculus Rift S里,钥匙还稳稳地躺在原地…… 原本的“团队协作”变成了“集体找不同”,大家纷纷摘下头显吐槽:“这VR同步也太离谱了吧?” 这不是个例。