【AI】Claude APIのCitations機能で回答の根拠を示す方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

Claude APIで回答の根拠となる引用元を自動で示したい」とお考えではありませんか?

社内ドキュメントのQ&AやRAGを作っていると、回答がどの資料のどこから来たのか分からず困る場面があります。

Claude APIのCitations機能を使うと、回答の各文にソースの該当箇所を自動でひも付けできます

いずみ

設定はドキュメントブロックに1行足すだけなので、サクッと解説します。

ということで、本記事ではClaude APIのCitations機能で回答の根拠を示す方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AI】Claude APIのCitations機能で回答の根拠を示す方法

早速ですが、Claude APIのCitations機能で回答の根拠を示す方法を解説していきます。

Citations機能とは

Citations機能は、渡したドキュメントのどの文を根拠に回答したかを、Claudeが自動で返してくれる仕組みです。

プロンプトで「引用を書いて」とお願いする方法と違い、APIが引用箇所を構造化データとして返します。

引用文は必ず元ドキュメント内の正しい位置を指すため、存在しない引用をでっち上げる心配がありません。

ドキュメント形式は、プレーンテキスト・PDF・カスタムコンテンツの3種類に対応しています。

事前準備

まずはPython SDKから呼び出せるようにします。

STEP
APIキーを環境変数に設定する

AnthropicコンソールでAPIキーを発行し、ANTHROPIC_API_KEYという環境変数に入れておきます。

STEP
SDKをインストールする
pip install anthropic

プレーンテキストで引用を有効にする

一番シンプルな、プレーンテキストのドキュメントで試します。

STEP
documentブロックでcitationsを有効化する
import anthropic

client = anthropic.Anthropic()

policy = """有給休暇は入社6か月後に10日付与されます。
残業申請は前日までに勤怠システムから行ってください。
交通費は月額3万円まで支給されます。"""

response = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "document",
                    "source": {
                        "type": "text",
                        "media_type": "text/plain",
                        "data": policy,
                    },
                    "title": "就業規則の抜粋",
                    "context": "人事部が管理する社内規定です。",
                    "citations": {"enabled": True},
                },
                {"type": "text", "text": "有給休暇は何日もらえますか?"},
            ],
        }
    ],
)

documentブロックのcitationsにenabledをTrueで渡すと、Citations機能が有効になります。

titleとcontextはモデルには渡りますが、引用元としては使われません。

titleは短い文字列しか入らないため、メタデータはcontextにテキストやJSON文字列で入れておきます。

STEP
レスポンスから引用を取り出す
for block in response.content:
    if block.type != "text":
        continue
    print(block.text)
    for citation in block.citations or []:
        print("  引用元:", citation.cited_text)
        print("  文字位置:", citation.start_char_index, citation.end_char_index)

引用が付いたtextブロックには、citations配列がぶら下がります。

いずみ

documentブロックにcitationsを1つ足すだけで、あとはClaudeが勝手に引用を付けてくれます。

レスポンスの構造

Citations機能を有効にすると、レスポンスのcontentは複数のtextブロックに分割されます。

根拠がある文のtextブロックにだけ、citations配列が付きます。

citations配列の各要素には、引用された原文のcited_textと、何番目のドキュメントかを表すdocument_indexが入ります。

プレーンテキストならstart_char_indexとend_char_index(0始まり・終端は含まない)で位置が返ります。

PDFならstart_page_numberとend_page_number(1始まり)、カスタムコンテンツならstart_block_indexとend_block_index(0始まり)になります。

cited_textは出力トークンとして課金されません。

会話を継続してcited_textを送り返しても、入力トークンには課金されません。

PDFとカスタムコンテンツで使う

PDFはbase64エンコードした文字列をsourceに渡します。

import base64
import pathlib

pdf_data = base64.standard_b64encode(
    pathlib.Path("report.pdf").read_bytes()
).decode()

response = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "document",
                    "source": {
                        "type": "base64",
                        "media_type": "application/pdf",
                        "data": pdf_data,
                    },
                    "title": "四半期レポート",
                    "citations": {"enabled": True},
                },
                {"type": "text", "text": "売上高の伸び率を教えてください。"},
            ],
        }
    ],
)

# PDFでは citation.start_page_number / citation.end_page_number が返る

PDFはテキストが抽出され、文単位でチャンク化されます。

スキャンしただけで文字情報を持たないPDFは、引用元にできません。

RAGのチャンクごとに引用位置を細かく制御したいなら、カスタムコンテンツ形式が向いています。

chunks = [
    "Citations機能はプレーンテキストを文単位でチャンク化する。",
    "cited_textは出力トークンとして課金されない。",
    "Citationsとstructured outputsは併用できない。",
]

response = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "document",
                    "source": {
                        "type": "content",
                        "content": [
                            {"type": "text", "text": c} for c in chunks
                        ],
                    },
                    "title": "Citationsの仕様メモ",
                    "citations": {"enabled": True},
                },
                {"type": "text", "text": "Citationsと併用できない機能は?"},
            ],
        }
    ],
)

# カスタムコンテンツでは citation.start_block_index / citation.end_block_index が返る

カスタムコンテンツは渡したcontentブロックがそのまま引用単位になり、追加のチャンク化は行われません。

いずみ

RAGでソース表示までやりたいときは、カスタムコンテンツ形式が一番きれいに決まります。

使うときの注意点

Citations機能はstructured outputsと併用できません。

documentブロックで引用を有効にしたままoutput_config.formatを指定すると、APIは400エラーを返します。

引用の有効化は「全ドキュメントで有効」か「全ドキュメントで無効」のどちらかしか選べません。

一部のドキュメントだけ引用を有効にする指定はできない点に注意してください。

引用できるのはテキストのみで、画像の引用は未対応です。

prompt caching・token counting・batch processingとは併用できます。

長いドキュメントを繰り返し使う場合は、documentブロックにcache_controlを付けるとコストを抑えられます。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

Citations機能を使うと料金は上がりますか?

システムプロンプトの追加とチャンク化のぶん、入力トークンがわずかに増えます。

一方で引用文のcited_textは出力トークンとして課金されないため、プロンプトで引用を書かせる方法よりコストを抑えやすいです。

どのモデルで使えますか?

現在提供されているモデルであれば利用できます。

呼び出し時にmodelへ使いたいモデルIDを指定すれば動作します。

RAGのチャンクごとに引用したい場合はどうすればいいですか?

チャンク単位で文を引用させたいなら、チャンク1つを1つのプレーンテキストドキュメントとして渡します。

追加のチャンク化をさせたくないなら、カスタムコンテンツドキュメントのcontent配列に各チャンクを入れます。

まとめ

今回は、Claude APIのCitations機能で回答の根拠を示す方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Citations機能はdocumentブロックのcitationsにenabledをTrueで渡すだけで使える。
  • 回答の各文にcited_textと位置情報がひも付き、根拠の検証が楽になる。
  • プレーンテキストは文字位置、PDFはページ番号、カスタムコンテンツはブロック番号で引用位置が返る。
  • structured outputsとは併用できず、引用の有効化は全ドキュメント一括になる。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次