На цій лекції ми реалізуємо дві функції:
  • 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. Ім'я дівчини?
  2. Скільки їй років?
  3. Оцініть її зовнішність: 1-10 балів?
  4. Ким вона працює?
  5. Мета знайомства?
І під час отримання відповіді на кожне нове запитання не забудьте збільшувати лічильник відповідей: Далі вам потрібно об'єднати відповіді в один рядок за допомогою функції 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. Насолоджуйтеся вашим ботом

Ви реалізували крутий бот зі штучним інтелектом — ви маєте пишатися собою!