创新实训(十三) 项目开发——实现用户终止对话功能

news2024/12/23 13:31:35

思路分析:

如何实现用户终止AI正在进行的回答?

分析实现思路如下:

  • 首先是在用户点击发送后,切换终止对话,点击后大模型终止对话,停止sse,不再接收后端的消息。
  • 同时因为对话记录存入数据库是后端的任务,所以这里也要在后端增加一个接口处理。

前端有三种情况:

  1. 还未接收到回答
    • 此时直接将对话内容切换为 (用户已终止回答)
    • 返回后端的doc和ans都为空
  2. 已经显示了知识库的检索内容doc,但是还未显示回答
    • 因为dac是一次生成的而不是多次拼接,所以doc只有 有和没有 两种情况
    • 返回后端的doc,ans置空
  3. 显示了回答
    • 终止接收sse,给answer拼接上“当前回答已经终止"。
    • 返回后端前端已经展示的answer,后端加入数据库作为历史记录

代码实现

因为后端插入是原子性插入,所以要同时返回用户请求问题和当前回答,接口设置如下:

class StopChat(BaseModel):
    conv_id: str
    query: str
    current_docs: List[str] | None = []
    current_ans: str | None = ''

button实现

首先实现点击发送后按钮的变化:

将发送按钮转变为停止,直到用户停止或者回答结束再改为发送

通过currentAiReply.value判断当前回答的状态,如果为true则表明ai正在回答,将按钮改为停止;如果为false表明当前暂时没有回答,button为发送。

实现changeButton方法如下:

//改变button状态
const changeButton= () =>{
  if(currentAiReply.value===true){
      button.value.text='停止';
      button.value.type='info';
  }
  else{
      button.value.text='发送';
      button.value.type='primary';
  }
}

在onSend(button点击方法)和ssechat的onclose中,在currentAiReply状态改变时分别调用该方法即可改变按钮状态。

用户终止回答

然后实现用户点击停止后终止ai回答,并回复后端此时ai生成内容

考虑到后端已经实现了拼接字符串,所以返回后端的doc和ans都是中断的原文,但是返回给用户的还是需要再次拼接上 “\n(用户已终止对话)\n”。

如何实现?

首先使用abort终止当前请求,并加上一个bool判断,终止字符串的拼接。

const controller = new AbortController();
const signal = controller.signal;

加上一个bool判断,终止字符串的拼接:

//用户是否终止当前回答: 默认为未终止
let isUserAbort = ref(false);

在sse的onmessage中加上判断,如果isUerAbort为false就继续拼接,否则不执行。

然后在onSend按钮中修改逻辑:

当回答处于第一种情况,还没有返回值时:也就是当前的AIReplay为 大模型正在生成回答,请耐心等待’,‘wait’);

  • 不做任何更改

当回答处于第二种情况时,有docs返回,但是还没有回答生成,修改docs为ssechat中的docs

//第二种情况,有docs返回,但是还没有回答生成
    else if(latestMsg.aiType==='docs'){
      returnData.current_docs=currentDocs.value;
    }

第三种情况时,修改返回的docs和ans

    //第三种情况,有回答生成
    else if(latestMsg.aiType==='text'){
      //要记得添加docs
      returnData.current_docs=currentDocs.value;
      returnData.current_ans=latestMsg.content;
    }

接下来调用stopChat接口,如果返回值为200,分别对三种情况进行如下修改:

  • 第一种情况
if(latestMsg.aiType==='wait'){
	msgList.pop();
	AIReplay('(用户已终止对话)\n','text');
}
  • 第二种情况
if( latestMsg.aiType==='docs'){
	AIReplay('(用户已终止对话)\n','text');
}
  • 第三种情况
else if(latestMsg.aiType==='text'){
	latestMsg.content=latestMsg.content+'\n(用户已终止对话)\n';
}

最后改变按钮的状态:

currentAiReply.value=false;
changeButton();

关键点分析

实验的过程中我遇到了一些问题,主要有以下几点

  • aiType->type
  • docs的返回格式问题
aiType->type

尝试请求如下:

在这里插入图片描述

响应为:

