ym88659208ym87991671
Создание агента | Документация для разработчиков

Создание агента

Обновлено 6 августа 2024

В разделе рассматриваются следующие основные поняти

Языковые модели просто генерируют текст и не могут выполнять действия. Разработка агентов — это один из основных сценариев использования GigaChain.

Агенты — системы, использующие LLM для рассуждений и определения действий, которые нужно предпринять, а также входных данных, которые нужно при этом использовать.

Результаты этих действий затем могут быть переданы обратно агенту, чтобы он определил, нужно ли делать что-то еще или можно закончить работу.

В разделе приведен пример агента, который может взаимодействовать с несколькими инструментами: локальной базой данных и поисковой системой. С агентом можно вести разговор и наблюдать, как он вызывает инструменты.

Пример агента

Пример ниже содержит код работающего агента, который использует модель для определения того, какой инструмент нужно вызвать. Агент подготовлен для работы с поисковым инструментом и обладает разговорной памятью, что позволяет использовать его в роли развитого чат-бота.

Ниже в разделе приводится пошаговый разбор каждого из компонтов агента.

# Импортирование необходимой функциональности
from langchain.chat_models.gigachat import GigaChat
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.prebuilt import create_react_agent

# Создание агента {#sozdanie-agenta2}

memory = SqliteSaver.from_conn_string(":memory:")
model = GigaChat(
credentials="<авторизационные_данные>",
scope="GIGACHAT_API_PERS",
model="GigaChat-Pro",
verify_ssl_certs=False,
)
search = TavilySearchResults(max_results=2)
tools = [search]
agent_executor = create_react_agent(model, tools, checkpointer=memory)

# Использование агента
config = {"configurable": {"thread_id": "abc100"}}
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Привет! Меня зову Вася. Я живу в Москве")]}, config
):
print(chunk)
print("----")

