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

.NET/JAVA集成GoView低代码可视化大屏完整案例详解【.NET篇】

.NET/JAVA集成GoView低代码可视化大屏完整案例详解【.NET篇】

文章目录 * 一、GoView简介 * 二、.NET集成GoView方案 * 三、集成步骤详解 * 1. 环境准备 * 2. 获取并构建GoView * 3. 创建.NET项目 * 5. 修改.NET路由配置 * 6. 配置API接口 * 7. 修改GoView配置 * 四、进阶集成方案 * 1. 身份验证集成 * 2. 动态主题切换 * 3. 数据缓存优化 * 五、常见问题解决 * 1.跨域问题: * 2. 静态文件404错误: * 3. API请求路径问题: * 4. 性能优化: * 六、总结 一、GoView简介 GoView 是一款基于 Vue3.x 构建的低代码数据可视化开发平台,它允许开发者通过简单的配置快速构建各种数据可视化大屏。 * 官网文档:

ComfyUI Photoshop插件终极配置指南:快速构建AI绘画工作流

ComfyUI Photoshop插件终极配置指南:快速构建AI绘画工作流 【免费下载链接】Comfy-Photoshop-SDDownload this extension via the ComfyUI manager to establish a connection between ComfyUI and the Auto-Photoshop-SD plugin in Photoshop. https://github.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin 项目地址: https://gitcode.com/gh_mirrors/co/Comfy-Photoshop-SD 想要在熟悉的Photoshop环境中直接使用AI绘画功能吗?ComfyUI Photoshop插件正是您需要的解决方案。作为连接ComfyUI和Photoshop的强大桥梁,这个插件让创作者能够在不离开Photoshop的情况下完成复杂的AI图像生成与编辑任务。 环境准备与快速检查 在开始配置前,请确认您的系统环境符合以下

Java Web 和智慧生活商城系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web 和智慧生活商城系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着互联网技术的飞速发展和电子商务的普及,智慧生活商城系统逐渐成为现代人日常生活中不可或缺的一部分。传统的线下购物模式已经无法满足消费者对便捷性、高效性和个性化的需求,线上商城系统通过整合各类商品资源,提供24小时不间断的服务,极大地提升了用户的购物体验。智慧生活商城系统不仅能够帮助商家拓展销售渠道,还能通过数据分析优化库存管理和营销策略,实现精准营销。在此背景下,开发一个基于Java Web技术的智慧生活商城系统具有重要的现实意义。该系统旨在为用户提供安全、稳定、高效的在线购物平台,同时为商家提供便捷的后台管理功能,推动电子商务行业的进一步发展。关键词:智慧生活商城、电子商务、Java Web、在线购物、数据分析。 本系统采用SpringBoot2作为后端框架,结合Vue3前端框架和MyBatis-Plus持久层框架,实现了前后端分离的高效开发模式。系统后端使用MySQL8.0作为数据库,确保了数据存储的高性能和可靠性。系统功能模块包括用户管理、商品管理、订单管理、支付管理和数据分析等,涵盖了商城系统的核心业务流程。用户可以通过前端页面浏览商品、加入购物车、下单支付,并查看

【面试分享】前端 React 50个基础高频面试题,助你轻松拿 offer!

【面试分享】前端 React 50个基础高频面试题,助你轻松拿 offer!

目录 前端基础高频面试题之-- React 篇 1、什么是React? 2、React有什么特点? 3、列出React的一些主要优点。 4、React有哪些限制? 5、什么是JSX? 6、为什么浏览器无法读取JSX? 7、React中的组件是什么? 8、怎样解释 React 中 render() 的目的。 9、什么是 Props? 10、React中的状态是什么?它是如何使用的? 11、 React 中的箭头函数是什么?使用箭头函数的好处? 12、什么是高阶组件(HOC)? 13、你能用HOC做什么? 14、什么是纯组件? 16、什么是React 路由? 17、为什么 useState 返回的是数组而不是对象? 18、如何实现