Kihagyás

09 – Tool Calling

A tool calling az a mechanizmus, amellyel egy LLM műveletet vagy külső capabilityt kérhet, anélkül hogy közvetlenül maga hajtaná végre azt.

A kulcs mentális modell:

LLM eldönti, mit szeretne tenni
        ↓
structured tool call
        ↓
application validálja a requestet
        ↓
application valódi kódot futtat
        ↓
tool result visszakerül a modellhez
        ↓
a modell az új információval folytatja

Az LLM nem executor. Egy decision-making komponens, amely tool invocationt javasolhat.

Miért létezik tool calling?

Egy LLM önmagában nem tud megbízhatóan aktuális adatbázist olvasni, emailt küldeni, privát rendszert lekérdezni, fájlt módosítani, internal API-t hívni vagy determinisztikus számítást elvégezni, hacsak ezeket a capabilityket nem tesszük elérhetővé számára.

A toolok ezt a rést hidalják át.

Példák:

  • get_customer(customer_id)
  • search_documents(query)
  • create_ticket(title, priority)
  • get_weather(location)
  • run_build(branch)
  • calculate_tax(amount, country)

A modell megkapja az elérhető toolok descriptionjét és schemáját, és kiválaszthat egyet, ha a taskhoz szükséges.

Tool definition mint contract

Egy toolnak világos, machine-readable contractja legyen.

Koncepcionálisan:

{
  "name": "get_order",
  "description": "Retrieve an order by its identifier",
  "parameters": {
    "type": "object",
    "properties": {
      "order_id": {
        "type": "string"
      }
    },
    "required": ["order_id"]
  }
}

Nem a pontos szintaxis a lényeg, hanem hogy az application definiálja:

  • a tool nevét,
  • mit csinál,
  • milyen argumentumokat fogad,
  • mely argumentumok kötelezők,
  • milyen típusokat vár.

Ez hasonló egy API contract vagy typed function signature definiálásához.

Példa: order lookup

User:

Where is order ORD-12345?

Az LLM training data alapján nem tudhatja az aktuális order state-et.

Kérheti:

{
  "tool": "get_order",
  "arguments": {
    "order_id": "ORD-12345"
  }
}

Az application ezután valami ehhez hasonlót hajt végre:

order = order_service.get_order("ORD-12345")

és resultot ad vissza:

{
  "order_id": "ORD-12345",
  "status": "shipped",
  "carrier": "DHL",
  "estimated_delivery": "2026-09-01"
}

A modell így már válaszolhat:

Your order has shipped with DHL and is currently estimated to arrive on September 1.

Az aktuális tény a toolból jött, nem a model training knowledge-ból.

A tool calling nem közvetlen function execution

Hasznos separation:

LLM layer
- choose tool
- generate arguments
- interpret tool result

Application layer
- authenticate
- authorize
- validate
- execute
- handle errors
- audit

Veszélyes architecture lenne gyakorlatilag ezt tenni:

LLM says "delete user 123"
        ↓
execute immediately

Biztonságosabb:

LLM proposes delete_user(user_id=123)
        ↓
validate schema
        ↓
authenticate caller
        ↓
check permission
        ↓
check business rules
        ↓
possibly require confirmation
        ↓
execute

A model tool choice input az application logichoz, nem authorization.

Read tool vs write tool

Nem minden tool azonos kockázatú.

Read-only tool

get_customer
search_docs
get_invoice

A failure tipikusan helytelen vagy hiányzó információt jelent.

Mutating tool

send_email
cancel_order
restart_server
transfer_money

A failure külső side effectet okozhat.

Mutating toolnál általában erősebb kontroll kell:

  • authorization,
  • confirmation,
  • idempotency,
  • auditing,
  • retry policy,
  • rate limits.

A tool result context

A tool result általában új model context lesz.

User request
    ↓
LLM
    ↓
tool call
    ↓
tool execution
    ↓
tool result
    ↓
LLM
    ↓
final answer or another tool call

Ez az agentic loop egyik alap building blockja.

A tool calling önmagában még nem feltétlen agent. Egyetlen kontrollált tool call lehet teljesen determinisztikus application workflow része.

Egy tool call vs loop

Egyszerű flow:

question
  ↓
LLM
  ↓
get_order
  ↓
answer

Agent-like flow:

goal
 ↓
LLM
 ↓
search_repository
 ↓
LLM
 ↓
read_file
 ↓
LLM
 ↓
run_tests
 ↓
LLM
 ↓
edit_file
 ↓
LLM
 ↓
final result

A második eset ismételten observe-olja az eredményt és kiválasztja a következő actiont. Itt kezdődik az agentic loop.

A tool schema design számít

Rossz tool:

execute(action: string, payload: object)

Ez nagyon széles és ambiguous interface-t ad a modellnek.

