こんにちは!この記事では、Claude を使って外部の関数を呼び出す方法について、初心者向けに丁寧に解説します。関数呼び出しを使うと、Claude の機能を拡張し、より多様なタスクを実行できるようになります。
こちらの記事もおすすめ
なん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 での関数呼び出しは以下のような流れになります。
- プロンプトに関数定義と stop_sequence としての
<function_calls>
ブロックを含める - Claude が関数呼び出しの必要性を判断し、適切な関数と引数を XML 形式で出力する
- Claude の出力をパースして、指定された関数をクライアント側で実行する
- 関数の実行結果を
<function_results>
ブロックに入れて Claude に返す - 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 の機能を拡張し、株価の取得のようなタスクを実行してもらうことができます。
以上がチュートリアルの内容です。関数呼び出しの基本的な仕組みが理解できたでしょうか? まだまだ発展途上の機能ですが、今後の進化にも注目です!
コメント