Использование Courier и GPT2 для создания мотивационной цитаты дня

Использование Courier и GPT2 для создания мотивационной цитаты дня

14 февраля 2023 г.

Мотивационные цитаты были в моде в те времена, когда MMS & переадресация электронной почты была популярна. Я помню, как мои родители перенаправляли меня в начале каждого утра. Перенесемся к сегодняшнему дню, если вам повезет, вы являетесь частью какой-либо группы переадресации в выбранном вами приложении для обмена сообщениями (Whatsapp, Telegram и т. д.).

Вдохновленные той же идеей, сегодня мы собираемся создать сервис, который отправляет нашим друзьям и родственникам мотивационную цитату дня, созданную искусственным интеллектом. Вместо того, чтобы жестко программировать список мотивационных цитат, мы собираемся использовать модель машинного обучения для создания цитаты по запросу, чтобы у нас никогда не заканчивались цитаты, которыми можно поделиться!

Инструкции

Часть 1. Использование ИИ для создания мотивационных цитат

OpenGPT2 и языковые модели

Модель OpenAI GPT-2 была предложена Алеком Рэдфордом, Джеффри Ву, Ревоном Чайлдом, Дэвидом Луаном, Дарио Амодеем и Ильей Суцкевером в книге «Языковые модели для многозадачных учащихся без присмотра». Это преобразователь причинно-следственных связей, предварительно обученный с помощью языкового моделирования на очень большом массиве текстовых данных объемом около 40 ГБ.

Для упрощения в OpenAI GPT2 высокого уровня используется большая языковая модель, обученная на огромных объемах данных. Эту модель можно использовать для прогнозирования следующего токена в заданной последовательности.

Если это звучит слишком сложно, не волнуйтесь, вам не нужно знать машинное обучение или искусственный интеллект, чтобы следовать этому проекту. Такие библиотеки, как Hugging Face, упрощают использование этой модели в нашем приложении.

Обнимает лицо

Мы будем использовать библиотеку Hugging Face для загрузки и обслуживания модели машинного обучения, которая будет генерировать котировки для нас. Hugging Face позволяет очень легко использовать модели-трансформеры (типом которых является GPT2) в наших проектах без каких-либо знаний об машинном обучении или искусственном интеллекте. Как упоминалось ранее, GPT2 — это языковая модель общего назначения, что означает, что она хорошо предсказывает общий текст по входной последовательности. В нашем случае нам нужна модель, более подходящая для генерации котировок. Для этого у нас есть два варианта:

  1. Мы можем точно настроить модель GPT2, используя собственный текст, для которого нам понадобится хороший набор данных цитат.
  2. Или мы можем найти уже существующую модель, в которую были добавлены некоторые кавычки.

К счастью, в нашем случае есть точно настроенная модель, обученная на наборе данных из 500 000 котировок — https:/ /huggingface.co/nandinib1999/quote-generator

С Hugging Face использовать эту модель так же просто, как создать токенизатор

from transformers import AutoTokenizer, AutoModelWithLMHead, pipeline

tokenizer = AutoTokenizer.from_pretrained("nandinib1999/quote-generator")

затем построение модели из предварительно обученной модели

model = AutoModelWithLMHead.from_pretrained("nandinib1999/quote-generator")

и, наконец, создание генератора, который мы можем использовать для генерации котировки n

generator = pipeline("text-generation", model=model, tokenizer=tokenizer)

# use a starting prompt
generator("Keep an open mind and")
[{'generated_text': 'Keep an open mind and a deep love for others'}]

Создание API для обслуживания модели

Теперь, когда у нас есть способ генерировать котировки, нам нужно подумать о том, как мы можем использовать это в нашем приложении. Есть несколько способов сделать это.

  1. Загружайте модель каждый раз, когда мы хотим запустить скрипт для отправки скрипта.
  2. Создайте API или службу, которая обслуживает эту модель GPT2, чтобы генерировать для нас котировки по запросу.

Ключевой плюс второго варианта заключается в том, что после загрузки модели API может быстро ответить нам и может использоваться в других приложениях. FWIW, первый вариант также является полностью допустимым подходом.

Мы можем использовать __Fast API__для создания API быстрого обслуживания. Вот как это выглядит n

# in file api.py

from pydantic import BaseModel
from fastapi import FastAPI, HTTPException
from transformers import AutoTokenizer, AutoModelWithLMHead, pipeline

## create the pipeline
tokenizer = AutoTokenizer.from_pretrained("nandinib1999/quote-generator")
model = AutoModelWithLMHead.from_pretrained("nandinib1999/quote-generator")
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)

app = FastAPI()

class QuoteRequest(BaseModel):
    text: str

class QuoteResponse(BaseModel):
    text: str

### Serves the Model API to generate quote
@app.post("/generate", response_model=QuoteResponse)
async def generate(request: QuoteRequest):
    resp = generator(request.text)
    if not resp[0] and not resp[0]["generated_text"]:
        raise HTTPException(status_code=500, detail='Error in generation')
    return QuoteResponse(text=resp[0]["generated_text"])

$ uvicorn api:app

INFO:     Started server process [40767]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

n Теперь мы можем начать отправлять запросы на конечную точку /generate, которая будет генерировать для нас предложение.

Часть 2. Создание генератора котировок

Теперь, когда у нас есть способ генерировать предложения по запросу, мы можем остановиться на этом и начать работу по отправке через курьерскую службу< /сильный>. Но кого мы обманываем, никто больше не читает текст! Мы можем сделать это интересным, используя красивое изображение и поместив на него нашу цитату, чтобы оно выглядело как постер.

Создать цитату

С учетом нашего API мы теперь можем сделать следующее, чтобы сгенерировать предложение n

from random import choice
# feel free to add more starting prompts for more variety
canned_seeds = ["Always remember to", "Start today with", "It is okay to"]
seed = choice(canned_seeds)
resp = requests.post('http://127.0.0.1:8000/generate', data=json.dumps({"text": seed}))
return resp.json()["text"]

Загрузка фонового изображения

Первой задачей является получение красивого фонового изображения для нашей цитаты. Для этого мы будем использовать Unsplash API, который предоставляет удобную конечную точку для возврата случайного изображения, соответствующего запросу. Открытие https://source.unsplash.com/random/800×800/?nature< /a> в нашем браузере возвращает красивое изображение природы.

Чтобы было интересно, мы можем использовать различные условия запроса, такие как звездочки и т. д. Вот как выглядит код для загрузки нашего фонового изображения — n

Создание изображения с цитатой

Хорошо, теперь у нас есть фоновое изображение и цитата, что означает, что мы можем работать над сборкой окончательного изображения, которое будет отправлено получателям. На высоком уровне мы хотим разместить текст на изображении, но даже эта простая задача может оказаться сложной. Для начала нам нужно ответить на ряд вопросов

  1. Как текст будет размещен на изображении?
  2. Как насчет переноса текста?
  3. Какого цвета должен быть текст, чтобы он был виден на фоновом изображении?
  4. Как это сделать для изображений разной ширины и высоты?

Ответы на некоторые из этих вопросов сложнее, чем на другие. Для простоты мы поместим текст в центр и немного обмотаем его, чтобы он выглядел хорошо. Наконец, сейчас мы будем использовать светлый цвет текста. Для всех манипуляций с изображениями мы будем использовать библиотеку изображений Python (PIL), чтобы упростить нам задачу. п

Это генерирует окончательное изображение с именем result.jpg

.

Загрузка изображения

Для предпоследнего шага нам нужно загрузить изображение, чтобы мы могли использовать его с Courier. В данном случае я использую Firebase Storage, но вы можете использовать все, что захотите.

import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage

cred = credentials.Certificate('serviceaccount.json')
firebase_admin.initialize_app(cred, {...})

bucket = storage.bucket()
blob = bucket.blob(filename)
blob.upload_from_filename(filename)
blob.make_public()
return blob.public_url

Шаг 3. Интеграция с Courier

Наконец-то у нас есть все необходимое, чтобы начать отправлять наши замечательные цитаты нашим друзьям и семье. Мы можем использовать Courier для создания красивого шаблона электронной почты.

Начните с создания учетной записи.

Создание шаблона в Courier

Отправка сообщения

Отправить сообщение с помощью Courier очень просто. Хотя у Courier есть собственные SDK, упрощающие интеграцию, я предпочитаю использовать его конечную точку API, чтобы все было просто. Имея на руках мои AUTH_TOKEN и TEMPLATE_ID, мы можем использовать следующий фрагмент кода для отправки нашего изображения

import requests

headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer {}".format(os.environ['COURIER_AUTH_TOKEN'])
}
message={
    "to": { "email": os.environ["COURIER_RECIPIENT"] },
    "data": {
        "date": datetime.today().strftime("%B %d, %Y"),
        "img": image_url ## this is image url we generated earlier
    },
    "routing": {
        "method": "single",
        "channels": [
            "email"
        ]
    },
    "template": os.environ["COURIER_TEMPLATE"]
}
requests.post("https://api.courier.com/send", json={"message": message}, headers=headers)

Ключ API можно найти в Настройки, а идентификатор шаблона — в < a href="https://app.courier.com/designer">настройки дизайна шаблона. И все!

Выводы

В этом руководстве показано, как легко начать работу с машинным обучением и amp; Курьер.

Если вы хотите продолжить и улучшить этот проект, вот несколько интересных идей, которые вы можете попробовать

  • Улучшенное фоновое изображение: использовать термин из сгенерированной цитаты для поиска изображения?
  • Улучшенный цвет фона для текста. Используйте более подходящие цвета для текста. Одна классная идея — использовать дополнительный цвет из основного цвета изображения. Вы можете использовать кластеризацию k-средних, чтобы выяснить это.
  • Добавление дополнительных каналов : распространяется на сообщения в мессенджерах и смс!

Об авторе

Пракхар — старший инженер-программист в Google, где он занимается созданием инструментов для разработчиков. Он увлеченный разработчик с открытым исходным кодом и любит играть на гитаре в свободное время.

Быстрые ссылки

🔗 Курьерские документы

🔗 Обнимающее лицо

🔗 Быстрый API

🔗 Unsplash API


Оригинал