Создание агента с функциями на базе GigaChat
С помощью API нейросетевой модели GigaChat вы можете вызывать различные функции — инструменты, которые будет использовать модель для решения поставленной задачи. Модель самостоятельно решает, когда и какой инструмент нужно использовать. Вызванные функции выполняются на стороне клиента. Вы можете использовать функции как разработанные самостоятельно, так и доступные в GigaChain и сторонних библиотеках.
Для использования функций нужно создать агента с помощью модуля gigachat_functions_agent
.
Раздел содержит пример агента, который задает вопрос в поисковом сервисе DuckDuckGo и рисует ответ с помощью Ascii-графики. Итоговый агент не только умеет работать с разными инструментами, но и обладает памятью.
Агент с одной функцией
Для создания агента с функцией обращения к поисковому сервису DuckDuckGo:
- Инициализируйте GigaChat.
- Добавьте функцию поиска в массив инструментов доступных модели.
- Передайте агенту модель и массив инструментов.
Инициализация GigaChat
Для работы агента создайте экземпляр класса GigaChat. В классе укажите модель, поддерживающую работу с функциями:
from langchain.chat_models.gigachat import GigaChat
giga = GigaChat(credentials=<авторизационные_данные>, model=<модель_с_поддержкой_функций>)
Для авторизации запросов к GigaChat используйте данные, полученные при создании проекта GigaChat API.
Список и описание доступных моделей — в разделе Модели GigaChat.
Добавление функции поиска
Добавьте адаптер поискового сервиса DuckDuckGo в список инструментов, которые будет использовать модель.
Для этого импортируйте класс DuckDuckGoSearchRun
и добавьте функцию DuckDuckGoSearchRun()
в массив tools
:
from langchain_community.tools import DuckDuckGoSearchRun
search_tool = DuckDuckGoSearchRun()
tools = [search_tool]
Создание и запуск агента
Инициализируйте агента. Передайте ему модель, которая будет вызывать функции, и массив доступных ей инструментов tools
:
from langchain.agents import AgentExecutor, create_gigachat_functions_agent
agent = create_gigachat_functions_agent(giga, tools)
#AgentExecutor создает среду, в которой будет работать агент
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
)
Запустите агента с помощью функции invoke()
:
agent_executor.invoke(
{"input": "Найди текущий курс биткоина и напечатай только число"}
)["output"]
> Entering new AgentExecutor chain...
Invoking: `duckduckgo_search` with `{'query': 'курс биткоина'}`
Курс Биткоина (BTC): цена Bitcoin, индекс, новости — Investing.com Новинка! 💥 Приобретите ProPicks и узнайте стратегию, опередившую S&P 500 более чем на 1,183% Получить скидку 40% Биткоин... 48 306,99 $ 1.2% 1,0000 BTC 0.0% 47 623,87 $ Диапазон за 24 ч 48 487,28 $ Добавить в портфель • 1 453 248 added Конвертируйте Биткоин в US Dollar (BTC в USD) Сегодня цена конвертации 1 Биткоин (BTC) в USD равна $48 324,27. BTC USD 1 BTC = 48 306,99 $ Как купить BTC за USD Показать График BTC в USD Сегодня Биткоин (BTC) стоит $48 324,27. Price of BTC today The live price of Bitcoin is $ 45,464.14 per (BTC / USD) with a current market cap of $ 892.11B USD. 24-hour trading volume is $ 26.67B USD. BTC to USD price is updated in real-time. Bitcoin is +2.55% in the last 24 hours with a circulating supply of 19.62M. BTC Price History USD BTC Price Information 24h Low & High Курс криптовалют онлайн - Курс криптовалют к доллару на сегодня - Минфин Еще Курс криптовалют к доллару Курс Bitcoin, Ethereum, Litecoin и других криптовалют Обновлено 08.02.2024, 20:59 Все Название Цена Капитализация за час Bitcoin 1 BTC 45.289,00 $ 886.893.940.707,00 $ +0,61 % Ethereum 2 ETH 2.431,94 $ 292.024.231.852,00 $ +0,36 % HEX 3 HEX Биткоин резко подорожал / фото УНИАН. В среду курс биткоина, наиболее популярной криптовалюты в мире, перешел рубеж в 51 тыс долл. Такие данные приводит криптобиржа Coindesk.. Последний раз биткоин торговался на этом ...48 324,27
> Finished chain.
'48 324,27'
Агент с несколькими функциями
Для создания агента, который кроме поиска будет возвращать текст в виде Ascii-графики, вам потребуется библиотека pyfiglet. Вы можете установить ее с помощью команды:
pip install pyfiglet
Библиотека умеет работать только с латинскими символами и цифрами.
Пример работы pyfiglet:
import pyfiglet
pyfiglet.print_figlet("Hello!", font="epic")
_______ _ _ _______ _
|\ /|( ____ \( \ ( \ ( ___ )( )
| ) ( || ( \/| ( | ( | ( ) || |
| (___) || (__ | | | | | | | || |
| ___ || __) | | | | | | | || |
| ( ) || ( | | | | | | | |(_)
| ) ( || (____/\| (____/\| (____/\| (___) | _
|/ \|(_______/(_______/(_______/(_______)(_)
Использование нескольких функций
Чтобы упростить создание функций из python-кода, используйте декоратор @tool
.
Он преобразует любую функцию в инструмент, доступный модели для вызова.
Модель ориентируется как на название и описание функции, так и на описание и типы аргументов возвращаемого значения. Чтобы модель правильно понимала, как нужно использовать инструмент, все значения функции нужно явно указать.
Создайте функцию draw_banner()
, которая будет возвращать результат поиска в виде Ascii-графики, и добавьте ее в новый массив инструментов new_tools
:
from langchain.tools import tool
@tool
def draw_banner(number: str) -> str:
"""Рисует баннер с текстом результатов кода в виде Ascii-графики
Args:
number (str): Число, которое нужно нарисовать на баннере
"""
pyfiglet.print_figlet(number, font="epic")
return "Draw complete"
new_tools = [search_tool, draw_banner]
Инициализируйте и запустите агента с просьбой найти нужное значение и нарисовать его на баннере:
agent = create_gigachat_functions_agent(giga, new_tools)
agent_executor = AgentExecutor(
agent=agent,
tools=new_tools,
verbose=True,
)
agent_executor.invoke(
{"input": "Найди в интернете курс биткоина в долларах и нарисуй это число на банере."}
)["output"]
> Entering new AgentExecutor chain...
Invoking: `duckduckgo_search` with `{'query': 'курс биткоина в долларах'}`
Сегодня цена конвертации 1 Биткоин (BTC) в USD равна $48 324,27. BTC USD 1 BTC = 48 306,99 $ Как купить BTC за USD Показать График BTC в USD Сегодня Биткоин (BTC) стоит $48 324,27. Это на 0.5% увеличилась, чем час назад, и на 1.2% увеличилась, чем вчера. Стоимость BTC сегодня на 13.5% больше, чем 7 дней назад. 1 BTC = 47 384,89 USD по курсу на 10.02.2024. Стоимость 1 биткоина в долларах США на сегодня составляет 47 384,89 $ по данным ЦБ РФ, по сравнению со вчерашним днем курс валюты увеличился на 0,16% (на +73,73 $). Курс биткоина по отношению к доллару США на графике, таблица динамики стоимости в процентах за день, неделю, месяц и год. Конвертер валют Узнайте курс биткоина в долларах в разных банках и обменниках, а также динамику их изменений за месяц и год. Сравните курсы биткоина в долларах с другими валютами и посмотрите средние курсы в банках, Межбанке, НБУ, Visa и Mastercard. Обменный курс Bitcoin приведен по состоянию на 10 февраля 2024 г. от coinmarketcap.com. Обменный курс доллар Соединенных Штатов приведен по состоянию на 8 февраля 2024 г. от Международный Валютный Фонд. Переводной коэффициент BTC состоит из 15 знаков. Переводной коэффициент USD состоит из 6 знаков. BTC курс 10 февраля 2024 г. USD курс 1 BTC = 42,310.13 USD Курс: 42310.1333 +154.99 Курс закрытия: 42155.1393 Обратный курс: 1.00 USD = 0.000020 BTC 🕒 Курс валют обновлен: Sun, 28 Jan 2024 09:00:11 Доллар США: 🚀 валюта выросла на 0.37% (+154.99) по отношению к Биткоин в сравнении с предыдущим закрытым курсом. Попробуйте конвертировать в обратном порядке: Доллар США в Биткоин.
Invoking: `draw_banner` with `{'number': '48 324,27'}`
responded: Ваш запрос принят. Идет обработка...
___ _____ ______ _______ ___ _______ ______
/ ) / ___ \ / ___ \ / ___ ) / ) / ___ )/ ___ \
/ /) | ( (___) ) \/ \ \\/ ) | / /) | \/ ) |\/ ) )
/ (_) (_ \ / ___) / / )/ (_) (_ / ) / /
(____ _)/ ___ \ (___ ( _/ /(____ _) _/ / / /
) ( ( ( ) ) ) \ / _/ ) ( / _/ / /
| | ( (___) ) /\___/ /( (__/\ | | _ ( (__/\ / /
(_) \_____/ \______/ \_______/ (_)( )\_______/ \_/
|/
Draw complete- вот баннер с курсом биткоина в долларах.
> Finished chain.
'- вот баннер с курсом биткоина в долларах.'
Добавление памяти
В созданном агенте отсутствуют данные о состоянии, таким образом, он не помнит предыдущие взаимодействия с пользователем.
Чтобы агент помнил, о чем пользователь разговаривал с ним, передайте историю сообщений в переменной chat_history
:
from langchain_core.messages import AIMessage, HumanMessage
agent_executor = AgentExecutor(
agent=agent,
tools=new_tools,
verbose=False,
)
agent_executor.invoke(
{
"chat_history": [
HumanMessage(
content="Привет! Запомни трех животных - слон, жираф, крокодил"
),
AIMessage(content="Привет! Хорошо, я запомнил."),
],
"input": "Что я просил тебя запомнить?",
}
)
{'chat_history': [HumanMessage(content='Привет! Запомни трех животных - слон, жираф, крокодил'),
AIMessage(content='Привет! Хорошо, я запомнил.')],
'input': 'Что я просил тебя запомнить?',
'output': 'Вы просили меня запомнить трех животных: слон, жираф и крокодил.'}
Использование памяти в чате с агентом
Вы можете использовать память для сохранения истории и промежуточных результатов общения пользователя с агентом:
chat_history = []
while True:
user_input = input("Вы: ")
print(f"Пользователь: {user_input}")
if user_input == "":
break
result = agent_executor.invoke(
{
"chat_history": chat_history,
"input": user_input,
}
)
chat_history.append(HumanMessage(content=user_input))
chat_history.append(AIMessage(content=result["output"]))
print(f"Агент: {result['output']}")
User: Привет
Bot: Здравствуйте! Могу ли я помочь Вам с чем-то?
User: Найди возраст Илона Маска
Bot: Илон Маск родился 28 июня 1971 года, поэтому на текущий момент (2022 год) ему 50 лет.
User: Выведи его возраст на банер
_______ _______
( ____ \( __ )
| ( \/| ( ) |
| (____ | | / |
(_____ \ | (/ /) |
) )| / | |
/\____) )| (__) |
\______/ (_______)
Bot: Возраст Илона Маска - 50 лет.
User: