◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-06-19上級

search_result ブロックで自前ナレッジに根拠を引かせる — Claude Citations 実装メモ

自前のRAGでClaudeが「どの記事を根拠にしたか」を見失う問題を、search_result コンテンツブロックと citations で解決する実装手順を、4サイト運用の実測値とともにまとめます。

Claude API127CitationsRAG4search_result個人開発130

✦ プレミアム記事

自分が運営する記事群に対して「関連記事を選ぶ」「事実関係を照合する」ための社内エージェントを、Claude API で組んでいたときの話から始めます。私自身、4つの技術ブログを個人開発で回していて、日本語だけで合計600本を超える記事が手元にあります。検索でヒットした候補をプロンプトに連結し、「この主張の根拠になる記事はどれですか」と尋ねる——よくある自前RAGの形です。

最初の実装はそれなりに動いていました。ところが運用を続けるうちに、無視できない癖が見えてきます。Claude は「○○という記事に書かれています」と答えるのですが、その記事名が手元の候補に存在しないことがあるのです。連結した本文のどこを読んで判断したのかも追えません。根拠の出どころが言葉の中に溶けてしまい、後から検証できない。これは社内向けとはいえ、誠実さを欠く挙動でした。

この「どの資料の、どの部分を根拠にしたか」を構造化データとして必ず返させる仕組みが、Claude の Citations、とりわけ search_result コンテンツブロックです。本番に載せ替えて数週間運用した実装と、その過程で踏んだ落とし穴を残しておきます。

言葉で根拠を語らせると、なぜ検証できなくなるのか

自前で本文を連結して渡す方式は、Claude から見ると「ただの長い文字列」です。区切りに ## 記事A のような見出しを入れても、それは意味の境界としては伝わりますが、機械可読な参照子ではありません。結果として返ってくる根拠は「記事Aによると〜」という自然文で、これを正規表現で拾って元記事に紐付け直す後処理が必要になります。

この後処理が脆いのが問題でした。Claude が記事名を少し言い換えたり、複数記事の内容を統合して「これらの記事から」と曖昧にまとめたりすると、マッチに失敗します。私の環境では、引用の機械的な突合成功率がおよそ7割前後で頭打ちでした。残りの3割は人手で確認するしかなく、自動化の意味が半減していました。

根本原因は、参照のIDを渡していないことに尽きます。渡していない以上、返ってくるはずもありません。search_result は、まさにこの「IDを持った検索結果として資料を渡す」ためのコンテンツブロックです。

search_result コンテンツブロックの構造

search_result は、メッセージの content 配列に置ける専用ブロックです。1件の検索結果が、ソース識別子・タイトル・本文断片の配列という三点セットで表現されます。

search_result_block = {
    "type": "search_result",
    "source": "https://claudelab.net/ja/articles/api-sdk/claude-api-prompt-caching-monthly-cost-half-guide",
    "title": "プロンプトキャッシュで月額コストを半分にする実装",
    "content": [
        {"type": "text", "text": "5分TTLのキャッシュブレークポイントをsystemの末尾に置くと…"},
        {"type": "text", "text": "1時間TTLは静的な大きい前提に向きます。料金は…"},
    ],
    "citations": {"enabled": True},
}

ポイントは content が文字列ではなくテキストブロックの配列であることです。Claude はこの配列の何番目を根拠にしたかをインデックスで返すので、断片の切り方がそのまま引用の粒度になります。段落単位で分けておくと、後から「記事のこの段落」へリンクを張りやすくなります。citations.enabled を true にしたブロックだけが引用の対象になる点も、最初に押さえておきたいところです。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦search_result ブロックで Claude の回答に『どの記事の何文目を根拠にしたか』を構造化データとして必ず付与させる実装
✦手組みのコンテキスト連結から移行し、引用の取りこぼしを抑えつつ送信トークンを約40%削減した手順
✦citations 配列を記事リンクへ還元する UI 連携と、本番で踏んだ search_result 特有の落とし穴3点
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ API & SDK2026-09-17
画像は20枚ずつ送っています — 21枚目から全画像に別の上限がかかると知った日
素材フォルダの62枚を一度に送ったら invalid_request_error で落ちました。容量ではなく枚数が原因です。視覚トークンを28pxのパッチで数え直し、枚数・寸法・ペイロードの3つの上限を同時に見てバッチを組むまでの記録です。
⬡ API & SDK2026-09-06
訳文は自然なのに、実行時に落ちる翻訳がありました
多言語アプリの文言を Claude API で訳したとき、意味は正しいのに書式指定子だけが壊れることがあります。重大度で分けた受け入れ検査と、壊れた行だけを訳し直す修復ループを実装と実測でまとめました。
⬡ API & SDK2026-05-15
壁紙アプリの一括カテゴリ分類を Claude Vision API で自動化した話 — 実運用で見えた精度と限界
個人開発の壁紙アプリで画像のカテゴリ分類をClaude Vision APIに任せた実体験の記録です。SonnetとHaikuのモデル選択、75枚の手動検証で確かめた分類精度、実運用で踏んだ落とし穴、途中で落ちても再開できるバッチ設計、そして実際にかかったコストの感覚まで正直に書きました。