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.

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

Следната диаграма илюстрира процеса на извикване на функции със Semantic Kernel:

извикване на функции

В Semantic Kernel функциите/инструментите се наричат плъгини. Можем да преобразуваме функцията get_current_time, която видяхме по-рано, в плъгин, като я превърнем в клас с функцията в него. Можем също така да импортираме декоратора kernel_function, който приема описанието на функцията. Когато създадете ядро с плъгина GetCurrentTimePlugin, ядрото автоматично ще сериализира функцията и нейните параметри, създавайки схемата за изпращане към 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 или предварително изградения интерпретатор на код в зависимост от заявката на потребителя.

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, генери Присъединете се към Azure AI Foundry Discord, за да се срещнете с други обучаващи се, да присъствате на консултации и да получите отговори на вашите въпроси относно AI агенти.

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

Предишен урок

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

Следващ урок

Агентен RAG


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