0Pricing
AI Engineering Academy · Pelajaran

Memproses Pemanggilan Alat di Aplikasi Anda

Deteksi finish_reason tool_calls dalam respons API, ambil nama fungsi dan argumennya, jalankan fungsi Python yang sesuai, lalu kirimkan hasilnya kembali ke model.

Memproses Pemanggilan Alat di Aplikasi Anda adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Objek Respons Pemanggilan Alat

Ketika model memutuskan untuk memanggil fungsi, respons API berisi daftar tool_calls pada objek pesan. Setiap pemanggilan alat memiliki id unik, function.name yang akan dipanggil, dan function.arguments—string JSON berisi argumen yang ingin diteruskan model. Kode aplikasi Anda bertanggung jawab menguraikan data ini dan menjalankan fungsi tersebut.

from openai import OpenAI
import json

client = OpenAI()

response = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'What is the weather in Paris?'}],
    tools=tools  # defined previously
)

message = response.choices[0].message

if response.choices[0].finish_reason == 'tool_calls':
    for tool_call in message.tool_calls:
        print('Call ID:', tool_call.id)
        print('Function name:', tool_call.function.name)
        print('Arguments (JSON string):', tool_call.function.arguments)

Menguraikan Argumen Fungsi

Bidang function.arguments adalah string berkode JSON, bukan dict Python. Anda harus menguraikannya dengan json.loads(). Selalu bungkus proses ini dalam try/except—model terkadang menghasilkan JSON yang formatnya rusak meskipun sudah diberi panduan skema, sehingga Anda perlu menanganinya dengan baik.

import json

def parse_tool_call(tool_call) -> dict:
    '''Parse a tool call's arguments from JSON string to dict.'''
    try:
        args = json.loads(tool_call.function.arguments)
        return args
    except json.JSONDecodeError as e:
        print(f'Failed to parse arguments for {tool_call.function.name}: {e}')
        print(f'Raw arguments: {tool_call.function.arguments}')
        return {}

# Usage
tool_call = message.tool_calls[0]
args = parse_tool_call(tool_call)
print('Parsed args:', args)  # {'location': 'Paris', 'unit': 'celsius'}

Mengarahkan ke Fungsi yang Tepat

Gunakan function.name untuk mengarahkan pemanggilan ke fungsi Python yang tepat. Pola yang rapi adalah menyimpan fungsi Anda dalam kamus yang memetakan nama ke objek yang dapat dipanggil. Cara ini menghindari rangkaian if/elif yang rapuh dan memudahkan penambahan alat baru nantinya.

def get_current_weather(location: str, unit: str = 'celsius') -> str:
    # Real implementation calls a weather API
    return f'{location}: 18{chr(176)}C, partly cloudy'

def create_calendar_event(title: str, start_time: str, duration_minutes: int, **kwargs) -> str:
    return f'Event created: {title} at {start_time} for {duration_minutes} minutes'

# Tool registry: maps function names to callables
TOOL_REGISTRY = {
    'get_current_weather': get_current_weather,
    'create_calendar_event': create_calendar_event
}

def execute_tool_call(tool_call) -> str:
    name = tool_call.function.name
    args = parse_tool_call(tool_call)

    if name not in TOOL_REGISTRY:
        return f'Unknown function: {name}'

    try:
        result = TOOL_REGISTRY[name](**args)
        return str(result)
    except Exception as e:
        return f'Function {name} raised an error: {str(e)}'

Mengirimkan Hasil Kembali ke Model

Setelah menjalankan fungsi, Anda harus mengirimkan hasilnya kembali ke model dalam panggilan API lanjutan. Tambahkan pesan asisten (yang berisi tool_calls) ke percakapan, lalu tambahkan pesan baru dengan role='tool', tool_call_id, dan hasil fungsi sebagai konten. Kemudian panggil API lagi.

def run_tool_call_loop(messages: list, tools: list) -> str:
    response = client.chat.completions.create(
        model='gpt-4o',
        messages=messages,
        tools=tools
    )
    message = response.choices[0].message
    messages.append(message)  # Add assistant's tool_calls message

    # Execute all tool calls and collect results
    for tool_call in (message.tool_calls or []):
        result = execute_tool_call(tool_call)
        # Add each tool result as a 'tool' role message
        messages.append({
            'role': 'tool',
            'tool_call_id': tool_call.id,
            'content': result
        })

    # Second API call with results appended
    final_response = client.chat.completions.create(
        model='gpt-4o',
        messages=messages,
        tools=tools
    )
    return final_response.choices[0].message.content

