в

Разработка разговорного ИИ на Node.js и OpenAI API

12 апреля 2024
Разработка разговорного ИИ на Node.js и OpenAI API

В этой статье мы рассмотрим процесс разработки простого проекта на Node.js и Express.js для взаимодействия с OpenAI API. Мы создадим приложение, которое сможет обрабатывать как одиночные сообщения, так и непрерывные диалоги. Погнали!

Настройка проекта Express.js

Сначала убедитесь, что на вашей машине установлены Node.js и PNPM. Затем создайте новую директорию для вашего проекта и перейдите в нее:

mkdir express-openai-chat
cd express-openai-chat

Инициализируйте новый проект Node.js:

pnpm init -y

Теперь установите Express, OpenAI SDK и dotenv для управления переменными окружения:

pnpm add express openai dotenv

Чтобы сервер автоматически перезапускался при изменениях, установим Nodemon в качестве зависимости для разработки:

pnpm add -D nodemon

Создайте файл index.js и еще один файл .env в корневой директории проекта. В файле .env должен храниться ваш ключ API OpenAI:

PORT=5000
OPENAI_API_KEY=your_openai_api_key_here

Замените your_openai_api_key_here на ваш реальный ключ API OpenAI.

В index.js настройте базовый сервер Express:

import dotenv from 'dotenv';
import express from 'express';
import OpenAI from 'openai';

dotenv.config();

const app = express();
app.use(express.json());

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

В вашем package.json добавьте "type": "module" для поддержки импорта в javascript файле, и измените раздел "scripts", добавив команду для запуска приложения:

"type": "module",
"scripts": {
  "start": "nodemon index.js"
}

Теперь вы можете запустить свой сервер командой:

pnpm start

Реализация одиночного сообщения

Создадим endpoint /single-message в index.js, который будет обрабатывать одиночное сообщение пользователя без учета истории диалога:

app.post('/single-message', async (req, res) => {
  const { newMessage } = req.body;
  try {
    const completion = await openai.chat.completions.create({
      messages: [{ role: "user", content: newMessage }],
      model: "gpt-3.5-turbo",
    });
    res.json({ message: completion.choices[0].message.content });
  } catch (error) {
    console.error("Error:", error);
    res.status(500).json({ message: "Internal Server Error" });
  }
});

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

curl -X POST http://localhost:3000/single-message \
-H 'Content-Type: application/json' \
-d '{"newMessage": "Привет! Как дела?"}'

Вы должны получить ответ от OpenAI API на основе введенного сообщения.

{"message":"Привет! У меня все отлично, спасибо! Как я могу помочь вам сегодня?"}

Реализация диалога

Теперь добавим еще один endpoint /conversation для обработки непрерывных диалогов. Это позволит AI сохранять контекст из предыдущих обменов:

app.post('/conversation', async (req, res) => {
  const { conversationHistory, newMessage } = req.body;
  try {
    const completion = await openai.chat.completions.create({
      messages: [...conversationHistory, { role: "user", content: newMessage }],
      model: "gpt-3.5-turbo",
    });
    const updatedConversationHistory = [
      ...conversationHistory,
      { role: "user", content: newMessage },
      { role: "assistant", content: completion.choices[0].message.content },
    ];
    res.json({
      message: completion.choices[0].message.content,
      conversationHistory: updatedConversationHistory,
    });
  } catch (error) {
    console.error("Error:", error);
    res.status(500).json({ message: "Internal Server Error" });
  }
});

Протестируйте endpoint /conversation с помощью cURL:

curl -X POST http://localhost:5000/conversation \
-H 'Content-Type: application/json' \
-d '{"conversationHistory": [{"role": "user", "content": "Какая погода сегодня?"}], "newMessage": "И что будет завтра?"}'

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

{
 "message":"Извините, но я не могу предоставить информацию о текущей погоде или прогнозе на будущий день, так как я - искусственный интеллект и не имею доступа к данным о погоде в реальном времени. Рекомендуется воспользоваться специализированными метеорологическими ресурсами или приложениями для получения актуальной информации о погоде.",
 "conversationHistory":[
   {"role":"user","content":"Какая сегодня погода?"},
   {"role":"user","content":"А что будет завтра?"},
   {"role":"assistant","content":"Извините, но я не могу предоставить информацию о текущей погоде или прогнозе на будущий день, так как я - искусственный интеллект и не имею доступа к данным о погоде в реальном времени. Рекомендуется воспользоваться специализированными метеорологическими ресурсами или приложениями для получения актуальной информации о погоде."}
 ]
}

Теперь у вас настроен базовый сервер Express.js, который может взаимодействовать с OpenAI API как для получения ответов на одиночные сообщения, так и для ведения непрерывных диалогов. С помощью этих инструментов вы можете начать создавать более сложные приложения, интегрировать ИИ в ваши существующие системы или просто экспериментировать с возможностями языковых моделей.

Помните, всегда защищайте свои ключи API и конфиденциальные данные, а также убедитесь, что вы соблюдаете политику использования OpenAI, прежде чем развертывать свое приложение.

Теги: