利用开源工具批量抓取ChatGPT插件提示词,构建AI应用开发知识库
1. 项目概述与核心价值最近在折腾一些AI应用开发发现一个挺有意思的现象很多开发者想基于类似ChatGPT的插件生态做点东西但第一步就卡住了——不知道从哪找高质量的、经过验证的插件提示词Prompt。官方文档的例子往往比较基础而真正能跑通复杂场景的提示词设计往往藏在那些已经上线的成功插件里。这时候手动去一个个插件页面查看、复制粘贴效率低不说还容易遗漏。就在这个当口我发现了Simon Willison在GitHub上开源的这个工具scrape-chatgpt-plugin-prompts。顾名思义它就是一个专门用来“爬取”ChatGPT插件提示词的小脚本。这个项目解决了一个非常具体的痛点如何批量、自动化地收集和分析已发布插件的真实提示词数据。对于AI应用开发者、提示词工程师甚至是研究AI交互模式的产品经理来说这都是一座金矿。它让你能绕过繁琐的手工操作直接获取到一批经过实际场景检验的提示词样本从而快速理解插件生态的交互范式、学习优秀的提示词结构甚至为自己的插件设计找到灵感和参考依据。我自己就用它快速分析了上百个插件的提示词对设计我自己的AI工具帮助巨大。接下来我就把这个工具的来龙去脉、怎么用、以及能挖出什么宝详细拆解一遍。2. 工具原理与设计思路拆解2.1 核心目标从公开信息中提取结构化数据scrape-chatgpt-plugin-prompts的核心逻辑并不复杂但设计得很巧妙。它的目标数据源是 OpenAI 官方的 ChatGPT 插件商店Plugin Store里每个插件的详情页面。这些页面是公开可访问的里面包含了插件的描述、配置方式以及最重要的——开发者预先为这个插件编写好的、用于引导用户使用的示例提示词Example Prompts。这些示例提示词是插件开发者精心设计的目的是向用户展示插件的核心功能和使用方法。它们本身就是高质量的、针对特定垂直领域优化过的提示词范本。这个工具要做的就是自动化地访问这些页面把散落在HTML中的提示词文本识别出来并整理成结构化的格式比如JSON或CSV方便后续分析。2.2 技术选型轻量级脚本的务实之道Simon Willison 是 Datasette 和 sqlite-utils 等知名开源工具的作者一贯以开发高效、实用的命令行工具著称。这个项目也延续了这种风格没有选用重型的爬虫框架如 Scrapy而是基于 Python 的标准库和几个轻量级依赖库构建httpx 用于发起 HTTP 请求。相比于经典的requests库httpx支持 HTTP/2 且完全异步在需要快速抓取多个页面时更有优势。不过在这个脚本中为了简化可能使用的是同步客户端。选择httpx也体现了对现代 Python 网络库趋势的跟进。BeautifulSoup4 用于解析 HTML。这是 Python 生态中最流行的 HTML 解析库API 友好能轻松地从复杂的 HTML 文档中提取目标数据。sqlite-utils Simon 自己开发的库用于便捷地操作 SQLite 数据库。脚本的核心输出之一就是将抓取到的数据存入 SQLite 数据库方便用 Datasette 浏览或进行 SQL 查询。这个选择非常“Simon”充分利用了自己的生态工具链实现了从抓取到分析查看的闭环。注意 在运行脚本前你需要通过pip install httpx beautifulsoup4 sqlite-utils来安装这些依赖。确保你的 Python 环境是 3.7 及以上版本。这种技术选型体现了“工具思维”用最少的依赖、最直接的代码解决一个明确的问题。整个脚本就是一个独立的.py文件没有复杂的配置开箱即用非常适合集成到自动化流程中。2.3 工作流程解析脚本的工作流程可以概括为以下几个步骤我结合自己的使用经验补充了一些细节获取插件列表 脚本可能需要一个起点。它可能从一个已知的插件列表URL开始或者需要你提供一个包含插件ID或商店页面URL的列表。有些实现会先抓取插件商店的目录页从中解析出所有插件的独立页面链接。遍历与请求 脚本会循环遍历这个插件URL列表对每一个URL发起GET请求。这里通常会加入一些礼貌性延迟例如在请求间 sleep 1-2 秒避免对目标服务器造成压力这也是编写爬虫的基本素养。HTML 解析与数据提取 收到页面响应后使用 BeautifulSoup 加载 HTML。关键的一步是定位提示词所在的HTML元素。这需要事先分析插件商店页面的DOM结构。通常示例提示词会被放在特定的div容器里可能有诸如example-prompts、prompt-examples或特定的CSS类名作为标识。脚本里会包含对应的CSS选择器或查找逻辑来精准定位这些文本。数据清洗与结构化 提取出来的原始文本可能包含多余的空白符、HTML标签等。脚本会进行清洗并将每个提示词与它的来源插件插件名、ID、URL关联起来形成一个结构化的字典Dictionary对象。数据存储 最后使用sqlite-utils库将这些结构化的数据插入或更新到一个 SQLite 数据库文件中。数据库的表结构可能包含plugins插件信息和prompts提示词两张表并通过外键关联。整个流程清晰明了就像一个数字矿工按照地图URL列表逐个矿洞插件页面挖掘把矿石提示词清洗后存入仓库数据库。3. 实操部署与运行指南理论讲完了我们动手把它跑起来。假设你已经有了Python环境我们从零开始操作一遍。3.1 环境准备与依赖安装首先打开你的终端或命令行工具。# 1. 克隆仓库到本地假设你使用git git clone https://github.com/simonw/scrape-chatgpt-plugin-prompts.git cd scrape-chatgpt-plugin-prompts # 2. 创建并激活一个虚拟环境推荐避免污染全局环境 python -m venv venv # 在 Windows 上 venv\Scripts\activate # 在 macOS/Linux 上 source venv/bin/activate # 3. 安装项目依赖 pip install httpx beautifulsoup4 sqlite-utils通常项目根目录下会有一个requirements.txt或pyproject.toml文件你也可以用pip install -r requirements.txt来安装。但根据Simon项目的习惯依赖可能直接写在setup.py或脚本开头的注释里手动安装上述三个库是最稳妥的。3.2 脚本运行与参数理解仓库里核心的Python脚本可能就叫scrape.py。运行前我们最好先看看它的帮助信息或源码开头了解需要哪些参数。python scrape.py --help如果没有--help那就直接查看源码。通常它可能需要一个输入参数比如一个包含插件URL列表的文本文件或者一个插件商店的基础URL让它自己发现。假设一种常见的使用场景脚本已经内置了获取插件列表的逻辑。你只需要运行python scrape.py运行后你会看到终端开始输出日志例如Fetching plugin list from store... Found 150 plugins. Processing plugin #1: Web Search (https://...) Extracted 3 prompts. Processing plugin #2: Code Interpreter (https://...) Extracted 5 prompts. ... Saved data to prompts.db关键输出prompts.db。这就是生成的 SQLite 数据库文件里面存储了所有抓取到的数据。3.3 数据查看与初步分析拿到prompts.db后如何查看里面的内容呢你有多种选择方法一使用 Datasette强烈推荐Simon Willison 开发的 Datasette 是浏览和发布 SQLite 数据库的绝佳工具。如果你安装了 Datasette可以pip install datasette datasette prompts.db然后在浏览器打开http://localhost:8001你会看到一个清晰的Web界面可以点击查看所有表执行SQL查询甚至以JSON格式导出数据。这对于探索性数据分析来说非常直观。方法二使用命令行 SQLite 工具如果你熟悉 SQL可以使用系统自带的sqlite3命令行工具sqlite3 prompts.db .tables # 查看所有表 .schema prompts # 查看prompts表结构 SELECT plugin_name, prompt_text FROM prompts LIMIT 5; # 查看前5条提示词方法三使用 Python 读取当然你也可以写个简单的Python脚本来读取import sqlite3 conn sqlite3.connect(prompts.db) cursor conn.cursor() cursor.execute(SELECT * FROM prompts) rows cursor.fetchall() for row in rows: print(row) conn.close()实操心得 第一次运行时建议先抓取少量插件比如修改脚本只处理前10个URL进行测试确保整个流程无误数据格式符合预期。同时检查一下prompts.db文件的大小确保数据被正确写入。4. 抓取数据深度解析与应用场景运行工具只是第一步真正的价值在于如何分析和利用抓取到的提示词数据。我们打开数据库看看里面究竟有什么以及能怎么用。4.1 数据结构与字段含义通常数据库里至少会有两个核心表plugins表存储插件元信息。字段名含义示例id插件唯一标识plugin_abc123name插件名称Web Searchurl插件商店页面URLhttps://chat.openai.com/plugin/...description插件描述Search the web for real-time information...author开发者/公司OpenAIprompts表存储核心的提示词数据。字段名含义示例id提示词唯一ID1plugin_id关联的插件IDplugin_abc123prompt_text提示词完整文本Find recent news articles about quantum computing.category可能的分类如脚本解析information_retrieval通过plugin_id字段可以轻松地将提示词与它的来源插件关联起来进行联合查询。4.2 核心分析维度与SQL示例有了结构化数据我们就可以用SQL提出各种有趣的问题挖掘洞见1. 统计插件提示词数量分布SELECT p.name, COUNT(*) as prompt_count FROM plugins pl JOIN prompts p ON pl.id p.plugin_id GROUP BY pl.id ORDER BY prompt_count DESC;这个查询能告诉你哪些插件提供的示例最丰富。通常功能复杂的插件如数据分析、内容生成会有更多示例。2. 分析高频动词与任务类型虽然SQL不擅长文本分析但我们可以进行简单的模式匹配。例如查找所有以“Find”或“Search”开头的提示词了解信息检索类任务的常见句式SELECT prompt_text FROM prompts WHERE prompt_text LIKE Find % OR prompt_text LIKE Search %;更进一步可以将数据导出到Python用nltk或spaCy进行词性标注和命名实体识别分析提示词中最常出现的动词如“create”, “summarize”, “translate”, “compare”和宾语如“email”, “code”, “report”从而绘制出插件生态主要支持的任务图谱。3. 寻找特定领域的提示词范例假设你在开发一个“法律文档分析”插件想参考其他文本分析类插件的提示词设计。你可以先筛选描述中包含“document”, “text”, “analyze”等关键词的插件再查看它们关联的提示词SELECT pl.name, p.prompt_text FROM plugins pl JOIN prompts p ON pl.id p.plugin_id WHERE pl.description LIKE %document% OR pl.description LIKE %analyze%;4.3 实际应用场景拓展这些数据不仅仅是用来“看”的更是用来“用”的。以下是我能想到的几个具体应用场景场景一提示词工程Prompt Engineering学习对于新手提示词工程师这是绝佳的免费教材。你可以系统地学习结构化 优秀的插件提示词如何清晰定义用户输入、上下文和预期输出上下文管理 在多轮对话中提示词如何引导AI记住插件功能错误处理 提示词是否包含了对用户模糊或错误输入的引导语 通过对比几十个不同插件的提示词你能快速总结出一些最佳实践模式。场景二新产品功能与交互设计灵感如果你在规划一个AI原生应用或插件这个数据库是一个需求宝库。功能挖掘 看看用户最常通过提示词要求插件做什么这反映了市场的真实需求。交互设计 分析提示词的长度、复杂度和句式。用户是喜欢用短句指令“总结这篇文章”还是自然语言描述“你能帮我读一下这篇长文并给出要点吗”这直接影响你的产品前端输入框的设计。场景三构建自己的提示词库或测试集你可以将抓取到的高质量提示词稍作修改注意版权和合规用作微调Fine-tuning数据 如果你要训练一个专门用于理解插件指令的模型这些是天然的、高质量的指令-任务配对数据。测试用例 在开发自己的AI功能时用这些多样化的真实用户查询来测试你的系统评估其鲁棒性和泛化能力。注意事项 在使用这些数据时务必尊重原始插件的版权和条款。这些提示词是公开可见的用于个人学习、研究和分析通常没有问题但如果大规模商用或直接复制可能需要谨慎考虑。最好将其作为灵感和分析的来源而不是照搬的素材。5. 高级技巧与定制化改造基础用法能满足大部分需求但如果你想更深入地控制抓取过程或者适配变化了的网页结构就需要对脚本进行一些定制了。5.1 应对网页结构变更网站前端经常会改版一旦插件商店页面的HTML结构发生变化原有的CSS选择器就可能失效导致抓不到数据。这是所有爬虫工具都要面对的问题。如何排查和修复手动检查 打开一个插件页面使用浏览器的开发者工具F12检查示例提示词区域的HTML结构。看看包裹提示词的标签、类名class或ID是否变了。修改选择器 找到新的选择器路径后打开scrape.py脚本找到解析提示词的关键代码行。它可能长这样# 假设原来的选择器 prompt_elements soup.select(“.plugin-prompt-example”) # 如果变了可能需要改成 prompt_elements soup.select(“div[data-testid‘prompt-examples’] p”)增加容错 好的脚本应该具备一定的容错性。你可以在代码中添加try…except块或者使用find_all配合更宽松的文本匹配确保即使部分元素找不到脚本也不会崩溃而是记录错误并继续。5.2 扩展抓取字段默认脚本可能只抓取插件名和提示词文本。但页面上还有其他有价值的信息比如插件的安装量或评分如果显示插件的更新时间更详细的分类标签开发者提供的配置参数说明你可以修改脚本的解析部分增加对这些新字段的提取并相应地扩展数据库表结构。这需要你仔细分析页面HTML并更新数据模型和插入逻辑。5.3 实现增量抓取与定时任务插件商店会不断上架新插件老插件也会更新他们的示例。我们不可能每次都全量重新抓取。增量抓取逻辑 修改脚本在抓取前先查询数据库中最新的插件update_time如果你抓取了这个字段或者只抓取那些不在现有数据库中的插件URL。更简单的办法是记录每个插件的抓取时间定期只抓取那些长时间未更新的。自动化定时运行 在Linux服务器上你可以使用cron定时任务。例如设置每周日凌晨3点运行一次抓取脚本# 编辑crontab crontab -e # 添加一行 0 3 * * 0 cd /path/to/scrape-chatgpt-plugin-prompts /path/to/venv/bin/python scrape.py scrape.log 21在Windows上可以使用“任务计划程序”实现类似功能。5.4 数据清洗与后处理增强原始抓取的提示词文本可能包含你不想要的字符或者你想进行更深入的分析文本清洗 在存入数据库前对prompt_text进行清洗去除首尾空白、多余的换行符或将HTML实体如amp;转换为正常字符。自动分类/打标 编写一个简单的规则引擎或使用轻量级文本分类模型如基于关键词匹配自动为提示词打上标签例如#信息检索、#内容创作、#代码辅助、#数据分析。这能极大提升后续筛选和分析的效率。向量化存储高级 如果你真的想玩点花的可以使用句子嵌入模型如all-MiniLM-L6-v2将每条提示词转换为向量存入数据库。这样你就可以根据语义相似度来搜索提示词了比如“找到所有和‘帮我写邮件’意思相近的提示词”。这需要集成sentence-transformers库并将向量存储在SQLite的BLOB字段或专门的向量数据库中。6. 常见问题与排查实录在实际使用和改造这个工具的过程中我遇到了一些典型问题。这里记录下来希望能帮你避开这些坑。6.1 运行环境与依赖问题问题ModuleNotFoundError: No module named ‘httpx’原因与解决 依赖没有正确安装或者你在错误的Python环境下运行。确保已经使用pip install安装了所有依赖。确认你激活了虚拟环境如果使用了的话。在终端中命令行提示符前应该有(venv)字样。使用which pythonmacOS/Linux或where pythonWindows检查当前使用的Python解释器路径是否正确。问题SSL证书验证错误原因与解决 在某些网络环境下可能会遇到SSL证书问题。临时解决方案不推荐用于生产在httpx请求中增加verifyFalse参数。但这会降低安全性。更好的方案更新你的本地CA证书包或者使用SSL_CERT_FILE环境变量指定证书路径。6.2 抓取过程与数据问题问题脚本运行很快但数据库里没有数据或数据很少原因与解决选择器失效 这是最常见的原因。按照前面“高级技巧”部分的方法检查并更新HTML选择器。请求被限制 目标网站可能有反爬机制。脚本中的请求头User-Agent看起来是否像一个真实浏览器可以尝试在httpx请求中添加更完整的headers模拟浏览器。加入适当的请求延迟time.sleep也是必须的。列表获取失败 如果脚本第一步是获取插件列表那么这一步失败会导致后续全部失败。检查获取列表的URL或API是否仍然有效。问题抓取到的提示词文本包含乱码或奇怪字符原因与解决 字符编码问题。确保在BeautifulSoup解析时指定了正确的编码或者让BeautifulSoup自动检测BeautifulSoup(response.content, ‘html.parser’)通常比BeautifulSoup(response.text, ‘html.parser’)更可靠因为response.content是字节流response.text可能误判编码。6.3 数据库与数据分析问题问题如何使用抓取的数据训练一个简单的模型思路参考 你可以将“提示词文本”作为输入X尝试构建一些预测任务。例如插件分类任务 给定一条提示词预测它属于哪个插件一个多分类问题。这可以帮你理解不同插件提示词的风格差异。意图识别任务 人工或基于规则为一部分提示词打上意图标签如“查询天气”、“生成代码”、“总结文档”然后训练一个文本分类模型。 具体步骤包括数据清洗、划分训练集测试集、使用TF-IDF或BERT等模型提取特征、训练分类器如逻辑回归、随机森林或神经网络。这已经是一个完整的NLP小项目了。问题数据量太大Datasette预览卡顿解决Datasette本身处理大量数据性能很好但浏览器渲染可能慢。可以在Datasette启动时使用--settings default_page_size 50参数减少每页显示行数。更根本的方法是只导入你关心的数据子集进行分析或者先在SQLite命令行中用聚合查询减少数据量再查看。这个工具本身是一个精巧的“钥匙”它打开了一扇门门后是AI插件生态中真实、鲜活的人机交互数据。如何利用这些数据取决于你的想象力和目标。无论是用于学习、研究、产品设计还是构建更复杂的AI应用它都提供了一个扎实的起点。最重要的是通过动手运行和改造这个项目你能更深刻地理解数据获取、清洗和分析的全流程这在当今的数据驱动时代是一项极其宝贵的基础能力。