リサーチ
1つの問いを、出典付きリサーチブリーフに変える
Web に問いを投げ、回答の根拠ページを Markdown で取得し、X の実務者の声を加え、最後に証拠をあとから検索できる LiveDoc に残します。
プロンプトをコピー
角括弧の項目を置き換えて、Claude Code、Codex、ターミナルにアクセスできる AI に貼り付けてください。Felo スキルをインストールし、クレジットを使う前に確認し、ワークフローを実行します。
[質問または意思決定] のために、出典付きのリサーチブリーフを作成してください。 対象範囲: [市場、地域、言語]。期間: [過去30日 / 過去12か月]。読者: [誰が読むか]。深さ: [1ページの概要 / 完全版ブリーフ]。 Markdown のブリーフに以下を含めてください。 1. 3つの箇条書きによる短い答え。 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 |
出典が一致しない点
ベンダーのベンチマークではほぼ同等だが、独立テストでは多段階の返金処理でまだ差がある。
まだ不明な点
その差がツール利用の改善で埋まるのか、より大きいモデルが必要なのか。
実際の呼び出し
開発者向け:同じワークフローを実行順に並べたコピー可能なコード。
実際の API 呼び出しを表示
Web に問いを投げる
Chat は Web を検索し、ソースを順位付けし、回答を書き、使ったリソースを返します。上位3件を残してください。以降の各ステップはそのリンクをたどります。下の helper はキーを一度送り、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": "Recent developments include …", "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 "# Example Article\n\nExtracted article content…"
X の声を加える
ニュースは発表を、X は実務で起きたことを伝えます。直近7日を検索し、著者と日時を残して、ブリーフがすべての主張に出典を付けられるようにします。
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あとで証拠に再質問する
ここが成果です。次の問いはオープン Web ではなく 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 のカバレッジはシグナルであり、代表性のある調査ではない
- インタビュー、非公開データ、有料データベースは扱わない
- 証拠が薄いときは推測で埋めず、その旨を書く
- 1プロンプトにつき1回実行。定期実行は agent か cron に任せる
よくある質問
出典はどこから来ますか?
Chat API が使用したページを返し、Web Fetch が重要なページを Markdown にし、X Search が日付付きの実務者投稿を加えます。各項目は URL を保持します。
テック以外の市場も調べられますか?
はい。スコープのプレースホルダーを自分の市場に置き換えてください。ニッチ市場は公開ソースが少ないことがありますが、ブリーフは推測せず空白として示します。
実行後も証拠は残りますか?
LiveDoc ステップを実行した場合は残ります。返された short_id を使えば、次の問いで同じページを再取得せず検索できます。
ブリーフの費用は?
従量制のクレジットです。現在の料金は料金ページにあります。プロンプトは使う前に承認を求めます。
毎週実行できますか?
できますが、このプロンプトは1回だけ実行します。同じワークフローを実行できる agent か cron にスケジュールを設定してください。
出典がペイウォールの場合は?
スキップして利用不可と表示します。ペイウォールの空白を、作った事実や引用で埋めることはありません。
関連ワークフロー
チームが本当に読む日次AIニュースダイジェストを作る
出典付きのニュースまとめを取り、X の実務者の議論を加え、動画の文字起こしを1本取得し、Markdown で号を構成して LiveDoc に保存します。
ワークフローを開くオフィスリサーチページをスライド資料に変える
ページを抽出し、LiveDoc の文脈として保存し、PPT Task API に deck を作らせ、完成したリンクが出るまでポーリングします。
ワークフローを開くサポート自分のドキュメントでサポート質問に答える
LiveDoc を作成し、ヘルプセンターと社内 runbook を読み込み、チケットに答える passage を検索し、その証拠だけからモデルに回答させます。
ワークフローを開く自分の形に変える
同じレシピを、実際の進め方に合わせて調整します。
ブリーフをファイルに書き出す
回答、ページ抜粋、X の引用を Markdown にまとめ、レポートツールに渡すかドキュメントリポジトリにコミットします。主張のそばに出典リンクを残してください。ブリーフの価値は引用で決まります。
定期的に実行する
`answer()` を cron で包み、各ブリーフを日付付きファイルに書きます。同じ LiveDoc にソースが蓄積され、4週目は1〜3週目に集めた証拠から回答できます。
LiveDoc を省略する
すでにデータベースがあるなら、chat の回答と抽出ページをそこに保存します。LiveDoc ステップは検索のためであり、既定の保存先ではありません。
さらに進む
このレシピの背景にあるリファレンスと、次に見るべきページ。