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

Создание агента с функциями на базе GigaChat

Обновлено 24 мая 2024

С помощью API нейросетевой модели GigaChat вы можете вызывать различные функции — инструменты, которые будет использовать модель для решения поставленной задачи. Модель самостоятельно решает, когда и какой инструмент нужно использовать. Вызванные функции выполняются на стороне клиента. Вы можете использовать функции как разработанные самостоятельно, так и доступные в GigaChain и сторонних библиотеках.

Для использования функций нужно создать агента с помощью модуля gigachat_functions_agent.

Раздел содержит пример агента, который задает вопрос в поисковом сервисе DuckDuckGo и рисует ответ с помощью Ascii-графики. Итоговый агент не только умеет работать с разными инструментами, но и обладает памятью.

Агент с одной функцией

Для создания агента с функцией обращения к поисковому сервису DuckDuckGo:

  1. Инициализируйте GigaChat.
  2. Добавьте функцию поиска в массив инструментов доступных модели.
  3. Передайте агенту модель и массив инструментов.

Инициализация 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:
ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.