Как создать чат-бота с поддержкой искусственного интеллекта¶
Искусственный интеллект (ИИ) в последнее время набирает обороты, а ChatGPT произвел революцию в интернете благодаря функции завершения чата.
С его помощью можно сделать многое: составить электронное письмо или другой документ, ответить на вопросы о наборе документов, создать разговорные агенты, придать вашему программному обеспечению интерфейс на естественном языке, обучать различным предметам, переводить языки и так далее.
В этой статье мы расскажем об основах создания чат-приложения с использованием функции chat completion, чтобы каждый программист мог легко с ней справиться. Это не так сложно, как кажется. Вы убедитесь в этом, следуя данному руководству.
Вы узнаете следующее
- Как создать приложение для чата с помощью CLI, используя только Node.js.
- Как создать приложение для чата, используя только React.
- Как объединить React и Node.js для создания лучшего программного обеспечения чата AI.
Этот учебник будет основан на модели gpt-3.5-turbo
.
Предварительные условия¶
Этот учебник требует базовых знаний JavaScript, CSS, React и Node.js.
Вам также понадобится учетная запись на платформе OpenAI, где размещен chatGPT. Он бесплатный, поэтому вы можете создать его здесь.
Как создать приложение ИИ чата с помощью CLI на Node.js¶
Этот раздел будет посвящен созданию чат-приложения, которое будет работать только в терминале с помощью Node.js.
Начните с создания каталога для проекта:
1 |
|
Перейдите в папку:
1 |
|
Инициализируйте проект:
1 |
|
В результате будет создан файл package.json
для отслеживания деталей проекта
Добавьте в файл следующую строку кода:
1 |
|
Это позволит вам использовать оператор импорта модуля ES6.
Установите OpenAI с помощью приведенной ниже команды:
1 |
|
Создайте файл, в котором будет находиться весь код. Назовите его index.js
:
1 |
|
Импортируйте Configuration
и OpenAIApi
из модуля OpenAI и readline
из модуля readline:
1 2 |
|
Создайте конфигурацию OpenAI следующим образом:
1 2 3 4 5 |
|
Этот код создает новый экземпляр объекта Configuration
. Внутри него вы введете значения для ваших организации
и apiKey
. Подробности о вашей организации вы можете найти в settings, а информацию о вашем apiKey - в API keys. Если у вас нет существующего API Key, вы можете создать его.
Введите следующий код после конфигурации, чтобы создать новый экземпляр API OpenAI:
1 |
|
Вы будете использовать ее на протяжении всего проекта.
Введите приведенный ниже код для проверки функции createChatCompletion
:
1 2 3 4 5 6 7 8 9 10 11 |
|
Этот код вызывает функцию createChatCompletion
, которая запускает конечную точку (https://api.openai.com/v1/chat/completions
). Функция принимает объект аргументов (модель
используемого chatGPT и массив сообщений
между пользователем и ИИ. Мы рассмотрим, как использовать массив сообщений
для ведения истории чата и улучшения приложения в следующем разделе).
Каждое сообщение - это объект, содержащий роль
(то есть, кто отправил сообщение. Значение может быть помощник
, если сообщение исходит от ИИ, или пользователь
, если сообщение исходит от человека) и содержание
(отправленная информация).
Наконец, код печатает ответ (res.data.choices[0].message.content
) от ИИ. Запустите файл в терминале с помощью этой команды:
1 |
|
Это позволит получить ответ от искусственного интеллекта через несколько секунд.
И это все, что нужно для создания чат-бота!
Но было бы полезно сделать приложение более интерактивным, запрашивая ввод от пользователя вместо жесткого кодирования содержания сообщения в коде. В этом нам поможет модуль readline.
Чтобы сделать его интерактивным, удалите последний введенный код и добавьте следующий:
1 2 3 4 |
|
Этот код создает пользовательский интерфейс в терминале, который позволяет пользователям вводить свои вопросы.
Затем предложите пользователю ввести сообщение, используя приведенный ниже код:
1 |
|
Наконец, введите следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
В приведенном выше коде,
- Когда пользователь что-то набирает и нажимает
Enter
, приведенный выше код запускает функцию обратного вызова. - Она передает все, что было набрано пользователем в качестве
ввода
. - Теперь
input
используется в качествеcontent
. - После отображения ответа ИИ пользователю предлагается ввести другое сообщение в блоке
then
.
Смотрите весь код на GitHub.
Запустите файл и пообщайтесь с ИИ. Это будет выглядеть так, как показано на рисунке ниже:
Отлично! Это интерактивный чат CLI.
Это полезно нескольким людям (например, инженерам), но при этом имеет хорошую безопасность, поскольку находится на стороне сервера.
Но как насчет других людей, которые могут не понимать, как использовать CLI-приложение? Им нужно что-то более простое в использовании с лучшим пользовательским интерфейсом (UI) и удобством использования (UX). Следующий раздел будет посвящен созданию такого приложения с помощью React.
Как создать приложение для чата с помощью React¶
Цель этого раздела - помочь разработчикам фронтенда освоить API ChatGPT для создания приложения чата и создать лучший пользовательский интерфейс, чтобы пользователи получали лучший опыт. Полученные здесь знания вы можете применить к другим фронтенд-фреймворкам или библиотекам.
Первое, что нужно сделать, это настроить базовый котел React. Для этого я буду использовать Vite. Вы можете использовать Vite для создания любого современного фронтенд-проекта на JavaScript. Используйте команду ниже:
1 |
|
Эта команда предложит вам создать имя и папку для вашего проекта и выбрать фреймворк или библиотеку (в этом учебнике используется React). После этого вы перейдете в папку и выполните следующую команду:
1 2 |
|
Эти команды установят необходимые зависимости и запустят локальный сервер на порту 5173
.
Далее, установите OpenAI с помощью команды ниже:
1 |
|
Этот модуль предоставляет доступ ко всему, что нам нужно для создания приложения чата.
Теперь мы готовы приступить к написанию кода!
Перейдите в файл src/App.jsx
и удалите все его содержимое. Затем добавьте следующие утверждения импорта:
1 2 |
|
Код выше импортирует Configuration
для установки значений конфигурации и OpenAIApi
для предоставления нам доступа к функциям завершения чата.
После этого создайте конфигурацию следующим образом:
1 2 3 4 5 |
|
Этот код создает новый экземпляр объекта Configuration
. Внутри него вы вводите значения для ваших организации
и apiKey
. Подробности о вашей организации вы можете найти в settings, а информацию о вашем apiKey - в API keys. Если у вас нет существующего API Key, вы можете создать его.
Введите следующий код после конфигурации, чтобы создать новый экземпляр API OpenAI:
1 |
|
Мы будем использовать его на протяжении всего проекта.
Создайте и экспортируйте функцию по умолчанию:
1 2 3 4 5 6 7 8 9 |
|
В этой функции будет находиться остальная часть кода.
Установите следующие состояния перед оператором return
:
1 2 3 |
|
- В массиве
message
будет храниться информация, отправленная из приложения в ИИ. - Массив
chats
будет отслеживать все сообщения, отправленные обеими сторонами (пользователем и ИИ). - Переменная
isTyping
будет уведомлять пользователя о том, набирает ли бот текст или нет.
Введите следующие строки кода под тегом h1
1 2 3 4 5 |
|
Приведенный выше код будет отображать Typing
всякий раз, когда пользователь ожидает ответа от ИИ.
Создайте форму, в которой пользователь может ввести сообщение, добавив приведенный ниже код в элемент main
:
1 2 3 4 5 6 7 8 9 |
|
Этот код создает форму с одним входом. Каждый раз, когда форма отправляется нажатием клавиши Enter
, запускается функция chat
.
Функция чата принимает два (2) аргумента (e
и message
) следующим образом:
1 2 3 |
|
Введите в функцию следующие строки:
1 2 3 4 |
|
Приведенный выше код предотвращает перезагрузку веб-страницы form
, проверяет, было ли сообщение набрано перед отправкой, и устанавливает isTyping
в true
, чтобы указать, что приложение начало работать над введенными данными.
ChatGPT имеет формат, в котором должны быть сообщения. Он принимает следующий шаблон:
1 |
|
Каждое сообщение (содержание
) должно показывать, кто его отправил. Роль - помощник
, если чат от ИИ, но пользователь
, если от человека. Поэтому, прежде чем отправить сообщение, убедитесь, что оно правильно оформлено и добавьте его в массив (chats
) следующим образом:
1 2 3 4 5 |
|
Последняя строка выше очищает вход, чтобы пользователь мог набрать еще одну заметку.
Теперь мы вызовем конечную точку createChatCompletion
, вызвав функцию createChatCompletion
с помощью кода ниже:
1 2 3 4 5 6 7 8 9 10 11 |
|
Функция createChatCompletion
принимает как минимум два (2) аргумента (модель
и сообщения
):
- Модель определяет используемую версию chatGPT.
- Сообщения - это список всех сообщений между пользователем и ИИ на данный момент и системное сообщение, которое дает ИИ представление о том, какую помощь он может оказать.
1 2 3 4 |
|
Вы можете изменить содержание так, как вам удобно.
Сообщения" не обязательно должны содержать более одного объекта в массиве. Это может быть просто одно сообщение. Но когда это массив, это обеспечивает историю сообщений, на которую ИИ может опираться, чтобы давать лучшие ответы в будущем, и это заставляет пользователя набирать меньше текста, так как нет необходимости постоянно быть слишком описательным.
Функция createChatCompletion
возвращает промис. Поэтому используйте блок then...catch...
, чтобы получить ответ.
1 2 3 4 5 6 7 8 |
|
Этот код добавляет сообщение, полученное от ИИ, в массив chats
и устанавливает isTyping
в false, указывая на то, что ИИ закончил отвечать.
Теперь вы должны получать обратную связь (Typing
) каждый раз, когда вы отправляете сообщение:
Пришло время отобразить историю чата, чтобы пользователь мог ее увидеть.
Введите следующий код прямо под тегом h1
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Приведенный выше код перебирает chats
и показывает их пользователю один за другим. Он выводит role
в верхнем регистре и content
сообщения рядом.
Вот как должен выглядеть вывод:
Это выглядит круто!
Но добавив немного стилизации, вы придадите ему привлекательный вид, как WhatsApp или Messenger.
Замените содержимое файла src/index.css
на следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
|
И удалите все стили из файла src/App.css
.
Вы можете найти полный код на GitHub.
Теперь приложение должно иметь новый вид:
На этом создание чатбота с помощью React и ChatGPT завершено. Это не так сложно, как кажется.
Но фронтенд-приложения, подобные этому, лучше всего подходят для демонстрации, а не для производства. Проблема создания приложения таким образом заключается в том, что фронтенд раскрывает API-ключ для кибер-атак.
Чтобы решить эту проблему, возможно, имеет смысл сохранить API Key и Organisation Id в безопасном месте в облаке и ссылаться на них, или создать бэкэнд для вашего приложения с лучшей безопасностью.
Следующий раздел будет работать над этой проблемой.
Как объединить React и Node.js для создания ИИ чата¶
В этом разделе мы объединим силы предыдущих разделов, чтобы создать более безопасное приложение, демонстрирующее лучшие UI и UX.
Мы улучшим раздел Node, используя сервер для выставления конечной точки для потребления фронтендом и упростим взаимодействие фронтенда с бэкендом вместо прямого обращения к OpenAI.
Как установить проект¶
В этой части будут созданы папки и файлы, необходимые для проекта.
Создайте каталог проекта:
1 |
|
Перейдите в папку:
1 |
|
Установите React с помощью Vite и назовите папку frontend
. Используйте эту команду:
1 |
|
После этого перейдите в папку и выполните следующую команду:
1 2 |
|
Эти команды установят необходимые зависимости и запустят локальный сервер на порту 5173
.
Создайте папку бэкенда:
1 |
|
Теперь перейдите в папку backend и инициализируйте проект с помощью этой команды:
1 |
|
Это создаст файл package.json
для отслеживания деталей проекта.
Добавьте в файл следующую строку кода:
1 |
|
Это позволит использовать модули ES6.
Установите OpenAI и другие зависимости с помощью команды ниже:
1 |
|
Создайте файл, в котором будет находиться весь код. Назовите его index.js
:
1 |
|
На этом настройка проекта завершена. Теперь есть две папки (frontend
и backend
).
Как создать сервер¶
Эта часть будет посвящена созданию локального сервера, который будет слушать порт 8000
.
Первое, что нужно сделать, это импортировать необходимые модули следующим образом:
1 2 3 4 |
|
Далее настройте express
, порт
для прослушивания, body-parser
для получения входных данных и cors
для свободного обмена данными между фронтендом и бэкендом. Используйте приведенный ниже код:
1 2 3 4 |
|
Наконец, введите следующий код:
1 2 3 |
|
На этом установка сервера завершена.
Когда вы запустите index.js
, вы должны получить следующий результат:
1 |
|
Как создать конечную точку¶
В этой части мы создадим конечную точку, которая будет получать сообщения от фронтенда, используя тело запроса, и возвращать ответ вызывающей стороне.
Начните с установки параметров конфигурации, как мы это делали в предыдущих разделах:
1 2 3 4 5 6 |
|
Затем создайте асинхронный POST-маршрут, используя приведенный ниже код:
1 |
|
Эта конечная точка будет вызываться с помощью http://localhost:8000/
.
В функции обратного вызова введите код ниже, чтобы получить входные данные chats
из тела запроса (request.body
):
1 |
|
Теперь вызовите конечную точку createChatCompletion
, как мы это делали в разделе React:
1 2 3 4 5 6 7 8 9 10 11 |
|
Разница здесь в том, что вместо использования блока then...catch...
мы присвоили его переменной (result
) и вернули ответ с помощью response.json()
, как в следующем коде:
1 2 3 |
|
Найдите код этой части на GitHub здесь.
Вот результат тестирования на Postman:
На этом часть кода, посвященная бэкенду, завершена. В следующей части мы соединим фронтенд с бэкендом, используя только что созданную конечную точку (http://localhost:8000/
).
Как подключиться к бэкенду с фронтенда¶
В этой части мы переходим на фронтенд, где создадим форму. Форма будет отправлять сообщение на бэкенд через конечную точку API и получать ответ через ту же среду.
Перейдите в файл frontend/src/App.jsx
и введите следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
|
Этот код похож на код из предыдущего раздела. Но мы удалили конфигурации OpenAI, поскольку в этом разделе они нам больше не понадобятся.
На данный момент при отправке формы появляется предупреждение. Это изменится через некоторое время.
В функции чата избавьтесь от сообщения alert
и введите следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Приведенный выше код вызывает созданную нами конечную точку и передает ей массив chats
для обработки. Затем он возвращает ответ, который добавляется в чаты
и отображается в пользовательском интерфейсе.
Ниже показано, как выглядит пользовательский интерфейс на данный момент:
Пользовательский интерфейс может выглядеть лучше, если вы добавите следующие стили в файл frontend/src/index.css
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
|
И удалите все стили из файла frontend/src/App.css
.
Код для этой части находится на GitHub.
Теперь вот окончательный результат:
Поздравляю с завершением проекта!
Полный стек чатбота был более трудоемким, но он помог нам разделить проблемы, создать более безопасное и привлекательное приложение и предложить лучший опыт пользователям. Так что это стоило усилий.
Вы можете найти код этого раздела на GitHub.
Заключение¶
Этот учебник, надеюсь, показал вам, что любой человек, обладающий базовыми знаниями программирования, может создавать программное обеспечение с искусственным интеллектом. Вы узнали, как создать чат-бота с помощью React и Nodejs, мы обсудили плюсы и минусы каждой технологии. Наконец, мы создали решение, которое было одновременно функциональным, безопасным и визуально привлекательным.
Прочитав это руководство, вы теперь можете изучить такие функциональные возможности ИИ, как работа с изображениями и взаимодействие со звуком. Не пожалейте времени на изучение документации и посмотрите, как вы можете расширить то, что мы здесь рассмотрели.