for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Покажи данные о погоде в моем городе")]}, config
):
print(chunk)
print("----")
    {'agent': {'messages': [AIMessage(content='Здравствуйте! Очень приятно познакомиться, Вася из Москвы. Чем я могу вам помочь сегодня?', additional_kwargs={'functions_state_id': 'c94ca48e-f423-4bdc-8073-156a4e48e1e3'}, response_metadata={'token_usage': Usage(prompt_tokens=102, completion_tokens=27, total_tokens=129), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-4a31e45c-5274-432a-86e9-a31ff854c68c-0')]}}
----
    WARNING:langchain_community.chat_models.gigachat:Giga generation stopped with reason: function_call
    {'agent': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'name': 'tavily_search_results_json', 'arguments': {'query': 'погода в Москве'}}, 'functions_state_id': 'f1a100da-7085-4fb0-b54d-f36b988f0713'}, response_metadata={'token_usage': Usage(prompt_tokens=157, completion_tokens=35, total_tokens=192), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'function_call'}, id='run-b1ef0f7b-ee72-4097-b9e9-c2b8b3ae6574-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'погода в Москве'}, 'id': '3a2fc4ff-938d-4eb4-a4c6-fa00781b5afe'}])]}}
----
{'tools': {'messages': [ToolMessage(content='[{"url": "https://pogoda.mail.ru/prognoz/moskva/14dney/", "content": "\\u0423\\u0437\\u043d\\u0430\\u0439\\u0442\\u0435, \\u043a\\u0430\\u043a\\u0430\\u044f \\u043f\\u043e\\u0433\\u043e\\u0434\\u0430 \\u043e\\u0436\\u0438\\u0434\\u0430\\u0435\\u0442\\u0441\\u044f \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 \\u0431\\u043b\\u0438\\u0436\\u0430\\u0439\\u0448\\u0438\\u0435 \\u0434\\u0432\\u0435 \\u043d\\u0435\\u0434\\u0435\\u043b\\u0438. \\u0421\\u043c\\u043e\\u0442\\u0440\\u0438\\u0442\\u0435 \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u0443, \\u043e\\u0441\\u0430\\u0434\\u043a\\u0438, \\u0432\\u0435\\u0442\\u0435\\u0440, \\u0434\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043b\\u0430\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c, \\u0444\\u0430\\u0437\\u0443 \\u043b\\u0443\\u043d\\u044b \\u0438 \\u0433\\u0435\\u043e\\u043c\\u0430\\u0433\\u043d\\u0438\\u0442\\u043d\\u043e\\u0435 \\u043f\\u043e\\u043b\\u0435 \\u0434\\u043b\\u044f \\u043a\\u0430\\u0436\\u0434\\u043e\\u0433\\u043e \\u0434\\u043d\\u044f."}, {"url": "https://yandex.ru/pogoda/moscow", "content": "\\u0423\\u0437\\u043d\\u0430\\u0439\\u0442\\u0435 \\u043f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437 \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 \\u0441\\u0435\\u0433\\u043e\\u0434\\u043d\\u044f, \\u0437\\u0430\\u0432\\u0442\\u0440\\u0430 \\u0438 \\u0431\\u043b\\u0438\\u0436\\u0430\\u0439\\u0448\\u0438\\u0435 \\u0434\\u043d\\u0438. \\u0421\\u043c\\u043e\\u0442\\u0440\\u0438\\u0442\\u0435 \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u0443, \\u043e\\u0441\\u0430\\u0434\\u043a\\u0438, \\u0434\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043b\\u0430\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c \\u0438 \\u0434\\u0440\\u0443\\u0433\\u0438\\u0435 \\u043f\\u0430\\u0440\\u0430\\u043c\\u0435\\u0442\\u0440\\u044b \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u0432 \\u0440\\u0430\\u0437\\u043d\\u044b\\u0445 \\u0440\\u0430\\u0439\\u043e\\u043d\\u0430\\u0445 \\u0433\\u043e\\u0440\\u043e\\u0434\\u0430."}]', name='tavily_search_results_json', tool_call_id='3a2fc4ff-938d-4eb4-a4c6-fa00781b5afe')]}}
----
{'agent': {'messages': [AIMessage(content='Я нашел для вас несколько сайтов с данными о погоде в Москве. Вот они: \n\n- pogoda.mail.ru/prognoz/moskva/14dney/\n- yandex.ru/pogoda/moscow', additional_kwargs={'functions_state_id': 'f06ab5b1-a7a2-4790-be88-271fbc975c25'}, response_metadata={'token_usage': Usage(prompt_tokens=391, completion_tokens=61, total_tokens=452), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-0e8a7ad5-7850-406e-96bf-fa9353cc480a-0')]}}
----

Подготовка к разработке

Jupyter-блокноты

Это руководство, как и большинство других в документации, использует Jupyter-блокноты. Они отлично подходят для изучения работы с LLM-системами, так как предоставляют интерактивную среду для работы с руководствами и позволяют работать с непредвиденными ситуациями: недоступностью API, нетипичным выводом и другими.

Подробнее об установке Jupyter — в официальной документации.

Установка

Для установки GigaChain выполните команды:

pip install -U gigachain-community gigagraph tavily-python

Подробнее об установке — в разделе Установка.

Tavily

В качестве инструмента в примере используется поисковый движок Tavily. Для работы с ним вам нужно получить и задать ключ API:

export TAVILY_API_KEY="..."

В Jupyter-блокноте ключ можно использовать так:

import getpass
import os

os.environ["TAVILY_API_KEY"] = getpass.getpass()

Определение инструментов

Сначала создайте инструменты, которые будет использовать агент. Основным инструментом в примере выступает поисковый движок Tavily. GigaChain предоставляет интеграцию для простого использования поисковой системы Tavily в качестве инструмента.

from langchain_community.tools.tavily_search import TavilySearchResults

search = TavilySearchResults(max_results=2)
search_results = search.invoke("Узнай на weatherapi погоду в Москве")
print(search_results)
# Если нужно, вы можете создать другие инструменты.
# После создания всех необходимых инструментов
# их можно сохранить в списке, к которому можно обращаться позднее.
tools = [search]
    [{'url': 'https://www.weatherapi.com/', 'content': "{'location': {'name': 'Moscow', 'region': 'Moscow City', 'country': 'Russia', 'lat': 55.75, 'lon': 37.62, 'tz_id': 'Europe/Moscow', 'localtime_epoch': 1722510905, 'localtime': '2024-08-01 14:15'}, 'current': {'last_updated_epoch': 1722510900, 'last_updated': '2024-08-01 14:15', 'temp_c': 19.9, 'temp_f': 67.7, 'is_day': 1, 'condition': {'text': 'Patchy light drizzle', 'icon': '//cdn.weatherapi.com/weather/64x64/day/263.png', 'code': 1150}, 'wind_mph': 11.4, 'wind_kph': 18.4, 'wind_degree': 284, 'wind_dir': 'WNW', 'pressure_mb': 1001.0, 'pressure_in': 29.56, 'precip_mm': 0.51, 'precip_in': 0.02, 'humidity': 59, 'cloud': 70, 'feelslike_c': 19.9, 'feelslike_f': 67.7, 'windchill_c': 19.9, 'windchill_f': 67.7, 'heatindex_c': 19.9, 'heatindex_f': 67.7, 'dewpoint_c': 11.8, 'dewpoint_f': 53.2, 'vis_km': 5.0, 'vis_miles': 3.0, 'uv': 4.0, 'gust_mph': 13.3, 'gust_kph': 21.3}}"}, {'url': 'https://www.weatherapi.com/weather/q/moscow-2145091', 'content': 'Moscow weather for 7, 10 and 14 day weather including today, tomorrow and weekend weather - Moscow City, Russia ... 01:45 AM: 03:08 AM: Phase: Waxing Crescent: First Quarter: Waxing Gibbous: Waxing Gibbous: Waxing Gibbous: ... WeatherAPI.com free weather widgets could be easily added to any website or content management systems (CMS) like ...'}]

Использование языковых моделей

Пример ниже показывает как использовать языковую модель для вызова инструментов. Кроме моделей GigaChat, GigaChain позволяет использовать и другие модели.

# | output: false
# | echo: false

from langchain.chat_models.gigachat import GigaChat

model = GigaChat(
credentials="<авторизационные_данные>",
scope="GIGACHAT_API_PERS",
model="GigaChat-Pro",
verify_ssl_certs=False,
)

Для вызова модели передайте ей список сообщений. По умолчанию ответом будет строка content.

from langchain_core.messages import HumanMessage

response = model.invoke([HumanMessage(content="Привет!")])
response.content
    'Здравствуйте! Готова ответить на ваши вопросы.'

Используйте метод .bind_tools, чтобы дать модели знать, к каким инструментам она может обращаться.

model_with_tools = model.bind_tools(tools)

Сначала, посмотрите как ответит модель на обычное сообщение. Ответ модели можно найти в двух полях content и tool_calls.

response = model_with_tools.invoke([HumanMessage(content="Привет!")])

print(f"ContentString: {response.content}")
print(f"ToolCalls: {response.tool_calls}")
    ContentString: Здравствуйте! Чем я могу вам помочь?
ToolCalls: []

Теперь попробуйте вызвать модель с помощью запроса, который предполагает использование инструмента.

response = model_with_tools.invoke([HumanMessage(content="Какая погода в Москве, спроси у weatherapi?")])

print(f"ContentString: {response.content}")
print(f"ToolCalls: {response.tool_calls}")
    WARNING:langchain_community.chat_models.gigachat:Giga generation stopped with reason: function_call
    ContentString: 
ToolCalls: [{'name': 'tavily_search_results_json', 'args': {'query': 'Какая погода в Москве?'}, 'id': '38c51d05-adf3-42d7-85b0-8af53818e03e'}]

Поле ContentString теперь пустое, но по содержимому массива ToolCalls видно, что модель хочет, чтобы вы вызвали инструмент поиска Tavily.

Модель не может самостоятельно вызвать инструмент, для этого нужно создать агента.

Создание агента

Для создания агента используйте GigaGraph — инструмент, который предоставляет высокоуровневый интерфейс для создания агентов. GigaGraph дает доступ к низкоуровневым инструментам, которые дают полный контроль над логикой работы агента. Инициализируйте агент с моделью и набором инструментов.

В агент можно передавать model, а не model_with_tools, т.к. метод create_react_agent самостоятельно вызывает .bind_tools.

from langgraph.prebuilt import create_react_agent

agent_executor = create_react_agent(model, tools)

Запуск агента

Теперь вы можете проверить работу агента на нескольких запросах.

Сейчас агент не сохраняет информацию о состоянии и не помнит историю взаимодействия с пользователем.

В результате работы агент возвращает итоговое состояние, которое кроме выходных данных также содержит все входные данные. Как получить только выходные данные показано в примерах ниже.

Посмотрите, как агент отвечает, когда не нужно вызывать инструменты:

response = agent_executor.invoke({"messages": [HumanMessage(content="Привет!")]})

response["messages"]
    [HumanMessage(content='Привет!', id='e8329188-248d-4c3f-8b5c-7fa71b699dbf'),
AIMessage(content='Здравствуйте! Чем я могу вам помочь?', additional_kwargs={'functions_state_id': '5ea42efe-df02-4b67-9b42-f8c7a7a513c8'}, response_metadata={'token_usage': Usage(prompt_tokens=91, completion_tokens=17, total_tokens=108), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-1778eb8f-3ed8-40e5-becb-f7c6cbebc323-0')]

Попробуйте обратиться к агенту с запросом, который предполагает вызов инструмента:

response = agent_executor.invoke(
{"messages": [HumanMessage(content="Какая погода в Москве, узнай на weatherapi?")]}
)
response["messages"]
    WARNING:langchain_community.chat_models.gigachat:Giga generation stopped with reason: function_call
    [HumanMessage(content='Какая погода в Москве, узнай на weatherapi?', id='2f10751b-3b3e-43fa-9872-9153e006551d'),
AIMessage(content='', additional_kwargs={'function_call': {'name': 'tavily_search_results_json', 'arguments': {'query': 'Какая погода в Москве, узнай на weatherapi?'}}, 'functions_state_id': 'e6f2cbba-7964-433f-8f1e-972c3badd13d'}, response_metadata={'token_usage': Usage(prompt_tokens=101, completion_tokens=44, total_tokens=145), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'function_call'}, id='run-ef497eef-d26c-41ae-853f-33dc6ad30657-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'Какая погода в Москве, узнай на weatherapi?'}, 'id': 'b3f7704b-a8fb-4ff9-8a00-3111a14b1ad8'}]),
ToolMessage(content='[{"url": "https://www.weatherapi.com/", "content": "{\'location\': {\'name\': \'\\u041c\\u043e\\u0441\\u043a\\u0432\\u0430\', \'region\': \'Moscow City\', \'country\': \'\\u0420\\u043e\\u0441\\u0441\\u0438\\u044f\', \'lat\': 55.75, \'lon\': 37.62, \'tz_id\': \'Europe/Moscow\', \'localtime_epoch\': 1722511056, \'localtime\': \'2024-08-01 14:17\'}, \'current\': {\'last_updated_epoch\': 1722510900, \'last_updated\': \'2024-08-01 14:15\', \'temp_c\': 19.9, \'temp_f\': 67.7, \'is_day\': 1, \'condition\': {\'text\': \'Patchy light drizzle\', \'icon\': \'//cdn.weatherapi.com/weather/64x64/day/263.png\', \'code\': 1150}, \'wind_mph\': 11.4, \'wind_kph\': 18.4, \'wind_degree\': 284, \'wind_dir\': \'WNW\', \'pressure_mb\': 1001.0, \'pressure_in\': 29.56, \'precip_mm\': 0.51, \'precip_in\': 0.02, \'humidity\': 59, \'cloud\': 70, \'feelslike_c\': 19.9, \'feelslike_f\': 67.7, \'windchill_c\': 19.9, \'windchill_f\': 67.7, \'heatindex_c\': 19.9, \'heatindex_f\': 67.7, \'dewpoint_c\': 11.8, \'dewpoint_f\': 53.2, \'vis_km\': 5.0, \'vis_miles\': 3.0, \'uv\': 4.0, \'gust_mph\': 13.3, \'gust_kph\': 21.3}}"}, {"url": "https://goodmeteo.ru/pogoda-moskva/1-8/", "content": "\\u041f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437 \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 01.08.2024. \\u0421\\u0430\\u043c\\u0430\\u044f \\u0442\\u043e\\u0447\\u043d\\u0430\\u044f \\u043f\\u043e\\u0447\\u0430\\u0441\\u043e\\u0432\\u0430\\u044f \\u043f\\u043e\\u0433\\u043e\\u0434\\u0430 \\u0432 \\u0433\\u043e\\u0440\\u043e\\u0434\\u0435 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 1 \\u0430\\u0432\\u0433\\u0443\\u0441\\u0442\\u0430 2024: \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u0430, \\u043e\\u0441\\u0430\\u0434\\u043a\\u0438, \\u0434\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435, \\u0432\\u0435\\u0442\\u0435\\u0440, \\u0432\\u043b\\u0430\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c. \\u041c\\u0435\\u0442\\u0435\\u043e\\u043f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437\\u044b \\u043d\\u0430 GoodMeteo.ru"}]', name='tavily_search_results_json', id='eae93942-8fc9-4c32-af63-dcc3266d86ed', tool_call_id='b3f7704b-a8fb-4ff9-8a00-3111a14b1ad8'),
AIMessage(content='Погода в Москве на 1 августа 2024 года, согласно данным с сайта weatherapi, составляет 19.9 градусов Цельсия. Также сообщается о наличии легкого моросящего дождя.', additional_kwargs={'functions_state_id': '208428f2-2581-4347-b331-9dab03cceca8'}, response_metadata={'token_usage': Usage(prompt_tokens=821, completion_tokens=50, total_tokens=871), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-940aca27-1089-40ed-a4ce-bdacc9b2c5e9-0')]

Потоковая передача сообщений

В предыдущих примерах агент вызывается с помощью метода .invoke и возвращает итоговой ответ. Это может занимать продолжительное время, если агент в процессе работы выполняет множество шагов. Для демонстрации промежуточных результатов вы можете передавать сообщения по мере их возникновения.

for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Какая погода в Москве, узнай на weatherapi?")]}
):
print(chunk)
print("----")
    WARNING:langchain_community.chat_models.gigachat:Giga generation stopped with reason: function_call
    {'agent': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'name': 'tavily_search_results_json', 'arguments': {'query': 'Какая погода в Москве, узнай на weatherapi?'}}, 'functions_state_id': '1c01b637-c2c1-4e2e-8683-821b103a779d'}, response_metadata={'token_usage': Usage(prompt_tokens=101, completion_tokens=44, total_tokens=145), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'function_call'}, id='run-ffb8a6a0-c0cb-4860-b3da-897a6059c72d-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'Какая погода в Москве, узнай на weatherapi?'}, 'id': '58ea597a-c72e-43cd-bad1-1677b5e3d435'}])]}}
----
{'tools': {'messages': [ToolMessage(content='[{"url": "https://www.weatherapi.com/", "content": "{\'location\': {\'name\': \'\\u041c\\u043e\\u0441\\u043a\\u0432\\u0430\', \'region\': \'Moscow City\', \'country\': \'\\u0420\\u043e\\u0441\\u0441\\u0438\\u044f\', \'lat\': 55.75, \'lon\': 37.62, \'tz_id\': \'Europe/Moscow\', \'localtime_epoch\': 1722511056, \'localtime\': \'2024-08-01 14:17\'}, \'current\': {\'last_updated_epoch\': 1722510900, \'last_updated\': \'2024-08-01 14:15\', \'temp_c\': 19.9, \'temp_f\': 67.7, \'is_day\': 1, \'condition\': {\'text\': \'Patchy light drizzle\', \'icon\': \'//cdn.weatherapi.com/weather/64x64/day/263.png\', \'code\': 1150}, \'wind_mph\': 11.4, \'wind_kph\': 18.4, \'wind_degree\': 284, \'wind_dir\': \'WNW\', \'pressure_mb\': 1001.0, \'pressure_in\': 29.56, \'precip_mm\': 0.51, \'precip_in\': 0.02, \'humidity\': 59, \'cloud\': 70, \'feelslike_c\': 19.9, \'feelslike_f\': 67.7, \'windchill_c\': 19.9, \'windchill_f\': 67.7, \'heatindex_c\': 19.9, \'heatindex_f\': 67.7, \'dewpoint_c\': 11.8, \'dewpoint_f\': 53.2, \'vis_km\': 5.0, \'vis_miles\': 3.0, \'uv\': 4.0, \'gust_mph\': 13.3, \'gust_kph\': 21.3}}"}, {"url": "https://world-weather.ru/pogoda/russia/moscow/august-2024/", "content": "\\u041f\\u043e\\u0434\\u0440\\u043e\\u0431\\u043d\\u044b\\u0439 \\u26a1 \\u043f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437 \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 \\u0430\\u0432\\u0433\\u0443\\u0441\\u0442 2024 \\u0433\\u043e\\u0434\\u0430 - \\u0438\\u043d\\u0444\\u043e\\u0440\\u043c\\u0430\\u0446\\u0438\\u044f \\u043e \\u0434\\u043d\\u0435\\u0432\\u043d\\u043e\\u0439 \\u0438 \\u043d\\u043e\\u0447\\u043d\\u043e\\u0439 \\ud83c\\udf21\\ufe0f \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u0435, \\u043e\\u0441\\u0430\\u0434\\u043a\\u0430\\u0445 \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435, \\u041c\\u043e\\u0441\\u043a\\u043e\\u0432\\u0441\\u043a\\u0430\\u044f \\u043e\\u0431\\u043b\\u0430\\u0441\\u0442\\u044c, \\u0420\\u043e\\u0441\\u0441\\u0438\\u044f - World-Weather.Ru"}]', name='tavily_search_results_json', tool_call_id='58ea597a-c72e-43cd-bad1-1677b5e3d435')]}}
----
{'agent': {'messages': [AIMessage(content='Погода в Москве на 1 августа 2024 года, согласно данным с сайта weatherapi, следующая: температура воздуха составляет 19.9 градусов Цельсия, ощущается как 19.9 градусов, влажность 59%, облачность 70%. Также отмечается легкий моросящий дождь.', additional_kwargs={'functions_state_id': '1a4b99e5-de87-49cb-9f43-0f5d6caf6bc7'}, response_metadata={'token_usage': Usage(prompt_tokens=817, completion_tokens=74, total_tokens=891), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-7f4803a0-d68c-4ea3-ae3d-f4d52eee2b8f-0')]}}
----

Потоковая передача токенов

Кроме сообщений вы также можете использовать потоковую передачу токенов. Для этого используйте метод .astream_events.

Метод .astream_events работает в версиях Python 3.11 и выше.

async for event in agent_executor.astream_events(
{"messages": [HumanMessage(content="Какая погода в Москве, узнай на weatherapi?")]}, version="v1"
):
kind = event["event"]
if kind == "on_chain_start":
if (
event["name"] == "Agent"
): # Назначается при создании агента с помощью метода `.with_config({"run_name": "Agent"})`
print(
f"Starting agent: {event['name']} with input: {event['data'].get('input')}"
)
elif kind == "on_chain_end":
if (
event["name"] == "Agent"
): # Назначается при создании агента с помощью метода `.with_config({"run_name": "Agent"})`
print()
print("--")
print(
f"Done agent: {event['name']} with output: {event['data'].get('output')['output']}"
)
if kind == "on_chat_model_stream":
content = event["data"]["chunk"].content
if content:
print(content, end="|")
elif kind == "on_tool_start":
print("--")
print(
f"Starting tool: {event['name']} with inputs: {event['data'].get('input')}"
)
elif kind == "on_tool_end":
print(f"Done tool: {event['name']}")
print(f"Tool output was: {event['data'].get('output')}")
print("--")
    --
Starting tool: tavily_search_results_json with inputs: {'query': 'Какая погода в Москве, узнай на weatherapi?'}
Done tool: tavily_search_results_json
Tool output was: [{'url': 'https://www.weatherapi.com/', 'content': "{'location': {'name': 'Moscow', 'region': 'Moscow City', 'country': 'Russia', 'lat': 55.75, 'lon': 37.62, 'tz_id': 'Europe/Moscow', 'localtime_epoch': 1722511212, 'localtime': '2024-08-01 14:20'}, 'current': {'last_updated_epoch': 1722510900, 'last_updated': '2024-08-01 14:15', 'temp_c': 19.9, 'temp_f': 67.7, 'is_day': 1, 'condition': {'text': 'Patchy light drizzle', 'icon': '//cdn.weatherapi.com/weather/64x64/day/263.png', 'code': 1150}, 'wind_mph': 11.4, 'wind_kph': 18.4, 'wind_degree': 284, 'wind_dir': 'WNW', 'pressure_mb': 1001.0, 'pressure_in': 29.56, 'precip_mm': 0.51, 'precip_in': 0.02, 'humidity': 59, 'cloud': 70, 'feelslike_c': 19.9, 'feelslike_f': 67.7, 'windchill_c': 19.9, 'windchill_f': 67.7, 'heatindex_c': 19.9, 'heatindex_f': 67.7, 'dewpoint_c': 11.8, 'dewpoint_f': 53.2, 'vis_km': 5.0, 'vis_miles': 3.0, 'uv': 4.0, 'gust_mph': 13.3, 'gust_kph': 21.3}}"}, {'url': 'https://world-weather.info/forecast/russia/moscow/january-2024/', 'content': 'Extended weather forecast in Moscow. Hourly Week 10 days 14 days 30 days Year. Detailed ⚡ Moscow Weather Forecast for January 2024 - day/night 🌡️ temperatures, precipitations - World-Weather.info.'}]
--
Погода в Москве, согласно данным weatherapi, следующая: температура составляет 19.9 градусов Цельсия, ощущается как 19.9 градусов, влажность 59%, облачность 70%. Также отмечается легкий моросящий дождь.|

Добавление памяти

Для добавления памяти нужно при вызове агента передать ему чекпойнтер и поле thread_id. С помощью этого поля агент сможет понять, к какому разговору нужно вернуться.

from langgraph.checkpoint.sqlite import SqliteSaver

memory = SqliteSaver.from_conn_string(":memory:")
agent_executor = create_react_agent(model, tools, checkpointer=memory)

config = {"configurable": {"thread_id": "abc123"}}
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Привет! Меня зовут Вася")]}, config
):
print(chunk)
print("----")
    {'agent': {'messages': [AIMessage(content='Здравствуйте, Вася! Рада познакомиться. Чем я могу вам помочь сегодня?', additional_kwargs={'functions_state_id': '48672f4f-dc4a-4370-be7e-ffce6d24c883'}, response_metadata={'token_usage': Usage(prompt_tokens=97, completion_tokens=25, total_tokens=122), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-056a1f85-08a2-417f-b2f6-7117d369b30b-0')]}}
----
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Как меня зовут?")]}, config
):
print(chunk)
print("----")
    {'agent': {'messages': [AIMessage(content='Вас зовут Вася.', additional_kwargs={'functions_state_id': 'ae930f9b-0a69-46a9-9338-d65ff768f71e'}, response_metadata={'token_usage': Usage(prompt_tokens=148, completion_tokens=12, total_tokens=160), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-be6d19fb-b89d-4e34-b5a7-6d82ed90b2e2-0')]}}
----

Для начала нового разговора вам достаточно изменить значение thread_id.

config = {"configurable": {"thread_id": "xyz123"}}
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Как меня зовут?")]}, config
):
print(chunk)
print("----")
    {'agent': {'messages': [AIMessage(content='Извините, но я не имею возможности предоставить вам эту информацию. Моя система не хранит и не обрабатывает персональные данные пользователей.', additional_kwargs={'functions_state_id': '3ce4de5a-95b5-4f4a-b18e-40def1558c82'}, response_metadata={'token_usage': Usage(prompt_tokens=94, completion_tokens=35, total_tokens=129), 'model_name': 'GigaChat-Pro:1.0.26.8', 'finish_reason': 'stop'}, id='run-6a2131a0-1534-4292-b53b-dc40eb68f52d-0')]}}
----

Смотрите также

Более подробную информацию о разработке агентов ищите в документации GigaGraph.

ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.