ai-agents-for-beginners

Как дизајнирати добре AI агенте

(Кликните на слику изнад да бисте погледали видео лекције)

Шаблон за коришћење алата

Алатке су занимљиве јер омогућавају AI агентима да имају шири спектар могућности. Уместо да агент има ограничен сет акција које може да изврши, додавањем алатке агент сада може да изврши широк спектар акција. У овом поглављу ћемо размотрити шаблон за коришћење алата, који описује како AI агенти могу користити специфичне алатке за постизање својих циљева.

Увод

У овој лекцији настојимо да одговоримо на следећа питања:

Циљеви учења

Након завршетка ове лекције, моћи ћете:

Шта је шаблон за коришћење алата?

Шаблон за коришћење алата се фокусира на омогућавање LLM-овима да интерагују са спољашњим алатима ради постизања специфичних циљева. Алатке су код који агент може извршити да би обавио акције. Алатка може бити једноставна функција, као што је калкулатор, или API позив ка услузи треће стране, као што је претрага цена акција или временска прогноза. У контексту AI агената, алатке су дизајниране да их агенти извршавају као одговор на функцијске позиве генерисане моделом.

На које случајеве употребе се може применити?

AI агенти могу користити алатке за обављање сложених задатака, преузимање информација или доношење одлука. Шаблон за коришћење алата се често користи у сценаријима који захтевају динамичну интеракцију са спољашњим системима, као што су базе података, веб услуге или интерпретатори кода. Ова способност је корисна за бројне случајеве употребе, укључујући:

Који су елементи/градивни блокови потребни за имплементацију шаблона за коришћење алата?

Ови градивни блокови омогућавају AI агенту да обавља широк спектар задатака. Погледајмо кључне елементе потребне за имплементацију шаблона за коришћење алата:

Следеће, погледајмо позивање функција/алатки детаљније.

Позивање функција/алатки

Позивање функција је примарни начин на који омогућавамо великим језичким моделима (LLM-овима) да интерагују са алаткама. Често ћете видети да се “функција” и “алатка” користе наизменично јер су “функције” (блокови поновљивог кода) “алатке” које агенти користе за обављање задатака. Да би се код функције позвао, LLM мора упоредити кориснички захтев са описом функције. Да би то урадио, шема која садржи описе свих доступних функција се шаље LLM-у. LLM затим бира најприкладнију функцију за задатак и враћа њено име и аргументе. Одабрана функција се позива, њен одговор се шаље назад LLM-у, који користи информације за одговор на кориснички захтев.

За програмере који желе да имплементирају позивање функција за агенте, потребно је:

  1. LLM модел који подржава позивање функција
  2. Шема која садржи описе функција
  3. Код за сваку описану функцију

Илустроваћемо пример добијања тренутног времена у граду:

  1. Иницијализујте LLM који подржава позивање функција:

    Не подржавају сви модели позивање функција, па је важно проверити да ли LLM који користите то омогућава. Azure OpenAI подржава позивање функција. Можемо започети иницијализацијом Azure OpenAI клијента.

     # Initialize the Azure OpenAI client
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Креирајте шему функције:

    Затим ћемо дефинисати JSON шему која садржи име функције, опис онога што функција ради, и имена и описе параметара функције. Ову шему ћемо затим проследити клијенту који је претходно креиран, заједно са корисничким захтевом за проналажење времена у Сан Франциску. Важно је напоменути да се враћа позив алатке, а не коначни одговор на питање. Као што је раније поменуто, LLM враћа име функције коју је изабрао за задатак и аргументе који ће јој бити прослеђени.

     # Function description for the model to read
     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"],
                 },
             }
         }
     ]
    
      
     # Initial user message
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # First API call: Ask the model to use the function
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Process the model's response
       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. Код функције потребан за обављање задатка:

    Сада када је LLM изабрао коју функцију треба покренути, потребно је имплементирати и извршити код који обавља задатак. Можемо имплементирати код за добијање тренутног времена у Python-у. Такође ћемо морати написати код за издвајање имена и аргумената из response_message да бисмо добили коначни резултат.

       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"})
    
      # Handle function calls
       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.")  
      
       # Second API call: Get the final response from the model
       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.
    

Позивање функција је срж већине, ако не и свих дизајна коришћења алатки од стране агената, међутим имплементација од нуле понекад може бити изазовна. Као што смо научили у Лекцији 2, агентски оквири нам пружају унапред изграђене градивне блокове за имплементацију коришћења алатки.

