На этой лекции мы реализуем две функции:
  • profile – позволяет генерировать профиль для своего тиндера
  • opener – генерация первого сообщения незнакомому человеку

Шаг 1. Генерация Tinder-профиля

По аналогии с режимом gpt, вам нужно создать 2 функции:
  • profile() – для обработки команды profile
  • profile_dialog() – для обработки сообщений пользователя
Список того, на что стоит обратить внимание:
  1. Режим работы называется “profile”.
  2. Добавить боту хэндлер для команды profile.
  3. Добавить вызов функции profile_dialog в функцию hello.

Шаг 2. Сбор информации о пользователе

Для сбора информации о пользователе нам понадобится отдельный объект – назовем его user и разместим внутри нашего объекта диалог.
dialog = Dialog()
dialog.mode = “main”
dialog.list = []
dialog.user = {}

Шаг 3. Задаем вопросы

Давайте начнем с вопроса «Сколько вам лет?». Хороший и уместный вопрос. Предлагаю задать его в конце функции profile:
async def profile(update, context):
    dialog.mode = "profile"
    …
    await send_text(update, context, "Сколько вам лет?")
А ответ на этот вопрос сохраним в объект user в функции profile_dialog:
async def profile_dialog(update, context):
    text = update.message.text
    dialog.user["age"] = text
Второй вопрос нужно задать сразу после ответа на первый:
async def profile_dialog(update, context):
    text = update.message.text
    dialog.user["age"] = text
    await send_text(update, context, "Кем вы работаете?")

Шаг 4. Обработка большого количества вопросов

А вот ответ на второй вопрос придет снова в функцию profile_dialog. Чтобы она корректно работала, нам нужно ввести счетчик вопросов: так она будет знать, на какой по счету вопрос пришел ответ. Давайте в наш объект dialog добавим еще атрибут count.
dialog = Dialog()
dialog.mode = “main”
dialog.list = []
dialog.user = {}
dialog.count = 0
Ну и заодно в метод profile() добавим очистку объекта user и обнуление счетчика вопросов:
async def profile(update, context):
    dialog.mode = "profile"
    text = load_message("profile")
    await send_photo(update, context, "profile")
    await send_text(update, context, text)

    dialog.user.clear()
    dialog.count = 0
    await send_text(update, context, "Сколько вам лет?")
Шаг 5. Задаем 5 вопросов Сколько вопросов нужно задать? 3 слишком мало, 10 – пользователю будет скучно отвечать. Предлагаю задать 5 вопросов:
  • Сколько вам лет?
  • Кем вы работаете?
  • Какое у вас хобби?
  • Что вам не нравится в людях?
  • Цель знакомства?
И при получении ответа на каждый новый вопрос нужно увеличивать счетчик ответов:
text = update.message.text
dialog.count += 1

if dialog.count == 1:
    dialog.user["age"] = text
    await send_text(update, context, "Кем вы работаете?")
elif dialog.count == 2:
    dialog.user["occupation"] = text
    await send_text(update, context, "У вас есть хобби?")
elif dialog.count == 3:
    dialog.user["hobby"] = text
    await send_text(update, context, "Что вам НЕ нравится в людях?")
elif dialog.count == 4:
    dialog.user["annoys"] = text
    await send_text(update, context, "Цель знакомства?")
elif dialog.count == 5:
    dialog.user["goals"] = text

Шаг 6. Отправляем запрос ChatGPT

Мы узнали информацию о пользователе нашего чат-бота, теперь нам нужно:
  • объединить ее в одну строку
  • отправить ее ChatGPT
  • ответ ChatGPT переслать пользователю
Для того, чтобы получить информацию о пользователе в одну строку можно воспользоваться функцией dialog.user.clear() dialog_user_info_to_str(). Эту функцию написал я сам – чтобы ее не пришлось писать вам. Код ее очень простой: если вам интересно, зайдите в файл util.py и посмотрите. Вот как будет выглядеть наш код по генерации профиля пользователя:
async def profile_dialog(update, context):
    ...
    prompt = load_prompt("profile")
    user_info = dialog_user_info_to_str(dialog.user)
    answer = await chatgpt.send_question(prompt, user_info)
    await send_text(update, context, answer)
Что вам нужно сделать:
  • вызвать этот код после того, как пользователь ответил на 5 вопросов
  • добавить поддержку долгих ответов от ChatGPT: используйте edit_text()

Шаг 7. Генерация сообщения для знакомства

По аналогии с режимом gpt вам нужно создать 2 функции:
  • opener() – для обработки команды profile
  • opener_dialog() – для обработки сообщений пользователя
Список того, на что обратить внимание:
  1. Режим работы называется “opener”.
  2. Добавить боту хэндлер для команды opener.
  3. Добавить вызов функции opener_dialog в функцию hello.

Шаг 8. Задаем 5 вопросов

Чтобы написать хорошее первое сообщение, нужно что-то знать о вашей девушке (или парне). Давайте также зададим 5 вопросов. Только других:
  • Имя девушки?
  • Сколько ей лет?
  • Оцените ее внешность: 1-10 баллов?
  • Кем она работает?
  • Цель знакомства?
И при получении ответа на каждый новый вопрос не забудьте увеличивать счетчик ответов: Дальше вам нужно объединить ответы в одну строку с помощью функции dialog_user_info_to_str() и отправить их ChatGPT вместе с соответствующим промптом:
async def opener_dialog(update, context):
    ...
    prompt = load_prompt("opener")
    user_info = dialog_user_info_to_str(dialog.user)
    answer = await chatgpt.send_question(prompt, user_info)
    await send_text(update, context, answer)

Шаг 9. Наслаждайтесь вашим ботом

Вы реализовали крутой бот с искусственным интеллектом – вы должны гордиться собой!