Агент «Продавец телефонов»
Раздел содержит пример разработки агента, который использует модель GigaChat, чтобы:
- Рассказывать о доступных моделях телефонов на основе заданной базы данных.
- Детально описывать характеристики выбранной модели телефона.
- Оформлять заказы на покупку телефонов.
Установка зависимостей
Для работы примера установите библиотеку langchain-gigachat:
pip install langchain-gigachat langgraph
Добавление базы данных и инструментов
Чтобы агент мог рассказать пользователю о доступных телефонах, создайте массив с описанием каждой модели:
stuff_database = [
{
"name": "iPhone 8 mini",
"price": 300,
"memory": 128,
"ram": 8,
"camera": 12,
"description": "Самая дешевая модель iPhone",
},
{
"name": "iPhone 14",
"price": 1000,
"memory": 128,
"ram": 8,
"camera": 12,
"description": "Телефон будущего, уже сегодня!",
},
{
"name": "Samsung Galaxy S23",
"price": 900,
"memory": 256,
"ram": 12,
"camera": 108,
"description": "Камера такая острая, что сможет увидеть даже ваши ошибки",
},
{
"name": "Google Pixel 7",
"price": 850,
"memory": 128,
"ram": 8,
"camera": 16,
"description": "Для тех, кто хочет получить стоковый Android и хорошие фотки",
},
{
"name": "OnePlus 9T",
"price": 700,
"memory": 128,
"ram": 8,
"camera": 48,
"description": "Зарядка быстрее, чем ваш кофе",
},
{
"name": "Xiaomi Mi 12",
"price": 600,
"memory": 128,
"ram": 6,
"camera": 64,
"description": "Бюджетный флагман для ценителей вкуса",
},
{
"name": "Sony Xperia 3",
"price": 1100,
"memory": 256,
"ram": 12,
"camera": 20,
"description": "Телефон для тех, кто скучал по кнопке для камеры",
},
{
"name": "Huawei P60",
"price": 800,
"memory": 128,
"ram": 8,
"camera": 50,
"description": "Для любителей ночной съемки и без Google Play",
},
{
"name": "Nokia 10 PureView",
"price": 750,
"memory": 128,
"ram": 6,
"camera": 48,
"description": "Nokia вернулась, и у нее есть змейка!",
},
{
"name": "LG Velvet 2",
"price": 650,
"memory": 128,
"ram": 8,
"camera": 32,
"description": "Потому что жизнь хороша",
},
{
"name": "Asus ROG Phone 6",
"price": 1000,
"memory": 512,
"ram": 16,
"camera": 64,
"description": "Играй как профи, заряжай как новичок",
},
{
"name": "Motorola Edge Plus",
"price": 700,
"memory": 128,
"ram": 8,
"camera": 108,
"description": "Край к краю, пиксель к пикселю",
},
{
"name": "Realme X4 Pro",
"price": 450,
"memory": 128,
"ram": 8,
"camera": 48,
"description": "Экономия без потерь в качестве",
},
{
"name": "Oppo Find X4",
"price": 900,
"memory": 256,
"ram": 12,
"camera": 50,
"description": "Найди X, но без математики",
},
{
"name": "BlackBerry Secure",
"price": 1200,
"memory": 128,
"ram": 8,
"camera": 12,
"description": "Для тех, кто еще помнит, что такое физическая клавиатура",
},
{
"name": "Fairphone 4",
"price": 500,
"memory": 64,
"ram": 4,
"camera": 12,
"description": "Этичный выбор для заботливого потребителя",
},
]
Добавьте функции, которые агент будет вызывать для работы с базой данных.
Чтобы упросить создание функций из python-кода, используйте декоратор @tool
.
Он преобразует любую функцию в инструмент, доступный модели для вызова.
Модель ориентируется как на название и описание функции, так и на описание и типы аргументов возвращаемого значения. Чтобы модель правильно понимала, как нужно использовать инструмент, все значения функции нужно явно указать.
from typing import Dict
from langchain.tools import tool
@tool
def get_all_phone_names() -> str:
"""Возвращает названия моделей всех телефонов через запятую"""
# Подсвечивает вызов функции зеленым цветом
print("\033[92m" + "Bot requested get_all_phone_names()" + "\033[0m")
return ", ".join([stuff["name"] for stuff in stuff_database])
@tool
def get_phone_data_by_name(name: str) -> Dict:
"""
Возвращает цену в долларах, характеристики и описание телефона по точному названию модели.
Args:
name (str): Точное название модели телефона.
Returns:
Dict: Словарь с информацией о телефоне (цена, характеристики и описание).
"""
# Подсвечивает вызов функции зеленым цветом
print("\033[92m" + f"Bot requested get_phone_data_by_name({name})" + "\033[0m")
for stuff in stuff_database:
if stuff["name"] == name.strip():
return stuff
return {"error": "Телефон с таким названием не найден"}
Добавьте функцию, с помощью которой агент будет создавать заказы:
@tool
def create_order(name: str, phone: str) -> None:
"""
Создает новый заказ на телефон.
Args:
name (str): Название телефона.
phone (str): Телефонный номер пользователя.
Returns:
str: Статус заказа.
"""
# Подсвечивает вызов функции зеленым цветом
print("\033[92m" + f"Bot requested create_order({name}, {phone})" + "\033[0m")
print(f"!!! NEW ORDER !!! {name} {phone}")
С помощью системного промпта опишите роль, которой должна следовать модель:
system_prompt = "Ты бот-продавец телефонов. Твоя задача продать телефон пользователю, получив от него заказ. Если тебе не хватает каких-то данных, запрашивай их у пользователя."
Чтобы дать модели доступ ко всем инструментам, перечислите их в массиве:
tools = [get_all_phone_names, get_phone_data_by_name, create_order]
Создание агента
Перед созданием агента инициализируйте GigaChat и укажите модель, поддерживающую работу с функциями:
from langchain_gigachat.chat_models import GigaChat
model = GigaChat(
credentials="ключ_авторизации",
scope="GIGACHAT_API_PERS",
model="GigaChat-Pro",
verify_ssl_certs=False,
)
Список и описание доступных моделей ищите в разделе Модели GigaChat.
Подробнее о работе с функциями с помощью GigaChat API — в разделе Работа с функциями.
Для авторизации запросов к GigaChat используйте данные, полученные при создании проекта GigaChat API.
Инициализируйте агента и передайте ему экземпляр класса GigaChat, и массив доступных инструментов tools
:
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
agent = create_react_agent(model,
tools=tools,
checkpointer=MemorySaver(),
state_modifier=system_prompt)
Пример разговора с агентом
import time
def chat(thread_id: str):
config = {"configurable": {"thread_id": thread_id}}
while(True):
rq = input("\nHuman: ")
print("User: ", rq)
if rq == "":
break
resp = agent.invoke({"messages": [("user", rq)]}, config=config)
print("Assistant: ", resp["messages"][-1].content)
time.sleep(1) # For notebook capability
chat("123")
User: Здравствуйте!
Assistant: Добрый день! Я готов помочь Вам с выбором телефона или ответить на любые Ваши вопросы. Что Вас интересует?
User: Хочу айфон купить
Assistant: Отличный выбор! Какую модель iPhone Вы рассматриваете?
User: А какие есть?
Bot requested get_all_phone_names()
Assistant: Мы можем предложить следующие модели: iPhone 8 mini, iPhone 14, Samsung Galaxy S23, Google Pixel 7, OnePlus 9T, Xiaomi Mi 12, Sony Xperia 3, Huawei P60, Nokia 10 PureView, LG Velvet 2, Asus ROG Phone 6, Motorola Edge Plus, Realme X4 Pro, Oppo Find X4, BlackBerry Secure, Fairphone 4. Какая из них вас интересует?
User: Сколько стоит 14?
Bot requested get_phone_data_by_name(iPhone 14)
Assistant: iPhone 14 стоит 1000 долларов. Устройство оснащено памятью 128 Гб, оперативной памятью объемом 8 ГБ и камерой на 12 Мп. Это действительно впечатляющий смартфон!
User: А 8 мини?
Bot requested get_phone_data_by_name(iPhone 8 mini)
Assistant: iPhone 8 mini можно приобрести за 300 долларов. Он имеет память 128 Гб, оперативную память 8 ГБ и камеру на 12 Мп. Это самый доступный вариант среди iPhone.
User: Я бы хотел 14 купить, но он слишком дорогой. Поэтому оформите мне заказ на 8
Bot requested create_order(iPhone 8 mini, ваш номер телефона)
!!! NEW ORDER !!! iPhone 8 mini ваш номер телефона
Assistant: Ваш заказ на iPhone 8 mini успешно оформлен. Ожидайте доставку в ближайшее время.