当前位置: 首页 > article >正文

构建高效智能对话前端:基于Ant Design X 的deepseek对话应用

文章目录

    • 实现的效果
    • 前言
    • Ant Design X
    • 添加欢迎组件
      • 创建对话气泡
      • 存储对话历史
      • 渲染对话气泡
    • 输入组件
    • WebSocket 连接
    • 总结

实现的效果

  • 待机页面
    待机页面

  • 等待页面
    等待页面

  • 完成页面
    完成页面

前言

随着人工智能技术的飞速发展,大模型对话系统已成为许多应用的核心组件。为了提供一个高效、智能且用户友好的对话界面,我们开发了一款基于 Vite、React 和 Ant Design X 的大模型对话前端页面。该系统能够实时与后端的大模型进行通信,为用户提供流畅的对话体验。

本文主要介绍前端页面部分,后端大模型 DeepSeek 的对接请移步至深度集成 DeepSeek 大模型。

Ant Design X

Ant Design X 是一个遵循 Ant Design 设计体系的 React UI 库,专为构建由 AI 驱动的界面而设计,支持一键接入智能对话组件与 API 服务。

  • 源自企业级 AI 产品的最佳实践:基于 RICH 交互范式,提供卓越的 AI 交互体验。
  • 灵活多样的原子组件:覆盖绝大部分 AI 对话场景,助力快速构建个性化 AI 交互页面。
  • 开箱即用的模型对接能力:轻松对接符合 OpenAI 标准的模型推理服务。
  • 高效管理对话数据流:提供好用的数据流管理功能,让开发更高效。
  • 丰富的样板间支持:提供多种模板,快速启动 LUI 应用开发。
  • TypeScript 全覆盖:采用 TypeScript 开发,提供完整类型支持,提升开发体验与可靠性。
  • 深度主题定制能力:支持细粒度的样式调整,满足各种场景的个性化需求。

添加欢迎组件

在用户首次访问时,显示欢迎组件以介绍应用。

<Welcomeicon="https://mdn.alipayobjects.com/huamei_iwk9zp/afts/img/A*s5sNRo5LjfQAAAAAAAAAAAAADgCCAQ/fmt.webp"title="Hello, I'm Ant Design X"description="Based on Ant Design, AGI product interface solution, create a better intelligent vision~"
/>

创建对话气泡

使用 Bubble 组件来存储和渲染对话历史。

存储对话历史

对话历史以对象数组的形式存储,每个对象包含 contentrole 属性。

// 存储对话历史
// 内容格式为 { content: '', role: 'assistant' } / { content: '', role: 'user' }
const [history, setHistory] = useState([]);

渲染对话气泡

根据消息的角色(用户或助手)渲染不同的对话气泡。

{history.map((item, index) => {if (item.role === 'user') {return (<Bubblekey={index}style={{ marginBottom: 8 }}placement="end"content={item.content}messageRender={renderMarkdown}avatar={{ icon: <UserOutlined />, style: fooAvatar }}/>);} else if (item.role === 'assistant') {return (<Bubblekey={index}loading={(index === history.length - 1) && loading}style={{ marginBottom: 8, maxWidth: '80%' }}placement="start"content={item.content}messageRender={renderMarkdown}avatar={{ icon: <RobotOutlined />, style: robotAvatar }}/>);}})
}

输入组件

使用 Sender 组件来处理用户输入和消息发送。

<Senderloading={loading}value={inputMsg}style={{ position: 'absolute', bottom: '10px', right: '10px', left: '10px', width: 'auto' }}onChange={(v) => {setInputMsg(v);}}onSubmit={() => {setHistory((prevHistory) => [...prevHistory, { content: inputMsg, role: 'user' }]);sendMsg();setInputMsg('');setLoading(true);}}onCancel={() => {// 取消发送消息时的处理逻辑(如果有需要)}}
/>

WebSocket 连接

使用 WebSocket 协议与后端的大模型进行实时通信。当用户发送消息时,前端通过 WebSocket 将消息发送到后端,并接收 DeepSeek 通过后端 Python 代码返回的对话内容。

代码示例:

const sendMsg = () => {// 创建一个新的 WebSocket 连接const socket = new WebSocket('ws://localhost:8765');// 初始化结果对象,用于存储助手的回复内容let result = {content: '',role: 'assistant'};// WebSocket 连接打开时的处理逻辑socket.onopen = () => {console.log('WebSocket connection established');console.log(inputMsg);// 发送用户输入的消息到后端socket.send(JSON.stringify({"user_input": inputMsg}));// 在对话历史中添加一个新的助手消息占位符setHistory((prevHistory) => [...prevHistory, { content: '', role: 'assistant' }]);};// WebSocket 接收到消息时的处理逻辑socket.onmessage = (event) => {try {// 检查消息是否为结束标志if (event.data === 'end') {// 处理结束逻辑(如果有需要)} else {// 解析接收到的消息const msg = JSON.parse(event.data);console.log(msg);// 累加助手的回复内容result.content += msg.content;// 更新对话历史中的最后一个助手消息内容setHistory((prevHistory) => {const newHistory = [...prevHistory];newHistory[newHistory.length - 1].content = result.content;console.log(newHistory[newHistory.length - 1].content);return newHistory;});}} catch (error) {console.error('Error parsing WebSocket message:', error);}};// WebSocket 连接关闭时的处理逻辑socket.onclose = () => {console.log('WebSocket connection closed');setLoading(false);};// WebSocket 连接发生错误时的处理逻辑socket.onerror = (error) => {console.error('WebSocket error:', error);setLoading(false);};
};

总结

本项目不仅实现了基本的实时对话功能,还充分考虑到了性能及用户体验方面的问题。借助 Vite、React 和 Ant Design X 的优势,我们得以在较短时间内完成高质量的产品交付。希望这篇文章能给正在探索类似项目的朋友们带来一些启发。

源码下载地址

相关文章:

构建高效智能对话前端:基于Ant Design X 的deepseek对话应用

文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面&#xff1a; 等待页面&#xff1a; 完成页面&#xff1a; 前言 随着人工智能技术的飞速发展&#xff0c;大模型对话系统已成为…...

四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵)【ESP32指向鼠标】

四元数如何用于 3D 旋转&#xff08;代替欧拉角和旋转矩阵&#xff09; 在三维空间中&#xff0c;物体的旋转可以用 欧拉角、旋转矩阵 或 四元数 来表示。 四元数相比于欧拉角和旋转矩阵有 计算更高效、避免万向锁、存储占用少 等优点&#xff0c;因此广泛用于 游戏开发、机器…...

Cloud: aws:network: limit 含有pps这种限制

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena 这个是调查网络问题的一个网页; 在里面,竟然含有pps这种限制:ethtool -S;其实是比较苛刻的安全相关的策略? [ec2-user ~]$ ethtool -S ethN NIC statistics:tx_timeout: …...

Python MoviePy 视频处理全攻略:从入门到实战案例

第1章 环境安装与配置 # 案例1&#xff1a;安装MoviePy及FFmpeg !pip install moviepy # Windows安装FFmpeg&#xff1a;https://ffmpeg.org/download.html # Linux: sudo apt-get install ffmpeg# 验证安装 from moviepy.editor import * print("MoviePy版本:", __…...

数据结构之BST、AVL、红黑树、哈夫曼树与B族树

数据结构之BST、AVL、红黑树、哈夫曼树与B族树 数据结构之BST、AVL、红黑树、哈夫曼树与B族树一、二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;1. 什么是二叉搜索树&#xff1f;重要性质 2. 二叉搜索树实现1. 节点结构定义2. 核心操作接口3. 插入算法实现4. 删除…...

开源多商户商城源码最新版_适配微信小程序+H5+APP+PC多端

在数字化时代&#xff0c;电子商务已经成为各行业不可或缺的一部分&#xff0c;开源多商户商城源码为中小企业和个人开发者提供了快速搭建和定制电商平台的利器。分享一款最新版的开源多商户商城源码&#xff0c;它能够适配微信小程序、H5、APP和PC等多个端口&#xff0c;满足商…...

第3章 .NETCore核心基础组件:3.1 .NET Core依赖注入

3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述&#xff0c;总结一下就是&#xff1a;软件设计模式中有一种叫做【控制反转】的设计模式&#xff0c;而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入&#xff0c;是学习怎样实现控…...

cesium基础设置

cesium官网下载&#xff1a;https://cesium.com/downloads/ 1.安装cesium 选择下载到本地使用&#xff0c;或者通过npm下载到项目中 2.代码书写 &#xff08;1&#xff09;创建容器 <div id"cesiumContainer" style"width: 100%; height: 100%"><…...

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...

文件夹上传到github分支最后github上面还是没有文件和文件夹

环境&#xff1a; github 问题描述&#xff1a; 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案&#xff1a; 从 git ls-tree -r HEAD 的输出中可以看到&#xff0c;metahuman-stream 文件夹显示为如下内容&#xff1a; 160000 commi…...

面试题之箭头函数和普通函数有什么区别?

箭头函数&#xff08;Arrow Function&#xff09;和普通函数&#xff08;Regular Function&#xff09;是 JavaScript 中两种不同的函数定义方式&#xff0c;它们在语法、上下文&#xff08;this&#xff09;、原型链等方面存在显著区别。以下是它们的主要区别&#xff1a; 1. …...

【文献精读】AAAI24:FacetCRS:打破对话推荐系统中的“信息茧房”

标题FacetCRS: Multi-Faceted Preference Learning for Pricking Filter Bubbles in Conversational Recommender System期刊The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24)年份2024关键词Conversational Recommender System (CRS), Filter Bubbles,…...

[vs2017][qt]MSB4019 未找到导入的项目QtMsBuild\Qt.prop

问题场景&#xff1a; vs2017qt5.9.9新建vs项目报错MSB4019 未找到导入的项目QtMsBuild\Qt.prop 报错解决方案&#xff1a; 由QtMsBuild导致的问题不需要像其他博客里说的那样各种环境变量配置&#xff0c;以及大费周章去查看一些系统的东西。 第一步&#xff1a; 只需要将…...

网络安全推荐的视频教程 网络安全系列

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 1.2.3 网络安全的种类P5 &#xff08;1…...

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用 目录 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用Embedding(嵌入)RAG(检索增强生成)Function calling(函数调用)Pr…...

基于Python的深度学习音乐推荐系统(有配套论文)

音乐推荐系统 提供实时音乐推荐功能&#xff0c;根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库&#xff1a;MySQL 系统包含角色&#xff1a;管理员、用户 管理员功能&#xff1a;用户管理、系统设置、音乐管理、音乐推荐管理、系…...

长文档处理痛点:GPT-4 Turbo引文提取优化策略与替代方案讨论

引言 随着GPT-4 Turbo的发布&#xff0c;其支持的128K上下文窗口&#xff08;约300页文本&#xff09;被视为处理长文本的突破性升级。然而&#xff0c;实际应用中&#xff0c;用户发现模型在提取长文档中的引文时存在显著缺陷&#xff1a;文档前三分之一的引文数量远多于中间…...

javacv将mp4视频切分为m3u8视频并播放

学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放)&#xff0c;整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频&#xff1f;优酷是怎么做的&#xff1f; - HLS 流媒体加密 ffmpe…...

Swagger 转 Word 技术方案

项目概述 本项目旨在提供一种便捷的工具,将 Swagger API 文档转换为 Word 文档,方便开发人员和团队进行文档管理和分享。通过简单的配置和操作,用户可以快速生成包含 API 接口信息、请求参数、返回参数等内容的 Word 文档。 技术架构 本项目基于 Java 开发,采用 Spring …...

MVTEC数据集笔记

前言 网上的博客只有从论文里摘出的介绍&#xff0c;没有数据集文件详细的样子&#xff0c;下载数据集之后&#xff0c;对数据集具体的构成做一个补充的笔记。 下载链接&#xff1a;https://ai-studio-online.bj.bcebos.com/v1/7d4a3cf558254bbaaf4778ea336cb14ed8bbb96a7f2a…...

[数据结构]红黑树,详细图解插入

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入&#xff08;步骤&#xff09; 1.为什么新插入的节点必须给红色&#xff1f; 2、插入红色节点后&#xff0c;判定红黑树性质是否被破坏 五、插入出现连续红节点情况分析图解&#xff08;看…...

国家地理信息公共服务平台的天地图

文章目录 一、国家地理信息公共服务平台的天地图二、地图转换1.GIS数据格式坐标转换&#xff08;地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000&#xff09;2.读入数据 总结 一、国家地理信息公共服务平台的天地图 三大地图付费后&#xff0c;仍可…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑤】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase05 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-005测试用例 用例ID测试场景验证要点参考条款预期…...

JavaScript中字符串的常用方法

JavaScript中字符串的常用方法 1.查询类2.拼接3.截取4.大小写5.去掉空格6.重复7.填充8.分隔9.模版匹配方法 可以通过查看String对象的原型来看有哪些方法: console.dir(String.prototype)1.查询类 charAt(index):返回指定位字符 console.log("abc".charAt(1));//b…...

python和pycharm 和Anaconda的关系

好的&#xff0c;下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系&#xff0c;并逐一解释它们的功能和作用。 1. Python&#xff08;编程语言&#xff09; 定义&#xff1a;Python 是一种高级编程语言&#xff0c;设计简洁&#xff0c;易于学习&#xff0c;且功能强…...

CMake 判断 Mac编译环境是Intel的还是Arm的?

在 CMake 中判断 Mac 是 Intel 架构还是 ARM 架构&#xff0c;可以通过检测 CMAKE_SYSTEM_PROCESSOR 变量。这个变量返回的是系统的处理器架构信息&#xff0c;可以根据它的值来区分 Intel 和 ARM。 具体来说&#xff1a; 对于 Intel Mac&#xff0c;CMAKE_SYSTEM_PROCESSOR …...

基于fastadmin快速搭建导航站和API接口站点系统源码

源码介绍 基于fastadmin快速搭建导航站和API接口站点系统源码 上传源码 设置运行目录为/public 导入 数据库.sql到数据库 设置配置文件application/database.php 后台admin.php 可以自己随意修改本文件名称为后台地址 推荐越复杂越好 账号admin 密码 123456 效果预览...

【Vue3】Vue 3 中列表排序的优化技巧

本文将深入探讨 Vue 3 中列表排序的优化技巧&#xff0c;帮助提升应用的性能和响应速度。 1. 避免不必要的排序 按需排序 在实际应用中&#xff0c;并非每次数据更新都需要进行排序。例如&#xff0c;当列表数据仅在特定条件下需要排序时&#xff0c;可通过条件判断来避免不…...

【Github每日推荐】-- 2024 年项目汇总

1、AI 技术 项目简述OmniParser一款基于纯视觉的 GUI 智能体&#xff0c;能够准确识别界面上可交互图标以及理解截图中各元素语义&#xff0c;实现自动化界面交互场景&#xff0c;如自动化测试、自动化操作等。ChatTTS一款专门为对话场景设计的语音生成模型&#xff0c;主要用…...

在C#中动态访问对象属性时,用表达式树可以获得高效性能

在C#中如何用表达式树动态访问对象属性的问题。用户可能已经知道反射的基本用法&#xff0c;但想用表达式树来提高性能&#xff0c;因为表达式树编译后的委托执行速度比反射快。 首先&#xff0c;表达式树的基本概念。表达式树允许在运行时构建代码&#xff0c;并编译成可执行的…...