Jobb:

get_customer(customer_id)
create_support_ticket(title, description, priority)
cancel_order(order_id, reason)

A szűk tool könnyebben:

  • érthető,
  • authorizálható,
  • validálható,
  • tesztelhető,
  • observe-olható,
  • korlátozható.

Ez normál API design elv.

Infrastructure tool helyett semantic tool

Tegyük fel, hogy egy ordert kell refundolni.

Gyenge abstraction:

execute_sql(sql)

Jobb abstraction:

refund_order(order_id, reason)

A második megőrzi a domain boundaryt, és lehetővé teszi, hogy a determinisztikus application code enforce-olja a valódi refund rule-okat.

Hasznos elv:

Business capabilityket adj a modellnek, ne unrestricted infrastructure primitiveket, kivéve ha a széles hozzáférés szándékos és erősen sandboxolt.

Tool argument validation

Még schema-compatible output esetén is kell business validation.

Tool call:

{
  "tool": "transfer_credit",
  "arguments": {
    "customer_id": "C-123",
    "amount": 1000000
  }
}

Az argumentum formailag lehet helyes, miközben az amount policyt sért.

Ezért:

schema validation
       ↓
business validation
       ↓
authorization
       ↓
execution

Error handling

A toolok ugyanúgy hibáznak, mint bármely software dependency.

Lehetséges hibák:

  • timeout,
  • HTTP 500,
  • invalid arguments,
  • permission denied,
  • resource not found,
  • rate limit,
  • temporary outage.

Az application a raw infrastructure failure-t szükség esetén világos structured tool resulttá alakítsa.

Példa:

{
  "status": "error",
  "error_code": "ORDER_NOT_FOUND",
  "message": "No order exists with this identifier"
}

A modell így kérhet másik ID-t ahelyett, hogy kitalálna egy ordert.

Ne rejts fontos hibát a modell elől

Rossz flow:

tool fails
 ↓
application returns empty object
 ↓
LLM guesses what happened

Jobb:

tool fails
 ↓
structured failure result
 ↓
LLM understands the failure
 ↓
retry / ask user / stop

Példa: support assistant

Elérhető toolok:

get_customer(email)
get_recent_orders(customer_id)
create_support_ticket(customer_id, category, summary)

User:

My last order never arrived. Please open a ticket.

Lehetséges sequence:

1. LLM → get_customer(email)
2. Application validates and executes
3. Result → customer_id C-847
4. LLM → get_recent_orders(C-847)
5. Result → last order ORD-551, status shipped
6. LLM → create_support_ticket(...)
7. Application checks authorization and executes
8. Result → ticket SUP-9182
9. LLM tells the user the ticket number

A modell koordinálhatja a workflow-t, de minden valós side effect application control alatt marad.

Tool calling vs RAG

Különböző problémát oldanak meg.

RAG tipikusan:

retrieve relevant knowledge
        ↓
put it into context
        ↓
answer

Tool calling:

choose an external capability
        ↓
execute it
        ↓
observe the result

Egy retrieval system maga is exposed tool lehet, de koncepcionálisan a retrieval és action külön concern.

Tool calling vs MCP

A tool calling a model/application interaction pattern.

Az MCP egy lehetséges standardizált mód toolok és más contextual resource-ok AI clientek számára történő expose-olására.

Koncepcionálisan:

Tool calling = hogyan kér a modell capability executiont

MCP = protokoll, amely ezeket a capabilityket biztosíthatja az AI applicationnek

Nem egymással versengő fogalmak.

Tool-enabled rendszerek tesztelése

Több szinten tesztelj.

Schema tests

Elutasítja a tool a malformed argumentumot?

Authorization tests

Unauthorized user képes protected actiont meghívni?

Execution tests

Helyesen működik az underlying tool implementation?

Model behavior tests

Reprezentatív requesteknél a megfelelő toolt választja a modell?

End-to-end tests

A teljes loop a várt resultot adja unintended side effect nélkül?

Gyakorlati design szabályok

  • A toolok legyenek szűkek és szemantikailag értelmesek.
  • A tool callt kezeld untrusted requestként validationig.
  • Authorization maradjon determinisztikus application code-ban.
  • Válaszd szét a read-only és mutating capabilityket.
  • Adj explicit structured failure-t.
  • Mutating toolt retryra és idempotencyre tervezz.
  • Logold a tool nevét, biztonságosan logolható argumentumait, result statusát, latencyjét és caller contextet.
  • Ne adj a modellnek szélesebb permissiont a taskhoz szükségesnél.

Mentális modell

LLM = planner / chooser
Tool = capability contract
Application = policy + executor
External system = real world state

A fontos boundary:

Az LLM eldöntheti, mit szeretne tenni. Az application dönti el, hogy az action engedélyezett-e, és hogyan hajtható végre.