ai-agents-for-beginners

Jak navrhnout dobré AI agenty

(Klikněte na obrázek výše pro zobrazení videa této lekce)

Vzorec návrhu využití nástrojů

Nástroje jsou zajímavé, protože umožňují AI agentům mít širší škálu schopností. Místo toho, aby agent měl omezenou sadu akcí, které může provádět, přidáním nástroje může agent nyní vykonávat širokou škálu akcí. V této kapitole si prohlédneme vzorec návrhu využití nástrojů, který popisuje, jak AI agenti mohou používat specifické nástroje k dosažení svých cílů.

Úvod

V této lekci se pokusíme odpovědět na následující otázky:

Výukové cíle

Po dokončení této lekce budete schopni:

Co je vzorec návrhu využití nástrojů?

Vzorec návrhu využití nástrojů se zaměřuje na to, aby LLM (velké jazykové modely) měly schopnost interagovat s externími nástroji k dosažení specifických cílů. Nástroje jsou kód, který může agent spustit, aby provedl akce. Nástroj může být jednoduchá funkce, například kalkulačka, nebo volání API na službu třetí strany, jako je vyhledání ceny akcií nebo předpověď počasí. V kontextu AI agentů jsou nástroje navrženy tak, aby byly spouštěny agenty jako odpověď na funkční volání generovaná modelem.

Pro jaké případy použití lze tento vzorec aplikovat?

AI agenti mohou využívat nástroje k dokončení složitých úkolů, získávání informací nebo přijímání rozhodnutí. Vzorec využití nástrojů se často používá v situacích vyžadujících dynamickou interakci s externími systémy, jako jsou databáze, webové služby nebo interpretory kódu. Tato schopnost je užitečná pro řadu různých případů použití včetně:

Jaké prvky/stavební bloky jsou potřeba k implementaci vzorce návrhu využití nástrojů?

Tyto stavební bloky umožňují AI agentovi provádět širokou škálu úkolů. Pojďme se podívat na klíčové prvky potřebné k implementaci vzorce návrhu využití nástrojů:

Nyní si podrobněji prohlédneme funkční volání.

Funkční/volání nástrojů

Volání funkcí je primární způsob, jak umožnit velkým jazykovým modelům (LLM) interakci s nástroji. Často uvidíte, že “funkce” a “nástroj” se používají zaměnitelně, protože “funkce” (bloky znovupoužitelného kódu) jsou “nástroje”, které agenti používají k provádění úkolů. Aby mohl být kód funkce vyvolán, musí LLM porovnat požadavek uživatele s popisem funkce. K tomu se LLM posílá schéma obsahující popisy všech dostupných funkcí. LLM pak vybere nejvhodnější funkci pro daný úkol a vrátí její název a argumenty. Vybraná funkce je spuštěna, její odpověď je zaslána zpět LLM, které využije informace k odpovědi na požadavek uživatele.

Pro vývojáře, kteří chtějí implementovat volání funkcí pro agenty, je potřeba:

  1. LLM model, který podporuje volání funkcí
  2. Schéma obsahující popisy funkcí
  3. Kód pro každou popsanou funkci

Jako příklad použijme získání aktuálního času ve městě:

  1. Inicializujte LLM, který podporuje volání funkcí:

    Ne všechny modely podporují volání funkcí, proto je důležité ověřit, zda váš LLM tuto funkci má. Azure OpenAI volání funkcí podporuje. Můžeme začít inicializací klienta Azure OpenAI.

     # Inicializujte klienta Azure OpenAI
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Vytvořte schéma funkce:

    Následně definujeme JSON schéma obsahující název funkce, popis toho, co funkce dělá, a názvy a popisy parametrů funkce. Toto schéma pak předáme dříve vytvořenému klientu spolu s uživatelským požadavkem na zjištění času v San Franciscu. Důležité je poznamenat, že se vrací volání nástroje, nikoli konečná odpověď na otázku. Jak již bylo zmíněno, LLM vrací název funkce, kterou vybral pro úkol, a argumenty předávané této funkci.

     # Popis funkce pro model k přečtení
     tools = [
         {
             "type": "function",
             "function": {
                 "name": "get_current_time",
                 "description": "Get the current time in a given location",
                 "parameters": {
                     "type": "object",
                     "properties": {
                         "location": {
                             "type": "string",
                             "description": "The city name, e.g. San Francisco",
                         },
                     },
                     "required": ["location"],
                 },
             }
         }
     ]
    
      
     # Počáteční uživatelská zpráva
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # První volání API: Požádej model, aby použil funkci
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Zpracuj odpověď modelu
       response_message = response.choices[0].message
       messages.append(response_message)
      
       print("Model's response:")  
    
       print(response_message)
      
    
     Model's response:
     ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
    
  3. Kód funkce potřebný k vykonání úkolu:

    Nyní, když LLM vybralo, která funkce má být spuštěna, je potřeba implementovat a spustit kód, který úkol provede. Můžeme implementovat kód pro získání aktuálního času v Pythonu. Rovněž bude potřeba napsat kód pro získání názvu a argumentů z response_message pro získání konečného výsledku.

       def get_current_time(location):
         """Get the current time for a given location"""
         print(f"get_current_time called with location: {location}")  
         location_lower = location.lower()
            
         for key, timezone in TIMEZONE_DATA.items():
             if key in location_lower:
                 print(f"Timezone found for {key}")  
                 current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
                 return json.dumps({
                     "location": location,
                     "current_time": current_time
                 })
          
         print(f"No timezone data found for {location_lower}")  
         return json.dumps({"location": location, "current_time": "unknown"})
    
      # Zpracovat volání funkcí
       if response_message.tool_calls:
           for tool_call in response_message.tool_calls:
               if tool_call.function.name == "get_current_time":
         
                   function_args = json.loads(tool_call.function.arguments)
         
                   time_response = get_current_time(
                       location=function_args.get("location")
                   )
         
                   messages.append({
                       "tool_call_id": tool_call.id,
                       "role": "tool",
                       "name": "get_current_time",
                       "content": time_response,
                   })
       else:
           print("No tool calls were made by the model.")  
      
       # Druhý API požadavek: Získat konečnou odpověď od modelu
       final_response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
       )
      
       return final_response.choices[0].message.content
    
       get_current_time called with location: San Francisco
       Timezone found for san francisco
       The current time in San Francisco is 09:24 AM.
    

Volání funkcí je jádrem většiny, ne-li všech, návrhů využití nástrojů agentů, implementace však může být někdy náročná. Jak jsme se dozvěděli v Lekci 2, agentní frameworky nám poskytují předpřipravené stavební bloky pro implementaci využití nástrojů.

Příklady využití nástrojů s agentními frameworky

Zde jsou některé příklady, jak můžete implementovat vzorec návrhu využití nástrojů pomocí různých agentních frameworků:

Microsoft Agent Framework

Microsoft Agent Framework je open-source AI framework pro tvorbu AI agentů. Zjednodušuje proces využití volání funkcí tím, že umožňuje definovat nástroje jako Python funkce s dekorátorem @tool. Framework zajišťuje komunikaci mezi modelem a vaším kódem. Také poskytuje přístup k předpřipraveným nástrojům, jako jsou File Search a Code Interpreter přes AzureAIProjectAgentProvider.

Následující diagram znázorňuje proces volání funkcí v Microsoft Agent Framework:

function calling

V Microsoft Agent Framework jsou nástroje definovány jako dekorované funkce. Můžeme převést funkci get_current_time, kterou jsme viděli dříve, na nástroj pomocí dekorátoru @tool. Framework automaticky serializuje funkci a její parametry a vytvoří schéma k odeslání LLM.

from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

@tool
def get_current_time(location: str) -> str:
    """Get the current time for a given location"""
    ...

