【前端】自己从头实现一个gpt聊天页面

预览

在这里插入图片描述

最小化功能点

  • 主界面:侧边栏会话历史、聊天窗口发送和断开。
  • 侧边栏:展示会话列表,每个会话包含多条聊天记录, 通过localstorage本地储存和恢复,会话需要重命名和删除。
  • 聊天框:区分一下发送者和回答者的布局(对于代码可以加入高亮功能)。
  • 流式请求对接:通过fetch读取text/oct-stream格式的请求。
  • 历史记录:折叠gpt的回答, 点击展开可弹框查看全部内容, 防止页面卡顿。

gpt总结的步骤

制作一个 ChatGPT 界面涉及多个功能点和步骤,以下是一个简要的总结,涵盖了前端和后端的基本构建要求。

1. 基本功能点
a. 用户输入
输入框:用户可以在文本框中输入问题或消息。
提交按钮:点击按钮提交输入,或实现键盘快捷键(例如回车键)。
b. 显示对话
消息显示区:用于展示用户和 ChatGPT 的对话内容。
滚动效果:确保聊天框可以自动滚动,显示最新消息。
c. 响应生成
ChatGPT 交互:根据用户输入,通过后端调用 OpenAI API 或类似的 AI 服务来生成回应。
异步显示:响应从 API 获取后实时更新,支持流式响应。
d. 输入和响应格式
文本和富文本:支持文本消息和可能的富文本(例如图片、链接等)。
加载指示器:当 AI 正在处理请求时,显示加载动画或提示。
e. 断开/停止功能
停止按钮:允许用户停止流式响应,关闭连接。
2. 功能细节实现步骤
a. 前端开发
UI 设计:设计清晰简洁的用户界面,包括输入框、聊天历史显示区域、发送按钮、加载指示器等。
输入框及事件监听:实现输入框,监听 enter 键或发送按钮的点击事件,将用户输入发送到后端。
显示聊天历史:使用滚动条或自动滚动功能显示聊天记录,确保对话内容实时更新。
异步请求与响应显示:通过 fetch 或 WebSocket 与后端交互,接收并显示生成的回答。
加载指示器:当请求正在处理中,显示加载指示器(例如转圈或 “typing...”)。
b. 后端开发
API 请求处理:实现一个处理前端请求的接口,接收用户消息并传递给 AI 服务。
OpenAI API 或其他聊天引擎:使用 OpenAI 的 API 或自定义 AI 模型生成响应。需要处理 API 密钥和认证。
流式响应:支持长时间的流式响应,利用 ReadableStream、WebSocket 或 Server-Sent Events (SSE) 实现实时响应。
消息缓存和处理:存储聊天历史,确保会话状态得以保留。可能需要简单的缓存机制。
断开和中断请求:实现 API 连接的中断功能(例如使用 AbortController 取消正在进行的请求),以支持停止和断开流式响应。
c. 流式响应与断开连接
前端:通过 fetch 与流数据接口交互,逐步显示响应内容。
后端:实现流式 API 响应,处理客户端请求并逐步推送数据。支持连接中断。
断开连接:通过前端按钮或事件监听来停止流式请求。确保前后端能够优雅地断开连接(例如通过 AbortController 或 WebSocket 的 close() 方法)。
3. 进阶功能(可选)
a. 身份认证和权限管理
用户身份认证:如果需要,可以添加用户身份验证功能(如 OAuth、JWT 等)。
权限控制:根据用户角色控制访问不同功能。
b. 消息翻译
语言切换:支持多语言输入和输出,自动或手动切换对话语言。
翻译功能:在不同语言环境下,自动翻译用户输入和 AI 的回应。
c. 聊天存档
历史记录:实现会话历史的保存,用户可以查看过去的聊天记录。
导出功能:提供导出聊天记录的选项(如文本文件、PDF 等)。
d. UI/UX优化
自定义主题:支持不同的主题切换(如浅色/深色模式)。
语音输入与输出:实现语音识别和语音合成功能,提升用户体验。
聊天气泡样式:美化聊天框,增强交互感。
4. 技术栈选择
a. 前端技术
HTML/CSS:用于布局和样式,确保界面简洁美观。
JavaScript/TypeScript:前端逻辑,处理用户输入、与后端交互、展示响应。
React/Vue/Angular:现代前端框架,用于构建高效的交互式应用。
WebSocket 或 Server-Sent Events (SSE):用于实时双向通信。
b. 后端技术
Node.js + Express/Koa:用于处理 HTTP 请求,管理与 AI 服务的交互。
Python + Flask/Django:如果使用 Python 提供 AI 服务,可以选择 Flask 或 Django。
OpenAI API:与 OpenAI 的 GPT 接口交互,生成响应。
c. 其他工具
Redis:用于存储用户会话历史和缓存数据。
数据库:例如 MySQL、PostgreSQL 或 MongoDB,用于存储用户信息和聊天记录。
总结
用户界面设计:包含消息显示区、输入框、按钮和加载提示。
与后端交互:通过异步请求与 AI 服务交互,支持流式响应。
消息显示和流式响应:实时显示消息并更新 UI,支持停止和断开流式响应。
断开功能:优雅地处理连接的断开和请求的取消。
通过以上功能点和步骤,你可以实现一个基本的 ChatGPT 界面,并在此基础上进行扩展和优化。
以下是一个简单的 GPT 聊天页面的示例代码: ```html <!DOCTYPE html> <html> <head> <title>GPT Chat</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { font-family: Arial, sans-serif; background-color: #f2f2f2; } .chatbox { display: flex; flex-direction: column; align-items: center; padding: 20px; margin: 20px; background-color: #fff; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); border-radius: 10px; max-width: 500px; min-height: 500px; } .chatbox h1 { margin: 0; padding: 10px; font-size: 24px; text-align: center; } .chat { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; margin: 20px 0; height: 100%; overflow-y: scroll; max-height: 400px; width: 100%; } .chat .message { display: flex; flex-direction: column; align-items: flex-start; margin-bottom: 10px; max-width: 80%; word-wrap: break-word; padding: 10px; border-radius: 10px; background-color: #eee; } .chat .message .text { margin: 0; font-size: 16px; line-height: 1.5; } .chat .message .time { margin: 5px 0 0; font-size: 12px; color: #999; } .form { display: flex; flex-direction: column; align-items: stretch; width: 100%; margin-top: auto; } .form input[type="text"] { padding: 10px; margin: 0; border: none; border-radius: 5px; background-color: #f2f2f2; font-size: 16px; line-height: 1.5; resize: none; outline: none; } .form input[type="submit"] { padding: 10px; margin: 10px 0 0; border: none; border-radius: 5px; background-color: #4caf50; color: #fff; font-size: 16px; line-height: 1.5; cursor: pointer; outline: none; } .form input[type="submit"]:hover { background-color: #3e8e41; } </style> </head> <body> <div class="chatbox"> <h1>GPT Chat</h1> <div class="chat"> <div class="message"> <p class="text">Welcome to GPT chat!</p> <p class="time">12:00 PM</p> </div> </div> <form class="form" onsubmit="sendMessage(event)"> <input type="text" placeholder="Type your message here..." id="messageInput"> <input type="submit" value="Send"> </form> </div> <script> function sendMessage(event) { event.preventDefault(); var messageInput = document.getElementById('messageInput'); var message = messageInput.value; if (message.trim()) { addMessage(message, true); messageInput.value = ''; sendToGPT(message); } } function addMessage(message, isUser) { var chat = document.querySelector('.chat'); var messageElement = document.createElement('div'); messageElement.className = 'message'; var textElement = document.createElement('p'); textElement.className = 'text'; textElement.textContent = message; messageElement.appendChild(textElement); var timeElement = document.createElement('p'); timeElement.className = 'time'; timeElement.textContent = getTime(); messageElement.appendChild(timeElement); if (isUser) { messageElement.classList.add('user'); } chat.appendChild(messageElement); chat.scrollTop = chat.scrollHeight; } function sendToGPT(message) { // TODO: Send message to GPT and get response // Replace this with your GPT API call var response = 'This is a response from GPT.'; addMessage(response, false); } function getTime() { var now = new Date(); var hours = now.getHours(); var minutes = now.getMinutes(); var ampm = hours >= 12 ? 'PM' : 'AM'; hours = hours % 12; hours = hours ? hours : 12; // the hour '0' should be '12' minutes = minutes < 10 ? '0' + minutes : minutes; var time = hours + ':' + minutes + ' ' + ampm; return time; } </script> </body> </html> ``` 这个页面包括一个聊天框,一个输入框和一个发送按钮。当用户在输入框中输入消息并点击发送按钮时,页面将调用 `sendMessage` 函数来添加用户的消息到聊天框中,并调用 `sendToGPT` 函数与 GPT 进行交互,获取并添加 GPT 的响应到聊天框中。其中,`addMessage` 函数用于将消息添加到聊天框中,`getTime` 函数用于获取当前时间。需要注意的是,`sendToGPT` 函数需要替换为你的 GPT API 调用代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值