研究
把一个问题变成有来源的研究简报
先问一遍网页,把答案背后的页面抓成 Markdown,再加入 X 上的实践者声音,最后把证据存进一个之后还能继续查询的 LiveDoc。
复制 prompt
把方括号里的字段替换掉,然后粘贴到 Claude Code、Codex 或任何能访问终端的 AI。它会安装 Felo skill、在花额度前询问,并执行这套 workflow。
为[问题或决策]制作一份带来源的研究简报。 范围:[市场、地区、语言]。时间范围:[过去 30 天 / 过去 12 个月]。读者:[谁会读]。深度:[一页速览 / 完整简报]。 输出一份 Markdown 简报,包含: 1. 用三条要点给出简短回答。 2. 证据表:主张、来源标题、URL、发布日期。 3. 来源之间存在分歧的地方。 4. 仍然未知的内容。 5. 完整来源列表。 规则: - 每个事实性主张都要有来源链接。区分事实、观点和你自己的推断。 - 不要编造引文、指标、日期或来源。数据缺失时写“暂无数据”,不要写零。 - 优先使用一手来源。X 只用于观察从业者信号,不作为证据。 - 把时间范围落实为明确的开始和结束日期,并注明时区。 - 消耗额度前,先展示计划执行的 API 调用并等待我批准。 - 不要创建定时任务、发送消息或发布任何内容。 - 将结果写入 ./research-brief.md,并在对话中总结。
复制的内容也包含安装步骤和安全规则。
你会得到什么
一次运行的示例输出,不是实时生成。
小模型会取代支持机器人里的大模型吗?
简短回答
- 小模型在分类和一线回答上已经足够好。
- 瓶颈是检索质量,不是模型大小。
- 切换的团队报告的是单工单成本下降,而不是解决率上升。
| 主张 | 来源 | 日期 |
|---|---|---|
| 检索质量决定回答质量 | https://example.com/rag-eval | 2026-10-12 |
| 单个已解决工单成本下降 38% | https://example.com/support-case | 2026-09-28 |
来源分歧
厂商基准显示几乎持平;独立测试在多步退款上仍有差距。
仍然未知
这个差距会因更好的工具使用而缩小,还是需要更大的模型。
实际调用
给开发者:同一套 workflow 的可复制代码,按执行顺序排列。
展开实际 API 调用
向网页提问
Chat 会搜索网页、给来源排序、写出答案,并返回用到的资源。保留前三个来源:后面的每一步都会沿着其中一条链接继续。下面的 helper 只发送一次 Key,非 2xx 响应会抛错。
research.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } type ChatData = { data: { answer: string; resources: { link: string; title: string }[] }; }; export async function answer(question: string) { const chat = await felo<ChatData>("/v2/chat", { query: question }); return { answer: chat.data.answer, sources: chat.data.resources.slice(0, 3) }; }示例输出
{ "answer": "近期进展包括……", "sources": [ { "link": "https://example.com/article", "title": "……" } ] }抓取答案背后的页面
只有摘要不够。开启 readability 后用 Markdown 抓取整页,让引语和标题保留下来,同时去掉导航等噪音。再次请求同一个 URL 会命中提取缓存。
research.ts type ExtractData = { data: { content: string } }; const pages = await Promise.all( sources.map((source) => felo<ExtractData>("/v2/web/extract", { url: source.link, output_format: "markdown", with_readability: true, with_cache: true, }).then((page) => ({ ...source, content: page.data.content })), ), );示例输出
// pages[0].content "# 示例文章\n\n提取出的正文……"
补上 X 上的声音
新闻覆盖的是发布,X 覆盖的是人们在实践里遇到的东西。搜索最近七天,并保留作者和时间戳,让简报可以标注每一条主张的出处。增大
limit可以扩大范围;每一页结果都会带 cursor。research.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; }[]; }; }; const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000); const social = await felo<XData>("/v2/x/tweet/search", { query: question, limit: 10, since_time: since, });示例输出
{ "data": { "tweets": [ { "content": "……", "author": { "username": "……" }, "created_at": "……" } ] } }把证据存进 LiveDoc
创建一个 LiveDoc,把来源作为 URL 资源加进去。API 会对已经见过的 URL 去重,并为每个 URL 返回 resource id,这样后来的问题可以直接检索同一批证据,而不必再次抓取。
research.ts type LiveDocData = { data: { short_id: string } }; const doc = await felo<LiveDocData>("/v2/livedocs", { name: `Research: ${question.slice(0, 60)}`, description: "Sources collected while answering the question", }); await felo(`/v2/livedocs/${doc.data.short_id}/resources/urls`, { urls: sources.map((source) => ({ url: source.link, title: source.title })), }); console.log(doc.data.short_id); // keep this for later queries之后再问这批证据
这才是回报:下一个问题在 LiveDoc 上做语义检索,而不是重新翻开放网络。只有想限定到已知子集时,才传
resource_ids。research.ts type Retrieved = { data: { title: string; content: string; score: number }[]; }; async function ask(livedoc: string, query: string) { const hits = await felo<Retrieved>( `/v2/livedocs/${livedoc}/resources/retrieve`, { query }, ); return hits.data.filter((hit) => hit.score >= 0.7); }示例输出
[ { "title": "……", "content": "……", "score": 0.92 } ]
包含什么
- 来自 Chat API 的有来源回答,以及答案背后的页面
- 对最强来源做整页 Markdown 提取
- 带作者和时间戳的 X 帖子,作为实践者信号
- 把证据保存为可查询 LiveDoc,供后续问题复用
不做什么
- 只覆盖公开来源;付费墙或仅登录可见的页面可能失败
- X 覆盖只是信号,不代表有代表性的调查
- 不做访谈,不碰私有数据或付费数据库
- 证据不足时会明确说明,而不是补猜测
- 每个 prompt 运行一次;定时执行交给你的 agent 或 cron
常见问题
来源从哪里来?
Chat API 会返回它用过的页面,Web Fetch 把其中最相关的页面转成 Markdown,X Search 补充带日期的实践者帖子。每一项都会保留 URL。
可以做科技行业以外的市场研究吗?
可以。把范围占位符换成你的市场即可。小众市场的公开来源可能更少,简报会标出这些空白,而不是猜。
运行结束后证据还在吗?
在。LiveDoc 步骤会保留证据,返回的 short_id 让之后的问题可以继续检索同一批页面,而不必重新抓取。
一份简报要花多少?
按用量计费,当前费率在价格页面。prompt 会在花额度之前请求你确认。
可以每周跑一次吗?
可以,但这段 prompt 只运行一次。把调度放在能执行同一套 workflow 的 agent 或 cron 里。
来源在付费墙后面怎么办?
跳过并标记为不可用。简报不会用一个编造的事实或引语去填补付费墙后的空白。
相关 workflow
改成你的版本
同一套配方,按你实际的交付方式调整。
把简报写入文件
把回答、页面节选和 X 引语拼成 Markdown,再交给报告工具或提交到文档仓库。来源链接要始终跟在主张旁边——简报的价值取决于引用。
定时运行
把 `answer()` 包进 cron,每次把简报写到一个带日期的文件。同一个 LiveDoc 会持续积累来源,第四周可以直接用前三周收集的证据来回答。
跳过 LiveDoc
如果你已经有数据库,可以把 chat 答案和抓取到的页面存进去。LiveDoc 步骤是为了检索,不是默认的存储方案。
继续深入
这套配方背后的参考页面,以及下一步可以看什么。