Разработка разговорного ИИ на 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, прежде чем развертывать свое приложение.