0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloudflare AI Searchで低コストRAGを作る:文書登録からWorkers連携・引用表示まで

0
Last updated at Posted at 2026-08-17

Cloudflare AI Searchで低コストRAGを作る

RAGを試すだけでも、ストレージ、文書分割、Embedding、ベクトルDB、検索API、生成モデル、ログを組み合わせる必要があります。Cloudflare AI Searchは、この検索基盤をマネージドにまとめて提供します。

この記事では、Built-in storageへ検証文書をアップロードし、Playgroundで確認した後、Cloudflare Workerから現行のAI Search bindingを使って検索・回答するところまでを作ります。

2026年8月18日時点でAI Searchはopen betaです。無料枠や課金条件は変更される可能性があります。公開前・導入前に公式のLimits & pricingを再確認してください。

今回、実際に確認したこと

Cloudflare DashboardでAI Search instanceを作り、Built-in storageへのファイル登録とPlaygroundのSearchまで実行しました。顧客データは使わず、架空の「サンプル株式会社」のMarkdown文書3件だけで検証しています。

項目 検証内容
Instance 検証用instance、Built-in storage
文書 出張旅費規程、情報セキュリティ規程、入社初日ガイド
質問 国内出張の宿泊費上限と精算期限
検索結果 01_出張旅費規程.md
スコア 0.761
該当内容 1泊12,000円、帰着日の翌日から5営業日以内

完成構成

Cloudflare AI Search社内文書RAGの構成

社内用途ではAI SearchのPublic Endpointをそのまま公開せず、Cloudflare Accessで認証したWorker経由に限定する構成を想定します。

1. AI Search instanceを作る

Cloudflare dashboardで次の順に進みます。

  1. AI → AI Searchを開く
  2. Create Instanceを選ぶ
  3. 例としてinternal-docs-pocと命名する
  4. データソースを選ぶ
  5. 設定内容を確認して作成する

データソースは主に次の3種類です。

データソース 使いどころ
Built-in storage 少数ファイルをすぐ試す
R2 bucket 既存のR2文書を継続同期する
Website 自社サイトやドキュメントをクロールする

今回はBuilt-in storageを使います。

2. 架空の社内文書をアップロードする

作成したinstanceのItemsタブから、架空企業の規程・手順書をアップロードします。アップロード後は自動でインデックスされます。

travel-policy.md
security-policy.md
onboarding-guide.md

completedになる前に質問すると結果が安定しないため、ItemsまたはStatsで処理状況を確認します。

今回は3件すべてのアップロード成功を確認してから、同期とインデックス作成を開始しました。

Cloudflare AI Searchへ検証文書3件をアップロードした画面

現行のWorkers Freeでは、AI Searchのファイルサイズ上限は1ファイル4MB、月間クエリは20,000件などの制限があります。大きなPDFは章単位に分ける、画像中心のPDFは事前にOCRする、といった前処理が必要です。

3. Playgroundで検索と回答を分けて試す

PlaygroundにはSearchとChatがあります。

  • Search: 関連チャンクとスコアを確認する
  • Chat: 検索結果を使った生成回答を確認する

最初はSearchで次を確認します。

国内出張の宿泊費上限はいくらですか?

正しい文書が返らない状態でChatのプロンプトを調整しても改善しません。まず検索、次に生成の順で原因を分けます。

実際のSearchでは、国内出張の宿泊費上限と精算期限に対して01_出張旅費規程.mdがスコア0.761で返りました。表示されたチャンクに、宿泊費上限と精算期限の両方が含まれることも確認しています。

Cloudflare AI SearchのPlaygroundで検索結果とスコアを確認した画面

なお、インデックス作成直後にChatを試したときは該当文書なしになりました。同期中の結果をそのまま評価せず、Itemsの処理完了後に同じ質問を再実行するのが安全です。

4. Workerプロジェクトを作る

npm create cloudflare@latest -- internal-docs-rag
cd internal-docs-rag

wrangler.jsoncにinstance bindingを追加します。

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "internal-docs-rag",
  "main": "src/index.ts",
  "compatibility_date": "2026-08-17",
  "ai_search": [
    {
      "binding": "INTERNAL_DOCS",
      "instance_name": "internal-docs-poc",
      "remote": true
    }
  ]
}

remote: trueを指定すると、ローカル開発中もデプロイ済みのAI Search instanceへ接続できます。

旧AutoRAGのenv.AI.autorag()はlegacyです。新規実装ではai_searchまたはai_search_namespaces bindingを使います。

5. 検索APIを実装する

まずは生成を行わず、検索チャンクだけを返します。

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);
    const query = url.searchParams.get("q")?.trim();

    if (!query || query.length > 500) {
      return Response.json({ error: "invalid query" }, { status: 400 });
    }

    const result = await env.INTERNAL_DOCS.search({
      messages: [{ role: "user", content: query }],
      ai_search_options: {
        retrieval: {
          retrieval_type: "hybrid",
          max_num_results: 5,
          match_threshold: 0.4
        }
      }
    });

    return Response.json({
      query: result.search_query,
      sources: result.chunks.map((chunk) => ({
        file: chunk.item.key,
        score: chunk.score,
        text: chunk.text
      }))
    });
  }
};

先にwrangler typesを実行し、bindingを含むEnv型を生成してください。

6. RAG回答と引用元を返す

次にchatCompletions()で回答を生成します。レスポンスのchunksを捨てず、回答と一緒にクライアントへ返すのがポイントです。

const result = await env.INTERNAL_DOCS.chatCompletions({
  messages: [
    {
      role: "system",
      content: "登録文書だけを根拠に回答し、根拠がなければ不明と答えてください。"
    },
    { role: "user", content: query }
  ],
  ai_search_options: {
    retrieval: { max_num_results: 5 },
    query_rewrite: { enabled: true }
  }
});

return Response.json({
  answer: result.choices[0]?.message.content ?? "",
  citations: result.chunks.map((chunk) => ({
    source: chunk.item.key,
    score: chunk.score
  })),
  usage: result.usage
});

画面側では、回答本文の下にファイル名を表示し、利用者が根拠を確認できるようにします。

7. 社内向けに閉じる

Public Endpointは認証なしで使えるため、社内文書用では無効のままにします。Workerの前にCloudflare Accessを置き、会社のIdPまたは許可したメールドメインで認証します。

さらに次を実施します。

  • CORSを自社フロントエンドに限定する
  • Workerで入力長、HTTP method、Content-Typeを検証する
  • ユーザーまたは部署を監査ログへ残す
  • AI Gatewayでモデル利用量、コスト、エラーを監視する
  • DLP・Guardrailsの適用可否を検討する
  • 機密度ごとにinstanceまたはnamespaceを分離する

AI Searchに接続したAI Gatewayでは、埋め込み呼び出しまで通るため、Gateway側の一般的なキャッシュや厳しいレート制限がインデックス処理を妨げる場合があります。検索結果のキャッシュにはAI Search側のSimilarity cacheを使い、Gateway設定は公式の注意事項に従います。

8. コストを見るときの注意

2026年8月18日時点では、AI Searchはopen betaの範囲内で無料ですが、Workers AIとAI Gateway経由のモデル推論などは別計算です。「RAG全体が無料」という意味ではありません。

PoCでは次を分けて記録します。

  • 初回・更新時のEmbedding
  • 1質問あたりの検索
  • Query rewritingとReranking
  • 回答生成モデルの入力・出力トークン
  • Workerリクエスト
  • ログ保持や外部モデルの費用

まとめ

Cloudflare AI Searchは、R2、Vectorize、文書分割、検索APIを個別に組み合わせる手間を減らし、小さなRAGを早く試すのに向いています。検索結果のchunksに引用元とスコアが含まれるため、根拠表示も実装しやすい構成です。

一方、open betaの仕様・料金変更、ファイルサイズ制限、文書ごとの権限制御は事前に確認が必要です。まずは公開情報または低機密の文書でPoCし、Access、Worker、監査ログまで含めて評価すると安全です。

導入判断・費用・制限を比較したい方へ

低コスト化できる範囲、open betaの注意点、認証、文書ACL、PoCの概算はRoot on公式ブログの「低コストで社内文書RAGを作る」 に整理しています。

公式資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?