{
    "code": 500,
    "msg": "终止对话失败",
    "data": {
        "error": "unsupported operand type(s) for +: 'NoneType' and 'str'"
    }
}

但是查看longchat的后端返回的200:

在这里插入图片描述

log输出发现,明明条件满足都是根本没有执行if中对三个状态的判断。

重新审查代码,意识到了msgList中设置了type和aiType,其中type是用来判断当前回答是用户的还是ai的,aiType是用来判断ai回答的类型,比如docs,text和wait。

将判断条件中的type改为aiType即可。

docs的返回格式问题

接口要求的docs格式为list,我的返回值是onMessage中得到的currentDocs.value=parsedData.data.docs;

成功调用接口,但是从历史记录重新进入问答,定位错误显示docs解析失败。

那就只有数据库的docs存储有问题。

查看正确可以解析的回答格式:

在这里插入图片描述

对比错误的回答格式,可以发现两个问题:

  • 当前的docs中少了键值对,是直接将list作为"docs"插入,缺少新的嵌套
  • 插入的是list而不是字符串

这两个问题都需要更改后端接口,更改如下:

# 在列表推导式中,将列表中的每个元素转换为字符串。
"docs":{"docs":[str(x) for x in sc.current_docs]}

重新运行,在第一种情况下点击终止时报错终止失败,报错如下:

在这里插入图片描述

这个是因为后端有校验,将current_docs的默认返回值改为[]即可

还有就是查看历史记录时,要考虑到用户终止后docs为空的情况,不输出,增加length判断即可:

if(docs.length!==0){
    extractTextFromSpan(docs)
    AIReplay('参考:\n'+docs.join(''),'docs');
}

测试问题:

  • 周易第一卦是什么?
  • 周易第二卦是什么?
  • 周易第三卦是什么?
  • 周易第四卦是什么?
  • 周易第五卦是什么?
  • 周易第六卦是什么?
  • 周易第七卦是什么?

实现效果

  • 第一种情况

在这里插入图片描述

  • 第二种情况

  • 第三种情况

在这里插入图片描述

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

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

相关文章

MySQL84 -- ERROR 1524 (HY000): Plugin ‘msql_native_password‘ is not loaded.

【问题描述】 MySQL 8.4版本,配置用户使用mysql_native_password认证插件验证用户身份,报错: 【解决方法】(Windows, MySQL 8.4) 1、修改MySQL配置文件my.ini,在[mysqld]段添加mysql_native_passwordON。 2、管理员…

FastAPI教程I

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…

计算机体系结构 量化研究方法

在第一章中看到关于微处理器中dynamic energy 和 dynamic power的定义觉得有些奇怪,特别记录一下。 上面的定义是取决于上下文的:动态能量可以理解为在一个时钟周期内,由电容充放电消耗的能量总和,而动态功率则是这种能量消耗在单…

运算放大器输出相位反转和输入过压保护

运算放大器输出电压相位反转 本教程讨论两个与运算放大器相关的话题:输出相位反转和输入过压保护。 超过输入共模电压(CM)范围时,某些运算放大器会发生输出电压相位反转问题。其原因通常是运算放大器的一个内部级不再具有足够的偏置电压而关闭&#xff…

面试-Redis常见场景

1.从海量的数据里查询某一固定前缀的key (1)keys pattern指令: 摸清数据规模(很重要) (2)cursor:游标 Scan cursor [MATCH pattern] [COUNT count] 可以无阻塞的提取出指定模式的key列表 基于游标的迭代器,需要基于上一次的游标延续之前的迭…

【仿真建模-anylogic】开发规范

Author:赵志乾 Date:2024-06-28 Declaration:All Right Reserved!!! 0. 说明 实际模型开发过程中,对遇到的问题进行总结归纳出以下开发规范,仅供参考! 1. 强制性规范 1…

云动态摘要 2024-06-28

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [新客专享]WeData 限时特惠 腾讯云 2024-06-21 数据分类分级管理,构建数据安全屏障 ,仅需9.9元! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器…

使用QGIS进行研究区域制图实战

目录 前言 一、QGIS的版本和数据介绍 1、关于QGIS版本 2、需要准备的数据 二、准备制图 1、制作全国区位图 2、矢量和遥感信息的编辑 三、出图编辑 1、设置主题信息 2、打印布局制作 3、美化地图 总结 前言 俗话说“一图胜千言”,在地理信息的领域中&…