Примери коришћења алатки са агентским оквирима

Ево неколико примера како можете имплементирати шаблон за коришћење алатки користећи различите агентске оквире:

Semantic Kernel

Semantic Kernel је отворени AI оквир за .NET, Python и Java програмере који раде са великим језичким моделима (LLM-овима). Он поједностављује процес коришћења позивања функција тако што аутоматски описује ваше функције и њихове параметре моделу кроз процес назван серијализација. Такође управља комуникацијом између модела и вашег кода. Још једна предност коришћења агентског оквира као што је Semantic Kernel је то што вам омогућава приступ унапред изграђеним алаткама као што су Претрага фајлова и Интерпретатор кода.

Следећи дијаграм илуструје процес позивања функција са Semantic Kernel-ом:

позивање функција

У Semantic Kernel-у функције/алатке се називају Плагини. Можемо претворити функцију get_current_time коју смо раније видели у плагин тако што ћемо је претворити у класу са функцијом унутар ње. Такође можемо увозити декоратор kernel_function, који узима опис функције. Када затим креирате kernel са GetCurrentTimePlugin-ом, kernel ће аутоматски серијализовати функцију и њене параметре, креирајући шему за слање LLM-у у процесу.

from semantic_kernel.functions import kernel_function

class GetCurrentTimePlugin:
    async def __init__(self, location):
        self.location = location

    @kernel_function(
        description="Get the current time for a given location"
    )
    def get_current_time(location: str = ""):
        ...

from semantic_kernel import Kernel

# Create the kernel
kernel = Kernel()

# Create the plugin
get_current_time_plugin = GetCurrentTimePlugin(location)

# Add the plugin to the kernel
kernel.add_plugin(get_current_time_plugin)

Azure AI Agent Service

Azure AI Agent Service је новији агентски оквир који је дизајниран да омогући програмерима да безбедно граде, имплементирају и скалирају висококвалитетне и прошириве AI агенте без потребе за управљањем основним рачунарским и складишним ресурсима. Посебно је користан за корпоративне апликације јер је у потпуности управљана услуга са безбедношћу на нивоу предузећа.

У поређењу са развојем директно са LLM API-јем, Azure AI Agent Service пружа неке предности, укључујући:

Алатке доступне у Azure AI Agent Service могу се поделити у две категорије:

  1. Алатке за знање:
  2. Алатке за акцију:

Agent Service нам омогућава да користимо ове алатке заједно као toolset. Такође користи threads које прате историју порука из одређеног разговора.

Замислите да сте продајни агент у компанији Contoso. Желите да развијете конверзацијског агента који може одговарати на питања о вашим продајним подацима.

Следећа слика илуструје како можете користити Azure AI Agent Service за анализу ваших продајних података:

Agentic Service у акцији

Да бисте користили било коју од ових алатки са услугом, можемо креирати клијента и дефинисати алатку или сет алатки. Да бисмо ово практично имплементирали, можемо користити следећи Python код. LLM ће моћи да погледа сет алатки и одлучи да ли да користи кориснички креирану функцију, fetch_sales_data_using_sqlite_query, или унапред изграђени Code Interpreter у зависности од корисничког захтева.

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 # fetch_sales_data_using_sqlite_query function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

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

# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset = ToolSet()
toolset.add(fetch_data_function)

# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
toolset.add(code_interpreter)

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

Које су посебне напомене за коришћење шаблона за изградњу поузданих AI агената?

Честа забринутост код SQL-а који динамички генеришу LLM-ови је безбедност, посебно риз Покретање апликације у безбедном окружењу додатно побољшава заштиту. У корпоративним сценаријима, подаци се обично извлаче и трансформишу из оперативних система у базу података само за читање или складиште података са прилагођеном шемом. Овај приступ осигурава да су подаци безбедни, оптимизовани за перформансе и приступачност, као и да апликација има ограничен приступ само за читање.

Имате још питања о употреби дизајнерских шаблона алата?

Придружите се Azure AI Foundry Discord да се повежете са другим ученицима, присуствујете консултацијама и добијете одговоре на ваша питања о AI агентима.

Додатни ресурси

Претходна лекција

Разумевање агентских дизајнерских шаблона

Наредна лекција

Agentic RAG


Одрицање од одговорности:
Овај документ је преведен помоћу услуге за превођење уз помоћ вештачке интелигенције Co-op Translator. Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људског преводиоца. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.