Как работает ИИ-агент: пошаговое руководство
Делиться

Агенты ИИ и большие языковые модели (LLM)
Большие языковые модели (LLM) — это передовые системы искусственного интеллекта, построенные на основе глубоких нейронных сетей, таких как трансформеры, и обученные на больших объёмах текста для генерации языка, похожего на человеческий. Такие LLM, как ChatGPT, Claude, Gemini и Grok, способны решать множество сложных задач и используются в таких областях, как наука, здравоохранение, образование и финансы.
Агент ИИ расширяет возможности LLM для решения задач, выходящих за рамки их предобученных знаний. LLM может написать учебник по Python, используя полученные во время обучения знания. Если вы попросите его забронировать билет на самолёт, для выполнения задачи потребуется доступ к вашему календарю, веб-поиску и возможность выполнять действия, которые выходят за рамки предобученных LLM знаний. Вот некоторые из распространённых действий:
- Прогноз погоды: LLM подключается к веб-поисковику для получения последнего прогноза погоды.
- Агент по бронированию: агент на базе искусственного интеллекта, который может проверять календарь пользователя, осуществлять поиск в Интернете для посещения сайтов бронирования, таких как Expedia, чтобы найти доступные варианты рейсов и отелей, предоставлять их пользователю для подтверждения и завершать бронирование от имени пользователя.
Как работает ИИ-агент
Агенты ИИ формируют систему, которая использует большую языковую модель для планирования, рассуждения и принятия мер по взаимодействию с окружающей средой, используя инструменты, предложенные в ходе рассуждений модели для решения конкретной задачи.
Базовая структура ИИ-агента

- Большая языковая модель (LLM): LLM — это мозг ИИ-агента. Он обрабатывает запрос пользователя, планирует и анализирует его, а затем разбивает задачу на этапы, определяя, какие инструменты следует использовать для её выполнения.
- Инструмент — это структура, которую агент использует для выполнения действия на основе плана и рассуждений, основанных на Большой языковой модели. Если вы попросите магистра права забронировать для вас столик в ресторане, он может использовать календарь для проверки вашей занятости и инструмент веб-поиска для доступа к сайту ресторана и бронирования столика.
Иллюстрированное принятие решений агентом по бронированию на основе искусственного интеллекта

Агенты ИИ могут получать доступ к различным инструментам в зависимости от задачи. Инструментом может быть хранилище данных, например, база данных. Например, агент службы поддержки клиентов может получить доступ к данным учётной записи клиента и истории покупок и решить, когда следует извлечь эту информацию для решения проблемы.
Агенты ИИ используются для решения широкого спектра задач, и существует множество мощных агентов. Агенты программирования, в частности, агентские IDE, такие как Cursor, Windsurf и GitHub Copilot, помогают инженерам быстрее писать и отлаживать код, а также быстро собирать проекты. Агенты программирования CLI, такие как Claude Code и Codex CLI, могут взаимодействовать с рабочим столом и терминалом пользователя для выполнения задач программирования. ChatGPT поддерживает агентов, которые могут выполнять такие действия, как бронирование от имени пользователя. Агенты также интегрируются в рабочие процессы службы поддержки клиентов для общения с клиентами и решения их проблем.
Вызов функции
Вызов функций — это метод подключения большой языковой модели (LLM) к внешним инструментам, таким как API или базы данных. Он используется при создании агентов ИИ для подключения LLM к инструментам. При вызове функций каждый инструмент определяется как кодовая функция (например, API погоды для получения последнего прогноза погоды) вместе со схемой JSON, которая определяет параметры функции и указывает LLM, когда и как вызывать функцию для данной задачи.
Тип определяемой функции зависит от задачи, которую должен выполнять агент. Например, для агента службы поддержки клиентов мы можем определить функцию, которая может извлекать информацию из неструктурированных данных, таких как PDF-файлы с информацией о продуктах компании.
В этой статье я продемонстрирую, как использовать вызов функций для создания простого веб-поискового агента, используя GPT-5 в качестве большой языковой модели.
Базовая структура веб-поискового агента

Основная логика веб-поискового агента:
- Определите функцию кода для обработки веб-поиска.
- Определите пользовательские инструкции, которые помогут большой языковой модели определить, когда вызывать функцию веб-поиска в зависимости от запроса. Например, если запрос касается текущей погоды, агент веб-поиска распознает необходимость поиска в интернете для получения последних прогнозов погоды. Однако, если запрос требует написать руководство по языку программирования, например, Python, на что он может ответить, основываясь на своих знаниях, он не будет вызывать функцию веб-поиска, а ответит напрямую.
Предпосылки
Создайте учетную запись OpenAI и сгенерируйте ключ API
1: Создайте учетную запись OpenAI, если у вас ее нет.
2. Создайте ключ API
Настройка и активация среды
python3 -m venv env source env/bin/activate
Экспорт ключа API OpenAI
экспорт OPENAI_API_KEY=»Ваш ключ API Openai»
Настройте Tavily для веб-поиска
Tavily — это специализированный инструмент веб-поиска для агентов с искусственным интеллектом. Создайте учётную запись на Tavily.com, и после настройки вашего профиля будет сгенерирован ключ API, который вы сможете скопировать в свою среду. Для новых учётных записей предоставляется 1000 бесплатных кредитов, которые можно использовать для выполнения до 1000 веб-поисков.
Экспорт ключа API TAVILY
export TAVILY_API_KEY=»Ваш API-ключ Tavily»
Установить пакеты
pip3 install openai pip3 install tavily-python
Создание веб-поискового агента с вызовом функций шаг за шагом
Шаг 1: Создайте функцию веб-поиска с помощью Tavily
Функция веб-поиска реализована с использованием Tavily, служащего инструментом для вызова функций в веб-поисковом агенте.
из tavily импорт TavilyClient импорт os tavily = TavilyClient(api_key=os.getenv(«TAVILY_API_KEY»)) def web_search(query: str, num_results: int = 10): try: result = tavily.search( query=query, search_thought=»basic», max_results=num_results, include_answer=False, include_raw_content=False, include_images=False ) results = result.get(«results», []) return { «query»: query, «results»: results, «sources»: [ {«title»: r.get(«title», «»), «url»: r.get(«url», «»)} for r in results ] } except Exception as e: return { «error»: f»Ошибка поиска: {e}», «query»: query, «results»: [], «источники»: [], }
Разбор кода веб-функции
Tavily инициализируется с помощью API-ключа. В функции web_search выполняются следующие шаги:
- Функция поиска Tavily вызывается для поиска в Интернете и извлечения 10 лучших результатов.
- Возвращаются результаты поиска и соответствующие им источники.
Возвращаемые выходные данные будут служить релевантным контекстом для поискового веб-агента, который мы определим далее в этой статье, для извлечения актуальной информации для запросов (подсказок), требующих данных в реальном времени, таких как прогнозы погоды.
Шаг 2: Создание схемы инструмента
Схема инструмента определяет специальные инструкции для модели ИИ о том, когда следует вызывать инструмент, в данном случае инструмент, который будет использоваться в функции веб-поиска. Она также определяет условия и действия, которые должны быть выполнены при вызове инструмента моделью. Схема инструмента JSON определена ниже на основе структуры схемы инструмента OpenAI.
tool_schema = [ { «type»: «function», «name»: «web_search», «description»: «»»Выполните поиск в Интернете для получения актуальной информации. Синтезируйте краткий, самодостаточный ответ на основе содержимого результатов посещённых страниц. Выберите страницы, извлеките текст и предоставьте наилучший доступный результат, ссылаясь на 1–3 источника (заголовок + URL). Если источники противоречивы, укажите на неопределённость и отдайте предпочтение самым последним данным. «»», «strict»: True, «parameters»: { «type»: «object», «properties»: { «query»: { «type»: «string», «description»: «Запрос для поиска в Интернете.», }, }, «required»: [«query»], «additionalProperties»: False }, }, ]
Свойства схемы инструмента
- тип: указывает, что тип инструмента — функция.
- имя: имя функции, которая будет использоваться для вызова инструмента, то есть web_search .
- Описание: описывает действия модели ИИ при вызове инструмента веб-поиска. Оно предписывает модели выполнять поиск в интернете с помощью функции web_search для получения актуальной информации и извлечения релевантных данных для формирования наилучшего ответа.
- strict: если установлено значение true, это свойство предписывает LLM строго следовать инструкциям схемы инструмента.
- Параметры: определяет параметры, которые будут переданы в функцию web_search . В данном случае используется только один параметр: query , представляющий собой поисковый запрос для поиска в интернете.
- обязательно: сообщает LLM, что запрос является обязательным параметром для функции web_search .
- additionalProperties: установлено значение false, что означает, что объект аргументов инструмента не может включать в себя какие-либо параметры, отличные от тех, которые определены в parameters.properties.
Шаг 3: Создание агента веб-поиска с использованием GPT-5 и вызова функций
Наконец, я создам агента, с которым можно будет общаться в чате, который будет искать в интернете актуальную информацию. Я буду использовать GPT-5-mini , быструю и точную модель от OpenAI, а также вызов функций для вызова схемы инструмента и уже определённой функции поиска в интернете .
from datetime import datetime, timezone import json from openai import OpenAI import os client = OpenAI(api_key=os.getenv(«OPENAI_API_KEY»)) # трекер для идентификатора ответа последней модели для сохранения состояния беседы prev_response_id = None # список для хранения результатов инструмента из вызова функции tool_results = [] while True: # если результаты инструмента пустые, сообщение-подсказка if len(tool_results) == 0: user_message = input(«Пользователь: «) «»» команды для выхода из чата «»» if isinstance(user_message, str) and user_message.strip().lower() in {«exit», «q»}: print(«Выход из чата. До свидания!») break else: user_message = tool_results.copy() # очистить результаты инструмента для следующего вызова tool_results = [] # получить текущая дата, которая будет передана в модель в качестве инструкции для помощи в принятии решений today_date = datetime.now(timezone.utc).date().isoformat() response = client.responses.create( model = «gpt-5-mini», input = user_message, instructions=f»Текущая дата: {today_date}.», tools = tool_schema, previous_response_id=prev_response_id, text = {«verbosity»: «low»}, reasoning={ «effort»: «low», }, store=True, ) prev_response_id = response.id # Обрабатывает выходные данные ответа модели for output in response.output: if output.type == «reasoning»: print(«Assistant: «,»Reasoning ….») for reasoning_summary in output.summary: print(«Assistant: «,reasoning_summary) elif output.type == «message»: for item in output.content: print(«Assistant: «,item.text) elif output.type == «function_call»: # получить имя функции function_name = globals().get(output.name) # загрузить аргументы функции args = json.loads(output.arguments) function_response = function_name(**args) tool_results.append( { «type»: «function_call_output», «call_id»: output.call_id, «output»: json.dumps(function_response) } )
Пошаговый разбор кода
из openai import OpenAI import os client = OpenAI(api_key=os.getenv(«OPENAI_API_KEY»)) prev_response_id = None tool_results = []
- Инициализировал API модели OpenAI с помощью ключа API.
- Инициализирует две переменные prev_response_id и tool_results . prev_response_id отслеживает ответ модели для поддержания состояния диалога, а tool_results — это список, в котором хранятся выходные данные, возвращаемые вызовом функции web_search .
Чат выполняется внутри цикла . Пользователь вводит сообщение, и модель, вызываемая с помощью схемы инструмента, принимает сообщение, анализирует его, решает, следует ли вызывать инструмент веб-поиска, а затем выходные данные инструмента передаются обратно в модель. Модель генерирует контекстно-зависимый ответ. Это продолжается до тех пор, пока пользователь не выйдет из чата.
Разбор кода цикла
если len(tool_results) == 0: user_message = input(«Пользователь: «) если isinstance(user_message, str) и user_message.strip().lower() in {«exit», «q»}: print(«Выход из чата. До свидания!») break else: user_message = tool_results.copy() tool_results = [] today_date = datetime.now(timezone.utc).date().isoformat() response = client.responses.create( model = «gpt-5-mini», input = user_message, instructions=f»Текущая дата: {today_date}.», tools = tool_schema, previous_response_id=prev_response_id, text = {«verbosity»: «low»}, reasoning={ «effort»: «low», }, store=True, ) prev_response_id = response.id
- Проверяет, пуст ли tool_results . Если пуст, пользователю будет предложено ввести сообщение с возможностью выхода с помощью exit или q .
- Если tool_results не пуст, user_message будет установлен на собранные выходные данные инструмента для отправки в модель. tool_results очищается, чтобы избежать повторной отправки тех же выходных данных инструмента на следующей итерации цикла.
- Текущая дата ( today_date ) получается для использования моделью для принятия решений с учетом времени.
- Вызывает client.responses.create для генерации ответа модели и принимает следующие параметры:
- модель: установлена на gpt-5-mini .
- ввод: принимает сообщение пользователя.
- инструкции: установить текущую дату (today_date).
- инструменты: установите схему инструментов, которая была определена ранее.
- previous_response_id: установите на идентификатор предыдущего ответа, чтобы модель могла поддерживать состояние разговора.
- текст: уровень детализации установлен на низком уровне, чтобы ответ модели был лаконичным.
- Рассуждение: GPT-5-mini — это модель рассуждения. Установите низкое усилие рассуждения для более быстрого ответа. Для более сложных задач можно установить высокое усилие.
- store: сообщает модели о необходимости сохранить текущий ответ, чтобы его можно было извлечь позже, а также способствует непрерывности разговора.
- prev_response_id устанавливается равным идентификатору текущего ответа, чтобы следующий вызов функции мог быть включен в тот же диалог.
for output in response.output: if output.type == «reasoning»: print(«Assistant: «,»Reasoning ….») for reasoning_summary in output.summary: print(«Assistant: «,reasoning_summary) elif output.type == «message»: for item in output.content: print(«Assistant: «,item.text) elif output.type == «function_call»: # получить имя функции function_name = globals().get(output.name) # загрузить аргументы функции args = json.loads(output.arguments) function_response = function_name(**args) # добавить список результатов инструмента с идентификатором вызова функции и ответом функции tool_results.append( { «type»: «function_call_output», «call_id»: output.call_id, «output»: json.dumps(function_response) } )
Он обрабатывает выходные данные ответа модели и выполняет следующие действия:
- Если тип вывода — рассуждение, выведите каждый элемент в сводке рассуждений.
- Если тип вывода — сообщение, выполните итерацию содержимого и выведите каждый текстовый элемент.
- Если тип выходных данных — вызов функции, получить имя функции, проанализировать её аргументы и передать их функции ( web_search ) для генерации ответа. В этом случае ответ веб-поиска содержит актуальную информацию, относящуюся к сообщению пользователя. Наконец, добавить ответ на вызов функции и идентификатор вызова функции в tool_results . Это позволяет следующему циклу отправить результат работы инструмента обратно в модель.
Полный код для агента веб-поиска
из datetime импорт datetime, timezone импорт json из openai импорт OpenAI импорт os из tavily импорт TavilyClient tavily = TavilyClient(api_key=os.getenv(«TAVILY_API_KEY»)) def web_search(query: str, num_results: int = 10): try: result = tavily.search( query=query, search_thought=»basic», max_results=num_results, include_answer=False, include_raw_content=False, include_images=False ) results = result.get(«results», []) return { «query»: query, «results»: results, «sources»: [ {«title»: r.get(«title», «»), «url»: r.get(«url», «»)} for r in results ] } except Exception as e: return { «error»: f»Search Ошибка: {e}», «query»: query, «results»: [], «sources»: [], } tool_schema = [ { «type»: «function», «name»: «web_search», «description»: «»»Выполните поиск в Интернете для получения актуальной информации. Синтезируйте краткий, содержательный ответ на основе содержимого результатов посещённых страниц. Выберите страницы, извлеките текст и предоставьте наилучший доступный результат, ссылаясь на 1–3 источника (название + URL). Если источники противоречивы, укажите на неопределённость и отдайте предпочтение самым последним данным. «»», «strict»: True, «parameters»: { «type»: «object», «properties»: { «query»: { «type»: «string», «description»: «Запрос для поиска в Интернете.», }, }, «required»: [«query»], «additionalProperties»: False }, }, ] client = OpenAI(api_key=os.getenv(«OPENAI_API_KEY»)) # трекер для идентификатора ответа последней модели для сохранения состояния беседы prev_response_id = None # список для хранения результатов инструмента из вызова функции tool_results = [] while True: # если результаты инструмента пусты, сообщение-подсказка if len(tool_results) == 0: user_message = input(«User: «) «»» команды для выхода из чата «»» if isinstance(user_message, str) and user_message.strip().lower() in {«exit», «q»}: print(«Выходим из чата. До свидания!») break else: # устанавливаем сообщения пользователя в результаты инструмента для отправки в модель user_message = tool_results.copy() # очищаем результаты инструмента для следующего вызова tool_results = [] # получаем текущую дату для передачи в модель в качестве инструкции для помощи в принятии решений today_date = datetime.now(timezone.utc).date().isoformat() response = client.responses.create( model = «gpt-5-mini», input = user_message, instructions=f»Текущая дата: {today_date}.», tools = tool_schema, previous_response_id=prev_response_id, text = {«verbosity»: «low»}, reasoning={ «effort»: «low», }, store=True, ) prev_response_id = response.id # Обрабатывает выходные данные ответа модели for output in response.output: if output.type == «reasoning»: print(«Assistant: «,»Reasoning ….») for reasoning_summary in output.summary: print(«Assistant: «,reasoning_summary) elif output.type == «message»: for item in output.content: print(«Assistant: «,item.text) # проверяет, является ли тип выходных данных вызовом функции, и добавляет результаты вызова функции в список результатов инструмента elif output.type == «function_call»: # получает имя функции function_name = globals().get(output.name) # загружает аргументы функции args = json.loads(output.arguments) function_response = function_name(**args) # добавляет в список результатов инструмента идентификатор вызова функции и ответ функции tool_results.append( { «type»: «function_call_output», «call_id»: output.call_id, «output»: json.dumps(function_response) } )
Запустив код, вы можете легко связаться с агентом и задать ему вопросы, требующие актуальной информации, например, о текущей погоде или последних выпусках продуктов. Агент отвечает актуальной информацией, а также ссылками на соответствующие источники в интернете. Ниже представлен пример вывода терминала.
Пользователь: Какая сегодня погода в Лондоне? Помощник: Рассуждение …. Помощник: Рассуждение …. Помощник: Прямо сейчас в Лондоне: пасмурно, около 18°C (64°F), влажность ~88%, слабый юго-западный ветер ~16 км/ч, осадков не сообщается. Источник: WeatherAPI (текущие условия) — https://www.weatherapi.com/ Пользователь: Какая последняя модель iPhone? Помощник: Рассуждение …. Помощник: Рассуждение …. Помощник: Новейшие модели iPhone — это линейка iPhone 17 (включая iPhone 17, iPhone 17 Pro, iPhone 17 Pro Max) и новый iPhone Air, представленный Apple 9 сентября 2025 года. Источник: Apple Newsroom — https://www.apple.com/newsroom/2025/09/apple-debuts-iphone-17/ Пользователь: Умножьте 500 на 12. Помощник: Рассуждение …. Помощник: 6000 Пользователь: выйти Выход из чата. До свидания!
Вы можете увидеть результаты, используя соответствующие веб-источники. Когда вы просите агента выполнить задачу, не требующую актуальной информации, например, выполнить математические вычисления или написать код, он отвечает напрямую, без необходимости поиска в интернете.
Примечание: Агент веб-поиска — это простой агент, работающий с одним инструментом. Продвинутые агентские системы объединяют множество специализированных инструментов и эффективно используют память для поддержания контекста, планирования и решения более сложных задач.
Заключение
В этой статье я объяснил, как работает агент ИИ и как он расширяет возможности большой языковой модели для взаимодействия с окружающей средой, выполнения действий и решения задач с помощью инструментов. Я также объяснил, как вызывать функции и как это позволяет LLM вызывать инструменты. Я продемонстрировал, как создать схему инструментов для вызова функций, которая определяет, когда и как LLM должен вызывать инструмент для выполнения действия. Я определил функцию веб-поиска с помощью Tavily для извлечения информации из интернета, а затем шаг за шагом показал, как создать агент веб-поиска, используя вызов функций и GPT-5-mini в качестве LLM. В итоге мы создали агент веб-поиска, способный извлекать актуальную информацию из интернета для ответа на запросы пользователей.
Загляните в мой репозиторий GenAI-Courses на GitHub, где я опубликовал ещё больше курсов по различным темам генеративного ИИ. Там также есть руководство по созданию агентного RAG с помощью вызова функций.
Свяжитесь со мной через:
Электронная почта: [email protected]
Linkedin: https://www.linkedin.com/in/ayoola-olafenwa-003b901a9/
Ссылки
https://platform.openai.com/docs/guides/function-calling?api-mode=responses
https://docs.tavily.com/documentation/api-reference/endpoint/search
Источник: towardsdatascience.com



























