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

全网最全「Claude/GPT/Codex中转站评测」!一键找到稳定好用的AI中转站,避开跑路坑! 从价格、可用率到隐藏福利,这篇帮你省下90%踩坑时间!

从价格、可用率到隐藏福利,这篇帮你省下90%踩坑时间! “买的Claude中转站突然跑路,充的钱全没了!” “同样的模型,这家便宜但总掉线,那家贵却稳如老狗——到底怎么选?” “官方API越来越贵,中转站又怕不靠谱…有没有靠谱的评测参考?” 如果你也在找稳定、便宜、不跑路的Claude/GPT/Codex中转站,那你一定不能错过这个宝藏网站——Help AIO AI中转站评测!它可能是目前全网最良心、最透明、最实用的AI中转站指南,没有广告、没有赞助,纯靠用户实测数据说话! 一、这网站到底是干嘛的? 简单来说,它是全球主流AI中转站的“大众点评”+“比价工具”! * 评测对象:覆盖Claude(Sonnet/Opus)、GPT(Codex)、Gemini等主流模型,专注“中转站”(即第三方代理服务,帮你更便宜/稳定地调用官方API)。 * 核心功能:✅ 模型晴雨表:实时监控各模型的可用率(比如GPT

快马ai助力:快速创建适配imtoken dapp浏览器的区块链小游戏应用

最近在琢磨怎么快速验证一个区块链小游戏的想法,特别是针对像 imToken 这类主流钱包的内置 DApp 浏览器环境。大家都知道,imToken 的 DApp 浏览器是个非常重要的入口,用户习惯在这里直接探索各种链上应用。如果能快速做出一个适配它的小应用原型,对验证想法、收集反馈来说效率就高多了。这次我就尝试用 InsCode(快马)平台 来快速搭建一个简单的猜数字游戏,整个过程下来,感觉对于想快速上手区块链应用开发的伙伴们,确实是一条捷径。 1. 明确目标与场景分析。我的核心想法是做一个极简的区块链小游戏,它必须能在 imToken 的 DApp 浏览器里无缝运行。这意味着前端界面要适配移动端,更重要的是,需要完整集成钱包连接、交易签名、合约调用这一套流程。游戏规则设定为经典的猜数字:玩家支付一点测试币(比如 0.001 ETH)参与,系统(合约)生成一个随机数,玩家猜中则赢得当前奖池的所有奖金。这个模型虽然简单,但涵盖了 DApp

Agent实习模拟面试之Dify + Skill本地部署大模型智能体:从零构建企业级可落地的AI Agent系统

Agent实习模拟面试之Dify + Skill本地部署大模型智能体:从零构建企业级可落地的AI Agent系统 摘要:本文以一场高度仿真的Agent实习生岗位模拟面试为载体,聚焦当前热门的低代码Agent开发平台 Dify 与 自定义Skill(技能)机制,深入探讨如何在完全本地化环境中部署一个安全、可控、可扩展的大模型智能体(Agent)。通过“面试官提问—候选人回答—连环追问”的对话形式,系统性地拆解了Dify的核心架构、Skill插件开发、本地大模型集成(如Llama-3、Qwen)、RAG优化、权限控制、监控告警等关键环节,并结合企业实际场景(如内部知识问答、自动化办公)给出完整落地路径。全文超过9500字,适合对AI Agent开发、私有化部署、企业智能化转型感兴趣的工程师、架构师与在校学生阅读。 引言:为什么企业需要“本地部署的Dify + 自定义Skill”? 在2024–2026年的大模型应用浪潮中,一个显著趋势是:企业不再满足于调用公有云API,而是强烈要求数据不出域、模型可审计、能力可定制的私有化Agent解决方案。

微信终于开放官方 Bot API!ClawBot 插件深度解析,AI 开发者的新机遇

微信终于开放官方 Bot API!ClawBot 插件深度解析,AI 开发者的新机遇

⚡⚡⚡ 欢迎预览,批评指正⚡⚡⚡ 文章目录 * 一、历史性时刻:微信开放官方 Bot API * 二、插件概况:什么是 ClawBot? * 2.1 官方定位 * 2.2 核心能力 * 三、技术亮点:iLink 协议深度解析 * 3.1 协议概览 * 3.2 认证机制 * 3.3 长轮询机制 * 3.4 消息结构 * 3.5 回复机制(关键!) * 3.6 CDN 媒体加密 * 四、启用插件:5 分钟快速上手 * 4.1 前置条件 * 4.