使用 Node.js、Socket.IO 和 GPT-4 构建 AI 聊天机器人

简介: 使用 Node.js、Socket.IO 和 GPT-4 构建 AI 聊天机器人

由 GPT-4 等先进人工智能技术提供支持的聊天机器人可以显着提高用户参与度、提供即时帮助并提升整体用户体验。在本教程中,将构建一个利用 Node.jsSocket.IOGPT-4 API 强大功能的 AI 聊天机器人应用程序。通过分步指南,将了解如何创建无缝的实时聊天机器人体验,从而改变网站并给访问者留下深刻印象。

image.png

要使用 GPT-4 创建一个提供聊天机器人功能的完整 Node.js Web 应用程序,需要一个 Express 服务器,使用 Socket.IO 进行实时通信,并使用 HTML 提供一个简单的前端, CSS 和 JavaScript 文件。

设置项目并安装依赖项

在深入研究聊天机器人的实施之前,需要先设置项目并安装必要的依赖项。在下面将引导完成创建项目结构、安装所需的 Node.js 包并确保顺利的开发体验。

第 1 步:为项目创建一个目录并进入到该目录

执行以下命令在第一步中创建一个新的项目目录:


mkdir ai-chatbot
cd ai-chatbot

第 2 步:初始化项目并安装所需的包

接下来,在项目文件夹中创建一个 package.json 文件,并确保安装了所有需要的依赖项:


npm init -y 
npm install express socket.io openai dotenv

第 3 步:创建一个 .env 文件来存储 OpenAI API 密钥:


OPENAI_API_THISKEY=your_openai_api_key

实现服务器逻辑

下面开始创建服务器端逻辑。

第 4 步:为服务器创建一个文件:service.js


require("dotenv").config();
const express = require("express");
const http = require("http");
const socketIO = require("socket.io");
const { Configuration, OpenAIApi } = require("openai");
const app = express();
const server = http.createServer(app);
const io = socketIO(server);
const port = process.env.PORT || 3001;
// OpenAI API 配置
const configuration = new Configuration({
    apiKey: process.env.OPENAI_API_THISKEY,
});
const openai = new OpenAIApi(configuration);
// 静态文件目录
app.use(express.static("public"));
io.on("connection", (socket) => {
    console.log("New user connected");
    // Initialize the conversation history
    const conversationHistory = [];
    socket.on("sendMessage", async (message, callback) => {
        try {
            // Add the user message to the conversation history
            conversationHistory.push({ role: "user", content: message });
            const completion = await openai.createChatCompletion({
                model: "gpt-4",
                messages: conversationHistory,
            });
            const response = completion.data.choices[0].message.content;
            // Add the assistant's response to the conversation history
            conversationHistory.push({ role: "assistant", content: response });
            socket.emit("message", response);
            callback();
        } catch (error) {
            console.error(error);
            callback("Error: Unable to connect to the chatbot");
        }
    });
    socket.on("disconnect", () => {
        console.log("User disconnected");
    });
});
server.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

上述代码片段是使用 GPT-4 APIExpressSocket.IO 的 Node.js 聊天机器人 Web 应用程序的主要服务器端代码。

  1. dotenv 导入并配置为从 .env 文件加载环境变量。
  2. 导入必要的模块,例如expresshttpsocket.ioopenai
  3. 创建一个 Express 应用程序、一个 HTTP 服务器和一个 Socket.IO 服务器,服务器侦听指定端口(来自环境变量或默认为 3001)。
  4. OpenAI API 使用提供的 API 密钥进行配置。
  5. public 目录设置为 Express 应用程序的静态文件目录。
  6. 连接事件监听器被添加到 Socket.IO 服务器。当新用户连接时:
  • 记录用户的连接。
  • 一个名为 conversationHistory 的空数组被初始化以存储对话历史记录。
  • 事件监听器 sendMessage 被添加到连接的套接字。当用户发送消息时:用户的消息被添加到数组中 conversationHistoryGPT-4 API 请求以对话历史记录作为输入。聊天机器人的响应从 API 结果中提取并添加到数组中 conversationHistory 。最后,聊天机器人的响应通过事件发回给用户 message。如果出现错误,则会向用户发送错误消息。
  1. disconnect事件侦听器被添加到已连接的套接字中,以在用户断开连接时进行记录。
  2. 服务器启动,一条日志消息表明它正在指定端口上运行。

第 5 步:创建一个目录 public 并在其中创建 index.htmlstyles.cssscript.js 文件:


mkdir public
cd public
touch index.html styles.css script.js

前端部分

以下 HTML 代码表示聊天机器人 Web 应用程序的主页。它提供基本结构,包括聊天机器人前端所需的 CSS 和 JavaScript 文件,需要插入到 index.html 中:


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>AI Chatbot</title>
        <meta
            name="keywords"
            content="GPT、AI、ChatGPT、Docker、Vue、angular、ember、ChatGPT、Html、WEB Point"
        />
        <meta
            name="description"
            content="An AI chatbot full stack project driven by GPT-4,used node.js、express、socke.io"
        />
        <meta http-equiv="content-language" content="en" />
        <meta name="author" content="https://github.com/QuintionTang" />
        <link rel="stylesheet" href="styles.css" />
    </head>
    <body>
        <div id="chat-container">
            <div id="messages"></div>
            <form id="message-form">
                <input
                    type="text"
                    id="message-input"
                    placeholder="Type your message"
                    autocomplete="off"
                />
                <button type="submit">Send</button>
            </form>
        </div>
        <script src="/socket.io/socket.io.js"></script>
        <script src="script.js"></script>
    </body>
</html>

第 7 步:将以下 CSS 代码添加到 styles.css 文件中


body {
    font-family: Arial, sans-serif;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-color: #262e35;
    -webkit-text-size-adjust: 100%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
*,
:after,
:before {
    box-sizing: border-box;
}
#chat-container {
    border-radius: 5px;
    display: flex;
    line-height: 1.5;
    width: 100%;
    height: 100vh;
    flex-direction: column;
}
#messages {
    overflow-y: auto;
    padding: 1.5rem !important;
    height: calc(100vh - 91px);
}
#message-form {
    display: flex;
    padding: 1.5rem !important;
    border-top: 1px solid #36404a;
}
#message-input {
    flex-grow: 1;
    border: 1px solid #36404a;
    border-radius: 5px;
    border-radius: 0.4rem;
    font-size: 0.875rem;
    min-height: calc(1.5em + 1rem + 6px);
    background-color: rgb(54, 64, 74);
    padding: 0.5rem 1rem;
    color: #fff;
}
button {
    background-color: #007bff;
    border-radius: 0.4rem;
    color: white;
    border: none;
    border-radius: 5px;
    padding: 0.5rem 1rem;
    padding: 6px 12px;
    margin-left: 5px;
    cursor: pointer;
}
button:hover {
    background-color: #0056b3;
}
.ctext-wrap {
    display: flex;
    margin-bottom: 10px;
    background-color: #7269ef;
    border-radius: 8px 8px 8px 8px;
    color: #fff;
    padding: 12px 20px;
    position: relative;
}

第 8 步:将以下 JavaScript 代码添加到 script.js 文件中


const socket = io();
const messageForm = document.getElementById("message-form");
const messageInput = document.getElementById("message-input");
const messages = document.getElementById("messages");
function displayMessage(role, message) {
    const div = document.createElement("div");
    div.innerHTML = `<p><b>${
        role === "user" ? "You" : "Assistant"
    }:</b> ${message}</p>`;
    messages.appendChild(div);
    messages.scrollTop = messages.scrollHeight;
}
messageForm.addEventListener("submit", (e) => {
    e.preventDefault();
    const message = messageInput.value;
    displayMessage("user", message); //
    socket.emit("sendMessage", message, (error) => {
        if (error) {
            return alert(error);
        }
        messageInput.value = "";
        messageInput.focus();
    });
});
socket.on("message", (message) => {
    displayMessage("assistant", message);
});
  1. Socket.IO 客户端实例是使用该变量创建io()并分配给该socket变量的。
  2. DOM 元素,例如消息表单、消息输入字段和消息容器,使用getElementById
  3. displayMessage函数定义为在消息容器中创建和显示聊天消息。它以消息发送者的角色(用户助理)和消息内容作为参数,使用格式化消息创建一个新元素,将div其附加到消息容器,并将容器滚动到底部。
  4. 事件侦听器添加到消息表单以处理表单提交:默认的表单提交行为被阻止使用e.preventDefault()。从输入字段中检索用户的消息并使用该displayMessage函数显示。该sendMessage事件通过带有用户消息的 Socket.IO 客户端发出,并提供错误回调函数。如果有错误,它会显示为警报。否则,输入字段被清除,焦点返回到输入字段。
  5. 事件侦听器添加到 Socket.IO 客户端以处理 message 事件:当从服务器接收到一条消息(聊天机器人的响应)时,displayMessage 将使用角色 助手 调用该函数,并将接收到的消息显示在聊天中。

测试应用程序

测试是为了验证逻辑,下面来测试一下。

第 9 步:通过运行启动服务器

node service.js

现在,可以在浏览器中访问 http://localhost:3000 并与 GPT-4 聊天机器人进行交互。聊天机器人将回复消息,可以与其进行对话。

如上所见:聊天机器人知道对话的上下文并提供考虑了对话历史的答案。

