Folosirea funcțiilor cu modelele AI Folosirea funcțiilor cu modelele AI

Folosirea funcțiilor cu modelele AI

Cei mai mulți utilizatori nu știu cum funcționează un model conversațional AI și sunt uimiți cum acesta poate genera răspunsuri la cele mai diverse întrebări.

Răspunsurile modelelor AI sunt însă de tip predictiv, pe baza unor înformații și instrucțiuni pe care modelele le primesc în momentul conceperii lor.

Astfel, dacă un model a fost antrenat spre exemplu la 1 ianuarie 2024 cu informații despre evenimentele sportive, el va putea să răspundă doar din acestea, iar în vara lui 2024 nu va putea da răspunsuri despre evenimentele petrecute în cursul anului curent.

Modelele vor încerca totuși să satisfacă cererea utilizatorilor și în funcție de programare, pot genera răspunsuri fictive – halucinații – ceea ce produce invariabil o neîncredere în ele.

Tehnologiile moderne permit programarea modelelor AI pentru folosirea funcțiilor personalizate în funcție de parametri introduși de utilizator.

Un scenariu este ca un utilizator să pună întrebarea: Câte grade sunt în București acum?, iar pentru un răspuns corect, evident modelul ar trebui să acceseze informațiile despre vreme în timp real, si să facă o filtrare pentru temperatura din orașul București.

Pentru a rezolva acestă problemă cea mai logică strategie este să dezvoltăm o funcție care apelează un API, în funcție de oraș și care răspunde cu temperatura curentâ și să instruim modelul pentru a folosi funcția respectivă dacă se dorește aflarea temperaturii.

Pentru acest exemplu am folosit un server Ollama local și modelul Mistral-Nemo.

Cod folosire funcții AI

Am folosit următorul cod:

import json
import ollama
import asyncio
import requests


def VremeaLatLon(latitude: str, longitude: str) -> str:
    headers = {'User-Agent': 'My User Agent 1.0'}
    url = 'https://api.open-meteo.com/v1/forecast?latitude=' + str(latitude) + '&longitude=' + str(longitude) + '&current=temperature_2m&temperature_unit=celsius&forecast_days=1'
    
    response = requests.get(url, headers=headers)

    if response.status_code == 200:
        data = response.json()
        if data:
            temperatura = data['current']['temperature_2m']
            return str(temperatura) + 'grade celsius'
        else:
            return "Nu am identificat temperatura"
    else:
        return "Error fetching data"
                                



def VremeaDinOras(city: str) -> str:

    city = city.replace(" ", "")
    headers = {'User-Agent': 'My User Agent 1.0'}
    url = 'https://nominatim.openstreetmap.org/search?q=' + str(city) + '&format=json'
    response = requests.get(url, headers=headers)
    
    if response.status_code == 200:
        data = response.json()
        if data:
            lat = data[0]['lat']
            lon = data[0]['lon']
            return VremeaLatLon(lat, lon)
        else:
            return "City not found"
    else:
        return "Error fetching data"

async def run(model: str, user_input: str):
    client = ollama.AsyncClient()
    # Initialize conversation with a user query
    messages = [{'role': 'user', 'content': 'Esti un asistent virtual care raspunde la intrebari in limba romana. Folosesti functia VremeaDinOras pentru a afla temperatura in timp real. Daca esti intrebat de vreme, temperatura sau grade raspunzi strict cu valoarea temperaturii fara alte informatii suplimentare. ' + str(user_input)}]

    # First API call: Send the query and function description to the model
    response = await client.chat(
        model=model,
        stream=False,
        messages=messages,
        tools=[        
        {
            'type': 'function',
            'function': {
                'name': 'VremeaDinOras',
                'description': 'Get the weather and temperature for a given city',
                'parameters': {
                   'type': 'object',
                   'properties': {
                       'city': {
                           'type': 'string',
                           'description': 'The city to get the weather for',
                       }
                    },
                'required': ['city'],
                },
            },
        }
            ],
    )

    # Add the model's response to the conversation history
    messages.append(response['message'])

    # Check if the model decided to use the provided function
    if not response['message'].get('tool_calls'):
        print("The model didn't use the function. Its response was:")
        print(response['message']['content'])
        return

    # Process function calls made by the model
    if response['message'].get('tool_calls'):
        available_functions = {
        'VremeaDinOras': VremeaDinOras
        }
        for tool in response['message']['tool_calls']:
            function_to_call = available_functions[tool['function']['name']]
            print(tool['function']['name'])
            if tool['function']['name'] == 'VremeaDinOras':
                function_response = function_to_call(tool['function']['arguments']['city'])
            # Add function response to the conversation
            messages.append(
                {
                'role': 'tool',
                'content': function_response,
                }
            )

    # Second API call: Get final response from the model
    final_response = await client.chat(model=model, messages=messages)
    print(final_response['message']['content'])


while True:
    user_input = input("User: ")
    if (user_input !=''):
        # Run the async function
        asyncio.run(run('mistral-nemo:latest', user_input))


Pentru aflarea temperaturii am utilizat două API-uri, respectiv identificarea coordonatelor geografice ale orașului țintă și a doua extragerea temperaturii curente de la locațiile geografice interogate.

Am verificat identificarea funției și extragerea temperaturilor pentru București și Arad:

Hai să vedem dacă funcția este identificată dacă reformulăm întrebarea:

User: Cum este vremea acum în Arad?
VremeaDinOras
Actualmente la Arad, temperatura este de 27.8 grade Celsius

Modelul Mistral – Nemo se descurcă fără probleme.

Concluzie

Folosirea funcțiilor împreună cu modelele AI deschide calea folosirea acestora în aplicații complexe în care înformațiile în timp real sunt extrem de importante. Modelele pot lua decizii în funcție de informații dinamice și pot genera răspunsuri fiabile și corecte de fiecare dată eliminând răspunsurile fictive.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *