Până de curând, rularea agenților capabili de Tool Calling (Function Calling) necesita exclusiv modele comerciale găzduite în cloud (OpenAI, Anthropic). Introducerea suportului nativ pentru unelte în Ollama a adus această capabilitate direct pe stațiile locale de lucru, permițând construirea de agenți autonomi complet confidențiali.
Ollama expune un format compatibil 1:1 cu schema OpenAI: trimiteți o listă de funcții descrise în format JSON (`type: function`), iar modelul local (cum ar fi Qwen 2.5 sau Llama 3.3) evaluează cererea utilizatorului și returnează un apel structurat `tool_calls` cu argumentele parsate corect.
După ce aplicația dumneavoastră execută funcția locală (de exemplu, o interogare în baza de date SQL internă sau o citire de fișier), trimiteți rezultatul înapoi către Ollama cu rolul `tool`, iar modelul sintetizează răspunsul final în limbaj natural pentru utilizator.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
tools |
Array de obiecte JSON ce descriu funcțiile apelabile, parametrii necesari și tipurile de date. |
tool_calls |
Structura returnată de model când decide să invoce una dintre uneltele disponibile. |
Role: 'tool' |
Rolul de mesaj prin care rezultatul execuției locale este returnat modelului pentru sinteză. |
Model Compatibility |
Modele optimizate special pentru funcții: `llama3.1`, `llama3.3`, `qwen2.5`, `mistral-nemo`. |
Exemple practice și comenzi
Exemplul 1: Apel de Tool Calling în Python folosind biblioteca oficială ollama
Cum se definește o unealtă locală de calcul și se transmite către un model Llama local.
import ollama
def aduna(a: int, b: int) -> int:
return a + b
# Definim schema funcției
unelte = [{
'type': 'function',
'function': {
'name': 'aduna',
'description': 'Adună două numere întregi',
'parameters': {
'type': 'object',
'properties': {
'a': {'type': 'integer', 'description': 'Primul număr'},
'b': {'type': 'integer', 'description': 'Al doilea număr'}
},
'required': ['a', 'b']
}
}
}]
r = ollama.chat(
model='qwen2.5:14b',
messages=[{'role': 'user', 'content': 'Cât fac 1243 + 9876?'}],
tools=unelte
)
print(r['message']['tool_calls'])
# Ieșire: [{'function': {'name': 'aduna', 'arguments': {'a': 1243, 'b': 9876}}}]
Rezultat & Impact
Modelul local returnează apelul de funcție precis fără a greși calculul matematic.
Greșeli frecvente și bune practici
- Folosirea de modele vechi care nu au fost finisate pentru tool calling (de ex. Llama 2), ceea ce produce răspunsuri text halucinate în loc de apeluri structurate JSON.
- Descrierea vagă a parametrilor în schemă, împiedicând modelul să înțeleagă când este oportun să apeleze unealta.