ai-agents-for-beginners

Как да проектираме добри AI агенти

(Кликнете върху изображението по-горе, за да гледате видеото на този урок)

Проектиране на използване на инструменти

Инструментите са интересни, защото позволяват на AI агентите да имат по-широк спектър от възможности. Вместо агентът да има ограничен набор от действия, които може да изпълнява, чрез добавяне на инструмент, агентът вече може да изпълнява широк спектър от действия. В тази глава ще разгледаме модела за проектиране на използване на инструменти, който описва как AI агентите могат да използват специфични инструменти, за да постигнат целите си.

Въведение

В този урок ще отговорим на следните въпроси:

Цели на обучението

След завършване на този урок ще можете да:

Какво представлява моделът за проектиране на използване на инструменти?

Моделът за проектиране на използване на инструменти се фокусира върху даването на възможност на големите езикови модели (LLMs) да взаимодействат с външни инструменти за постигане на конкретни цели. Инструментите са код, който може да бъде изпълнен от агент за извършване на действия. Инструмент може да е проста функция като калкулатор или API повикване към услуга на трета страна като проверка на цена на акции или прогнозиране на времето. В контекста на AI агенти, инструментите са проектирани да бъдат изпълнявани от агенти в отговор на функционални повиквания, генерирани от модела.

За кои случаи на употреба може да се приложи?

AI агенти могат да използват инструменти, за да изпълняват сложни задачи, да извличат информация или да вземат решения. Моделът за използване на инструменти често се използва в сценарии, изискващи динамично взаимодействие с външни системи, като бази данни, уеб услуги или интерпретатори на код. Тази възможност е полезна за различни случаи на употреба, включително:

Кои са елементите/строителните блокове, необходими за реализиране на модела за използване на инструменти?

Тези строителни блокове позволяват на AI агента да изпълнява широк набор от задачи. Нека разгледаме ключовите елементи, необходими за реализиране на модела за използване на инструменти:

Следва да разгледаме извикването на функции/инструменти по-подробно.

Извикване на функции/инструменти

Извикването на функции е основният начин, по който позволяваме на големите езикови модели (LLMs) да взаимодействат с инструменти. Често ще срещнете „функция“ и „инструмент“ да се използват взаимозаменяемо, тъй като „функции“ (блокове от преизползваем код) са „инструментите“, които агентите използват за изпълнение на задачи. За да се извика код на функция, LLM трябва да сравни заявката на потребителя с описанието на функциите. За целта към LLM се изпраща схема, съдържаща описанията на всички налични функции. След това LLM избира най-подходящата функция за задачата и връща името и аргументите ѝ. Избраната функция се извиква, отговорът ѝ се изпраща обратно на LLM, който използва тази информация, за да отговори на заявката на потребителя.

За разработчици, желаещи да реализират извикване на функции за агенти, е необходимо:

  1. Модел LLM, който поддържа извикване на функции
  2. Схема с описания на функциите
  3. Код за всяка описана функция

Нека илюстрираме с пример за получаване на текущото време в град:

  1. Иницииране на LLM, който поддържа извикване на функции:

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

     # Инициализиране на клиента на 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. Създаване на схема на функция:

    След това ще дефинираме JSON схема, съдържаща името на функцията, описание на това какво прави функцията и имената и описанията на нейните параметри. Ще предадем тази схема на клиента, създаден по-рано, заедно със заявката на потребителя да получи време в Сан Франциско. Важно е да се отбележи, че се връща повикване на инструмент, а не окончателен отговор на въпроса. Както споменахме по-рано, LLM връща името на функцията, която е избрал за задачата, и аргументите, които ще му бъдат подадени.

     # Описание на функцията за модела за четене
     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"],
                 },
             }
         }
     ]
    
      
     # Първоначално съобщение от потребителя
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # Първо API повикване: Помолете модела да използва функцията
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Обработване на отговора на модела
       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 за получаване на текущото време. Също така ще трябва да извадим името и аргументите от отговорното съобщение, за да вземем крайния резултат.

       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"})
    
      # Обработвайте повиквания на функции
       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.")  
      
       # Второ API повикване: Получаване на окончателния отговор от модела
       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, агентните рамки ни предоставят предварително изградени строителни блокове за реализиране на използване на инструменти.

