ym88659208ym87991671
Агент «Продавец телефонов» | Документация для разработчиков

Агент «Продавец телефонов»

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

Раздел содержит пример разработки агента, который использует модель GigaChat, чтобы:

  • Рассказывать о доступных моделях телефонов на основе заданной базы данных.
  • Детально описывать характеристики выбранной модели телефона.
  • Оформлять заказы на покупку телефонов.

Добавление базы данных и инструментов

Чтобы агент мог рассказать пользователю о доступных телефонах, создайте массив с описанием каждой модели:

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" + f"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:
return stuff

return {}

Добавьте функцию, с помощью которой агент будет создавать заказы:

@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 = "Ты бот-продавец телефонов. Твоя задача продать телефон пользователю, получив от него заказ. Если тебе не хватает каких-то данных, запрашивай их у пользователя."

Чтобы дать модели доступ ко всем инструментам, перечислите их в массиве:

tools = [
get_all_phone_names,
get_phone_data_by_name,
create_order
]

Создание агента

Перед созданием агента инициализируйте GigaChat и укажите модель, поддерживающую работу с функциями:

from langchain.chat_models.gigachat import GigaChat

giga = GigaChat(credentials="<авторизационные_данные>", model="<модель_с_поддержкой_функций>")

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

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

Инициализируйте агента и передайте ему экземпляр класса GigaChat, и массив доступных инструментов 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=False,
)

Сохранение контекста диалога

Чтобы агент помнил о чем пользователь разговаривал с ним, передайте историю сообщений в переменной chat_history.

Вы можете использовать память для сохранения истории и промежуточных результатов общения пользователя с агентом:

from langchain_core.messages import AIMessage, HumanMessage, SystemMessage

chat_history = [SystemMessage(content=system)]
while True:
user_input = input("Покупатель: ")
print(f"User: {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"Bot: {result['output']}")
    User: Какие у вас есть модели айфонов?
Bot requested get_all_phone_names()
Bot: У нас есть следующие модели айфонов: iPhone 8 mini, iPhone 14. Какие-то из них Вас интересуют?
User: Сколько стоит 14й?
Bot requested get_phone_data_by_name(iPhone 14)
Bot: iPhone 14 стоит 1000 долларов. Он имеет 128 ГБ памяти и 8 ГБ оперативной памяти. Основная камера имеет разрешение 12 мегапикселей. Описание: "Телефон будущего, уже сегодня!" Хотели бы Вы приобрести этот телефон?
User: Дорого. Тогда я хочу купить 8 mini
Bot requested get_phone_data_by_name(iPhone 8 mini)
Bot: iPhone 8 mini стоит 300 долларов. Он имеет 128 ГБ памяти и 8 ГБ оперативной памяти. Основная камера имеет разрешение 12 мегапикселей. Описание: "Самая дешевая модель iPhone". Хотели бы Вы приобрести этот телефон?
User: Да, оформи заказ
Bot requested get_phone_data_by_name(iPhone 8 mini)
Bot: Отлично! Для завершения заказа мне нужен Ваш номер телефона.
User: +79222232233
Bot requested create_order(iPhone 8 mini, +79222232233)
!!! NEW ORDER !!! iPhone 8 mini +79222232233
Bot: Ваш заказ на iPhone 8 mini успешно оформлен. Ваш номер телефона для связи: +79222232233.
User: Спасибо!
Bot: Пожалуйста! Если у Вас есть еще вопросы, задавайте.
User:
ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.