На этой лекции мы реализуем две функции:
  • 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. Наслаждайтесь вашим ботом

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