Claude での関数呼び出し入門

AIアシスタント

こんにちは!この記事では、Claude を使って外部の関数を呼び出す方法について、初心者向けに丁寧に解説します。関数呼び出しを使うと、Claude の機能を拡張し、より多様なタスクを実行できるようになります。


こちらの記事もおすすめ

Harina - Claude 3 Haiku を使ったレシート解析Discord Bot アプリ
はじめにHarinaはDiscordで動作するレシート解析Botです。ユーザーがチャットにレシートの画像を送信すると、最新のClaude 3 Haikuモデルを使って高速かつ高精度にレシートの情報を抽出します。抽出されたデータはGoogle...
ろんJ (V1.4)~論文をなんJ風に解説!専門家と初心者の活発な議論が面白い~
論文は難しそうで読むのが億劫...。でもそんな人でも、「ろんJ GPTs」を使えば論文の内容が面白おかしく理解できるかもしれません。「ろんJ GPTs」は、アップロードした論文の内容を、あの有名な2ちゃんねるの「なんでも実況J」(通称:なん...

なんJ アイスブレイク~Claude での関数呼び出しとは?~

1 名前:プログラミング初心者 投稿日時:2023/05/01(月) 12:34:56 ID:eXaMpLe1

Claude の関数呼び出しについて勉強中やけど、ようわからんわ。誰か教えてクレメンス。

2 名前:Python中級者 投稿日時:2023/05/01(月) 12:37:12 ID:PyThOn11

>>1
Claude_プロンプト用のツール記述を構築() 関数のことか?あれはツールの説明をXML形式っぽい文字列で作っとるんやで。

3 名前:データサイエンティスト 投稿日時:2023/05/01(月) 12:40:33 ID:DaTa_Sc1

>>1
パラメータプロンプトを構築() はパラメータの情報を タグで囲んで文字列化しとるで。これをツール記述の の部分に入れるんや。

4 名前:AI研究者 投稿日時:2023/05/01(月) 12:43:18 ID:Ai_ReSr4

>>1
ツールの名前、説明、パラメータの情報を Claude に伝えるための形式やな。これを使って Claude にツールの使い方を教えるんや。

5 名前:ソフトウェアエンジニア 投稿日時:2023/05/01(月) 12:45:55 ID:SwEnG_55

operatorのところ、+、-、*、/ 以外受け付けへんみたいやから気をつけてな。

6 名前:プログラミング初心者 投稿日時:2023/05/01(月) 12:48:22 ID:eXaMpLe1

なるほど、段々分かってきたで!サンガツ!

7 名前:フロントエンドエンジニア 投稿日時:2023/05/01(月) 12:50:47 ID:FrOnT_77

>>2 >>3
XMLっぽい形式ってのが、タグで囲んで構造化するってことなんやな。勉強になるわ。

8 名前:機械学習エンジニア 投稿日時:2023/05/01(月) 12:53:14 ID:Ml_EnG_8

>>4
Claude にツールの使い方を教えるための仕組みなんやね。すごいな、AI の世界。

9 名前:バックエンドエンジニア 投稿日時:2023/05/01(月) 12:55:39 ID:BaEn_G9

>>5
operatorの制限はしっかり覚えとかなあかんな。バグの元やわ。

10 名前:ITコンサルタント 投稿日時:2023/05/01(月) 12:58:06 ID:It_CoN10

これを使えば、Claudeに複雑なタスクも任せられそうやな。ビジネスでの活用が楽しみやわ。

11 名前:プロジェクトマネージャー 投稿日時:2023/05/01(月) 13:00:51 ID:PrMgR_11

>>10
そうやな。でも、しっかりテストして安全性を確認してからな。それが大事やで。

12 名前:プログラミング初心者 投稿日時:2023/05/01(月) 13:03:17 ID:eXaMpLe1

みんな、めっちゃ勉強になったわ!これからもClaudeといろいろ試してみるで!

13 名前:システムアーキテクト 投稿日時:2023/05/01(月) 13:05:43 ID:SyArC_13

>>12
がんばりや!わからんことがあったら、また聞きにきてな。みんなで knowledge share していこうや!

関数呼び出しとは?

関数呼び出しは、Claude に外部のクライアント側ツールや関数を使わせる機能のことです。Claude 自体にはプログラミング言語のような関数はありませんが、外部で定義した関数を Claude に使ってもらうことができるのです。

例えば、現在の天気を取得する get_weather(location) という関数を定義したとします。ユーザーが「東京の今日の天気は?」と聞いてきたら、Claude はこの関数を呼び出して答えを得ることができます。

関数の定義方法

Claude に関数を使ってもらうには、まずその関数について XML 形式で説明する必要があります。関数の定義には下記の情報を含めます。

  • 関数名
  • 関数の機能についての説明文
  • 引数名、型、説明
  • 戻り値の型と説明
  • 例外が発生する条件

例えば、get_weather 関数は以下のように定義できます。


<tool_description>
<tool_name>get_weather</tool_name>
<description>
指定された場所の現在の天気を取得します。
戻り値は2つのフィールドを持つ辞書型です:
- temperature: 現在の気温(華氏)
- conditions: 現在の天気の簡単な説明
指定された場所が見つからない場合は ValueError が発生します。  
</description>
<parameters>
<parameter>
<name>location</name>
<type>string</type>
<description>都市名と州名。例: San Francisco, CA</description>
</parameter>
</parameters>
</tool_description>

関数定義を書く際は、明確かつ簡潔に、でも必要な情報は漏らさずに書くのがコツです。コード構文よりも平易な説明文を心がけましょう。

関数の呼び出し方

Claude に関数を呼び出してもらうには、特殊な XML 形式のブロックをプロンプトに含める必要があります。書式は下記のようになります。


<function_calls>
<invoke>
<tool_name>関数名</tool_name>
<parameters>
<param1>値1</param1>
<param2>値2</param2>
</parameters>
</invoke>
</function_calls>

<function_calls> ブロックの中には、複数の <invoke> ブロックを含められます。各 <invoke> ブロックには、呼び出す関数名と引数の名前と値を指定します。

Claude に関数を呼び出させたい場所で、このブロックを stop_sequence として指定します。こうすると、Claude は関数呼び出しが終わるまで応答の生成を一時停止し、関数の実行結果を待ちます。

関数の実行結果は、下記のような <funtion_results> ブロックで Claude に渡します。


<function_results>
<result>
<tool_name>関数名</tool_name>
<stdout>
関数の実行結果
</stdout>
</result>
</function_results>

もし関数がエラーを起こした場合は、代わりに以下のようなブロックを返します。


<function_results>
<error>
エラーメッセージ 
</error>
</function_results>

関数呼び出しの一連の流れ

ここまでの内容をまとめると、Claude での関数呼び出しは以下のような流れになります。

  1. プロンプトに関数定義と stop_sequence としての <function_calls> ブロックを含める
  2. Claude が関数呼び出しの必要性を判断し、適切な関数と引数を XML 形式で出力する
  3. Claude の出力をパースして、指定された関数をクライアント側で実行する
  4. 関数の実行結果を <function_results> ブロックに入れて Claude に返す
  5. Claude が関数の結果を受け取り、最終的な応答の生成を再開する

サンプルコード

最後に、株価を取得する関数の定義と呼び出しの一連の流れを、サンプルコードで見てみましょう。


import os
import anthropic

# 関数定義
function_defs = """
<tools>
<tool_description>
<tool_name>get_stock_price</tool_name>
<description>指定された銘柄の現在の株価を取得します。</description>
<parameters>
<parameter>
<name>symbol</name>
<type>string</type>
<description>株価を調べたい銘柄のティッカーシンボル</description>
</parameter>
</parameters>
</tool_description>
</tools>
"""

# 質問文
human_query = "アップルの現在の株価を教えてください。"

# Claude を呼び出す
client = anthropic.Client(os.environ["ANTHROPIC_API_KEY"])
response = client.completion.create(
    prompt=f"{function_defs}\n\nHuman: {human_query}\n\nAssistant: ",
    stop_sequences=["\n\nHuman"],
    model="claude-2",
    max_tokens_to_sample=200,
)

# Claude の応答をパース
claude_response = response.completion
print(claude_response)
# <function_calls>
# <invoke>
# <tool_name>get_stock_price</tool_name>
# <parameters>
# <symbol>AAPL</symbol>
# </parameters>
# </invoke>
# </function_calls>

# 関数を実行 (ここでは株価を取得するコードは省略)
def get_stock_price(symbol):
    price = 123.45 # 実際には外部 API などから取得
    return price

symbol = "AAPL" # Claude の応答からパース
price = get_stock_price(symbol)

# 関数の結果を Claude に返す  
function_results = f"""
<function_results>
<result>
<tool_name>get_stock_price</tool_name>
<stdout>
{price}
</stdout>
</result>
</function_results>
"""

# Claude に関数の結果を渡して、応答の生成を再開
response = client.completion.create(
    prompt=f"{function_defs}\n\nHuman: {human_query}\n\nAssistant: {claude_response}{function_results}",
    stop_sequences=["\n\nHuman"],   
    model="claude-2",
    max_tokens_to_sample=200,
)

# 最終的な応答
result = response.completion
print(result)  
# アップルの現在の株価は123.45ドルです。

このように、関数呼び出しを使うことで Claude の機能を拡張し、株価の取得のようなタスクを実行してもらうことができます。

以上がチュートリアルの内容です。関数呼び出しの基本的な仕組みが理解できたでしょうか? まだまだ発展途上の機能ですが、今後の進化にも注目です!

ノートブック

Google Colaboratory

参考サイト

anthropic-cookbook/function_calling/function_calling.ipynb at main · anthropics/anthropic-cookbook
A collection of notebooks/recipes showcasing some fun and effective ways of using Claude. - anthropics/anthropic-cookbook
Functions & external tools
Although formal support is still in the works, Claude has the capability to interact with external client-side tools and functions in order to expand its capabi...

コメント

タイトルとURLをコピーしました