Satu Putaran Percakapan Lengkap

Interaksi pemanggilan alat yang lengkap melibatkan empat pesan dalam riwayat percakapan: pesan pengguna, pesan asisten yang meminta pemanggilan alat, pesan hasil alat, dan respons akhir asisten yang menyertakan hasil tersebut. Memahami struktur ini sangat penting untuk membangun asisten yang menggunakan alat dalam beberapa putaran.

# The full message history for a tool-calling conversation:
conversation = [
    {'role': 'user', 'content': 'What is the weather in Tokyo?'},

    # Model requests a tool call (added by run_tool_call_loop)
    # {'role': 'assistant', 'content': None, 'tool_calls': [...]},

    # Application sends tool result back
    # {'role': 'tool', 'tool_call_id': 'call_abc123', 'content': 'Tokyo: 22C, sunny'},

    # Model produces final human-readable response
    # {'role': 'assistant', 'content': 'The weather in Tokyo is 22 degrees Celsius and sunny.'}
]

final_answer = run_tool_call_loop(
    [{'role': 'user', 'content': 'What is the weather in Tokyo?'}],
    tools
)
print(final_answer)

Menangani Kondisi Saat Tidak Ada Alat yang Dipanggil

Terkadang model menjawab secara langsung tanpa memanggil alat apa pun—finish_reason akan bernilai 'stop', bukan 'tool_calls'. Selalu periksa kondisi ini sebelum mencoba memproses pemanggilan alat. Implementasi yang tangguh menangani kedua cabang tersebut dengan rapi.

def smart_complete(user_message: str) -> str:
    messages = [{'role': 'user', 'content': user_message}]
    response = client.chat.completions.create(
        model='gpt-4o',
        messages=messages,
        tools=tools
    )
    choice = response.choices[0]

    if choice.finish_reason == 'stop':
        # Model answered directly without calling a tool
        return choice.message.content

    elif choice.finish_reason == 'tool_calls':
        # Process tool calls
        messages.append(choice.message)
        for tc in choice.message.tool_calls:
            result = execute_tool_call(tc)
            messages.append({'role': 'tool', 'tool_call_id': tc.id, 'content': result})
        # Get final answer
        final = client.chat.completions.create(model='gpt-4o', messages=messages)
        return final.choices[0].message.content

    return 'Unexpected finish reason: ' + choice.finish_reason

Memvalidasi Argumen Sebelum Menjalankan Fungsi

Model terkadang dapat meneruskan argumen yang gagal dalam validasi logika bisnis—durasi negatif, surel yang tidak valid, atau tanggal yang sudah lewat. Validasi argumen sebelum memanggil fungsi sebenarnya dan kembalikan string kesalahan yang deskriptif jika validasi gagal. Model kemudian dapat memperbaiki argumennya pada putaran berikutnya.

from pydantic import BaseModel, ValidationError
from datetime import datetime

class CreateEventArgs(BaseModel):
    title: str
    start_time: str  # ISO 8601
    duration_minutes: int

def safe_create_event(tool_call) -> str:
    try:
        raw_args = json.loads(tool_call.function.arguments)
        validated = CreateEventArgs(**raw_args)
        # Additional business rule
        event_time = datetime.fromisoformat(validated.start_time)
        if event_time < datetime.now():
            return 'Error: start_time must be in the future.'
        return create_calendar_event(**validated.dict())
    except ValidationError as e:
        return f'Invalid arguments: {e}'

Mencatat Interaksi Pemanggilan Alat

Selalu catat interaksi pemanggilan alat untuk keperluan penelusuran kesalahan dan analitik. Catat nama fungsi, argumen, hasil, dan waktu eksekusi. Data ini membantu Anda mengidentifikasi alat mana yang paling sering dipanggil, alat mana yang gagal, dan pola argumen apa yang dihasilkan model—semuanya sangat berharga untuk meningkatkan skema dan implementasi fungsi Anda.

import time
import logging

logger = logging.getLogger('tool_calls')

def logged_execute(tool_call) -> str:
    name = tool_call.function.name
    args_str = tool_call.function.arguments
    start = time.time()
    result = execute_tool_call(tool_call)
    elapsed = time.time() - start

    logger.info(
        'Tool call executed',
        extra={
            'function': name,
            'arguments': args_str,
            'result_length': len(result),
            'elapsed_ms': round(elapsed * 1000)
        }
    )
    return result

Pertimbangan Keamanan Pemanggilan Alat

Jangan pernah menjalankan fungsi sembarang berdasarkan keluaran model tanpa validasi. Selalu masukkan nama fungsi yang tepat ke daftar izin dalam TOOL_REGISTRY, validasi semua argumen, dan periksa otorisasi sebelum menjalankan tindakan. Model adalah pemanggil yang tidak tepercaya—perintah berbahaya dapat mencoba memanggil fungsi yang merusak jika logika pengarah Anda terlalu longgar.

  • Hanya izinkan fungsi yang secara eksplisit tercantum dalam TOOL_REGISTRY
  • Validasi masukan dengan Pydantic sebelum eksekusi
  • Wajibkan otorisasi untuk operasi penulisan/penghapusan

Mengembalikan Hasil Terstruktur yang Kaya

Hasil alat tidak harus berupa string biasa. Anda dapat mengembalikan data berformat JSON, tabel, atau ringkasan. Mengembalikan data terstruktur sebagai JSON memungkinkan model menguraikan dan merujuk bidang tertentu dalam jawaban akhirnya. Untuk hasil yang besar, kembalikan ringkasan berisi fakta utama, bukan seluruh data mentah ke dalam konteks.

def get_order_status(order_id: str) -> str:
    # Fetch from real database
    order = {'id': order_id, 'status': 'shipped', 'estimated_delivery': '2024-03-15', 'carrier': 'FedEx', 'tracking': 'FX123456'}
    # Return concise summary, not raw DB record
    return (
        f'Order {order_id}: Status={order["status"]}, '
        f'Estimated delivery: {order["estimated_delivery"]}, '
        f'Carrier: {order["carrier"]}, Tracking: {order["tracking"]}'
    )

Percakapan Multi-Putaran yang Menggunakan Alat

Salah satu pola yang kuat adalah percakapan beberapa putaran ketika model memanggil alat di antara beberapa pesan pengguna untuk membangun konteks. Selalu pertahankan seluruh riwayat percakapan, termasuk pemanggilan alat dan hasil sebelumnya, agar model dapat merujuk jawaban terdahulu tanpa memanggil alat kembali secara tidak perlu.

Pemeriksaan Singkat

Uji pemahaman Anda tentang pemrosesan pemanggilan alat dalam aplikasi.

Rangkuman Pelajaran

Dalam pelajaran ini, Anda mempelajari bahwa: argumen pemanggilan alat tiba sebagai string JSON yang harus diuraikan dengan json.loads(), kamus TOOL_REGISTRY memetakan nama fungsi ke objek yang dapat dipanggil untuk pengarahan yang rapi, dan hasil dikirim kembali ke model sebagai pesan role='tool' dengan tool_call_id yang sesuai. Selanjutnya, kita akan menangani kondisi ketika model memanggil beberapa fungsi secara bersamaan dengan pemanggilan fungsi paralel.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memproses Pemanggilan Alat di Aplikasi Anda” gratis?

Ya — teks lengkap “Memproses Pemanggilan Alat di Aplikasi Anda” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memproses Pemanggilan Alat di Aplikasi Anda”?

Deteksi finish_reason tool_calls dalam respons API, ambil nama fungsi dan argumennya, jalankan fungsi Python yang sesuai, lalu kirimkan hasilnya kembali ke model. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?

Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Memproses Pemanggilan Alat di Aplikasi Anda” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?

Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendefinisikan Skema Fungsi untuk API
  2. Memproses Pemanggilan Alat di Aplikasi Anda
  3. Pemanggilan Fungsi secara Paralel
  4. Membangun Antarmuka Basis Data Bahasa Alami
← Kembali ke AI Engineering Academy