Felo API PlatformFelo API Platform

サポート

自分のドキュメントでサポート質問に答える

LiveDoc を作成し、ヘルプセンターと社内 runbook を読み込み、チケットに答える passage を検索し、その証拠だけからモデルに回答させます。

所要時間20 分レベル初級更新日2026-10-29
対象サポートチームカスタマーサクセスHelpdesk 構築者

プロンプトをコピー

角括弧の項目を置き換えて、Claude Code、Codex、ターミナルにアクセスできる AI に貼り付けてください。Felo スキルをインストールし、クレジットを使う前に確認し、ワークフローを実行します。

このサポート質問に、私たちのドキュメントだけを使って答えてください: [顧客の質問]。

ナレッジベース: [ヘルプセンター URL または LiveDoc short_id]。エスカレーション経路: [担当者またはキュー]。
利用可能な顧客コンテキスト: [プラン、地域、製品](パスワードや支払いデータを求めないでください)。

以下を作成してください。
1. 2〜4文の直接的な回答。
2. 根拠となるパッセージ(リソースタイトル付き)。
3. 顧客の次のステップ。
4. 内部メモ: 使用したリソースと関連スコア。

ルール:
- 取得したパッセージだけから答えてください。ヒットなしまたは関連度が低い場合はエスカレーションし、決して推測しないでください。
- ポリシー、返金、価格、アカウント操作を捏造しないでください。
- 顧客の非公開データ、認証情報、支払い情報を取り込まないでください。
- 取り込みや取得でクレジットを消費する前に確認してください。
- 回答を顧客に送らず、レビュー用に私へ返してください。

コピー内容にはインストール手順と安全ルールも含まれます。

完成するもの

実行時の出力例です。リアルタイム生成ではありません。

回答の例(抜粋)

回答: プランは毎月1日に更新されます。カード決済に失敗した場合、3日間リトライし、その後シートが一時停止されます。

出典: 「請求に関するよくある質問」 - https://example.com/help/billing

ここでカバーされていない場合: 請求キューに請求書 ID を添えてエスカレーションしてください。

実際の呼び出し

開発者向け:同じワークフローを実行順に並べたコピー可能なコード。

実際の API 呼び出しを表示
  1. 知識ベースを作成する

    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"
    }
  2. 公開ヘルプセンターを読み込む

    ヘルプセンター 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" }
    ]
  3. 非公開ドキュメントを追加する

    社内 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
  4. 質問に関連する証拠を検索する

    セマンティック検索で最も関連する 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
      }
    ]
  5. 証拠だけから回答する

    モデルには検索された 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つの製品ラインだけ読み込む

範囲を1製品に絞ると知識ベースがきれいになります。

チケット分類を加える

回答前に質問種別を分類し、対応するドキュメントを検索します。

定期監査

月1回、切れたリンクと古いポリシーを確認します。

このレシピの背景にあるリファレンスと、次に見るべきページ。