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

前端环境配置(nvm、nodejs、npm)

前端环境配置(nvm、nodejs、npm)

一、安装nvm 1. 下载vnm url: https://nvm.uihtm.com/doc/download-nvm.html 2. 解压文件后双击exe文件进行安装 3. 选择nvm的安装地址,我是安装在D:\App\nvm 4. 选择nodejs的安装地址,我是安装在C:\Program Files\nodejs 5. 点击next 一直点击 完成安装; 6. 找到nvm的settings.txt文件打开后: 给该文件添加这两行命令: node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/ 二、环境变量配置 1.

【DeepSeek R1部署至RK3588】RKLLM转换→板端部署→局域网web浏览

【DeepSeek R1部署至RK3588】RKLLM转换→板端部署→局域网web浏览

本文为DeepSeek R1 7B 以qwen为底座的LLM在瑞芯微RK3588 SoC上的完整部署流程,记录从开发板驱动适配烧录开始,到最终的开发板终端访问模型和局域网web访问模型的完整流程,有不足之处希望大家共同讨论。 文章目录 * 一、项目背景介绍 * 二、所需工具介绍 * 1.硬件工具 * 1.X86 PC虚拟机Ubuntu20.04 * 2. 准备NPU驱动为0.9.8的RK3588开发板 * 2.软件工具 * 三、获取.safetensors模型权重 * 四、safetensors转RKLLM * 1.转换环境搭建 * 2.模型转换 * 五、RKLLM模型板端部署及推理 * 六、集成开源gradio工具实现web访问 一、项目背景介绍 先来介绍下项目背景吧,目前有一个空闲的firefly出厂的搭载瑞芯微RK3588 SoC的arm64开发板,样式如图所示: 博主之前主要进行CV领域的模型的RK开发板部署,对于LLM和VLM的接触并不算多,但现在大模型是趋势所向,并且瑞芯微及时的完成了针对各开源

想做多语言项目?试试Hunyuan-MT-7B-WEBUI快速部署方案

想做多语言项目?试试Hunyuan-MT-7B-WEBUI快速部署方案 你有没有遇到过这样的情况:手头有个跨境项目,要同时处理日语产品说明、西班牙语用户反馈、维吾尔语政策文件,甚至还有藏文古籍数字化需求——可翻来翻去,不是翻译质量差强人意,就是部署起来像在解一道高数题?在线工具不敢传敏感数据,本地跑模型又卡在CUDA版本、依赖冲突、显存爆炸上……最后只能靠人工硬啃,进度一拖再拖。 Hunyuan-MT-7B-WEBUI 就是为这种真实困境而生的。它不讲大道理,不堆参数,不做“实验室里的冠军”,而是把腾讯混元团队打磨出的最强开源翻译模型,连同网页界面、一键脚本、预装环境,全打包进一个镜像里。你不需要懂Transformer结构,不用查PyTorch兼容表,甚至不用打开终端敲命令——点一下,等两分钟,就能在浏览器里开始翻译38种语言。 这不是又一个“需要调参、需要写代码、需要配环境”的AI工具。这是你今天下午就能用上的多语言工作台。 1. 为什么这款翻译镜像值得你立刻试试? 1.1 它真能覆盖你没想过的语言 很多翻译模型标榜“支持多语言”,但实际打开列表一看:英、法、

前端实现Word文档在线编辑与导出:基于mammoth.js与Blob对象的完整解决方案

如何在浏览器中直接编辑Word文档并导出?本文将深入探索一种基于mammoth.js和Blob对象的完整技术方案。 在当今的Web应用开发中,实现文档的在线编辑与导出已成为常见需求。无论是企业内部系统、教育平台还是项目管理工具,都迫切需要让用户能够在浏览器中直接编辑Word文档,而无需安装桌面软件。本文将详细介绍如何利用mammoth.js和Blob对象实现这一功能,并对比其他可行方案。 一、为什么选择mammoth.js与Blob方案? 在Web前端实现Word文档处理,主要有三种主流方案:浏览器原生Blob导出、mammoth.js专业转换和基于模板的docxtemplater方案。它们各有优劣,适用于不同场景。 mammoth.js的核心优势在于它能将.docx文档转换为语义化的HTML,而非简单复制视觉样式。这意味着它生成的HTML结构清晰、易于维护和样式定制。配合Blob对象,我们可以轻松将编辑后的内容重新导出为Word文档。 与直接使用Microsoft Office Online或Google Docs嵌入相比,mammoth.js方案不依赖外部服务,能更好地