搭建一个AI对话机器人——前端ChatUI使用纪录

news2024/11/15 17:19:08

最近在使用 OpenAI 的 gpt api 搞着玩玩,然后就遇上了前端对话交互实现的需求场景,如何快速实现 CUI(Chat User Interface)成了问题。最后选择了来自阿里达摩院的ChatUI,本人便用于整理其使用经验。

介绍

服务于对话领域的设计和开发体系,助力智能对话机器人的搭建。——ChatUI

聊天应用程序的用户界面(UI)是用户与应用程序交互的关键部分。ChatUI 是一种聊天应用程序的用户界面设计,它为用户提供了一种简单、易于使用的界面。

在本人的使用情况来看,ChatUI 是一整套机器人对话界面的前端解决方案,遵循前端组件化和容器标准化的设计思想,包含丰富使用的对话组件。

官方文档:https://chatui.io/docs/quick-start

chatUI 适用于 React 项目,支持 PC/移动端样式响应式。效果如:

在这里插入图片描述

使用

在通过 Nodejs 包管理工具npm i @chatui/core安装完依赖后,只需在使用场景下引入对应模块即可。

<Chat/>组件

整个 ChatUI 的核心其实就是<Chat/>容器组件,然而在目前官方文档并没有对此组件的使用展开具体描述及案例说明,以致于需要经常查看其 ts 声明文件或 demo。个人的使用经验整理如下:

消息 hookuseMessages(initialState)

这是使用中关键且必不可少的 API,充当着控制器的角色,相关消息展示、修改等操作都是都过此 hook。文档上没有找到对应说明,从 ts 声明文件中可以大致了解其使用方法:

export default function useMessages(initialState?: MessageWithoutId[]): {
  // 用于展示的信息列表
  messages: Messages;

  // 添加信息(在之前)
  prependMsgs: (msgs: Messages) => void;

  // 添加信息(在之后)
  appendMsg: (msg: MessageWithoutId) => void;

  // 根据id更新某一条信息
  updateMsg: (id: MessageId, msg: MessageWithoutId) => void;

  // 根据id删除某一条信息
  deleteMsg: (id: MessageId) => void;

  // 重置
  resetList: (list?: any) => void;
  setTyping: (typing: boolean) => void;
};

初始语句initialState

  • 格式:MessageWithoutId[],其中``:
    interface MessageWithoutId {
      /**
       * 消息类型
       */
      type: string;
      /**
       * 消息内容
       */
      content?: any;
      /**
       * 消息创建时间
       */
      createdAt?: number;
      /**
       * 消息发送者信息
       */
      user?: User;
      /**
       * 消息位置
       */
      position?: 'left' | 'right' | 'center' | 'pop';
      /**
       * 是否显示时间
       */
      hasTime?: boolean;
      /**
       * 状态
       */
      status?: IMessageStatus;
      /**
       * 消息内容渲染函数
       */
      renderMessageContent?: (message: MessageProps) => React.ReactNode;
    }
    

如:

import React from 'react';
import Chat, { useMessages, RichText, Bubble } from '@chatui/core';
import '@chatui/core/dist/index.css';

export default function ChatFrame() {
  const { messages } = useMessages([
    {
      type: 'text',
      content: { text: '你好,我是智能助理小X~' },
    },
  ]);

  return (
    <Chat
      messages={messages}
      renderMessageContent={msg => {
        const { content } = msg;
        return (
          <Bubble>
            <RichText content={content.text} />
          </Bubble>
        );
      }}
      onSend={(type: string, val: string) => console.log(type, val)}
    />
  );
}

效果如:

在这里插入图片描述

也可以设置user属性增加头像:

export interface User {
  avatar?: string;
  name?: string;
  url?: string;
  [k: string]: any;
}

如:

const { messages, appendMsg } = useMessages([
  {
    type: 'text',
    content: { text: '你好,我是智能助理小X~' },
    user: {
      name: '小X',
      avatar: 'https://avatars.githubusercontent.com/u/16474680?v=4',
    },
  },
]);

效果如:
在这里插入图片描述

当然初始信息可以为多条、也可以为组件(设置type属性)

<Chat/>使用配置

如下图,官网对于<Chat/>容器的属性介绍非常简单,像navbar这些属性都不清楚具体配置项及示例

在这里插入图片描述

使用及配置时可以通过找到其声明文件来确定使用。还是以navbar为例,ts 声明如下:

    /**
     * 导航栏配置
     */
    navbar?: NavbarProps | undefined;

继续定位,可以大致猜测其作用

export declare type NavbarProps = {
  // 标题文案
  title: string;

  // 可设置className
  className?: string;

  // 标题logo
  logo?: string;

  // 标题栏左侧内容
  leftContent?: IconButtonProps;

  // 标题栏右侧内容
  rightContent?: IconButtonProps[];
};

再继续定位,如IconButtonProps

export interface IconButtonProps extends ButtonProps {
  img?: string;
}

export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  className?: string;
  label?: string;
  color?: 'primary';
  variant?: 'text' | 'outline';
  size?: 'sm' | 'md' | 'lg';
  block?: boolean;
  icon?: string;
  loading?: boolean;
  disabled?: boolean;
  onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
}

以此基本能确定navbar配置项为:

interface TempNavbarProps {
  // 标题文案
  title: string;

  // 可设置className
  className?: string;

  // 标题logo
  logo?: string;

  // 标题栏左侧内容
  leftContent?: {
    // 图片/logo
    img?: string;
    className?: string;

    // 左侧标签文案
    label?: string;
    color?: 'primary';
    variant?: 'text' | 'outline';
    size?: 'sm' | 'md' | 'lg';
    block?: boolean;

    // 图标,通过 SVG Symbol 实现的矢量图形
    icon?: string;
    loading?: boolean;
    disabled?: boolean;
    onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
  };

  // 标题栏右侧内容
  rightContent?: Array<{
    // 图片/logo
    img?: string;
    className?: string;

    // 左侧标签文案
    label?: string;
    color?: 'primary';
    variant?: 'text' | 'outline';
    size?: 'sm' | 'md' | 'lg';
    block?: boolean;

    // 图标,通过 SVG Symbol 实现的矢量图形
    icon?: string;
    loading?: boolean;
    disabled?: boolean;
    onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
  }>;
}

组件

相比<Chat/>容器,其他组件的使用简单了很多。组件引入都在@chatui/core中,以使用频率最高的<Bubble>组件为例:

<Bubble>气泡

引入组件:

import { Bubble } from '@chatui/core';

大部分的对话信息都会在<Bubble>中呈现,其属性type可以是字符串text、也可以是图片img。当然用得更多的形式是用<Bubble>包裹要展示的组件,如包裹卡片:

<Bubble>
  <Card size="xl">
    <CardTitle>Show some text</CardTitle>
    <CardActions>
      <Button color="primary">了解更多</Button>
      <Button color="primary">使用</Button>
    </CardActions>
  </Card>
</Bubble>

效果如:
在这里插入图片描述


综合评估

能力

从本人个人使用来看还没有遇到能力不满足的情况,并且如果是计划做一套企业级对话系统的话可以尝试使用ChatUI pro

在这里插入图片描述

具体不做介绍

体积

从产物来看,chatUI 一共224kb的产物大小(css37k, js187k),整体来看也不算重

兼容性

支持响应式,从 css 来看无明显的兼容问题,应该能适配大部分设备。具体兼容情况待后续补充。

社区情况

在这里插入图片描述

项目看着也因近期 ChatGPT 热度有所上升。不过结合issue等情况整体感觉文档及社区维护这块有提升的空间~

综合来看,ChatUI 是一种简单、易于使用的聊天应用程序 UI 设计。它的特点在于其简单、直观的设计,以及对多种消息类型的支持,问题在于当前的文档不够完善。


相关链接

  • https://chatui.io/components/chat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶 | 使用机器学习方法的GNSS多径检测

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;GNSS Multipath Detection Using a Machine Learning Approach 论文链接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8317700 摘要 在高度城市化地区…

Yolov8轻量化:EMO,结合 CNN 和 Transformer 的现代倒残差移动模块设计,性能优于EdgeViT、Mobile-former等网络

论文: https://arxiv.org/pdf/2301.01146.pdf 🏆🏆🏆🏆🏆🏆Yolo轻量化模型🏆🏆🏆🏆🏆🏆 重新思考了 MobileNetv2 中高效的倒残差模块 Inverted Residual Block 和 ViT 中的有效 Transformer 的本质统一,归纳抽象了 MetaMobile Block 的一般…

JAVA基础JVM讲解

JVM体系结构 主要包括两个子系统和两个组件&#xff1a; Class loader(类装载器) 子系统&#xff08;用来装载.class文件&#xff09;; Execution engine(执行引擎) 子系统&#xff08;执行字节码&#xff0c;或者执行本地方法&#xff09;&#xff1b; Runtime data area (…

2023年6月18日DAMA-CDGA/CDGP数据治理认证报名指南

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

弹性及其应用

弹性 衡量了买者和卖者对市场环境变化作出反应的程度大小是我们能够更精确的分析供给和需求 需求的价格弹性 给定百分之一的价格变化&#xff0c;需求量变量的百分数就是需求的价格弹性它衡量了一种物品的需求量对该物品价格变化作出反应的程度大小 需求价格弹性的决定因素…

手把手教你搭建OpenStack云平台(超级详细)

一、前言 OpenStack云平台搭建需要两个节点&#xff0c;一个是controller&#xff08;控制节点&#xff09;&#xff0c;另一个是compute&#xff08;计算节点&#xff09;。 控制节点&#xff08;controller&#xff09;规划如下&#xff1a; 一块200G的硬盘。两块网卡&#x…

天地图下载数据的方法

天地图下载数据的方法&#xff0c;目前我知道的&#xff0c;部分数据可以下载&#xff0c;部分数据不提供下载&#xff08;但是有数据&#xff09;具体就不知道原因了&#xff0c;话不多说&#xff1a; 登录全国地理信息资源目录服务系统&#xff08;全国地理信息资源目录服务…

cuda编程

https://docs.nvidia.com/cuda/index.html 这里写目录标题 OpenCL 与OpenGlrelease noteCUDA Features Archivensight visual studio安装指导本地下载和网络下载 bili 视频1c2050 版本Fermi架构3接口延迟cpu逻辑控制&#xff0c;管理 GPU计算核心连接 GPU硬件架构综述架构2atom…

Revit中如何使创建的族文件内存变小

族文件的大小直接影响到项目文件的大小和软件运行速度&#xff0c;如何将族文件做的最小并且满足项目需求呢? 方法一&#xff1a;清除未使用项 1. 族制作完成可以把族文件中未用到的外部载入族或其他多余数据删掉&#xff0c;点击“管理”选项卡下拉的“清除未使用项”命令; 2…

我拒绝了字节的offer,给求职者提个醒....

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是2年。我想说的是&#xff0c;但凡有点机会&#xff0c;千万别去外包&#xff01; 在深思熟虑过后&am…

LabVIEWCompactRIO 开发指南第七章45 将I/O添加到Compact RIO

LabVIEWCompactRIO 开发指南第七章45 将I/O添加到Compact RIO 基于LabVIEW可重配置I/O&#xff08;RIO&#xff09;架构的NI产品日益被采用用于需要高通道数、密集处理和分布式I/O的系统级应用。将RIO扩展I/O添加到NI RIO产品产品中&#xff0c;可实现1&#xff1a;N系统拓扑…

源码分析 | MySQL 的 commit 是怎么 commit 的?

作者&#xff1a;李鹏博 爱可生 DBA 团队成员&#xff0c;主要负责 MySQL 故障处理和 SQL 审核优化。对技术执着&#xff0c;为客户负责。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 …

JavaEE进阶(Mybatis)5/30

目录 1.单元测试 2.生成单元测试 3.Mybatis 插入操作 4.#{}和${}的区别 1.单元测试 优点&#xff0c;1.可以检查方法的正确性 2.可以&#xff0c;在打包前检查程序的错误&#xff0c;减少错误 3.不污染数据库 2.生成单元测试 1.要生成的类内部generate 2.添加单元测试的代码…

5.31串讲Spring、Vue相关问题

5.31串讲 SSM相关问题 文章目录 5.31串讲 SSM相关问题Spring Security&#xff08;Shiro&#xff09;Security框架认证流程Security流程图展示 Vue相关指令四个阶段 axios Spring Security&#xff08;Shiro&#xff09; Spring Security是一个基于Spring 的安全框架&#xff…

高压放大器怎么驱动超声波探头的

高压放大器是超声波探头中的关键部分&#xff0c;它主要用于放大发射信号和接收信号。在超声波成像过程中&#xff0c;发射信号需要经过高压放大器的放大后才能刺激探头产生超声波&#xff0c;并且接受到的超声波也需要通过高压放大器进行放大处理。因此&#xff0c;高压放大器…

ChatGPT正式登陆iOS平台

6天前&#xff0c;ChatGPT在美区App Store中上架了官方App&#xff0c;累计下载量已经突破 50 万次&#xff0c;OpenAI 的 ChatGPT 应用在上架之后&#xff0c;其热度远超必应聊天等聊天机器人&#xff0c;以及其它使用 GPT-4 的第三方应用。 3.5是免费的&#xff0c;GPT4是收…

【大数据之Hive】五、Hiveserver2服务部署

hiveserver2服务 hiveserver2提供JDBC/ODBC接口&#xff0c;使得用户可以远程访问Hive数据&#xff0c;即作为客户端的代理与Hadoop集群进行交互。 hiveserver2部署时需要部署到一个能访问集群的节点上&#xff0c;保证能够直接往Hadoop上提交数据。   用户在客户端提交SQL语…

8个免费UI图标网站,任何设计师都不该错过

图标是网页设计和应用程序界面设计中不可缺少的一部分。但在日常工作中&#xff0c;许多设计师每次都需要设计一套特定的图标&#xff0c;但他们不知道在哪里获得高质量的UI图标素材。 本文推荐8个宝藏级UI图标完整资源网站&#xff0c;免费&#xff0c;建议迅速收集以备不时之…

Linux网站搭建(nginx+php+mysql)

中间件 web服务器&#xff1a;nginx&#xff08;前端网页&#xff09;php 数据库服务器&#xff1a;mysql 思路&#xff1a; 先安装中间件nginx&#xff0c;nginx要采用源码安装。安装按之后启动&#xff0c;可以访问到一个静态初始页面&#xff1b;然后安装php&#xff08;超…

可节省40%MCU开发成本的音乐睡眠灯语音扩展芯片方案N9300-S16

随着社会节奏的加快&#xff0c;人们每天的生活节奏也在不断的加快&#xff0c;工作压力也在不断的加大&#xff0c;越来越多的人都面临着失眠的痛苦&#xff0c;当拖着疲惫不堪的身体躺到床上时&#xff0c;却发现由于担忧每天的工作或月底需要交房租等问题&#xff0c;久久无…