0Pricing
AI Agents · レッスン

モデルへの結果の返却

ツールの出力をtoolロールのメッセージとして整形し、モデルが読み取って会話を続けられるようにします。

「モデルへの結果の返却」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。

ツール結果メッセージ

ツールを実行した後、ツールメッセージで結果をモデルに伝えます。

messages.append({
    'role': 'tool',
    'tool_call_id': tool_call.id,    # MUST match the assistant's tool_call.id
    'content': json.dumps(result)
})

contentは文字列にする

OpenAIはcontentが文字列であることを想定しています。オブジェクトはjson.dumpsでシリアライズします。

# Bad — will error
messages.append({'role': 'tool', 'tool_call_id': id, 'content': {'temp': 18}})

# Good
messages.append({'role': 'tool', 'tool_call_id': id, 'content': '{"temp": 18}'})

Anthropicの形式

Anthropicでは、ユーザーメッセージ内にコンテンツブロックを配置します。

messages.append({
    'role': 'user',
    'content': [{
        'type': 'tool_result',
        'tool_use_id': 'toolu_abc',
        'content': json.dumps(result)
    }]
})

エラーを返す

ツールが失敗した場合は、成功したふりをせずエラーを返します。モデルはそこから回復できます。

try:
    result = run_tool(...)
    content = json.dumps({'ok': True, 'data': result})
except Exception as e:
    content = json.dumps({'ok': False, 'error': str(e)})

messages.append({'role': 'tool', 'tool_call_id': id, 'content': content})

複数結果のパターン

並列ツール呼び出しでは、それぞれ対応するIDを付けて結果を追加します。

for tc in message.tool_calls:
    result = dispatch(tc)
    messages.append({
        'role': 'tool',
        'tool_call_id': tc.id,
        'content': json.dumps(result)
    })

大きな出力は要約する

ツールが100KBのHTMLを返した場合、それをすべてモデルに送るとトークンを浪費し、注意が分散します。先に要約または切り詰めを行ってください。

def truncate(text, max_chars=4000):
    if len(text) <= max_chars:
        return text
    return text[:max_chars] + f'\n...[truncated, {len(text)-max_chars} more chars]'

sample = "x" * 4500
result = truncate(sample, max_chars=50)
print(result)

常に同じスキーマにする

結果が成功、エラー、未検出のいずれであっても、出力スキーマは安定させます。形式が一貫している方が、モデルの信頼性は高くなります。

from typing import TypedDict, Literal, Optional, Any

class ToolResult(TypedDict):
    status: Literal['ok', 'not_found', 'error']
    data: Optional[Any]
    error: Optional[str]

def make_result(status, data=None, error=None) -> ToolResult:
    return {'status': status, 'data': data, 'error': error}

print(make_result('ok', data={'temp': 72}))
print(make_result('not_found', error='city not found'))

メタデータのヒントを含める

コンテンツにヒントを含めることで、モデルが結果を解釈しやすくなります。

content = json.dumps({
    'data': rows,
    'note': 'Returned 50 rows (most recent first). There may be more matches.'
})

バイナリデータ

大きなデータをツールメッセージにBase64エンコードして埋め込まないでください。代わりにストレージへ保存し、URLまたはIDを返します。

result = {
    'image_path': '/tmp/chart-abc.png',
    'thumbnail_url': 'https://...',
    'caption': 'Sales by quarter, 2024'
}
for k, v in result.items():
    print(f"{k}: {v}")

モデルをもう一度ループさせる

すべてのツール結果を追加した後、もう一度モデルを呼び出します。モデルは最終回答を生成するか、さらにツールを呼び出します。

class Msg:
    def __init__(self, tool_calls=None, content=None):
        self.tool_calls = tool_calls or []
        self.content = content

class ToolCall:
    def __init__(self, name, args):
        self.name = name
        self.args = args

def call_model(messages, tools):
    if len(messages) < 4:
        return Msg(tool_calls=[ToolCall('get_weather', {'city': 'Paris'})])
    return Msg(content='It is sunny in Paris.')

messages = [{'role': 'user', 'content': 'Weather in Paris?'}]
tools = ['get_weather']
message = call_model(messages, tools)

while message.tool_calls:
    for tc in message.tool_calls:
        result = f'Result of {tc.name}({tc.args})'
        messages.append({'role': 'tool', 'name': tc.name, 'content': result})
        print('Tool call:', tc.name, '->', result)
    message = call_model(messages, tools)

print('Final answer:', message.content)

ツール出力を監査する

デバッグ用に、すべての(tool_call_id、引数、結果)をログに記録します。エージェントが奇妙な動作をしたときは、まずツール結果のログを確認してください。

ツール結果の形式

ツールメッセージ内のtool_call_idは何を指しているのでしょうか。

まとめ

これで、ツール呼び出しのラウンドトリップ全体を扱えるようになりました。次のコースは、エージェントの3本目の柱であるメモリです。

よくある質問

「モデルへの結果の返却」レッスンは無料ですか?

はい。「モデルへの結果の返却」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。

「モデルへの結果の返却」で何を学びますか?

ツールの出力をtoolロールのメッセージとして整形し、モデルが読み取って会話を続けられるようにします。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Agentsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「モデルへの結果の返却」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Agentsレッスンでコードを書いて実行できますか?

はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Function Callingの仕組み
  2. ツールスキーマの定義(JSON Schema)
  3. 実行時のツール選択
  4. モデルへの結果の返却
← AI Agentsに戻る