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

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

Обновлено 24 апреля 2024

С помощью нейросетевой модели 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"]

Агент с несколькими функциями

Для создания агента, который кроме поиска будет возвращать текст в виде 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 = []
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']}")

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

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