Создайте умного чат-бота для ваших 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 и установите пакеты:
- Убедитесь, что в вашей системе установлен Python 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 для входящих сообщений, вам необходимо сделать следующее:
- В консоли Twilio перейдите на страницу конфигурации номера телефона и прокрутите вниз до раздела «Сообщения».
- В разделе «ВХОДЯЩЕЕ СООБЩЕНИЕ» введите URL-адрес конечной точки
/smsвашего чат-бота в поле «Веб-перехватчик». - Нажмите «Сохранить», чтобы сохранить конфигурацию.

Теперь, когда кто-то отправляет SMS-сообщение на ваш номер телефона Twilio, Twilio отправит запрос на конечную точку вашего чат-бота /sms с деталями сообщения. Затем чат-бот сгенерирует ответ с помощью OpenAI API и отправит его обратно пользователю через Twilio.
Вы также можете настроить дополнительные веб-перехватчики для других событий, таких как получение звонка или изменение статуса доставки сообщения. Дополнительные сведения см. в Документации Twilio.
Заключение
Мы надеемся, что вам понравилось это руководство, и вы узнали, как создать и развернуть чат-бот для обмена сообщениями с помощью OpenAI и Twilio. Если у вас есть какие-либо вопросы или отзывы, сообщите нам об этом в комментариях ниже.
Спасибо за прочтение! Подпишитесь на нас, чтобы не пропустить другие статьи о программировании, машинном обучении и науке о данных.
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в публикации Level Up Coding
- 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"
🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу