Создайте умного чат-бота для ваших SMS-разговоров в кратчайшие сроки с OpenAI GPT-3 и Fly.io

В предыдущей статье мы показали вам, как создать чат-бота для Twitter с помощью OpenAI GPT-3 и DALL-E 2.



В этом руководстве мы покажем вам, как создать чат-бота для обмена сообщениями (SMS) с использованием API OpenAI и Twilio. Мы также покажем вам, как бесплатно развернуть чат-бот с помощью Fly.io. К концу этого урока у вас будет чат-бот, который сможет отвечать на вопросы и разговаривать с вами по SMS.

Вот несколько примеров работы чат-бота:

Как видите, чат-бот умеет отвечать на вопросы и вести беседу с пользователем посредством SMS.

TLDR; Покажи мне код

В этом руководстве мы показали вам, как создать чат-бота для обмена сообщениями (SMS) с помощью OpenAI API и Twilio, а также как бесплатно развернуть чат-бота с помощью Fly.io. Код чат-бота вы можете найти в репозитории GitHub.

Что тебе понадобится

Чтобы следовать этому руководству, вам понадобится следующее:

  • Ключ API OpenAI. Вы можете подписаться на бесплатный ключ API здесь.
  • Учетная запись Twilio и номер телефона. Вы можете зарегистрировать бесплатную учетную запись Twilio здесь.
  • Аккаунт Fly.io. Вы можете зарегистрировать бесплатную учетную запись Fly.io здесь.

Настройка OpenAI и Twilio

Во-первых, вам нужно зарегистрировать учетную запись OpenAI и получить ключ API.

Затем вам нужно зарегистрировать учетную запись Twilio и приобрести номер телефона, который может отправлять и получать SMS-сообщения.

Когда у вас есть ключ API OpenAI, учетная запись Twilio и номер телефона, вы готовы приступить к созданию чат-бота.

Создание чат-бота

Мы будем использовать фреймворк FastAPI для создания чат-бота. FastAPI — это современная и быстрая веб-инфраструктура для создания API с помощью Python. Он прост в использовании и обеспечивает автоматическую проверку и документацию для ваших конечных точек API.

Создайте виртуальную среду с помощью python3 -m venv и установите пакеты:

  1. Убедитесь, что в вашей системе установлен Python 3.
  2. Перейдите в каталог проекта в терминале.
  3. Выполните следующую команду, чтобы создать виртуальную среду в каталоге venv:
python3 -m venv venv

4. Активируйте виртуальную среду:

source venv/bin/activate

5. Создайте файл requirements.txt в каталоге проекта с требуемыми именами пакетов, по одному в каждой строке. Например:

fastapi==0.88.0
uvicorn==0.20.0
openai==0.25.0
twilio==7.16.0
python-multipart==0.0.5
python-dotenv==0.21.0

6. Установите необходимые пакеты:

pip install -r requirements.txt

Затем создайте файл с именем .env в каталоге проекта. И добавьте переменные окружения и их значения в файл, используя формат VARNAME=value. Например:

OPENAI_API_KEY=your_api_key
TWILIO_AUTH_TOKEN=your_auth_token

Затем создайте файл с именем app.py и скопируйте в него следующий код:

import openai
import os
from dotenv import load_dotenv
from fastapi import FastAPI, Request, Response, Form, HTTPException
from twilio.twiml.messaging_response import MessagingResponse
from twilio.request_validator import RequestValidator
import logging

# Load environment variables from .env file
load_dotenv(".env")

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = FastAPI()
# Use the OpenAI API to generate a response to the message
openai.api_key = os.environ["OPENAI_API_KEY"]

# Use the RequestValidator to verify that the request came from Twilio
validator = RequestValidator(os.environ["TWILIO_AUTH_TOKEN"])


@app.post("/sms")
async def sms_webhook(request: Request, From: str = Form(...), Body: str = Form(...)):
    # Verify that the request came from Twilio
    form_ = await request.form()
    url = str(request.url).replace("http", "https")
    sig = request.headers.get("X-Twilio-Signature", "")

    if not validator.validate(
        url,
        form_,
        sig,
    ):
        logger.error("Error in Twilio Signature")
        raise HTTPException(
            status_code=403, detail="Error in Twilio Signature")

    # Get the incoming message and phone number from the request body
    message = Body
    phone_number = From

    logger.info(f"Message received from {phone_number}: {message}")

    # Send the message to the OpenAI API
    response_text = openai.Completion.create(
        engine="text-davinci-003",
        prompt=message,
        max_tokens=128,
        temperature=0.7,
    ).choices[0].text

    logger.info(f"OpenAI response: {response_text}")

    # Create a Twilio response object
    twiml_response = MessagingResponse()

    # Add the response text to the Twilio response
    twiml_response.message(response_text)

    # Return the Twilio response as the HTTP response
    return Response(content=str(twiml_response), media_type="application/xml")

Код импортирует необходимые библиотеки и определяет функцию sms_webhook, которая является конечной точкой API для чат-бота. Функция принимает объект запроса, а также поля формы From и Body. Поле From — это номер телефона отправителя, а поле Body — это тело сообщения.

Во-первых, код использует класс RequestValidator для проверки того, что запрос пришел из Twilio. Метод validate() экземпляра RequestValidator вызывается с URL-адресом запроса, данными формы и заголовком X-Twilio-Signature в качестве аргументов. Если проверка не пройдена, возникает исключение HTTPException. Этот код гарантирует, что чат-бот обрабатывает только запросы от Twilio, помогая предотвратить злоупотребления и спам.

Если запрос действителен, код получает входящее сообщение и номер телефона из тела запроса, а затем отправляет сообщение в API OpenAI с помощью метода openai.Completion.create(). Параметр engine указывает, какую модель OpenAI использовать, а параметр prompt — это сообщение для отправки модели. Параметр max_tokens указывает максимальное количество токенов (слов и знаков препинания), которые будут генерироваться в ответе, а параметр temperature управляет креативностью ответа.

API OpenAI возвращает список возможных ответов, и мы выбираем первый ответ в списке. Затем ответ регистрируется и отправляется обратно пользователю в виде SMS-сообщения Twilio с использованием класса twilio.twiml.messaging_response.MessagingResponse.

Наконец, функция возвращает HTTP-ответ с SMS-сообщением Twilio в качестве содержимого. На этом обработка чат-ботом входящего SMS-сообщения завершена.

Чтобы запустить приложение FastAPI локально, выполните следующую команду в виртуальной среде.

uvicorn app.main:app --host 0.0.0.0 --port 8124 --reload

Развертывание чат-бота с помощью Fly.io

Теперь, когда мы создали чат-бота, мы можем развернуть его в Интернете, чтобы он мог получать и отвечать на SMS-сообщения от кого угодно. Мы будем использовать Fly.io для бесплатного развертывания чат-бота.

Давайте создадим Dockerfile для контейнеризации приложения.

FROM python:3.9-slim
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
ENV LOG_LEVEL=INFO
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"]

Сначала зарегистрируйте учетную запись Fly.io и следуйте инструкциям по установке интерфейса командной строки Fly. Затем выполните следующие команды, чтобы создать новое приложение Fly и развернуть чат-бота:

# Create a new Fly app
fly launch

# Set secrets
fly secrets set --app my-sms-api \
TWILIO_AUTH_TOKEN=your_api_key \
OPENAI_API_KEY=your_openai_api_key

# Deploy the chatbot
fly deploy

Чат-бот будет развернут по уникальному URL-адресу, например https://my-chatbot.fly.dev.

Страница FastAPI Swagger

FastAPI автоматически создает страницу Swagger для вашего API в разделе https://my-chatbot.fly.dev/docs, которая предоставляет документацию и примеры для каждой конечной точки API.

Вот пример страницы Swagger для чат-бота:

Как видите, на странице Swagger представлено описание конечной точки /sms, а также примеры полезной нагрузки запроса и ответа.

Настройка веб-хука Twilio Messaging

Чтобы настроить веб-перехватчик Twilio для входящих сообщений, вам необходимо сделать следующее:

  1. В консоли Twilio перейдите на страницу конфигурации номера телефона и прокрутите вниз до раздела «Сообщения».
  2. В разделе «ВХОДЯЩЕЕ СООБЩЕНИЕ» введите URL-адрес конечной точки /sms вашего чат-бота в поле «Веб-перехватчик».
  3. Нажмите «Сохранить», чтобы сохранить конфигурацию.

Теперь, когда кто-то отправляет SMS-сообщение на ваш номер телефона Twilio, Twilio отправит запрос на конечную точку вашего чат-бота /sms с деталями сообщения. Затем чат-бот сгенерирует ответ с помощью OpenAI API и отправит его обратно пользователю через Twilio.

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

Заключение

Мы надеемся, что вам понравилось это руководство, и вы узнали, как создать и развернуть чат-бот для обмена сообщениями с помощью OpenAI и Twilio. Если у вас есть какие-либо вопросы или отзывы, сообщите нам об этом в комментариях ниже.

Спасибо за прочтение! Подпишитесь на нас, чтобы не пропустить другие статьи о программировании, машинном обучении и науке о данных.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу