Создание агента с функциями на базе GigaChat
С помощью API нейросетевой модели GigaChat вы можете вызывать различные функции — инструменты, которые будет использовать модель для решения поставленной задачи. Модель самостоятельно решает, когда и какой инструмент нужно использовать. Вызванные функции выполняются на стороне клиента. Вы можете использовать функции как разработанные самостоятельно, так и доступные в GigaChain и сторонних библиотеках.
Для использования функций нужно создать агента с помощью модуля gigachat_functions_agent
.
Раздел содержит пример агента, который задает вопрос в поисковом сервисе DuckDuckGo и рисует ответ с помощью Ascii-графики. Итоговый агент не только умеет работать с разными инструментами, но и обладает памятью.
Агент с одной функцией
Для создания агента с функцией обращения к поисковому сервису DuckDuckGo:
- Инициализируйте GigaChat.
- Добавьте функцию поиска в массив инструментов доступных модели.
- Передайте агенту модель и массив инструментов.
Инициализация 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: