Создание агента
В разделе рассматриваются следующие основные понятия:
Языковые модели просто генерируют текст и не могут выполнять действия. Разработка агентов — это один из основных сценариев использования GigaChain.
Агенты — системы, использующие LLM для рассуждений и определения действий, которые нужно предпринять, а также входных данных, которые нужно при этом использовать.
Результаты этих действий затем могут быть переданы обратно агенту, чтобы он определил, нужно ли делать что-то еще или можно закончить работу.
В разделе приведен пример агента, который может взаимодействовать с несколькими инструментами: локальной базой данных и поисковой системой. С агентом можно вести разговор и наблюдать, как он вызывает инструменты.
Пример агента
Пример ниже содержит код работающего агента, который использует модель для определения того, какой инструмент нужно вызвать. Агент подготовлен для работы с поисковым инструментом и обладает разговорной памятью, что позволяет использовать его в роли развитого чат-бота.
Ниже в разделе приводится пошаговый разбор каждого из компонтов агента.
# Импортирование необходимой функциональности
from langchain_community.chat_models.gigachat import GigaChat
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.prebuilt import create_react_agent
# Создание агента {#undefined}
memory = MemorySaver()
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='Здравствуйте, Вася! Рада слышать вас. Расскажите, могу ли я вам чем-нибудь помочь?', response_metadata={'token_usage': Usage(prompt_tokens=97, completion_tokens=29, total_tokens=126), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-aad23d97-0cb5-4977-8d2e-b1ce06751157-0')]}}
----
{'agent': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'name': 'tavily_search_results_json', 'arguments': {'query': 'погода в москве'}}}, response_metadata={'token_usage': Usage(prompt_tokens=140, completion_tokens=23, total_tokens=163), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'function_call'}, id='run-8989a123-6824-4ae2-839b-77e0290aa584-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'погода в москве'}, 'id': 'fb19fd4f-3bc1-4b7f-9cca-e669ab8d96e4', 'type': 'tool_call'}])]}}
----
{'tools': {'messages': [ToolMessage(content='[{"url": "https://www.gismeteo.ru/weather-moscow-4368/now/", "content": "\\u0423\\u0437\\u043d\\u0430\\u0439\\u0442\\u0435 \\u0444\\u0430\\u043a\\u0442\\u0438\\u0447\\u0435\\u0441\\u043a\\u0443\\u044e \\u043f\\u043e\\u0433\\u043e\\u0434\\u0443 \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 \\u0441\\u0435\\u0433\\u043e\\u0434\\u043d\\u044f \\u0438 \\u043d\\u0430 \\u0431\\u043b\\u0438\\u0436\\u0430\\u0439\\u0448\\u0438\\u0435 \\u0434\\u043d\\u0438. \\u0421\\u043c\\u043e\\u0442\\u0440\\u0438\\u0442\\u0435 \\u043a\\u0430\\u0440\\u0442\\u0443 \\u043e\\u0441\\u0430\\u0434\\u043a\\u043e\\u0432, \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u044b, \\u0432\\u0435\\u0442\\u0435\\u0440\\u0430 \\u0438 \\u043e\\u0431\\u043b\\u0430\\u0447\\u043d\\u043e\\u0441\\u0442\\u0438, \\u0430 \\u0442\\u0430\\u043a\\u0436\\u0435 \\u043d\\u043e\\u0432\\u043e\\u0441\\u0442\\u0438 \\u0438 \\u043f\\u0440\\u0438\\u043c\\u0435\\u0442\\u044b."}, {"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, \\u0434\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043b\\u0430\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c, \\u0441\\u043a\\u043e\\u0440\\u043e\\u0441\\u0442\\u044c \\u0432\\u0435\\u0442\\u0440\\u0430 \\u0438 \\u043e\\u0441\\u0430\\u0434\\u043a\\u0438 \\u043d\\u0430 \\u043a\\u0430\\u0440\\u0442\\u0435 \\u0438 \\u0432 \\u0442\\u0430\\u0431\\u043b\\u0438\\u0446\\u0435."}]', name='tavily_search_results_json', tool_call_id='fb19fd4f-3bc1-4b7f-9cca-e669ab8d96e4', artifact={'query': 'погода в москве', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'title': 'Погода В Москве Сейчас | Gismeteo', 'url': 'https://www.gismeteo.ru/weather-moscow-4368/now/', 'content': 'Узнайте фактическую погоду в Москве на сегодня и на ближайшие дни. Смотрите карту осадков, температуры, ветера и облачности, а также новости и приметы.', 'score': 0.9981613, 'raw_content': None}, {'title': 'Прогноз погоды в Москве на 10 дней — Яндекс.Погода', 'url': 'https://yandex.ru/pogoda/moscow', 'content': 'Узнайте прогноз погоды в Москве на сегодня, завтра и ближайшие дни. Смотрите температуру, давление, влажность, скорость ветра и осадки на карте и в таблице.', 'score': 0.99698395, 'raw_content': None}], 'response_time': 2.27})]}}
----
{'agent': {'messages': [AIMessage(content='Погода в Москве сейчас облачная и прохладная. Температура воздуха около 15 градусов по Цельсию.', response_metadata={'token_usage': Usage(prompt_tokens=1744, completion_tokens=29, total_tokens=1773), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-b864e6be-a222-496d-aeab-2da9bea7ad1b-0')]}}
----
Ключ авторизации — строка, полученная в результате кодирования в Base64 клиентского идентификатора (Client ID) и ключа (Client Secret) API. Вы можете использовать готовый ключ из личного кабинета или самостоятельно закодировать Client ID и Client Secret.
Пример ключа авторизации:
MjIzODA0YTktMDU3OC00MTZmLWI4MWYtYzUwNjg3Njk4MzMzOjljMTI2MGQyLTFkNTEtNGRkOS05ZGVhLTBhNjAzZTdjZjQ3Mw==
Ключ авторизации, Client ID и Client Secret вы можете получить после создания проекта GigaChat API:
Подготовка к разработке
Jupyter-блокноты
Это руководство, как и большинство других в документации, использует Jupyter-блокноты. Они отлично подходят для изучения работы с LLM-системами, так как предоставляют интерактивную среду для работы с руководствами и позволяют работать с непредвиденными ситуациями: недоступностью API, нетипичным выводом и другими.
Подробнее об установке Jupyter — в официальной документации.
Установка
Для установки GigaChain выполните команды:
%%capture --no-stderr
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': 1726587484, 'localtime': '2024-09-17 18:38'}, 'current': {'last_updated_epoch': 1726587000, 'last_updated': '2024-09-17 18:30', 'temp_c': 22.3, 'temp_f': 72.1, 'is_day': 1, 'condition': {'text': 'Sunny', 'icon': '//cdn.weatherapi.com/weather/64x64/day/113.png', 'code': 1000}, 'wind_mph': 4.5, 'wind_kph': 7.2, 'wind_degree': 112, 'wind_dir': 'ESE', 'pressure_mb': 1032.0, 'pressure_in': 30.47, 'precip_mm': 0.0, 'precip_in': 0.0, 'humidity': 41, 'cloud': 0, 'feelslike_c': 23.8, 'feelslike_f': 74.8, 'windchill_c': 22.0, 'windchill_f': 71.5, 'heatindex_c': 23.7, 'heatindex_f': 74.7, 'dewpoint_c': 5.9, 'dewpoint_f': 42.6, 'vis_km': 10.0, 'vis_miles': 6.0, 'uv': 6.0, 'gust_mph': 8.4, 'gust_kph': 13.5}}"}, {'url': 'https://yandex.ru/pogoda/moscow/month/september', 'content': 'Погода в Москве в сентябре: температура воздуха, количество солнечных дней, осадки, давление и влажность. ... 12 сентября, четверг. днем, 17°; ночью, 14°; пасмурно ... Прогноз погоды на сентябрь 2024 ...'}]
Использование языковых моделей
Пример ниже показывает как использовать языковую модель для вызова инструментов. Кроме моделей GigaChat, GigaChain позволяет использовать и другие модели.
# | output: false
# | echo: false
from langchain_community.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}")
ContentString:
ToolCalls: [{'name': 'tavily_search_results_json', 'args': {'query': 'Какая погода в Москве, спроси у weatherapi?'}, 'id': 'c3b8aae6-8fec-4516-9c5b-c43e4465669c', 'type': 'tool_call'}]
Поле 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='039c0ab3-0e7e-4544-afca-0a5041d20dd0'),
AIMessage(content='Здравствуйте! Я могу вам чем-нибудь помочь?', response_metadata={'token_usage': Usage(prompt_tokens=86, completion_tokens=16, total_tokens=102), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-59315bc5-35a2-4ba4-b4ba-5a02aee9d375-0')]
Попробуйте обратиться к агенту с запросом, который предполагает вызов инструмента:
response = agent_executor.invoke(
{"messages": [HumanMessage(content="Какая погода в Москве, узнай на weatherapi?")]}
)
response["messages"]
[HumanMessage(content='Какая погода в Москве, узнай на weatherapi?', id='745327d6-f6ce-4664-ab06-c49f517c4835'),
AIMessage(content='', additional_kwargs={'function_call': {'name': 'tavily_search_results_json', 'arguments': {'query': 'какая погода в москве, узнать на weatherapi?'}}}, response_metadata={'token_usage': Usage(prompt_tokens=96, completion_tokens=31, total_tokens=127), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'function_call'}, id='run-374b7c90-7807-469b-9d05-100b202e885e-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'какая погода в москве, узнать на weatherapi?'}, 'id': 'e279257d-01ff-4886-bff1-6861f4645331', 'type': 'tool_call'}]),
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\': 1726587954, \'localtime\': \'2024-09-17 18:45\'}, \'current\': {\'last_updated_epoch\': 1726587000, \'last_updated\': \'2024-09-17 18:30\', \'temp_c\': 22.3, \'temp_f\': 72.1, \'is_day\': 0, \'condition\': {\'text\': \'Clear\', \'icon\': \'//cdn.weatherapi.com/weather/64x64/night/113.png\', \'code\': 1000}, \'wind_mph\': 4.5, \'wind_kph\': 7.2, \'wind_degree\': 112, \'wind_dir\': \'ESE\', \'pressure_mb\': 1032.0, \'pressure_in\': 30.47, \'precip_mm\': 0.0, \'precip_in\': 0.0, \'humidity\': 41, \'cloud\': 0, \'feelslike_c\': 23.8, \'feelslike_f\': 74.8, \'windchill_c\': 22.0, \'windchill_f\': 71.5, \'heatindex_c\': 23.7, \'heatindex_f\': 74.7, \'dewpoint_c\': 5.9, \'dewpoint_f\': 42.6, \'vis_km\': 10.0, \'vis_miles\': 6.0, \'uv\': 6.0, \'gust_mph\': 8.4, \'gust_kph\': 13.5}}"}, {"url": "https://weather.rambler.ru/v-moskve/17-september/", "content": "\\u041f\\u043e\\u0434\\u0440\\u043e\\u0431\\u043d\\u044b\\u0439 \\u043f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437 \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 17 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f 2024: \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u0430 \\u0432\\u043e\\u0437\\u0434\\u0443\\u0445\\u0430, \\u0432\\u0435\\u0442\\u0435\\u0440, \\u043e\\u0441\\u0430\\u0434\\u043a\\u0438, \\u0434\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435, \\u0432\\u043b\\u0430\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c, \\u0430 \\u0442\\u0430\\u043a\\u0436\\u0435 \\u0433\\u0435\\u043e\\u043c\\u0430\\u0433\\u043d\\u0438\\u0442\\u043d\\u0430\\u044f \\u043e\\u0431\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043a\\u0430 \\u0438 uv \\u0438\\u043d\\u0434\\u0435\\u043a\\u0441. ... \\u041f\\u043e\\u0433\\u043e\\u0434\\u0430 \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 17 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f 2024 ..."}]', name='tavily_search_results_json', id='ab821433-a289-452d-9c8e-955bdb704686', tool_call_id='e279257d-01ff-4886-bff1-6861f4645331', artifact={'query': 'какая погода в москве, узнать на weatherapi?', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'title': 'Weather in Москва', 'url': 'https://www.weatherapi.com/', 'content': "{'location': {'name': 'Москва', 'region': 'Moscow City', 'country': 'Россия', 'lat': 55.75, 'lon': 37.62, 'tz_id': 'Europe/Moscow', 'localtime_epoch': 1726587954, 'localtime': '2024-09-17 18:45'}, 'current': {'last_updated_epoch': 1726587000, 'last_updated': '2024-09-17 18:30', 'temp_c': 22.3, 'temp_f': 72.1, 'is_day': 0, 'condition': {'text': 'Clear', 'icon': '//cdn.weatherapi.com/weather/64x64/night/113.png', 'code': 1000}, 'wind_mph': 4.5, 'wind_kph': 7.2, 'wind_degree': 112, 'wind_dir': 'ESE', 'pressure_mb': 1032.0, 'pressure_in': 30.47, 'precip_mm': 0.0, 'precip_in': 0.0, 'humidity': 41, 'cloud': 0, 'feelslike_c': 23.8, 'feelslike_f': 74.8, 'windchill_c': 22.0, 'windchill_f': 71.5, 'heatindex_c': 23.7, 'heatindex_f': 74.7, 'dewpoint_c': 5.9, 'dewpoint_f': 42.6, 'vis_km': 10.0, 'vis_miles': 6.0, 'uv': 6.0, 'gust_mph': 8.4, 'gust_kph': 13.5}}", 'score': 0.9999731, 'raw_content': None}, {'title': 'Погода в Москве на 17 сентября 2024', 'url': 'https://weather.rambler.ru/v-moskve/17-september/', 'content': 'Подробный прогноз погоды в Москве на 17 сентября 2024: температура воздуха, ветер, осадки, давление, влажность, а также геомагнитная обстановка и uv индекс. ... Погода в Москве на 17 сентября 2024 ...', 'score': 0.99995315, 'raw_content': None}], 'response_time': 3.41}),
AIMessage(content='Согласно данным сервиса WeatherAPI, в Москве сейчас ясно, температура воздуха +22.3°С. Ветер восточно-юго-восточный, скорость 4.5 м/с. Влажность воздуха составляет 41%, атмосферное давление 1032.0 мб. Осадков нет. Ощущается как +23.8°С. УФ индекс 6.0. Данные актуальны на 18:30 по московскому времени.', response_metadata={'token_usage': Usage(prompt_tokens=1627, completion_tokens=108, total_tokens=1735), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-10450461-cc41-42c8-8b91-f97b15ca67a3-0')]
Потоковая передача сообщений
В предыдущих примерах агент вызывается с помощью метода .invoke
и возвращает итоговой ответ.
Это может занимать продолжительное время, если агент в процессе работы выполняет множество шагов.
Для демонстрации промежуточных результатов вы можете передавать сообщения по мере их возникновения.
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Какая погода в Москве, узнай на weatherapi?")]}
):
print(chunk)
print("----")
{'agent': {'messages': [AIMessage(content='', additional_kwargs={'function_call': {'name': 'tavily_search_results_json', 'arguments': {'query': 'какая погода в москве, узнать на weatherapi?'}}}, response_metadata={'token_usage': Usage(prompt_tokens=96, completion_tokens=31, total_tokens=127), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'function_call'}, id='run-cbd1e6f5-d99d-46bb-a54f-1482de12a277-0', tool_calls=[{'name': 'tavily_search_results_json', 'args': {'query': 'какая погода в москве, узнать на weatherapi?'}, 'id': '414756b7-d87a-46e3-83b4-e4f688efff58', 'type': 'tool_call'}])]}}
----
{'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\': 1726587954, \'localtime\': \'2024-09-17 18:45\'}, \'current\': {\'last_updated_epoch\': 1726587000, \'last_updated\': \'2024-09-17 18:30\', \'temp_c\': 22.3, \'temp_f\': 72.1, \'is_day\': 0, \'condition\': {\'text\': \'Clear\', \'icon\': \'//cdn.weatherapi.com/weather/64x64/night/113.png\', \'code\': 1000}, \'wind_mph\': 4.5, \'wind_kph\': 7.2, \'wind_degree\': 112, \'wind_dir\': \'ESE\', \'pressure_mb\': 1032.0, \'pressure_in\': 30.47, \'precip_mm\': 0.0, \'precip_in\': 0.0, \'humidity\': 41, \'cloud\': 0, \'feelslike_c\': 23.8, \'feelslike_f\': 74.8, \'windchill_c\': 22.0, \'windchill_f\': 71.5, \'heatindex_c\': 23.7, \'heatindex_f\': 74.7, \'dewpoint_c\': 5.9, \'dewpoint_f\': 42.6, \'vis_km\': 10.0, \'vis_miles\': 6.0, \'uv\': 6.0, \'gust_mph\': 8.4, \'gust_kph\': 13.5}}"}, {"url": "https://yandex.ru/pogoda/moscow/month/september", "content": "\\u041f\\u043e\\u0433\\u043e\\u0434\\u0430 \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u0432 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u0435: \\u0442\\u0435\\u043c\\u043f\\u0435\\u0440\\u0430\\u0442\\u0443\\u0440\\u0430 \\u0432\\u043e\\u0437\\u0434\\u0443\\u0445\\u0430, \\u043a\\u043e\\u043b\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043e \\u0441\\u043e\\u043b\\u043d\\u0435\\u0447\\u043d\\u044b\\u0445 \\u0434\\u043d\\u0435\\u0439, \\u043e\\u0441\\u0430\\u0434\\u043a\\u0438, \\u0434\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 \\u0438 \\u0432\\u043b\\u0430\\u0436\\u043d\\u043e\\u0441\\u0442\\u044c. ... 17 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f, \\u0432\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a. \\u0434\\u043d\\u0451\\u043c, 15\\u00b0; \\u043d\\u043e\\u0447\\u044c\\u044e, 12\\u00b0; \\u0434\\u043e\\u0436\\u0434\\u044c ... \\u041f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437 \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u043d\\u0430 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c 2024 \\u0433\\u043e\\u0434\\u0430 ..."}]', name='tavily_search_results_json', tool_call_id='414756b7-d87a-46e3-83b4-e4f688efff58', artifact={'query': 'какая погода в москве, узнать на weatherapi?', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'title': 'Weather in Москва', 'url': 'https://www.weatherapi.com/', 'content': "{'location': {'name': 'Москва', 'region': 'Moscow City', 'country': 'Россия', 'lat': 55.75, 'lon': 37.62, 'tz_id': 'Europe/Moscow', 'localtime_epoch': 1726587954, 'localtime': '2024-09-17 18:45'}, 'current': {'last_updated_epoch': 1726587000, 'last_updated': '2024-09-17 18:30', 'temp_c': 22.3, 'temp_f': 72.1, 'is_day': 0, 'condition': {'text': 'Clear', 'icon': '//cdn.weatherapi.com/weather/64x64/night/113.png', 'code': 1000}, 'wind_mph': 4.5, 'wind_kph': 7.2, 'wind_degree': 112, 'wind_dir': 'ESE', 'pressure_mb': 1032.0, 'pressure_in': 30.47, 'precip_mm': 0.0, 'precip_in': 0.0, 'humidity': 41, 'cloud': 0, 'feelslike_c': 23.8, 'feelslike_f': 74.8, 'windchill_c': 22.0, 'windchill_f': 71.5, 'heatindex_c': 23.7, 'heatindex_f': 74.7, 'dewpoint_c': 5.9, 'dewpoint_f': 42.6, 'vis_km': 10.0, 'vis_miles': 6.0, 'uv': 6.0, 'gust_mph': 8.4, 'gust_kph': 13.5}}", 'score': 0.9999057, 'raw_content': None}, {'title': 'Погода в Москве в сентябре — Яндекс.Погода', 'url': 'https://yandex.ru/pogoda/moscow/month/september', 'content': 'Погода в Москве в сентябре: температура воздуха, количество солнечных дней, осадки, давление и влажность. ... 17 сентября, вторник. днем, 15°; ночью, 12°; дождь ... Прогноз погоды на сентябрь 2024 года ...', 'score': 0.999764, 'raw_content': None}], 'response_time': 4.02})]}}
----
{'agent': {'messages': [AIMessage(content='В Москве сейчас ясно, температура 22.3°С.', response_metadata={'token_usage': Usage(prompt_tokens=1635, completion_tokens=16, total_tokens=1651), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-c301121e-20f4-4031-8f4f-52f5bf60104e-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("--")
<ipython-input-28-6a1dd78ae5f1>:1: LangChainBetaWarning: This API is in beta and may change in the future.
async for event in agent_executor.astream_events(
--
Starting tool: tavily_search_results_json with inputs: {'query': 'какая погода в москве, узнать на weatherapi?'}
Done tool: tavily_search_results_json
Tool output was: content='[{"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\': 1726588046, \'localtime\': \'2024-09-17 18:47\'}, \'current\': {\'last_updated_epoch\': 1726587900, \'last_updated\': \'2024-09-17 18:45\', \'temp_c\': 21.2, \'temp_f\': 70.2, \'is_day\': 0, \'condition\': {\'text\': \'Clear\', \'icon\': \'//cdn.weatherapi.com/weather/64x64/night/113.png\', \'code\': 1000}, \'wind_mph\': 4.5, \'wind_kph\': 7.2, \'wind_degree\': 112, \'wind_dir\': \'ESE\', \'pressure_mb\': 1032.0, \'pressure_in\': 30.47, \'precip_mm\': 0.0, \'precip_in\': 0.0, \'humidity\': 43, \'cloud\': 0, \'feelslike_c\': 21.2, \'feelslike_f\': 70.2, \'windchill_c\': 22.0, \'windchill_f\': 71.5, \'heatindex_c\': 23.7, \'heatindex_f\': 74.7, \'dewpoint_c\': 5.9, \'dewpoint_f\': 42.6, \'vis_km\': 10.0, \'vis_miles\': 6.0, \'uv\': 6.0, \'gust_mph\': 8.4, \'gust_kph\': 13.5}}"}, {"url": "https://weather.rambler.ru/v-moskve/17-september/", "content": "\\u041c\\u043e\\u0441\\u043a\\u0432\\u0430 \\u2014 \\u043f\\u043e\\u0433\\u043e\\u0434\\u0430 ... \\u043a\\u0430\\u043a\\u043e\\u0439 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043f\\u043e\\u0433\\u043e\\u0434\\u0430 \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 17 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f 2024. \\u041f\\u0440\\u043e\\u0441\\u0442\\u044b\\u0435 \\u0438 \\u043f\\u043e\\u043d\\u044f\\u0442\\u043d\\u044b\\u0435 \\u0438\\u043a\\u043e\\u043d\\u043a\\u0438 \\u0438 \\u0433\\u0440\\u0430\\u0444\\u0438\\u043a\\u0438 \\u043f\\u043e\\u043a\\u0430\\u0437\\u044b\\u0432\\u0430\\u044e\\u0442 \\u043f\\u0440\\u043e\\u0433\\u043d\\u043e\\u0437 \\u043f\\u043e\\u0433\\u043e\\u0434\\u044b \\u0432 \\u041c\\u043e\\u0441\\u043a\\u0432\\u0435 \\u043d\\u0430 17 \\u0441\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044f 2024, \\u0432 \\u043a\\u043e\\u0442\\u043e\\u0440\\u043e\\u043c \\u0434\\u043e\\u0431\\u0430\\u0432\\u043b\\u0435\\u043d\\u044b \\u0434\\u0430\\u043d\\u043d\\u044b\\u0435 \\u043e ..."}]' name='tavily_search_results_json' tool_call_id='0f46fe30-9839-4a24-a1fd-0b45d7275491' artifact={'query': 'какая погода в москве, узнать на weatherapi?', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'title': 'Weather in Moscow', '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': 1726588046, 'localtime': '2024-09-17 18:47'}, 'current': {'last_updated_epoch': 1726587900, 'last_updated': '2024-09-17 18:45', 'temp_c': 21.2, 'temp_f': 70.2, 'is_day': 0, 'condition': {'text': 'Clear', 'icon': '//cdn.weatherapi.com/weather/64x64/night/113.png', 'code': 1000}, 'wind_mph': 4.5, 'wind_kph': 7.2, 'wind_degree': 112, 'wind_dir': 'ESE', 'pressure_mb': 1032.0, 'pressure_in': 30.47, 'precip_mm': 0.0, 'precip_in': 0.0, 'humidity': 43, 'cloud': 0, 'feelslike_c': 21.2, 'feelslike_f': 70.2, 'windchill_c': 22.0, 'windchill_f': 71.5, 'heatindex_c': 23.7, 'heatindex_f': 74.7, 'dewpoint_c': 5.9, 'dewpoint_f': 42.6, 'vis_km': 10.0, 'vis_miles': 6.0, 'uv': 6.0, 'gust_mph': 8.4, 'gust_kph': 13.5}}", 'score': 0.9999598, 'raw_content': None}, {'title': 'Погода в Москве на 17 сентября 2024', 'url': 'https://weather.rambler.ru/v-moskve/17-september/', 'content': 'Москва — погода ... какой будет погода в Москве на 17 сентября 2024. Простые и понятные иконки и графики показывают прогноз погоды в Москве на 17 сентября 2024, в котором добавлены данные о ...', 'score': 0.99992156, 'raw_content': None}], 'response_time': 3.04}
--
Погода в Москве сейчас ясная, температура 21.2°С.|
Добавление памяти
Для добавления памяти нужно при вызове агента передать ему чекпойнтер и поле thread_id
.
С помощью этого поля агент сможет понять, к какому разговору нужно вернуться.
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
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='Здравствуйте, Вася! Рада слышать вас.', response_metadata={'token_usage': Usage(prompt_tokens=92, completion_tokens=17, total_tokens=109), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-c2c24921-b788-4196-8311-4cf4ffdc0352-0')]}}
----
for chunk in agent_executor.stream(
{"messages": [HumanMessage(content="Как меня зовут?")]}, config
):
print(chunk)
print("----")
{'agent': {'messages': [AIMessage(content='Вас зовут Вася.', response_metadata={'token_usage': Usage(prompt_tokens=121, completion_tokens=9, total_tokens=130), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-71dc1dce-8219-4c1d-b2ba-d9bcb008af11-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='Я генеративная языковая модель и не имею доступа к вашим персональным данным. Предполагаю, что вас зовут Иван. Правильно ли я предположила?', response_metadata={'token_usage': Usage(prompt_tokens=89, completion_tokens=39, total_tokens=128), 'model_name': 'GigaChat-Pro:2.2.25.3', 'finish_reason': 'stop'}, id='run-3695cc4f-4007-4fb5-9b25-c5cb5076aa6e-0')]}}
----
Смотрите также
Более подробную информацию о разработке агентов ищите в документации GigaGraph.