“AI+”时代,群核科技进化成了家居设计打工人理想的样子

6月,2024世界智能产业博览会上,人工智能大模型展团以“AI大模型驱动新质生产力”为主题,各家企业纷纷提到了基于不同行业场景的应用。 这透露出当前的行业发展趋势强调大模型落地核心行业,产生业务价值。其中,“AI图像…

车辆轨迹预测系列 (五):Argoverse API Forecasting Tutorial代码解析

车辆轨迹预测系列 (五):Argoverse API Forecasting Tutorial代码解析 文章目录 车辆轨迹预测系列 (五):Argoverse API Forecasting Tutorial代码解析一、argoverse.data_loading.argoverse_forecasting_loader二、argoverse.visualization.visualize_seq…

MTK8786/MT8786芯片性能参数_规格书_datasheet

联发科MT8786(MTK8786)处理器采用了台积电12纳米FinFET技术,由2个Cortex A75核心和6个Cortex A55核心组成,其中大核A75主频为2.0GHz,GPU采用了ARM Mali-G52。MTK8786芯片设计极大地提升了智能设备的性能和安全等级。 MT8786采用了安全的ISP设…

如何将 ONLYOFFICE 文档 Linux 版更新到 v8.1

本指南将向您展示如何将 ONLYOFFICE 文档 Linux 版本更新到最新 8.1 版本。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书,可多人在线协作,支持 AI 集…

【2024大语言模型必知】做RAG时为什么要使用滑动窗口?句子窗口检索(Sentence Window Retrieval)是什么?

目录 1. 传统的向量检索方法,使用整个文档检索,为什么不行? 2.句子滑动窗口检索(Sentence Window Retrieval)工作原理 3.句子滑动窗口检索(Sentence Window Retrieval)的优点 1. 传统的向量检…

【高考志愿】集成电路科学与工程

目录 一、专业概述 二、课程设置 三、就业前景 四、适合人群 五、院校推荐 六、集成电路科学与工程专业排名 一、专业概述 集成电路科学与工程,这一新兴且引人注目的交叉学科,正在逐渐崭露头角。它集合了电子工程、计算机科学、材料科学等多个领域的…

ASUS/华硕天选5 FX607J系列 原厂Windows11系统

安装后恢复到您开箱的体验界面,带原机所有驱动和软件,包括myasus mcafee office 奥创等。 最适合您电脑的系统,经厂家手调试最佳状态,性能与功耗直接拉满,体验最原汁原味的系统。 原厂系统下载网址:http:…

c语言入门

c语言入门 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程…

AI大模型在短视频处理和剪辑中的应用

文章目录 🚀一、背景🚀二、视频处理方向 🔎2.1 视频分析与标注🔎2.2 视频剪辑与特效🔎2.3 视频内容生成与故事叙述🔎2.4 视频后期处理与发布 🚀三、AI视频处理书籍推荐 🔎3.1 知识要…

Qt自定义信号

1.Teacher类下定义信号signals: Student类下定义槽函数&#xff1a; Teacher.h #pragma once#include <QObject>class Teacher : public QObject {Q_OBJECTpublic:Teacher(QObject *parent);~Teacher(); signals:void Ask(); //老师向学生提问void Ask(QString str);…

@ComponentScan注解在Spring的作用

ComponentScan注解的作用是什么&#xff1f; 告知Spring扫描那些包下的类&#xff0c;可以配置includeFilters&#xff0c;excludeFilters&#xff0c;过滤某些类&#xff0c;更多内容可以具体看下此注解文件。 Spring是如何通过这个注解将类注入到Ioc容器中的&#xff1f; 请…

智慧的网络爬虫之CSS概述

智慧的网络爬虫之CSS概述 ​ CSS 是“Cascading Style Sheet”的缩写&#xff0c;中文意思为“层叠样式表”&#xff0c;用于描述网页的表现形式。如网页元素的位置、大小、颜色等。css的主要作用是定义网页的样式。 CSS样式 1. 行内样式 行内样式&#xff1a;直接定义在 HT…