十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

为AI Agent打造“人肉搜索引擎”:从零实现跨平台搜索Skill

为AI Agent打造“人肉搜索引擎”:从零实现跨平台搜索Skill 让 AI Agent 从通用问答走向真正能干活的工具关键往往不在模型本身而在于它能调用哪些能力。这里说的能力在 Agent 生态里有一个专门概念叫 Skill。你可以把 Skill 理解成一份打包好的技能文件它告诉 Agent 什么时候该用这个能力、需要提供哪些参数、底层调用什么接口、结果按什么结构返回。今天要拆解的这个 Skill 方向是给 Agent 装上一个“人肉搜索引擎”让它能去 Reddit、X、YouTube 这类公开讨论平台把真实用户正在聊的内容搜回来。相比模型自己“编”出来的答案这类 Skill 的价值在于它拿回的是当下真实发生的讨论而不是训练数据里的旧记忆。这篇文章会从 Skill 的概念讲起然后一步步完成一个可运行的human_searchSkill。内容包括目录结构、SKILL.md 写法、Reddit/X/YouTube 三个平台的搜索实现、聚合去重、命令行验证以及上线后常见的限流、空结果、Agent 不识别 Skill 等问题的排查方法。看完之后你不仅能照着写一个自己的搜索 Skill还能理解 Skill 在 Agent 工程里为什么值得被单独抽象一层。1. 先理解 Skill 在 AI Agent 里到底解决什么问题1.1 Skill 是“能力包”不是普通函数在 Agent 开发里我们经常听到几个相近的词Prompt、Tool、Function Call、Plugin、Skill。它们容易混淆但定位不同。Tool 和 Function Call 偏向单次调用比如“查天气”“算价格”Prompt 是给模型的指令文本而 Skill 是一整套可复用能力的最小交付单元。可以这样理解Tool 是一个函数Skill 是一本“使用说明书 实现代码 用例”的打包文件。Agent 看到当前任务后先读 Skill 的描述文件判断这个任务是否需要启用某个技能如果匹配再调用技能里的脚本最后把脚本返回的结构化结果交给模型组织成回答。在实际项目中Skill 通常包含四部分描述文件告诉 Agent 这个技能做什么、在什么场景触发、需要什么参数。可执行脚本真正完成任务的代码比如拉取接口、解析网页、处理文件。示例数据给 Agent 或开发者看的输入输出样例帮助判断匹配是否准确。校验与测试验证脚本在边界条件下不会把错误结果当作正常结果返回。这样设计的核心原因是能力复用。同一个搜索逻辑今天给市场调研 Agent 用明天给内容选题 Agent 用只要封装成 Skill就不需要每处都重复写一遍接口调用和解析逻辑。1.2 为什么“人肉搜索引擎”值得做成 Skill大模型最明显的短板之一是它无法主动获取实时信息。模型回答依赖训练数据而训练数据有截止时间。如果你想了解“最近社区对某个开源项目的真实评价”直接问模型它只能给出泛泛而谈的推测这种场景需要的是真实用户讨论也就是帖子、推文、视频评论里的内容。把这些平台搜索能力做成 Skill有几个实际价值输入输出可以标准化。无论搜 Reddit 还是 YouTube本质上都是“关键词 数量 时间范围”返回“标题 链接 来源 发布时间 摘要”。这种稳定接口非常适合 Agent 调用。结果可以被验证。Skill 返回的每一条结果都带有 URL模型可以引用来源读者可以点开核对这比模型生成的“可能有用”的总结可靠得多。可以复用。同一份代码可以服务选题调研、竞品分析、用户反馈收集、SEO 关键词挖掘等多个任务而不需要每次重新开发。从 Agent 工程角度看搜索类任务是 Skill 的典型场景任务边界清楚、参数明确、结果结构化、外部接口稳定、失败模式可预期。1.3 Skill 的调用链路一个完整的调用链路可以这样描述用户提问 - Agent 主模型判断意图 - 检索并匹配 Skill 描述 - 调用 Skill 脚本 - 脚本请求外部平台接口 - 解析返回结果 - 输出结构化 JSON - 主模型结合结果组织回答。这里有一个容易被忽略的点Agent 主模型不是直接调用平台接口而是先“读懂”Skill 的描述再决定调不调、怎么调。所以 SKILL.md 里描述写得清不清楚直接影响 Skill 能不能被正确命中。描述太模糊Agent 可能该用的时候不用描述太复杂Agent 可能被干扰。这是后面第 3 节重点讲的内容。2. 设计搜索 Skill 之前先盘清三个平台的能力边界2.1 三个平台各能搜到什么Reddit、X、YouTube 表面都是“社区内容”但搜索价值完全不同。Reddit 是讨论型社区搜索价值在于帖子标题、正文和评论里的深度观点。用户会在这里对比工具、给反馈、写长文踩坑经验适合做产品口碑调研和技术方案论证。X 是短文本实时流搜索价值在于当下发生的讨论和即时反应。某个版本发布、某个功能上线、某个话题被热议通常都能在 X 上看到最快反馈。它的特点是时效性强、信息密度高但噪声也大。YouTube 是视频内容平台搜索价值在于视频标题、标签和简介里的信息。技术教程、产品体验视频、会议录播都在这个生态里。需要注意Data API v3 的搜索接口返回的是视频元信息不是视频字幕或评论内容如果想搜索视频里的具体台词那是另一个维度的问题。三个平台合在一起覆盖了“讨论型社区 实时社交媒体 视频内容”三类形态基本能满足一个“人肉搜索引擎”的初级需求。2.2 接口能力与访问方式对照开始写代码之前先明确每个平台的接口类型和权限模式避免做着做着才发现某个平台根本搜不了。平台常见接口认证方式关键限制适合搜索的内容RedditOAuth2 /api/search或 PRAW 库client_id、client_secret、user_agent需要设置 User-Agent匿名请求容易限流帖子标题、正文、子版块内容XAPI v2tweets/search/recentBearer Token 或 OAuth 2.0配额受账号权限影响常见权限只能搜最近一段时间关键词近况推文、话题讨论YouTubeData API v3youtube.search.listAPI Key 或 OAuth 2.0按配额计费默认每天 10000 单位搜索一次约 100 单位视频标题、描述、标签X 的搜索特别说明一点普通开发者账号能访问的搜索范围通常有限常见的是近 7 天搜索窗口完整历史检索需要更高权限的账号。不同时期、不同账号的配额差异很大落地前一定要以自己账号后台实际显示的权限为准。2.3 环境准备与密钥管理本机开发环境建议使用 Python 3.9 以上版本。三个平台只需要两个依赖核心库requests负责 X 和 YouTube 的 HTTP 调用praw负责 Reddit 的封装调用python-dotenv负责读取本地环境变量。环境要求可以整理成一张表依赖版本建议作用Python3.9运行脚本requests2.31X、YouTube 接口请求praw7.7Reddit API 封装python-dotenv1.0读取.env密钥文件各平台密钥按官方申请认证与配额控制密钥不要写死在代码里。项目里维护一份.env.example把真实密钥放到.env并在.gitignore里忽略.env。生产环境如果部署在服务器上建议改用专门的密钥管理服务或环境变量注入不要把密钥文件带进镜像。# .env.example REDDIT_CLIENT_IDyour_reddit_client_id REDDIT_CLIENT_SECRETyour_reddit_client_secret REDDIT_USER_AGENThuman_search_script/1.0 X_BEARER_TOKENyour_x_bearer_token YOUTUBE_API_KEYyour_youtube_api_key注意REDDIT_USER_AGENT不是可选项。Reddit 要求每个请求带一个能标识应用身份的 User-Agent直接使用默认 Python 爬虫 UA 很容易触发限流。写一个形如应用名/版本号的字符串即可。3. 搭建 Skill 目录SKILL.md 决定 Agent 能不能认出它3.1 Skill 目录结构一个搜索 Skill 的目录可以这样组织human_search/ ├── SKILL.md ├── search.py ├── requirements.txt ├── .env.example ├── examples/ │ ├── example_1.json │ └── example_2.json └── tests/ └── test_search.py逐项说明SKILL.md技能描述文件Agent 通过它判断什么时候调用。search.py真正的搜索逻辑支持命令行直接运行也支持被 Agent 子进程调用。requirements.txt依赖清单。.env.example密钥模板。examples/输入输出示例方便人工验证和 Agent 理解返回结构。tests/边界测试至少覆盖空结果、错误密钥、网络超时三类场景。这样的目录结构不是为了好看而是为了让“人能用、Agent 能用、测试能跑”。如果你使用的是 Claude Code、Codex 这类编码 Agent 的 Skill 机制通常会约定一个技能根目录你只需要把human_search整个目录放进去并在描述文件里把触发条件写清楚。3.2 SKILL.md 怎么写SKILL.md是 Agent 决定是否调用 Skill 的依据。写它的核心原则是让模型看到任务描述时能准确判断“这个任务归我管”。一份可用的 SKILL.md 示例如下--- name: human_search description: 搜索 Reddit、X、YouTube 等公开平台上的真实用户讨论内容返回带标题、链接、来源、发布时间和摘要的结果列表。适合产品反馈调研、选题挖掘、技术方案口碑对比、热点事件讨论收集等场景。 version: 1.0.0 ---正文部分建议写清楚输入参数query必填platforms可选默认三个平台全搜。输出格式JSON字段包括source、title、url、author、published_at、snippet。执行方式命令行运行python search.py --query 关键词 --platforms reddit,x,youtube。失败处理某个平台失败时不要整体报错返回其余平台的结果并在结果里标记异常平台。description不要写得太短。只说“搜索互联网”是不够的模型无法区分这个 Skill 和通用搜索有什么区别。应该明确“Reddit、X、YouTube”“真实用户讨论”“口碑调研”这些关键触发词。但也不要写成一篇论文描述控制在两三句能读完的分量最好。3.3 搜索参数和返回结构定义为了让 Agent 能稳定调用参数必须收敛。不要设计二十个未命名参数Agent 会不知道怎么填。建议只保留这几个参数类型默认值说明--querystr必填搜索关键词支持平台相关语法--platformsstrreddit,x,youtube逗号分隔的待搜索平台--limitint10每个平台最多返回条数--subredditstr空限定 Reddit 子版块空则搜索全部--daysint7时间过滤窗口默认近 7 天--outputstrjson输出格式可选json或markdown返回结构统一成 JSON方便 Agent 解析{ query: flutter 状态管理, platforms: [reddit, x, youtube], ts: 2026-02-14T10:30:00Z, total: 23, items: [ { source: reddit, title: Flutter 状态管理选型经验分享, url: https://www.reddit.com/r/FlutterDev/comments/xxx, author: some_user, published_at: 2026-02-12, snippet: 我们在两个项目中对比了 Riverpod 和 Bloc结论是... } ] }这里的snippet建议截断到 200 字以内。太长会占用 Agent 上下文太短又无法让模型判断内容是否相关。200 字是一个相对折中的选择。4. 核心实现用一个 search.py 聚合三个平台4.1 统一入口和参数解析命令行入口是 Skill 与外部通信的稳定通道。Agent 无论用什么语言编写都可以通过子进程调用这个脚本只要参数约定不变。#!/usr/bin/env python3 import argparse import json import os import sys import time from dotenv import load_dotenv load_dotenv() def parse_args(): parser argparse.ArgumentParser(descriptionSearch public community platforms.) parser.add_argument(--query, requiredTrue, helpsearch keyword) parser.add_argument(--platforms, defaultreddit,x,youtube, helpcomma separated platforms) parser.add_argument(--limit, typeint, default10, helpmax items per platform) parser.add_argument(--subreddit, default, helpreddit subreddit filter) parser.add_argument(--days, typeint, default7, helptime window) parser.add_argument(--output, defaultjson, choices[json, markdown], helpoutput format) return parser.parse_args()这里把load_dotenv()放在脚本顶部是为了本地调试方便。生产环境如果通过进程环境注入密钥load_dotenv()不会覆盖已有的环境变量所以不影响。输出在脚本末尾处理json格式直接打印 JSONmarkdown格式则渲染成一个带链接的列表。这样 Agent 既可以拿结构化 JSON 继续加工也可以把 Markdown 直接拼进回答里给用户看。4.2 Reddit 搜索实现Reddit 用 PRAW 库封装比较省事。需要先初始化一个只读客户端然后调用搜索接口。import praw def build_reddit_client(): return praw.Reddit( client_idos.getenv(REDDIT_CLIENT_ID), client_secretos.getenv(REDDIT_CLIENT_SECRET), user_agentos.getenv(REDDIT_USER_AGENT, human_search_script/1.0), ) def search_reddit(reddit, query, limit10, subreddit, days7): kwargs { query: query, limit: limit, sort: relevance, } if days: kwargs[time_filter] week if days 7 else month if subreddit: results reddit.subreddit(subreddit).search(**kwargs) else: results reddit.subreddit(all).search(**kwargs) items [] for post in results: items.append({ source: reddit, title: post.title, url: fhttps://www.reddit.com{post.permalink}, author: post.author.name if post.author else , published_at: time.strftime( %Y-%m-%d, time.localtime(post.created_utc) ), snippet: (post.selftext or post.url or )[:200], }) return items这里用time_filter控制时间窗口Reddit 只支持hour、day、week、month、year这几个粒度。days参数大于 7 时映射到month这是一个简单但不精确的处理方式如果你的调研对时间精度要求高可以在参数定义阶段直接改成枚举值而不是自由整数。post.selftext可能是空字符串因为很多 Reddit 帖子的正文在评论区里主帖只有一个标题。这种情况snippet会退化为取 URL虽然信息量有限但至少保证结构完整。4.3 X 搜索实现X 的 API v2 搜索不依赖第三方库直接用requests请求tweets/search/recent接口即可。import requests def safe_get(url, headersNone, paramsNone, timeout15): resp requests.get(url, headersheaders, paramsparams, timeouttimeout) resp.raise_for_status() return resp.json() def search_x(bearer_token, query, limit10, days7): if not bearer_token: return { source: x, error: missing bearer token, items: [], } headers {Authorization: fBearer {bearer_token}} params { query: query, max_results: min(limit, 100), tweet.fields: created_at,author_id,text, } data safe_get( https://api.twitter.com/2/tweets/search/recent, headersheaders, paramsparams, ) items [] for tweet in data.get(data, []): items.append({ source: x, title: tweet.get(text, )[:80], url: fhttps://x.com/user/status/{tweet[id]}, author: tweet.get(author_id, ), published_at: tweet.get(created_at, )[:10], snippet: tweet.get(text, )[:200], }) return itemsX 搜索有几个容易被坑的点。第一query支持运算符比如flutter lang:en或flutter -ads这些语法可以提高精度但也可能导致结果为空。第二max_results最大是 100不是你传多少它给多少。第三URL 里的x.com是展示链接底层接口地址目前仍是api.twitter.com不同时期的域名以官方文档为准。代码里对bearer_token做了前置判断。这个判断很重要X 的付费配额门槛导致不是每个开发者都有可用的 token如果没有 token 就让整个 Skill 崩溃体验会很差。更合理的做法是返回一个 error 标记让上层 Agent 决定是跳过 X 还是降级到其它平台。4.4 YouTube 搜索实现YouTube Data API v3 的搜索接口使用 API Key 即可不需要 OAuth 用户授权适合只读搜索场景。def search_youtube(api_key, query, limit10): if not api_key: return { source: youtube, error: missing api key, items: [], } params { part: snippet, q: query, maxResults: min(limit, 50), type: video, relevanceLanguage: zh, key: api_key, } data safe_get( https://www.googleapis.com/youtube/v3/search, paramsparams, ) items [] for item in data.get(items, []): snippet item.get(snippet, {}) video_id item.get(id, {}).get(videoId, ) items.append({ source: youtube, title: snippet.get(title, ), url: fhttps://www.youtube.com/watch?v{video_id}, author: snippet.get(channelTitle, ), published_at: snippet.get(publishedAt, )[:10], snippet: (snippet.get(description, ) or )[:200], }) return itemsYouTube 的配额机制要特别留意。默认每天 10000 单位一次search.list调用大约消耗 100 单位。也就是说默认配额下一天只能调用约 100 次搜索。如果这个 Skill 被多个人共用或者 Agent 每小时自动跑选题调研配额会很快用完。所以必须加缓存这是 4.5 节要做的事。relevanceLanguage参数按需设置不是必须的。如果需要中英文混合结果建议去掉让 YouTube 自己按相关度排序。4.5 聚合、排序与缓存三个平台的搜索结果拿回来之后不能直接返回。要做三件事合并、去重、按时间排序。def aggregate(platform_results, limit): all_items [] for result in platform_results: if items not in result: continue all_items.extend(result[items]) seen set() deduped [] for item in all_items: if not item.get(url): continue if item[url] in seen: continue seen.add(item[url]) deduped.append(item) deduped.sort(keylambda it: it.get(published_at, ), reverseTrue) return deduped[: limit] def cache_get(cache_file, ttl_seconds3600): if not os.path.exists(cache_file): return None if time.time() - os.path.getmtime(cache_file) ttl_seconds: return None try: with open(cache_file, r, encodingutf-8) as f: return json.load(f) except (json.JSONDecodeError, OSError): return None def cache_set(cache_file, data): try: os.makedirs(os.path.dirname(cache_file) or ., exist_okTrue) with open(cache_file, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) except OSError: pass缓存的 key 可以用查询条件和平台组合生成比如cache/human_search_{hash}.json。缓存 TTL 建议设置为 1 小时舆情和热点场景对时效要求高缓存时间太长会把旧讨论当新热点。缓存文件的路径应该放在运行目录下不要写进源码目录避免污染 Skill 代码。另外去重只按 URL 做是不够的。同一个视频可能在不同来源里出现但 URL 都指向同一个 YouTube 链接这没问题如果同一个讨论被多个平台转发URL 不同就不会被去重。更严格的做法是再按“标题相似度”去重但这对小 Skill 来说成本偏高按 URL 去重已经能处理大部分重复场景。main()函数最后把聚合结果输出为 JSON 或 Markdowndef main(): args parse_args() platforms [p.strip() for p in args.platforms.split(,) if p.strip()] results [] if reddit in platforms: reddit build_reddit_client() results.append({ source: reddit, items: search_reddit(reddit, args.query, args.limit, args.subreddit, args.days), }) if x in platforms: results.append({ source: x, items: search_x(os.getenv(X_BEARER_TOKEN, ), args.query, args.limit, args.days), }) if youtube in platforms: results.append({ source: youtube, items: search_youtube(os.getenv(YOUTUBE_API_KEY, ), args.query, args.limit), }) items aggregate(results, args.limit) if args.output markdown: for it in items: print(f- [{it[source]}] [{it[title]}]({it[url]}) {it[published_at]}) else: print(json.dumps({query: args.query, total: len(items), items: items}, ensure_asciiFalse, indent2)) if __name__ __main__: main()5. 运行验证从命令行到 Agent 调用5.1 直接运行脚本验证依赖安装完成后先安装依赖pip install -r requirements.txt然后执行一次搜索python search.py --query AI agent 开发 --platforms reddit,x,youtube --limit 8 --days 7如果三个平台密钥都配置正确输出会是 JSON并且total大于 0。如果某个平台密钥缺失该平台会返回 error 标记但脚本不会崩溃。这个行为是有意设计的Skill 面向 Agent 调用时局部失败比整体失败更友好。验证时建议分两步走。第一步只搜一个平台减少排查范围python search.py --query AI agent --platforms reddit --limit 5确认 Reddit 正常后再逐个加上 X 和 YouTube。不要第一次就同时调三个平台否则出现 403 时你很难判断是哪一家的密钥问题。5.2 在 Agent 框架里注册 Skill不同 Agent 框架对 Skill 的注册方式不同但核心逻辑一致把human_search目录放到框架约定好的技能目录中框架会加载SKILL.md的name和description并在对话中决定何时调用。以常见的编码 Agent 为例注册后你可以这样测试请查一下最近社区对 Riverpod 和 Bloc 的讨论重点看 Reddit 和 X帮我总结两边各有什么倾向。如果 Agent 正确识别了 Skill它应该会执行类似这样的命令python search.py --query Riverpod vs Bloc --platforms reddit,x --limit 10 --days 14然后基于返回的 JSON 组织回答。这一步是整个 Skill 是否真正有价值的验收环节不是脚本能跑而是 Agent 能在没有你提示“去调用 human_search”的情况下自动决定调用。5.3 验证用例设计建议至少跑这些用例覆盖正常和异常路径用例输入预期结果基本搜索--query python asynciototal 0字段齐全限定子版块--query rust --subreddit rust结果全部来自 r/rust空结果关键词--query zzz_no_such_word_2026total 为 0不报错缺少密钥删除.env中的一个密钥对应平台返回 error 标记网络异常断网后运行脚本抛出异常能打印可读错误时间过滤--days 30Reddit 映射到 monthX 和 YouTube 按接口能力过滤其中“缺少密钥”这个用例最能检验 Skill 的健壮性。很多脚本在密钥缺失时直接抛TypeError给 Agent 返回一堆无意义堆栈这不是一个合格的 Skill。6. 常见坑与排查链路6.1 请求返回 403、限流或密钥失效问题现象常见原因检查方式处理建议Reddit 返回 403未设置 User-Agent 或 UA 过于通用检查请求头里的 User-Agent使用应用名/版本号格式的 UAReddit 频繁 429请求频率过高查看 PRAW 输出的限流日志增加 sleep 或使用指数退避X 返回 403 或 401Bearer Token 无效或权限不足单独 curl 一次tweets/search/recent确认账号是否有搜索权限检查 token 是否过期YouTube quota 超限配额用完查看 Google Cloud 配额页面加缓存、降低调用频率或申请更高配额碰到 403 时不要先怀疑代码。先用命令行工具单独验证接口能不能通比如curl -s -H Authorization: Bearer $X_BEARER_TOKEN \ https://api.twitter.com/2/tweets/search/recent?queryaimax_results10 | head如果 curl 都失败说明是令牌、权限或网络问题与 Python 代码无关。6.2 搜索返回为空或缺字段空结果不等于 Bug但要判断是“真的没人聊”还是“查询条件把结果过滤掉了”。常见情况有三种第一X 的query不支持中文空格分词直接搜索“AI agent 开发”会被当成一个精确短语匹配不到内容。建议把长查询拆成AI agent与开发两个词用空格连接或用 OR 运算符。第二Reddit 的time_filter设置过于严格比如限定day而某个话题的讨论集中在三天前结果自然为空。第三YouTube 的relevanceLanguage限制了语言如果内容不是中文会被过滤掉。排查顺序是先去掉时间过滤、语言过滤只保留关键词确认能搜到结果后再逐步加上过滤条件找到是哪个条件把结果过滤没了。6.3 Skill 没有被 Agent 识别或调用这个坑最隐蔽因为代码本身没问题但 Agent 就是不调用它。原因通常出在 SKILL.mddescription太泛Agent 无法把这个 Skill 和“用户询问社区反馈”这个意图关联起来。技能目录的文件名或name字段与其它 Skill 重复导致框架加载冲突。脚本依赖没有安装Agent 尝试调用时直接失败后续就会减少调用频率。排查时先检查两件事第一name是否全局唯一第二description是否包含用户任务里的关键词。比如用户说“查一下大家怎么评价这个框架”描述里如果完全没有“评价”“讨论”“口碑”这类词Agent 很可能不会触发这个 Skill。可以在描述里直接写明触发场景“当用户想了解某主题在社区的真实讨论、口碑、反馈时使用本 Skill”。6.4 上线前快速排查清单每次新增或修改 Skill 后按这个清单过一遍密钥是否已注入且没有写进代码仓库。SKILL.md 的description是否覆盖真实触发场景。脚本对空结果、缺失密钥、网络异常是否有明确处理。是否设置了缓存TTL 是否合理。是否遵守平台速率限制有没有退避重试。日志是否记录了 query、耗时、结果数量和错误信息。是否保留降级方案某个平台不可用时其它平台还能正常工作。这个清单可以直接打印出来作为 Skill 提交评审时的检查项。7. 生产环境最佳实践与扩展方向7.1 Skill 编写规范把 Skill 当做一个独立交付物而不是一个临时脚本编写时建议遵守以下规范描述文件必须写清楚触发场景、参数、输出格式、失败模式。描述是给模型看的不是给人看的语言要贴近真实用户提问。脚本保证幂等。同一查询重复执行不应产生副作用结果应该一致或至少不破坏数据。统一返回 schema。所有平台返回同一结构上层 Agent 不需要针对每个平台写不同解析逻辑。局部失败降级。某个平台报错时返回 error 标记而不是中断整个 Skill。记录调用日志。至少记录 query、各平台耗时、结果数量、错误信息方便事后排查配额和限流问题。7.2 安全、合规与稳定性生产环境比本地开发多三件事密钥管理、配额监控、合规边界。密钥管理上不要使用.env文件进镜像。使用环境变量注入或专业的密钥管理服务并严格控制权限范围。搜索类 Skill 只需要只读权限不要申请额外写权限降低密钥泄露后的影响面。配额监控上X 和 YouTube 都有配额限制建议在脚本里记录每次调用的配额消耗输出到监控平台。当配额使用率达到 80% 时告警而不是等 429 报错才反应过来。合规边界上搜索 Skill 调用的是平台官方公开接口应遵守平台服务条款和速率限制。不要绕过接口去抓取需要登录才能看到的页面也不要把搜索结果用于违反平台规则的目的。接口权限、搜索结果范围和授权范围都以官方文档为准。7.3 扩展方向这个 Skill 的架构留了很好的扩展位。后续可以在不改动主入口的前提下做这些扩展增加平台。GitHub 搜索 Issue 和 Discussion、Hacker News 搜索、知乎搜索都可以按同样的“参数 - 搜索 - 解析 - 聚合”模式接入。增加搜索维度。当前搜的是帖子和视频扩展后可以搜 Reddit 评论、YouTube 评论获得更细粒度的用户反馈。增加语义分析。拿到结果后交给 Agent 做情感倾向、话题聚类、关键词提取把“搜索 Skill”变成“洞察 Skill”。增加定时任务。对固定关键词定时执行生成趋势报表适合竞品监控和舆情跟踪场景。增加结果持久化。把搜索结果写入数据库形成历史库后续可以做对比分析和趋势判断。如果只记一句话Skill 的核心不是“能搜到什么”而是让 Agent 在正确的任务场景下用明确的参数调用可验证的脚本并返回能被上层模型直接消费的结构化结果。照着这个思路写你的第一个 AI Agent Skill 就不会停留在玩具阶段。
返回列表