# Vytvořte klienta
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# Vytvořte agenta a spusťte ho s nástrojem
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")

Azure AI Agent Service

Azure AI Agent Service je novější agentní framework navržený tak, aby umožnil vývojářům bezpečně vytvářet, nasazovat a škálovat vysoce kvalitní a rozšiřitelné AI agenty bez nutnosti spravovat základní výpočetní a úložné zdroje. Je obzvláště užitečný pro podnikovou sféru, protože jde o plně spravovanou službu s bezpečností na podnikové úrovni.

Ve srovnání s vývojem přímo pomocí LLM API přináší Azure AI Agent Service některé výhody, včetně:

Nástroje dostupné v Azure AI Agent Service lze rozdělit do dvou kategorií:

  1. Nástroje pro znalosti:
  2. Nástroje pro akce:

Agent Service nám umožňuje používat tyto nástroje společně jako nástroje (toolset). Také využívá vlákna (threads), která sledují historii zpráv z konkrétní konverzace.

Představte si, že jste obchodní agent ve firmě Contoso. Chcete vyvinout konverzační agenta, který dokáže odpovídat na otázky týkající se vašich prodejních dat.

Následující obrázek ukazuje, jak můžete Azure AI Agent Service využít k analýze vašich prodejních dat:

Agentic Service In Action

Pro použití jakéhokoliv z těchto nástrojů se službou můžeme vytvořit klienta a definovat nástroj nebo sadu nástrojů. Praktická implementace může vypadat následovně v Pythonu. LLM bude moci nahlédnout do sady nástrojů a rozhodnout, zda použije uživatelem vytvořenou funkci fetch_sales_data_using_sqlite_query, nebo předem připravený Code Interpreter v závislosti na požadavku uživatele.

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # funkce fetch_sales_data_using_sqlite_query, která se nachází v souboru fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)

# Inicializovat sadu nástrojů
toolset = ToolSet()

# Inicializovat agenta volání funkcí s funkcí fetch_sales_data_using_sqlite_query a přidat ji do sady nástrojů
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Inicializovat nástroj Code Interpreter a přidat jej do sady nástrojů.
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset.add(code_interpreter)

agent = project_client.agents.create_agent(
    model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent", 
    toolset=toolset
)

Jaká jsou zvláštní opatření pro použití vzorce návrhu využití nástrojů při budování důvěryhodných AI agentů?

Častou obavou u dynamicky generovaného SQL pomocí LLM je bezpečnost, zejména riziko SQL injection nebo škodlivých akcí, například odstranění nebo poškození databáze. Tyto obavy jsou oprávněné, avšak lze je efektivně zmírnit správnou konfigurací přístupových oprávnění k databázi. U většiny databází to znamená konfiguraci databáze jako jen pro čtení. U databázových služeb jako PostgreSQL nebo Azure SQL by měla být aplikaci přiřazena role pouze pro čtení (SELECT).

Provozování aplikace v bezpečném prostředí dále zvyšuje ochranu. V podnikových scénářích jsou data obvykle extrahována a transformována z provozních systémů do databáze nebo datového skladu pouze pro čtení s uživatelsky přívětivým schématem. Tento přístup zajišťuje, že data jsou bezpečná, optimalizovaná pro výkon a přístupnost, a že aplikace má omezený, pouze čtecí přístup.

Ukázkové kódy

Máte další otázky ohledně vzorce návrhu využití nástrojů?

Připojte se k Microsoft Foundry Discord, kde můžete potkat další studenty, zúčastnit se konzultací a získat odpovědi na vaše otázky týkající se AI agentů.

Další zdroje

Předchozí lekce

Porozumění agentním vzorcům návrhu

Další lekce

Agentní RAG


Prohlášení o vyloučení odpovědnosti: Tento dokument byl přeložen pomocí automatické překladatelské služby Co-op Translator. Přestože usilujeme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědni za jakékoliv nedorozumění nebo chybné výklady vyplývající z užití tohoto překladu.