Примери за използване на инструменти с агентни рамки

Ето някои примери как може да реализирате модела за използване на инструменти чрез различни агентни рамки:

Microsoft Agent Framework

Microsoft Agent Framework е отворена AI рамка за изграждане на AI агенти. Тя опростява процеса на използване на извикване на функции, позволявайки да дефинирате инструменти като Python функции с декоратора @tool. Рамката управлява двупосочната комуникация между модела и вашия код. Също така предлага достъп до предварително изградени инструменти като Търсене на файлове и Интерпретатор на код чрез AzureAIProjectAgentProvider.

Следната диаграма илюстрира процеса на извикване на функции с Microsoft Agent Framework:

function calling

В Microsoft Agent Framework инструментите се дефинират като декорирани функции. Можем да преобразуваме функцията get_current_time, която видяхме по-рано, в инструмент, като използваме декоратора @tool. Рамката автоматично сериализира функцията и нейните параметри, създавайки схемата за изпращане към 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"""
    ...

# Създайте клиента
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# Създайте агент и го стартирайте с инструмента
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 е по-нова агентна рамка, предназначена да даде възможност на разработчиците да изграждат, внедряват и мащабират висококачествени, разширяеми AI агенти сигурно, без да се налага да управляват основните изчислителни и съхранителни ресурси. Тя е особено полезна за корпоративни приложения, тъй като е напълно управлявана услуга с корпоративно ниво на сигурност.

В сравнение с разработване директно чрез LLM API, Azure AI Agent Service предлага някои предимства, включително:

Инструментите налични в Azure AI Agent Service могат да се разделят в две категории:

  1. Инструменти за знания:
  2. Инструменти за действия:

Агентната услуга ни позволява да използваме тези инструменти заедно като набор от инструменти. Тя също използва нишки (threads), които следят историята на съобщенията от конкретен разговор.

Представете си, че сте търговски агент във фирма, наречена Contoso. Искате да разработите разговорен агент, който може да отговаря на въпроси за вашите данни за продажби.

Следващото изображение илюстрира как бихте могли да използвате Azure AI Agent Service за анализиране на данните за продажби:

Agentic Service In Action

За да използваме който и да е от тези инструменти с услугата, можем да създадем клиент и да дефинираме инструмент или набор от инструменти. За практическа реализация можем да използваме следния Python код. LLM ще може да разгледа набора от инструменти и да реши дали да използва потребителската функция fetch_sales_data_using_sqlite_query или предварително изградения Интерпретатор на код в зависимост от заявката на потребителя.

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, която може да бъде намерена във файл 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"],
)

# Инициализиране на набора от инструменти
toolset = ToolSet()

# Инициализиране на агент за извикване на функции с функцията fetch_sales_data_using_sqlite_query и добавянето ѝ към набора от инструменти
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Инициализиране на инструмент 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
)

Какви са специалните съображения при използване на модела за проектиране на използване на инструменти за изграждане на надеждни AI агенти?

Чест проблем при динамично генерирани SQL заявки от LLM е сигурността, особено рискът от SQL инжекция или злонамерени действия, като изтриване или манипулация на базата данни. Докато тези опасения са валидни, те могат да бъдат ефективно смекчени чрез правилно конфигуриране на правата за достъп до базата данни. За повечето бази се конфигурира база данни в режим само за четене. За бази данни като PostgreSQL или Azure SQL приложението трябва да бъде с назначена роля само за четене (SELECT).

Изпълнението в сигурна среда допълнително повишава защитата. В корпоративни сценарии данните обикновено се извличат и трансформират от оперативни системи в база данни или склад за данни в режим само за четене с удобна за потребителя схема. Този подход осигурява, че данните са защитени, оптимизирани по отношение на производителността и достъпността, и че приложението има ограничен достъп само за четене.

Примери с код

Имате ли още въпроси за моделите за използване на инструменти?

Присъединете се към Microsoft Foundry Discord, за да се свържете с други обучаващи се, да участвате в работни сесии и да получите отговори на въпросите си за AI агенти.

Допълнителни ресурси

Предходен урок

Разбиране на агентните модели за проектиране

Следващ урок

Agentic RAG


Отказ от отговорност: Този документ е преведен с помощта на AI преводачески услуга Co-op Translator. Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.