見出し画像

Claude3のTool Calling(Function Calling)をLangChainで試す

はじめに

Anthropic の Calude 3のAPIでFunction Callingの機能 (β版) が公開され  LangChainからも利用可能となりましたので、早速テストしてみます。

以下のClaudeのfunction callingについてClaude 3にまとめてもらいました。

はじめに:

  • ツール機能はパブリックベータ版で提供開始。anthropic-beta: tools-2024-04-04ヘッダーを付けてアクセス

  • ストリーミングはまだ未サポート。今後のベータ版で追加予定

  • サードパーティーのプラットフォームでの利用は準備中

ツールの指定方法:

  • toolsパラメータで指定。name, description, input_schemaの3要素が必要

  • input_schemaはJSONスキーマ形式。パラメータ名や型、必須/オプションなどを定義

  • ツール名の命名ルール(^[a-zA-Z0-9_-]{1,64}$)にも注意

ツール利用のコンテンツブロック:

  • tool_use: Claudeがツールを使用する際のリクエスト。ツールへの入力情報を含む

    • id: ツール使用リクエストのユニークID

    • name: 使用するツールの名前

    • input: ツールへの入力情報のオブジェクト

  • tool_result: ツールの実行結果を返す際のブロック

    • tool_use_id: 対応するツール使用リクエストのID

    • content: ツールの実行結果の文字列または入れ子のコンテンツブロック

    • is_error: ツールのエラー時はtrueをセット

JSONデータの出力:

  • ツールは外部機能である必要はない。Claudeにスキーマに沿ったJSONを生成させるのにも使える

エラーハンドリング:

  • ツール実行時のエラー(通信エラーなど): tool_resultのis_errorをtrueにしてエラー内容を返す

  • max_tokens超過: ツール使用リクエストが途切れる場合がある。max_tokensを増やして再実行が必要

  • 不正なツール使用: 必須パラメータ不足などは、より詳細なdescriptionで再実行。または、tool_resultでエラーを返してリトライさせる

思考連鎖のタグ:

  • Opusは必ず、SonnetとHaikuは明示的なプロンプトで、<thinking>タグによる思考連鎖を表示

  • <search_quality_reflection>タグと検索品質スコアを出力しないよう、プロンプトで明示的に指示可能

ベストプラクティスと制限:

  • 並行実行は避け、1回1ツールの逐次利用が基本

  • 2-3回の失敗後、Claudeはリトライをあきらめがち

  • ツールをデバッグするには思考連鎖をよく観察。期待通りのツール利用を明示的にプロンプトで指示するのも有効

LangChainで利用する

Anthropicが Claude のTool Calling (Function calling)を発表したその日に、LangChainからも利用可能になりました。さすがですね。。💦

具体的なコードの記述方法はLangChainのドキュメントの以下のページに記載されています。

実際にドキュメント上にあるサンプルコードを実行してみます。
このコードは、Claude にカスタムツールを提供し、そのツールを使用して特定のタスクを実行する方法を示しています。

  1. GetWeatherというPydanticモデルクラスを定義し、ツールの入力スキーマを定義

  2. Claudeモデルのインスタンスllmを作成

  3. llm.bind_tools([GetWeather])でGetWeatherツールをバインドした新しいインスタンスllm_with_toolsを作成

  4. llm_with_tools.invoke("what is the weather like in San Francisco")でユーザープロンプトを渡し、ClaudeがGetWeatherツールを使用して回答を生成

from langchain_core.pydantic_v1 import BaseModel, Field

llm = ChatAnthropic(
    model="claude-3-opus-20240229",
)


class GetWeather(BaseModel):
    """Get the current weather in a given location"""

    location: str = Field(..., description="The city and state, e.g. San Francisco, CA")


llm_with_tools = llm.bind_tools([GetWeather])

ai_msg = llm_with_tools.invoke(
    "what is the weather like in San Francisco",
)
ai_msg

実行結果

{
 "content": [
   {
     "text": "<thinking>\nThe user has asked for the current weather in a specific location - San Francisco. The relevant tool for this is the GetWeather function.\n\nThe GetWeather function has one required parameter:\n- location: The city and state, e.g. San Francisco, CA\n\nThe user has directly provided the location in their request - they specified \"San Francisco\". While they did not provide the state, it is reasonable to infer they are referring to San Francisco, California since that is by far the most well known San Francisco.\n\nSince the required location parameter has been provided, we can proceed with calling the GetWeather function.\n</thinking>",
     "type": "text"
   },
   {
     "id": "toolu_01GbH5P4yh4uaRSgz4rogHje",
     "input": {
       "location": "San Francisco, CA"
     },
     "name": "GetWeather",
     "type": "tool_use"
   }
 ],
 "response_metadata": {
   "id": "msg_019FJkb6PnDhvoNugAKcATe1",
   "model": "claude-3-opus-20240229",
   "stop_reason": "tool_use",
   "stop_sequence": null,
   "usage": {
     "input_tokens": 487,
     "output_tokens": 191
   }
 },
 "id": "run-40d42f94-597d-41e0-ac8e-8b829613d16d-0"
}

この実行結果は、ユーザーが "What is the weather like in San Francisco?" と質問した際の、Claudeの思考プロセスとツールの使用を表しています。

  1. Claudeは、ユーザーの質問に答えるために必要なツールとして `GetWeather` 関数を特定しています。

  2. Claudeは、ユーザーが提供した場所 "San Francisco" が、州名は明示されていないものの、一般的に "San Francisco, CA" を指すと推測しています。

  3. 必要なパラメータ(location)が提供されているため、`GetWeather` 関数を呼び出すことができると判断しています。

  4. これらの思考プロセスは `<thinking>` タグで囲まれたテキストブロックとして出力されています。

  5. 最後に、Claudeは実際に `GetWeather` ツールを使用するために、`tool_use` ブロックを出力しています。このブロックには、ツールの名前、一意のID、入力パラメータ(location: "San Francisco, CA")が含まれています。

この例は、Anthropicのドキュメントで説明されているツールの使用方法に沿っています。Claudeは、ユーザーの質問を分析し、適切なツールを選択して必要なパラメータを推測し、ツールの使用をリクエストしています。

また、この例では、Claudeの思考プロセスが `<thinking>` タグを使って明示的に示されています。これは、特に Claude 3 Opus モデルにおいて一般的な動作であり、ツールの使用における推論の過程を理解するのに役立ちます。

この記事が気に入ったらサポートをしてみませんか?