Text CompletionsからMessagesに移行する際は、以下の変更点を考慮してください。

入力と出力

Text CompletionsとMessagesの最大の違いは、モデルへの入力の指定方法とモデルからの出力の受け取り方です。

Text Completionsでは、入力は生の文字列です:

Python
prompt = "\n\nHuman: こんにちは\n\nAssistant: こんにちは、私はClaudeです。どのようにお手伝いできますか?\n\nHuman: 解糖系について説明してもらえますか?\n\nAssistant:"

Messagesでは、生のプロンプトの代わりに入力メッセージのリストを指定します:

messages = [
  {"role": "user", "content": "こんにちは。"},
  {"role": "assistant", "content": "こんにちは、私はClaudeです。どのようにお手伝いできますか?"},
  {"role": "user", "content": "解糖系について説明してもらえますか?"},
]

各入力メッセージにはrolecontentがあります。

ロール名

Text Completions APIでは\n\nHuman:\n\nAssistant:の交互のターンを期待しますが、Messages APIではuserassistantのロールを期待します。ドキュメントでは「human」または「user」のターンと呼ばれることがありますが、これらは同じロールを指しており、今後は「user」になります。

Text Completionsでは、モデルが生成したテキストはレスポンスのcompletion値で返されます:

Python
>>> response = anthropic.completions.create(...)
>>> response.completion
" こんにちは、私はClaudeです"

Messagesでは、レスポンスはcontent値で、これはコンテンツブロックのリストです:

Python
>>> response = anthropic.beta.messages.create(...)
>>> response.content
[{"type": "text", "text": "こんにちは、私はClaudeです"}]

Claudeの口に言葉を入れる

Text Completionsでは、Claudeの応答の一部を事前に入力できます:

Python
prompt = "\n\nHuman: こんにちは\n\nAssistant: こんにちは、私の名前は"

Messagesでは、最後の入力メッセージのroleassistantにすることで同じ結果を得ることができます:

Python
messages = [
  {"role": "human", "content": "こんにちは"},
  {"role": "assistant", "content": "こんにちは、私の名前は"},
]

その際、レスポンスのcontentは最後の入力メッセージのcontentから続きます:

JSON
{
  "role": "assistant",
  "content": [{"type": "text", "text": " Claudeです。今日はどのようにお手伝いできますか?" }],
  ...
}

システムプロンプト

Text Completionsでは、システムプロンプトは最初の\n\nHuman:ターンの前にテキストを追加することで指定します:

Python
prompt = "今日は2024年1月1日です。\n\nHuman: こんにちは、Claude\n\nAssistant:"

Messagesでは、systemパラメータでシステムプロンプトを指定します:

Python
anthropic.Anthropic().beta.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1024,
    system="今日は2024年1月1日です。", # <-- システムプロンプト
    messages=[
        {"role": "user", "content": "こんにちは、Claude"}
    ]
)

モデル名

Messages APIでは、完全なモデルバージョン(例: claude-3-opus-20240229)を指定する必要があります。

以前は、メジャーバージョン番号のみ(例: claude-2)を指定することをサポートしており、マイナーバージョンへの自動アップグレードが行われていました。しかし、このような統合パターンはもはや推奨されておらず、Messagesではサポートされていません。

停止理由

Text Completionsのstop_reasonは常に以下のいずれかです:

  • "stop_sequence": モデルが自然にターンを終了したか、カスタムの停止シーケンスが生成された。
  • "max_tokens": 指定したmax_tokens分のコンテンツがモデルによって生成されたか、絶対最大値に達した。

Messagesのstop_reasonは以下のいずれかの値です:

  • "end_turn": 会話のターンが自然に終了した。
  • "stop_sequence": 指定したカスタムの停止シーケンスが生成された。
  • "max_tokens": (変更なし)

max tokensの指定

  • Text Completions: max_tokens_to_sampleパラメータ。検証はないが、モデルごとに上限値あり。
  • Messages: max_tokensパラメータ。モデルがサポートする値より大きい値を渡すと、検証エラーが返される。

ストリーミング形式

Text Completionsで"stream": trueを使用すると、レスポンスにはcompletionpingerrorのサーバーセントイベントが含まれます。詳細はText Completionsのストリーミングを参照してください。

Messagesには、さまざまなタイプの複数のコンテンツブロックを含めることができるため、そのストリーミング形式はやや複雑です。詳細はMessagesのストリーミングを参照してください。