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

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

Обновлено 30 сентября 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="<модель_с_поддержкой_функций>", verify_ssl_certs=False)

Список и описание доступных моделей — в разделе Модели GigaChat.

Подробнее о работе с функциями с помощью GigaChat API — в разделе Работа с функциями.

Для авторизации запросов к GigaChat используйте данные, полученные при создании проекта GigaChat API.

Добавление функции поиска

Добавьте адаптер поискового сервиса 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"]
'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) -> None:
"""Рисует баннер с текстом результатов кода в виде Ascii-графики

Args:
number (str): Число, которое нужно нарисовать на баннере
"""
pyfiglet.print_figlet(number, font="epic")

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"]
   ___    _____     ______   _______    ___     _______  ______  
/ ) / ___ \ / ___ \ / ___ ) / ) / ___ )/ ___ \
/ /) | ( (___) ) \/ \ \\/ ) | / /) | \/ ) |\/ ) )
/ (_) (_ \ / ___) / / )/ (_) (_ / ) / /
(____ _)/ ___ \ (___ ( _/ /(____ _) _/ / / /
) ( ( ( ) ) ) \ / _/ ) ( / _/ / /
| | ( (___) ) /\___/ /( (__/\ | | _ ( (__/\ / /
(_) \_____/ \______/ \_______/ (_)( )\_______/ \_/
|/

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

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

Чтобы агент помнил, о чем пользователь разговаривал с ним, передайте историю сообщений в переменной 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 в настройках своего браузера.