- Je maakt een expliciet onderscheid tussen een toolvoorstel en het uitvoeren van een functie.
- Je koppelt teruggekomen resultaten op ID in plaats van op toevallige aankomstvolgorde.
Een model kan voorstellen om twee getallen te vermenigvuldigen. Bij function calling, ook tool use genoemd, beschrijft het de gewenste functie en argumenten; gewone applicatiecode controleert het voorstel en voert de functie uit. De functie draait doordat jouw programma haar aanroept.
We bouwen een eigen klein contract voor multiply en stock. Beide werken uitsluitend op getallen of een fictieve voorraaddictionary. Zo kun je de volledige route van voorstel naar resultaat onderzoeken met voorspelbare uitkomsten.
1. Controleer naam, velden en argumenten
Een call heeft exact id, name en arguments. Het ID bevat 1–32 ASCII-letters, cijfers, koppeltekens (-) of underscores (_). De naam moet bij de twee toegestane functies horen; argumenten moeten precies de afgesproken velden hebben.
call = {'id':'c1','name':'multiply',
'arguments':{'x':6,'y':7}}
checked = validate_tool_call(call)
print(checked['name']) # multiply
print(checked is call) # False
Maak validate_tool_call met een nieuwe dictionary en gekopieerde argumenten. multiply vraagt twee echte gehele getallen x en y. In Python is isinstance(True,int) waar, maar ons contract weigert booleans; controleer daarvoor type(value) is int.
Deze grenzen beperken zowel invoer als resultaat. stock vraagt exact sku: 1–30 kleine ASCII-letters, cijfers of koppeltekens. Gebruik volledige patroonmatching, zodat ook een verkeerde rest achter een geldig begin wordt geweigerd.
Het schema lijkt op properties, required en additionalProperties in JSON Schema. We implementeren hier alleen onze eigen afspraak in Python. Dit is geen volledige schemavalidator of berichtformaat van een specifieke modelaanbieder.
Kies een fictief voorstel. Alleen een geldige call bereikt de rekenfunctie of de eigen voorraadlijst.
{
"id": "c1",
"name": "multiply",
"arguments": {
"x": 6,
"y": 7
}
}Naam en argumenten passen bij het vaste contract. Het resultaat komt uit echte lokale JavaScript-rekenlogica, zonder netwerk.
2. Laat een dispatcher de bekende functie kiezen
Een dispatcher kiest op de gevalideerde naam welke functie draait. Valideer eerst; vermenigvuldig daarna x en y of lees de voorraad op. De vaste catalogus bevat notebook=12 en pen=30.
stock = {'id':'c2','name':'stock',
'arguments':{'sku':'pen'}}
r1 = execute_tool(call)
r2 = execute_tool(stock)
print(r1['result']) # {'value': 42}
print(r2['result'])
# {'found': True, 'quantity': 30}
Maak execute_tool met het oorspronkelijke ID als call_id. Een onbekende sku krijgt found=False en quantity=None. Nul betekent een bekend artikel zonder voorraad; None betekent dat dit artikel niet in onze catalogus is gevonden.
Deze functies hebben geen bijwerkingen. Het model-lab krijgt hiermee ook geen toolrechten: het oefent tekstgeneratie, terwijl deze les het applicatiemechanisme apart uitvoert. Een model kan later een correct toolresultaat alsnog verkeerd verwoorden, dus toon kritieke getallen zo nodig rechtstreeks uit het gecontroleerde resultaat.
023. Herstel callvolgorde met een ID-map
Stel dat het voorraadantwoord eerder aankomt dan de vermenigvuldiging. De aankomstvolgorde zegt niets over welk resultaat bij welke vraag hoort. Een dictionary per call_id maakt de koppeling expliciet.
arrived = [r2,r1]
ordered = order_tool_results(
[call,stock],arrived)
print([r['call_id'] for r in ordered])
# ['c1', 'c2']
print(ordered[0]['result']['value'])
# 42
Maak order_tool_results voor maximaal acht calls, ieder met precies één antwoord. Weiger dubbele, ontbrekende of onbekende IDs en extra velden. Bewaar de oorspronkelijke callvolgorde en geef nieuwe resultaatdictionaries terug.
Een multiply-resultaat heeft exact value met een echte integer binnen het productbereik. Voorraad heeft exact found en quantity: een echte bool plus bij gevonden voorraad een integer van nul tot een miljoen, anders None. De lege lijst calls met een lege lijst resultaten geeft een lege lijst terug.
Deze helper toetst vorm en koppeling, niet de waarheid van de berekening. Zelfs value=999 bij multiply(6,7) voldoet aan het resultaatschema. Betrouwbare herkomst, toegestane handelingen en controle van kritieke inhoud vragen extra applicatielogica; de agenttrack bouwt de volledige lus verder uit.
03Wat neem je mee?
- Een toolvoorstel gaat eerst door een expliciet invoercontract.
- De dispatcher voert alleen bekende functies uit.
- IDs herstellen de koppeling; een geldig schema bewijst geen juiste inhoud.
Hierna reserveer je context en kosten voor gesprekken met zulke berichten.