简介这份PDF汇集21个AI提示词站点资源面向希望提升ChatGPT等对话式AI使用效率的创作者、学生与研究人员尤其适合AI绘画、创意写作、学术研究及技术文档等场景帮助解决提示词零散、检索困难与优化无门的问题。包内共1个PDF文件约2.14MB内容以站点清单和功能说明为主按AIGC提示词可视化编辑器、ChatGPT提示语、PromptPerfect、ChatGPT Shortcut、PromptBase、提示工程指南等方向整理既可用作工具导航也适合作为提示词学习索引。已有574人学习下载。读者可借此集中了解各站点的定位、适用模型与核心能力例如中英文提示词翻译与分类、快捷指令筛选、自动优化、提示词交易与图像生成以及提示工程入门思路同时能按绘画、写作、问答等用途快速匹配工具减少试错成本建立可复用的提示词获取与优化路径。1. 提示词站点收集的真正难点在“之后”很多人手上都躺着一份叫《21个AI提示词站点收集》的 PDF21 个链接、分门别类、看起来一次性解决了“去哪找提示词”。一周之后问题才暴露——记得某个站点上有一条做代码评审的提示词翻遍 21 个书签找不到团队三个人各存了一份内容还不一样。收集从来不是难点难点在收集之后站点会下线、条目会迭代、格式五花八门一份静态链接列表回答不了“我要的那条在哪”。把这件事当工程做需要四步入口分类与筛选、条目字段标准化、本地可检索、以及能一键再生成的 PDF 文档。适合正在写提示词的工程师、做 AI 应用落地的开发者以及想把提示词当团队资产沉淀下来的人。2. 21个AI提示词站点的分类与筛选从链接列表到可维护清单2.1 四类站点的能力边界与采集方式聚合市场型条目量最大通常按热度或收藏数排序带标签体系站内搜索做得不错短板是导出能力弱多数只在页面上展示少数提供接口但有额度限制。这类站点适合定期抽样不适合全量镜像。官方示例型来自模型厂商的文档与示例库条目不多但写法规范、和具体模型能力贴合是写提示词模板时最该反复读的一类。缺点是覆盖面窄偏基础场景。社区实战型分布在论坛、问答和社交平台上时效性强藏着大量 ai编程提示词、ai agent 编排这类偏工程的经验贴。噪声也最大需要人工标注可信度最好只抽取被反复验证过的条目。工具内置型比如编辑器插件、聊天客户端自带的提示词片段甚至像 ComfyUI 提示词插件那种随工具分发的词库开箱即用迁移成本却高往往和工具版本绑定。社区里流传的一些编辑器提示词片段也能作为参考样本。四类站点的采集方式完全不同官方型适合手工精编聚合型适合接口或页面解析社区型适合关键词订阅工具型适合本地文件解析。2.2 一张表决定哪个站点值得进你的库不是 21 个都值得维护筛选维度固定下来之后取舍会快很多。维度取值示例判断标准可导出性JSON / CSV / 页面表格 / 纯文本页面结构化程度越高越优先纯文本次之站内检索支持标签全文 / 仅分类支持全文的站点后期补采成本低更新频率周更 / 月更 / 已停更周更站点只抽样不做全量授权与署名明确协议 / 未声明未声明授权的一律不二次分发访问门槛公开 / 需登录需登录的内容不纳入自动采集范围2.3 sites.yaml把 21 个入口写成配置站点清单不要写在代码里写成一个 YAML 文件改配置不改逻辑。id 一旦分配就不再改动后续提示词条目的命名会引用它。# sites.yaml —— 每个入口一条记录id 分配后不再修改 - id: s01 name: 示例官方示例库 category: official # market | official | community | tool fetch: manual # manual | html | json | rss entry: https://example.com/prompts license: CC-BY-4.0 status: active # active | dead | paused last_checked: 2025-01-0121 这个数字不必写死。站点下线就把 status 改成 dead保留记录避免下次复查时重复判断。定期巡检用一个小脚本就够了# check_sites.py —— 巡检站点清单列出需要复查的条目 import yaml, datetime TODAY datetime.date.today() sites yaml.safe_load(open(sites.yaml, encodingutf-8)) for s in sites: last datetime.date.fromisoformat(str(s[last_checked])) age (TODAY - last).days flag 复查 if age 90 or s[status] ! active else ok print(f{s[id]:4} {flag:4} {age:4}d {s[name]})age 90是复查阈值站点更新频率高就调到 30低频站点调到 180。status非 active 的条目无条件进入复查列表防止某个入口悄悄恢复更新却被漏掉。2.4 采集脚本骨架与限速约定# collect.py —— 通用采集骨架解析函数按站点类型替换 import time import requests HEADERS {User-Agent: prompt-lib/1.0 (contact: youexample.com)} def fetch(url: str, delay: float 2.0, timeout: int 15) - str: time.sleep(delay) # 同站点连续请求之间强制间隔 r requests.get(url, headersHEADERS, timeouttimeout) r.raise_for_status() # 4xx/5xx 直接抛错不写入脏数据 return r.text def parse_json(payload: dict) - list[dict]: # 只保留需要的字段其余丢弃减少后续清洗成本 return [{title: i.get(title, ), body: i.get(content, )} for i in payload.get(items, [])]delay默认 2 秒对方站点响应慢就加到 5timeout给 15 秒超时就跳过而不是挂住整批任务UA 里带联系方式出问题时对方能直接找到人。raise_for_status()这一行看着多余实际能挡掉大量“状态码 429 却把错误页当成提示词存进库”的事故。提示采集前先看目标站点的 robots.txt 与使用条款只抓公开可访问的页面登录后可见的内容不要用自动化方式拉取。3. 提示词条目字段标准化让21个站点的数据长成同一种形状3.1 一条提示词的最小字段集字段定得越早后期迁移越省事。下面这套是实践下来够用又不臃肿的组合。字段类型必填说明idstring是全局唯一建议「站点id-序号」titlestring是检索入口别用正文前 20 字敷衍bodystring是提示词原文保留换行tagslist否走统一词表避免同义词泛滥modelstring否适用模型系列或能力档位source_urlstring是溯源出问题能回到原页面licensestring否转载与二次分发约束langstring否zh / en便于分池检索raw_hashstring是归一化后的哈希用于去重updated_atdate是判断条目新旧3.2 归一化与哈希先变形再比对同一条提示词在四个站点上会出现四种写法空格数量不同、中英文标点混用、变量占位符一边写{{topic}}一边写[主题]。直接算 MD5 会得到四条互不相干的记录。import re, hashlib VAR_PATTERNS [r\{\{.*?\}\}, r\{.*?\}, r\[.*?\], r.*?] def normalize(text: str) - str: t text.strip().lower() for p in VAR_PATTERNS: t re.sub(p, {var}, t) # 变量占位符统一成一个符号 t t.replace( , ) # 全角空格归一 t re.sub(r\s, , t) # 连续空白压成一个 return t def raw_hash(text: str) - str: return hashlib.sha1(normalize(text).encode(utf-8)).hexdigest()VAR_PATTERNS覆盖了双花括号、单花括号、方括号、尖括号四种常见占位符写法遇到新写法直接往列表里加。normalize的结果只用于比对和去重。注意写回库里的body必须保留原文归一化文本一旦落库变量占位符会被破坏模板就没法用了。3.3 归一化入库脚本import json, pathlib def to_record(raw: dict, site: dict) - dict: return { id: f{site[id]}-{raw[title][:16]}, title: raw[title].strip(), body: raw[body].replace(\r\n, \n), tags: [t.strip() for t in raw.get(tags, [])], model: raw.get(model, ), source_url: raw.get(url, site[entry]), license: site.get(license, ), lang: zh if any(\u4e00 c \u9fff for c in raw[body]) else en, raw_hash: raw_hash(raw[body]), updated_at: 2025-01-01, } out pathlib.Path(prompts.jsonl) with out.open(a, encodingutf-8) as f: for raw in parse_json(payload): f.write(json.dumps(to_record(raw, site), ensure_asciiFalse) \n)ensure_asciiFalse保证中文以原字符写入方便直接 grep 和人工翻看追加模式让多个站点的结果可以累积到一个文件里。id用标题前 16 字符只是临时方案正式项目建议换成站点内自增序号标题改一次 id 就变一次溯源会很痛苦。3.4 近似去重MD5 挡不住改写版归一化哈希只能抓完全相同的条目。同一条提示词被 AI 改写、加了两句限定语、换了个语气哈希就完全不同了。这里用字符 n-gram 的 Jaccard 系数兜底def shingles(text: str, n: int 5) - set[str]: t normalize(text).replace( , ) return {t[i:in] for i in range(len(t) - n 1)} def jaccard(a: str, b: str) - float: sa, sb shingles(a), shingles(b) return len(sa sb) / len(sa | sb) if sa | sb else 0.0中文提示词以短句为主n5是字符长度而不是词数5 个字符的片段足以区分大部分语义差异。阈值分两档0.85 以上直接判重保留source_url更权威的那条0.6 到 0.85 之间的进人工复核队列这批里经常藏着“同一目标、不同思路”的优质变体直接删掉反而亏。四种去重手段的分工可以固定下来手段适用场景代价MD5原文完全一致极低误杀少漏杀多归一化哈希格式差异、变量写法差异低需要维护占位符规则Jaccard同义改写、加减限定语中O(n²) 比对向量余弦跨语言、语义级近似高需嵌入服务4. 提示词库的本地检索与批量验证4.1 检索路线怎么选纯关键词检索快、可解释、零外部依赖问题是中文分词差搜“代码评审”命中不了“代码审查”。纯向量检索语义召回好但对一行长的短提示词区分度一般两个不同任务可能落在同一个簇里。常见做法是混合先用关键词把候选缩到几十条再用向量重排。4.2 SQLite FTS5 建索引与中文 bigram 处理-- 主表存储原始数据 CREATE TABLE prompts ( id TEXT PRIMARY KEY, title TEXT, body TEXT, tags TEXT, body_tok TEXT, -- 中文 bigram 后的检索列 model TEXT, source_url TEXT, updated_at TEXT ); -- 虚表只对检索列建索引 CREATE VIRTUAL TABLE prompts_fts USING fts5( title, body_tok, tags, contentprompts, content_rowidrowid, tokenizeunicode61 );FTS5 默认的unicode61分词器会把一整段中文当成一个长 token搜单个词几乎必然落空。解决办法是在入库前把中文切成二元组单独写进body_tok列def bigram(text: str) - str: t normalize(text).replace( , ) return .join(t[i:i2] for i in range(len(t) - 1))“代码评审”会变成代码 码评 评审用户搜“评审”时能命中评审这个 token。代价是索引体积大约翻倍短文本场景完全可接受。检索语句写成这样SELECT p.id, p.title, bm25(prompts_fts) AS score FROM prompts_fts JOIN prompts p ON p.rowid prompts_fts.rowid WHERE prompts_fts MATCH ? ORDER BY score LIMIT ?;bm25()在 FTS5 里返回的是负值数值越小越相关所以排序用默认的 ASC别想当然写成 DESC。4.3 参数表top_k、阈值、切片怎么设参数建议值影响top_k10 ~ 20太小漏召回太大重排成本上升余弦阈值0.35 ~ 0.5低于 0.3 基本是噪声chunk_size800 字以内整条提示词普遍短切碎反而丢语义overlap50 ~ 80 字仅超长提示词需要bigram n2中文场景 n2 命中与体积最平衡4.4 批量跑一遍验证提示词效果库里躺着几千条提示词真正用起来之前最好批量跑一轮看哪些是死条目。from openai import OpenAI client OpenAI(base_urlhttp://localhost:8000/v1, api_keysk-local) def run(prompt_body: str, sample: str) - dict: resp client.chat.completions.create( modellocal-model, messages[{role: user, content: prompt_body.replace({var}, sample)}], temperature0.2, # 验证阶段压低随机性便于横向对比 max_tokens512, timeout60, ) return {text: resp.choices[0].message.content, tokens: resp.usage.total_tokens}base_url指向本地推理服务换成任意兼容接口都能跑。temperature0.2是为了让不同提示词之间的差异更多来自提示词本身而不是采样随机性。{var}替换成同一批固定样本横向对比才有意义。跑之前记得串行加短间隔本地服务被并发打满时超时和掉线会伪装成“这条提示词不行”。4.5 排错速查搜不到先确认body_tok真的写入了再确认查询走的是 bigram 后的列。召回一堆无关条目提高余弦阈值顺便把“请”“你是一个”这类高频开头词加进停用表。同一提示词出现多条raw_hash列没建唯一索引或者归一化规则漏了某种占位符写法。批量调用大量超时先降并发再调timeout最后才怀疑模型服务。导出 PDF 后中文搜不到八成是字体没嵌入见下一章。5. 生成可检索的《21个AI提示词站点》PDF5.1 从库里导出 Markdown# export_md.py import sqlite3, pathlib con sqlite3.connect(prompts.db) rows con.execute(SELECT title, body, source_url FROM prompts ORDER BY id) lines [# AI 提示词站点收集, ] for title, body, url in rows: lines [f## {title}, , body, , f来源{url}, ] pathlib.Path(book.md).write_text(\n.join(lines), encodingutf-8)标题层级直接映射成 PDF 书签这是后面能被目录导航的前提别用加粗代替标题。5.2 Pandoc 转 PDF 的中文字体参数pandoc book.md -o prompts.pdf \ --pdf-enginexelatex \ --toc --toc-depth2 \ -V CJKmainfontNoto Sans CJK SC \ -V geometry:margin2cm--toc生成目录和 PDF 大纲书签CJKmainfont必须显式指定中文字体不指定就会输出一片方框。geometry:margin2cm控制页边距条目多的时候压缩到 1.5cm 能省不少页数。替代路线是 Markdown 转 HTML 再用浏览器打印适合不方便装 LaTeX 的机器。Windows 上自带的 Microsoft Print to PDF 驱动已经内置不需要额外下载浏览器打印对话框里直接选它就行Chrome 的 headless 打印模式更适合放进脚本。这条路对中文字体依赖小但浏览器打印默认不加书签目录层级会丢。5.3 让 PDF 真正可被检索的四个细节正文必须是文本层不要贴截图。贴图看着整齐搜索时一条都命中不了。字体子集嵌入换台机器打开才不会乱码。保留书签层级几十页的文档靠翻页找站点基本没戏。首页放一张站点索引表把 id、站点名、来源链接对齐排好人肉查找先看这一页。生成后花两条命令验证pdffonts prompts.pdf | head # 确认字体已嵌入 pdftotext prompts.pdf - | grep -c 提示词 # 确认文本层可提取输出非 0pdftotext的输出为 0说明正文是图片或者字体做了非常规处理得回到上一步换排版链路。顺带一提有 pdf 转 word、pdf 解析需求时也是先用pdftotext判断文本层是否存在——没有文本层的文档走 OCR有文本层的直接解析两条路的耗时差一个数量级。5.4 一键再生成脚本#!/usr/bin/env bash set -euo pipefail STAMP$(date %Y%m%d) python check_sites.py sites-report.txt python export_md.py pandoc book.md -o prompts-${STAMP}.pdf --pdf-enginexelatex --toc pdftotext prompts-${STAMP}.pdf - | wc -c # 文本层字节数异常时提前发现set -euo pipefail保证任何一步失败就中断不会拿一份半成品 PDF 当成果。文件名带日期历史版本自然留档下次站点清单有变动改完sites.yaml重跑一遍脚本就够了。本文还有配套的精品资源点击获取