サポート
自分のドキュメントでサポート質問に答える
LiveDoc を作成し、ヘルプセンターと社内 runbook を読み込み、チケットに答える passage を検索し、その証拠だけからモデルに回答させます。
プロンプトをコピー
角括弧の項目を置き換えて、Claude Code、Codex、ターミナルにアクセスできる AI に貼り付けてください。Felo スキルをインストールし、クレジットを使う前に確認し、ワークフローを実行します。
このサポート質問に、私たちのドキュメントだけを使って答えてください: [顧客の質問]。 ナレッジベース: [ヘルプセンター URL または LiveDoc short_id]。エスカレーション経路: [担当者またはキュー]。 利用可能な顧客コンテキスト: [プラン、地域、製品](パスワードや支払いデータを求めないでください)。 以下を作成してください。 1. 2〜4文の直接的な回答。 2. 根拠となるパッセージ(リソースタイトル付き)。 3. 顧客の次のステップ。 4. 内部メモ: 使用したリソースと関連スコア。 ルール: - 取得したパッセージだけから答えてください。ヒットなしまたは関連度が低い場合はエスカレーションし、決して推測しないでください。 - ポリシー、返金、価格、アカウント操作を捏造しないでください。 - 顧客の非公開データ、認証情報、支払い情報を取り込まないでください。 - 取り込みや取得でクレジットを消費する前に確認してください。 - 回答を顧客に送らず、レビュー用に私へ返してください。
コピー内容にはインストール手順と安全ルールも含まれます。
完成するもの
実行時の出力例です。リアルタイム生成ではありません。
回答: プランは毎月1日に更新されます。カード決済に失敗した場合、3日間リトライし、その後シートが一時停止されます。
出典: 「請求に関するよくある質問」 - https://example.com/help/billing
ここでカバーされていない場合: 請求キューに請求書 ID を添えてエスカレーションしてください。
実際の呼び出し
開発者向け:同じワークフローを実行順に並べたコピー可能なコード。
実際の API 呼び出しを表示
知識ベースを作成する
LiveDoc API で知識ベースを作成し、short_id を保存します。
support.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 LiveDocData = { data: { short_id: string } }; const kb = await felo<LiveDocData>("/v2/livedocs", { name: "Support knowledge base", description: "Help center, policy pages, and internal runbooks", }); const kbId = kb.data.short_id; // save this in your config出力例
{ "short_id": "PvyKouzJirXjFdst4uKRK3", "name": "Support knowledge base", "description": "Help center, policy pages, and internal runbooks" }公開ヘルプセンターを読み込む
ヘルプセンター URL をリソースとして LiveDoc に追加します。
support.ts type UrlResult = { data: { url: string; status: string; fail_reason: string | null; resource_id: string | null; }[]; }; const added = await felo<UrlResult>( `/v2/livedocs/${kbId}/resources/urls`, { urls: [ "https://example.com/help/getting-started", { url: "https://example.com/help/billing", title: "Billing FAQ" }, ], }, ); const failed = added.data.filter((item) => item.status === "failed");出力例
[ { "url": "https://example.com/help/getting-started", "status": "success", "resource_id": "res_003" }, { "url": "https://example.com/help/billing", "status": "existed", "resource_id": "res_004" } ]非公開ドキュメントを追加する
社内 runbook をドキュメントリソースとして追加します。
support.ts type ResourceData = { data: { id: string } }; const runbook = `# Refund policy Refunds are available within 30 days of purchase. Requests after 30 days need a manual review by the billing team. `; const policy = await felo<ResourceData>( `/v2/livedocs/${kbId}/resources/doc`, { title: "Refund policy", content: runbook }, ); console.log(policy.data.id); // use this for updates質問に関連する証拠を検索する
セマンティック検索で最も関連する passage とスコアを取得します。
support.ts type Hit = { id: string; title: string; content: string; score: number }; async function findEvidence(question: string) { const res = await felo<{ data: Hit[] }>( `/v2/livedocs/${kbId}/resources/retrieve`, { query: question }, ); return res.data.filter((hit) => hit.score >= 0.7).slice(0, 4); } const question = "Can I get a refund after 45 days?"; const hits = await findEvidence(question);出力例
[ { "id": "res_005", "title": "Refund policy", "content": "Refunds are available within 30 days of purchase…", "score": 0.92 } ]証拠だけから回答する
モデルには検索された passage だけを使わせ、ヒットしない場合はエスカレーションさせます。
support.ts type Completion = { choices: { message: { content: string | null } }[]; usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }; }; const context = hits .map((hit) => `### ${hit.title}\n${hit.content}`) .join("\n\n"); const completion = await felo<Completion>("/api/v1/chat/completions", { model: "anthropic/claude-haiku-5.5", messages: [ { role: "system", content: "Answer only from the context. If the context does not cover the question, say so and hand the ticket to a human.", }, { role: "user", content: `Context:\n${context}\n\nQuestion: ${question}`, }, ], }); console.log(completion.choices[0].message.content); console.log(completion.usage.total_tokens);出力例
"No. The Refund policy says refunds are available within 30 days of purchase, so a request at 45 days needs a manual review by the billing team."
含まれるもの
- ヘルプセンターと社内 runbook から作る LiveDoc
- passage と見出し付きのセマンティック検索
- 出典付きで引用できる回答
- ドキュメントにない場合の明確なエスカレーション
やらないこと
- 自分のドキュメントだけから回答し、オープン Web は見ない
- アカウント操作、返金、プラン変更はしない
- 非公開の顧客データや認証情報を知識ベースに入れない
- ドキュメントが古いと回答も古くなる。定期的に更新する
- 回答を起草するだけで、顧客への送信はしない
よくある質問
回答はどこから来ますか?
構築した LiveDoc のヘルプセンターページと runbook だけから来ます。検索が passage を返し、agent がその passage から回答を書きます。
ドキュメントにない場合は?
エスカレーションします。ヒットなし、または関連度が低い場合は未カバーとして扱い、モデルに推測させません。
知識ベースを最新に保つには?
ポリシー変更時に URL やドキュメントリソースを再追加・更新します。ワークフローには更新と監査のコマンドが含まれます。
チケットキューに組み込めますか?
はい、起草ステップとして使えます。顧客への送信前に人の承認を残してください。
アカウント固有の質問は扱えますか?
ドキュメントだけでは無理です。アカウントデータは自社システムにあります。agent に必要な安全な文脈だけを渡し、認証情報は絶対に渡さないでください。
1回の費用は?
読み込みと検索は従量制クレジットです。現在の料金は料金ページにあり、プロンプトは使う前に確認を求めます。
関連ワークフロー
1つの問いを、出典付きリサーチブリーフに変える
Web に問いを投げ、回答の根拠ページを Markdown で取得し、X の実務者の声を加え、最後に証拠をあとから検索できる LiveDoc に残します。
ワークフローを開くコンテンツチームが本当に読む日次AIニュースダイジェストを作る
出典付きのニュースまとめを取り、X の実務者の議論を加え、動画の文字起こしを1本取得し、Markdown で号を構成して LiveDoc に保存します。
ワークフローを開くオフィスリサーチページをスライド資料に変える
ページを抽出し、LiveDoc の文脈として保存し、PPT Task API に deck を作らせ、完成したリンクが出るまでポーリングします。
ワークフローを開く自分の形に変える
同じレシピを、実際の進め方に合わせて調整します。
1つの製品ラインだけ読み込む
範囲を1製品に絞ると知識ベースがきれいになります。
チケット分類を加える
回答前に質問種別を分類し、対応するドキュメントを検索します。
定期監査
月1回、切れたリンクと古いポリシーを確認します。
さらに進む
このレシピの背景にあるリファレンスと、次に見るべきページ。