结论

到此使用 Node.js、Socket.IO 和 GPT-4 API 成功构建了 AI 支持的聊天机器人 Web 应用程序。凭借其上下文感知功能和实时交互,聊天机器人可以满足当今用户不断变化的期望。

随着继续开发和完善聊天机器人,可能性是无限的。可以进一步自定义聊天机器人的功能、外观以及与其他服务的集成以满足特定需求。


相关实践学习
阿里巴巴智能语音交互技术与应用
智能语音交互,是基于语音识别、语音合成、自然语言理解等技术,为企业在多种实际应用场景下,赋予产品“能听、会说、懂你”式的智能人机交互体验。适用于多个应用场景中,包括智能问答、智能质检、法庭庭审实时记录、实时演讲字幕、访谈录音转写等。 本课程主要讲解智能语音相关技术,包括语音识别、人机交互、语音合成等。 &nbsp;
相关文章
|
6天前
|
存储 人工智能 自然语言处理
15.4K Star!Vercel官方出品,零基础构建企业级AI聊天机器人
"基于Next.js 14和AI SDK打造的Chat SDK,让开发者快速构建支持多模态交互、代码执行、文件共享的智能对话系统,5分钟完成全栈部署!" —— Vercel AI Chatbot项目核心宣言
|
6月前
|
存储 人工智能 uml
介绍一款好用的开源画图神器-draw.io | AI应用开发
draw.io 是一款基于浏览器的开源绘图工具,无需安装即可使用,支持多种操作系统和设备。其简洁的界面、丰富的形状库、智能对齐功能和强大的云端协作能力,使其成为专业人士和创意爱好者的首选。无论是产品设计、流程图绘制还是思维导图构建,draw.io 都能满足你的多样化需求。【10月更文挑战第7天】
640 0
|
2月前
|
人工智能 数据可视化 Java
打造动态数据可视化:JavaScript与AI的完美结合
在快速发展的技术世界中,Java作为广泛应用的编程语言,持续占据重要地位。本文探讨如何将AI技术,如DeepSeek,融入Java高级应用开发,实现智能代码生成、优化与自动化测试,提升开发效率和代码质量。AI通过分析大量代码库,自动生成高质量代码片段,减少重复劳动,并提出优化建议,帮助开发者编写更高效、安全的代码。未来,AI将进一步推动Java开发智能化,降低开发门槛,助力创新。
|
2月前
|
人工智能 JavaScript 前端开发
探索JavaScript网页设计的无限可能:从基础到AI集成
在互联网时代,JavaScript是网页设计的核心语言之一,不仅增强用户界面的交互性,还能通过集成AI技术(如DeepSeek)提供智能化体验。本文介绍JavaScript基础、DOM操作、事件处理,并通过构建一个简单的用户评论网页展示其应用,进一步引入DeepSeek进行情感分析,实现美观且智能的网页设计。
|
2月前
|
人工智能 数据可视化 JavaScript
打造动态数据可视化:JavaScript与AI的完美结合
本文介绍如何通过JavaScript和AI技术实现动态数据可视化,以实时股票数据为例。使用JavaScript动态更新网页内容,Chart.js绘制股票价格走势图,并通过DeepSeek API进行趋势预测。用户输入股票代码后,网页展示历史价格并预测未来走势,增强用户体验。结合AI技术,不仅提升网页功能性,还为用户提供智能化的数据洞察。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
PeterCat:一键创建开源项目 AI 问答机器人,自动抓取 GitHub 仓库信息、文档和 issue 等构建知识库
PeterCat 是一款开源的智能答疑机器人,能够自动抓取 GitHub 上的文档和 issue 构建知识库,提供对话式答疑服务,帮助开发者和社区维护者高效解决技术问题。
342 7
PeterCat:一键创建开源项目 AI 问答机器人,自动抓取 GitHub 仓库信息、文档和 issue 等构建知识库
|
3月前
|
人工智能 JavaScript 前端开发
一段 JavaScript 代码,集成网站AI语音助手
根据本教程,只需通过白屏化的界面操作,即可快速构建一个专属的AI智能体。
|
4月前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
1286 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
4月前
|
XML 算法 自动驾驶
使用URDF和Xacro构建差速轮式机器人模型
前言 本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。 差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 此次建模,不引入算法,只是把机器人模型的样子做出来,所以只使用 rivz 进行可视化显示。 机器人的定义和构成 机器人定义:机器人是一种自动化的机器,所不同的是这种机器具备一些与人或生物相似的智能能力,如感知能力、规划能力、动作能力和协同能力,是一种具有高级灵活性的自动化机器
158 15
|
5月前
|
XML 算法 自动驾驶
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
【11月更文挑战第7天】本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
201 6

热门文章

最新文章