いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「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向けの案件が豊富。 | 公式 |
【AI】Claude APIのCitations機能で回答の根拠を示す方法
早速ですが、Claude APIのCitations機能で回答の根拠を示す方法を解説していきます。
Citations機能とは
Citations機能は、渡したドキュメントのどの文を根拠に回答したかを、Claudeが自動で返してくれる仕組みです。
プロンプトで「引用を書いて」とお願いする方法と違い、APIが引用箇所を構造化データとして返します。
引用文は必ず元ドキュメント内の正しい位置を指すため、存在しない引用をでっち上げる心配がありません。
ドキュメント形式は、プレーンテキスト・PDF・カスタムコンテンツの3種類に対応しています。
事前準備
まずはPython SDKから呼び出せるようにします。
AnthropicコンソールでAPIキーを発行し、ANTHROPIC_API_KEYという環境変数に入れておきます。
pip install anthropicプレーンテキストで引用を有効にする
一番シンプルな、プレーンテキストのドキュメントで試します。
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文字列で入れておきます。
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つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- IT案件に特化したフリーランスエージェント。
- 週2〜3日の案件が豊富。
- リモート案件が多く、直エンドなので単価も高い。
※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。
ITプロパートナーズ
![]()
![]()
週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。



週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。
とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!
よくある質問
Citations機能を使うと料金は上がりますか?
システムプロンプトの追加とチャンク化のぶん、入力トークンがわずかに増えます。
一方で引用文のcited_textは出力トークンとして課金されないため、プロンプトで引用を書かせる方法よりコストを抑えやすいです。
どのモデルで使えますか?
現在提供されているモデルであれば利用できます。
呼び出し時にmodelへ使いたいモデルIDを指定すれば動作します。
RAGのチャンクごとに引用したい場合はどうすればいいですか?
チャンク単位で文を引用させたいなら、チャンク1つを1つのプレーンテキストドキュメントとして渡します。
追加のチャンク化をさせたくないなら、カスタムコンテンツドキュメントのcontent配列に各チャンクを入れます。
まとめ
今回は、Claude APIのCitations機能で回答の根拠を示す方法について解説しました。
以下が本記事のまとめになります。



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。








