Community编程与开发github.com

ummydev/ai-search

让网站对AI助手(ChatGPT、Claude、Perplexity、Gemini、Copilot、Google AI Overviews)可读、准确且可引用,确保它们正确描述产品并引用来源。

ai-search 是什么?

该技能专注于优化网站内容,使其能被主流AI助手(如ChatGPT、Claude、Perplexity等)准确抓取、理解和引用。其核心理念是“每个事实只写一次,随处渲染”,通过集中管理事实数据表、自动生成llms.txt文件、优化robots.txt访问策略、在关键页面顶部提供一句话定义、使用比较表格和FAQ、公开定价、以及通过结构化数据解决品牌名称冲突,系统性地提升网站在AI搜索中的可见性和准确性。该技能支持所有主流AI平台,并提供了详尽的检查清单和常见陷阱总结,帮助开发者避免重复踩坑。通过定期手动测试AI助手的回答并记录错误,形成持续改进的闭环。

兼容平台✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ummydev/marketing-team-skills/tree/HEAD/skills/ai-search

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

AI 搜索优化

当 AI 助手回答“什么是 X”、“X 的定价”或“Y 的最佳工具”时,它会抓取几个页面,提取句子和表格行,然后引用它们。如果一个事实没有以纯文本形式出现在页面上,AI 助手会猜测,或者引用写下这个事实的人。目标:让产品仅通过一次抓取就能被正确描述。

贯穿每个步骤的一个原则是:每个事实只写一次,到处渲染。 定义、状态(内测、开放注册、正式可用)、定价、支持的平台和关键 URL 都存放在一个源文件中;页面、llms.txt 和结构化数据都从该文件中读取。手动复制的事实会逐渐出现偏差。

工作流程

1. 编写事实表

创建 content/facts.ts(或 JSON/YAML),包含:产品名称和别名、一句话定义、目标用户、状态、套餐和价格、平台或集成、关键页面 URL 以及官方资料(GitHub、X、LinkedIn、Product Hunt)。在编写之前,先对照实际产品逐一检查每个条目。

2. 发布 /llms.txt

遵循 llmstxt.org 规范:一个 H1 标题(产品名称)、一个引用块摘要、几个纯文本事实,然后是 H2 级别的链接部分,格式为 - [标题](url): 内容说明。名为 Optional 的部分用于标记 AI 助手可以跳过的链接。

# Acme AI

> Acme AI 是一款发票匹配工具,可为小型财务团队协调 Stripe 付款与银行存款。它在浏览器中运行,连接 Stripe 和 Plaid。

- 目标用户:在 1-50 人公司中手动核对付款的财务主管。
- 状态:开放注册(自 2026 年 11 月起)。
- 定价 (https://acme.example/pricing):免费版,0 美元,每月最多 50 张发票;Pro 版,29 美元/月,不限发票数;团队版,79 美元/月,最多 10 个席位。价格以美元计。
- 注意不要混淆:Acme Anvil,一家无关的硬件公司。

## 关键页面
- [定价](https://acme.example/pricing):套餐、限制和包含内容。
- [Acme AI vs 竞品](https://acme.example/vs/rival):功能和价格比较,检查于 2026-11-06。

## FAQ
- Acme AI 免费吗?是的,每月最多 50 张发票。Pro 和团队版是付费的。

## 可选
- [博客](https://acme.example/blog):产品更新和指南。

从事实表和页面元数据生成(通过路由处理程序或构建脚本),这样新页面出现时无需手动编辑。以状态码 200、内容类型 text/plain 或 text/markdown; charset=utf-8 提供服务,无需登录、重定向或 JavaScript。检查:

curl -sI https://acme.example/llms.txt | head -5        # 200 和文本内容类型
curl -s  https://acme.example/llms.txt | head -30

3. 可选:添加 /llms-full.txt

你最希望被引用的页面的完整 Markdown 文本(产品、定价、比较、文档),每个在其自己的 # 标题 下,并带有 Source: <url> 行。在构建时生成。省略博客存档和任何过时的内容。

4. 链接到它

在页脚中放置一个纯文本的 llms.txt 链接,并在 <head> 中可选添加 <link rel="alternate" type="text/markdown" href="/llms.txt">。没有被链接到的文件只能由猜测路径的爬虫找到。

5. 允许 AI 爬虫访问(robots.txt 和 CDN)

User-agent所有者用途
OAI-SearchBotOpenAIChatGPT 搜索索引
ChatGPT-UserOpenAI获取用户询问的页面
GPTBotOpenAI模型训练
Claude-SearchBot / Claude-User / ClaudeBotAnthropic搜索索引 / 用户抓取 / 训练
PerplexityBot / Perplexity-UserPerplexity搜索索引 / 用户抓取
Google-ExtendedGoogleGemini 训练和引用的标记;不影响 Google 搜索或 AI Overviews
BingbotMicrosoftBing 索引,Copilot 从中回答

搜索和用户抓取代理决定你是否可以被引用。训练代理则是业务选择;希望被推荐的产品通常会允许它们。

User-agent: *
Allow: /
Disallow: /api/
Disallow: /app/

User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: GPTBot
User-agent: Claude-SearchBot
User-agent: Claude-User
User-agent: ClaudeBot
User-agent: PerplexityBot
User-agent: Perplexity-User
User-agent: Google-Extended
Allow: /
Disallow: /api/
Disallow: /app/

Sitemap: https://acme.example/sitemap.xml

爬虫只遵守其名字所在的组,因此命名的组必须重复每个 Disallow,否则会暴露你的私有路径。robots.txt 也无法覆盖 CDN:有些 CDN 提供“阻止 AI 爬虫”开关,无论 robots.txt 如何设置都会返回 403。抽查,然后在 CDN 的爬虫报告或服务器日志中确认真实爬虫的访问(验证了 IP 的 CDN 可能会区别对待伪造的 User-Agent):

curl -s -o /dev/null -w '%{http_code}\n' -A 'Mozilla/5.0 (compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)' https://acme.example/pricing

6. 在每个关键页面顶部放置一句话定义

紧接 H1 下方,在服务端渲染的 HTML 中:"<名称> 是一个 <类别>,用于 <为谁> <做什么>。" 第二句话给出差异化特点。在首页、llms.txt、Organization.description、目录列表和社交媒体简介中重复使用同一句话。口号(如“财务,重新构想”)无法为助手提供可引用的内容。许多 AI 抓取工具不执行 JavaScript,因此检查原始 HTML:

curl -s https://acme.example/ | grep -c "is an invoice-matching tool"     # 预期 1 或更多

7. 比较表格和 FAQ

  • 表格: 使用真实的 HTML <table>,每行一个产品,列包括买家询问的内容(价格、平台、是否开源、主要限制)。注明日期(如“Checked 2026-11-06”)。每个事实来自供应商自己的网站、文档、定价页面或 GitHub API。当供应商未发布某项信息时,写成“未发布”;绝不做估算。
  • FAQ: 以提问者的措辞作为标题;答案 2-4 句话,自成段落,第一句话直接回答问题。涵盖助手容易搞错的问题:价格、“是否免费”、“是否与 X 兼容”、“是否与 <同名产品> 相同”。FAQPage 标记是可选的;可视的问答才是被引用的内容。

8. 公开定价

提供 /pricing 页面,包含套餐名称、价格、货币、计费周期和限制,以文本形式呈现,而非仅通过图片或计算器。在 llms.txt 和 SoftwareApplication.offers 中镜像这些信息。答案和目录列表需要价格或定价模式(免费、免费增值、付费);没有这些信息,AI 助手会猜测或跳过你。如果付费计划尚未上线,请说明(如“Pro:即将推出;在此之前所有功能免费”)。

{ "@context": "https://schema.org", "@type": "SoftwareApplication", "name": "Acme AI",
  "applicationCategory": "BusinessApplication", "operatingSystem": "Web",
  "offers": [ { "@type": "Offer", "name": "Free", "price": "0", "priceCurrency": "USD" },
              { "@type": "Offer", "name": "Pro", "price": "29", "priceCurrency": "USD" } ] }

9. 品牌名称冲突时的组织机构和网站数据

如果搜索你的品牌名称首先显示另一个产品,请选择一个独特的名称形式(如“Acme AI”)并在所有地方使用它,同时使用结构化数据将不同变体关联到同一个实体:

{ "@context": "https://schema.org", "@type": "Organization",
  "name": "Acme AI", "alternateName": ["Acme", "acme.example"],
  "url": "https://acme.example/", "logo": "https://acme.example/logo.png",
  "description": "Acme AI 是一款发票匹配工具,可为小型财务团队协调 Stripe 付款与银行存款。",
  "sameAs": ["https://github.com/acme-ai", "https://x.com/acmeai", "https://www.linkedin.com/company/acme-ai"] }

添加一个 WebSite 对象,使用相同的 name 和 alternateName;Google 在搜索结果中使用它作为站点名称。sameAs 中只列出你控制的、并链接回网站的配置文件。

10. 保持品牌后缀一致

在所有地方使用同一个后缀:标题中的 | Acme AI,og:site_name 中的相同字符串,llms.txt 的 H1,社交媒体简介和 GitHub 组织。标题保持在 60 个字符以内(中文、日文和韩文约 30 个字符),关键词在前;只有当能容纳时再添加后缀。

11. 检查助手实际说了什么

每月一次,并在重大变更后,手动在 ChatGPT(开启搜索)、Perplexity、Claude、Gemini 和 Copilot 中询问 5-10 个提示:“什么是 Acme AI?”、“Acme AI 定价”、“最佳 <类别> 用于 <受众>”、“<竞品> 替代品”、“Acme AI vs <竞品>”。每次在正常界面中询问一个提示;不要编写脚本操作聊天 UI。将日期、助手、提示、是否被提及、引用的 URL 以及任何错误的记录到 docs/seo/ai-answers.md 中。修复每个错误事实背后的源页面,然后重新检查。对于流量,按引荐来源分段分析:chatgpt.com、perplexity.ai、claude.ai、gemini.google.com、copilot.microsoft.com。

检查清单

  • 事实表已存在;页面、llms.txt 和 JSON-LD 从其读取
  • /llms.txt 以文本形式返回 200,已生成,并在页脚中被链接
  • robots.txt 允许 AI 代理并重复了禁止规则;CDN 不阻止它们
  • 每个关键页面以原始 HTML 的一句话定义开头
  • 比较表格已注明日期并标明来源;未知项显示“未发布”
  • FAQ 答案自成段落,涵盖价格、“是否免费”和名称混淆
  • /pricing 是公开的;llms.txt 和 offers 与之匹配
  • Organization 和 WebSite 包含名称、别名、描述和 sameAs
  • 所有地方使用一个品牌后缀;标题在 60 个字符以内
  • 助手回答已记录;错误事实追溯到页面并已修复

我们遇到的陷阱

  • 没有公开定价。 /pricing 返回 404,llms.txt 和 SoftwareApplication 没有 offers,我们自己的比较表格不得不对自己写“未发布”。一个包含三个套餐文本的 /pricing 页面,镜像到 llms.txt 和 offers 中,解决了问题;付费层级标记为“即将推出”。
  • 状态漂移。 开放注册后,包括 llms.txt 在内的 9 种语言约 300 个文件仍写着“早期访问”。现在状态来自一个常量。
  • 无人链接的文件。 审计发现没有页面链接到 llms.txt,没有 llms-full.txt,站点地图中也没有 lastmod。
  • robots.txt 组覆盖。 为 AI 爬虫单独创建一个组而不重复禁止规则,会使得 API 和登录路径向它们开放。
  • 品牌冲突。 搜索我们的品牌名称首先显示一个同名的排班调度应用。我们在标题、alternateName 和 sameAs 中切换为“<名称> AI”。
  • 截断且不一致的标题。 49 个英文标题为 57-88 个字符,后缀混合。我们将它们截断到 60 个字符或更少,关键词在前,仅当能容纳时才加后缀。
  • 竞品页面抓取不可靠。 一个研究子代理抓取的竞品定价页面看起来像被篡改过;我们在真实浏览器中确认后才发布。另一个供应商的定价页面向抓取器返回 403,因此我们从他们的文档中获取价格并说明了来源。
  • 过早写“免费”。 在定价发布之前,我们写了“未发布”,而不是“免费”。助手会重复页面上说的任何内容。

相关技能

  • seo-page:定义、表格和 FAQ 所在的页面模板。
  • competitor-pages:比较和替代品页面,助手会大量引用。
  • programmatic-pages:大规模生成 llms.txt 部分和结构化数据。
  • multilingual-seo:每种语言的本地化定义、标题和后缀长度。
  • keyword-research、trend-keywords:要回答的问题和要测试的提示。
  • index-push:让页面被爬取;Bing 的索引为 Copilot 提供数据。
  • seo-daily-report:AI 推荐流量作为独立行出现在报告中。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

ummydev/index-push

When the user wants to get new or changed pages crawled and indexed by Google and Bing quickly, instead of waiting weeks for the sitemap to be read. Use after any deploy that adds or updates pages, and when the user says "get this indexed", "request indexing", "submit to Google", "submit URLs to Bing", "IndexNow", "ping search engines", "resubmit the sitemap", "why isn't my page indexed", "Discovered – currently not indexed", "URL is unknown to Google", "Quota Exceeded in Search Console" or "indexing queue". Covers IndexNow, Search Console URL Inspection and sitemaps, Bing Webmaster URL submission, a prioritized queue file, and diagnosing pages that stay out of the index.

ummydev/remotion-video

When the user wants to make a vertical promo video of their own software product in code with Remotion, rebuilding the product's real UI instead of screen-recording it, with a TTS voice-over, captions timed to the voice and camera moves that zoom into details. Use when the user says "Remotion", "make a product video", "faceless demo video", "UI motion video", "programmatic video", "product reel", "animate our UI", "render the video", or wants a TikTok or Reels video about their app that an agent can re-render after every change.

ummydev/short-video-formats

When the user wants to choose or plan the format of a promo short video for TikTok, Instagram Reels, YouTube Shorts or Xiaohongshu, especially for a software product, dev tool or AI agent. Covers the four formats that carry this category (talking head over a demo, phone filming the screen, faceless UI demo, talking-head open into full-screen demo), screen layout rules, hooks and endings like "comment X and I'll send it", and how to make an AI presenter. Use when the user says "what kind of video should we make", "video format", "talking head", "faceless video", "AI presenter", "AI avatar", "UGC style", "hook ideas", "how should the first frame look", "comment to get the link", or "视频形式".

ummydev/video-retro

When the user wants to review how their short videos performed on TikTok, Instagram Reels or other platforms and decide what to make next. Covers reading views, likes, comments, saves and follows without scraping, the stats log, 24-hour and 72-hour checks, comparing topics, formats and hooks, the daily report and recording what to change. Use when the user says "how did the video do", "video stats", "复盘", "retro", "which videos worked", "why did this flop", "weekly video report", "update the stats", or at the start or end of a short-video working day.

相关技能