CLAUDE LABEN
APPLY — ant CLI v1.30.0 に ant apply が入りました。エージェント・環境・スキル・メモリストア・デプロイメントを、リポジトリのファイルから作成・更新できますLOCKFILE — 書き出される claude-lock.json は必ずコミットしてください。忘れると、実行のたびに同じリソースが新しく作られていきますPLAN — ant apply は適用の前に計画を表示し、承認を挟みます。CI で無人実行するなら、この承認をどう扱うかを先に決めておくことですPRICING — Claude Sonnet 5 の 3 ドル / 15 ドルへの値上げは実施されていません。導入価格の 2 ドル / 10 ドルがそのまま標準価格になりましたSOURCE — 価格と版番号は二次ニュースに誤りが混じります。platform.claude.com のリリースノートで裏を取ってから書くようにしていますBETA — Agent Skills と Skills API はベータを抜け、skills-2025-10-02 ヘッダが不要になりました。Files API はヘッダの有無でレスポンス形式が変わる点に注意ですAPPLY — ant CLI v1.30.0 に ant apply が入りました。エージェント・環境・スキル・メモリストア・デプロイメントを、リポジトリのファイルから作成・更新できますLOCKFILE — 書き出される claude-lock.json は必ずコミットしてください。忘れると、実行のたびに同じリソースが新しく作られていきますPLAN — ant apply は適用の前に計画を表示し、承認を挟みます。CI で無人実行するなら、この承認をどう扱うかを先に決めておくことですPRICING — Claude Sonnet 5 の 3 ドル / 15 ドルへの値上げは実施されていません。導入価格の 2 ドル / 10 ドルがそのまま標準価格になりましたSOURCE — 価格と版番号は二次ニュースに誤りが混じります。platform.claude.com のリリースノートで裏を取ってから書くようにしていますBETA — Agent Skills と Skills API はベータを抜け、skills-2025-10-02 ヘッダが不要になりました。Files API はヘッダの有無でレスポンス形式が変わる点に注意です
記事一覧/API & SDK
API & SDK/2026-06-19上級

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

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

Claude API121CitationsRAG4search_result個人開発126

プレミアム記事

自分が運営する記事群に対して「関連記事を選ぶ」「事実関係を照合する」ための社内エージェントを、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.enabledtrue にしたブロックだけが引用の対象になる点も、最初に押さえておきたいところです。

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

API & SDK2026-09-06
訳文は自然なのに、実行時に落ちる翻訳がありました
多言語アプリの文言を Claude API で訳したとき、意味は正しいのに書式指定子だけが壊れることがあります。重大度で分けた受け入れ検査と、壊れた行だけを訳し直す修復ループを実装と実測でまとめました。
API & SDK2026-07-13
画像を原寸で送るか縮小するか — Opus 4.7 の高解像度ビジョンで1枚ごとに解像度を決めるコスト設計
Opus 4.7 の高解像度ビジョンで壁紙の細部分類は上がったのに、全部を原寸で送ったら週のトークンが跳ねました。1枚ごとに解像度と使うモデルを決める preflight を設計し、精度を保ったままコストを下げた実測を残します。
API & SDK2026-07-12
APIキーに有効期限を付けると、失効は事故ではなく予定になる — 無人運用の鍵カレンダー設計
Console で APIキーに有効期限を設定できるようになりました。無人で回している夜間ジョブを止めないために、二重鍵の重ね替えとローカルの失効台帳で「予定された失効」を運用に組み込む方法をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます