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

思路分析:

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

分析实现思路如下:

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

前端有三种情况:

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

代码实现

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

class StopChat(BaseModel):conv_id: strquery: strcurrent_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'){//要记得添加docsreturnData.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.mzph.cn/web/36567.shtml

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

相关文章

2小时动手学习扩散模型(pytorch版)【入门版】【代码讲解】

2小时动手学习扩散模型(pytorch版) 课程地址 2小时动手学习扩散模型(pytorch版) 课程目标 给零基础同学快速了解扩散模型的核心模块,有个整体框架的理解。知道扩散模型的改进和设计的核心模块。 课程特色&#xf…

基于VMware的linux操作系统安装(附安装包)

目录 一、linux操作系统下载链接 二、开始导入镜像源 注:若是还没安装VMware请转到高效实现虚拟机(VMware)安装教程(附安装包)-CSDN博客 一、linux操作系统下载链接 1.官网链接下载 ubuntu:ubuntu官网…

港湾周评|胖东来为什么是胖东来?蜜雪冰城为什么差之千里?

《港湾商业观察》李镭 似乎每一次胖东来的热搜,都堪称为教科书般化不利为有利,变坏事为好事。 6月27日凌晨,“胖东来商贸集团”官方公众号发布《关于新乡胖东来餐饮商户“擀面皮加工场所卫生环境差”的调查报告》,对于帮助其发现…

【C++ | 类型转换】转换构造函数、类型转换运算符 详解及例子源码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…

git 代码回退 soft hard区别

一:只是本地修改提交到本地版本库仓库,代码如何回退 git hard 回退 会清除掉 你当前修改的所有文件代码内容 或添加的新文件 把当前文件恢复到没有修改前的状态 git soft 回退 不会清除掉 你当前修改的所有文件代码内容 或添加的新文件 把当前文件恢复到当时修改时的状…

Linux /proc目录总结

1、概念 在Linux系统中,/proc目录是一个特殊的文件系统,通常被称为"proc文件系统"或"procfs"。这个文件系统以文件系统的方式为内核与进程之间的通信提供了一个接口。/proc目录中的文件大多数都提供了关于系统状态的信息&#xff0…

Linux容器篇-Docker容器的使用

文章目录 前言一、Docker的安装主机环境准备关闭防火墙关闭selinux时间同步关闭 swap配置操作系统yum源配置国内Docker-ce镜像源注意 二、安装docker-ce三、配置镜像加速器阿里云镜像加速器生成 四、Docker的使用Docker 客户端获取镜像启动容器查看所有的容器:启动已…

【Python】已解决:ModuleNotFoundError: No module named ‘LAC‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ModuleNotFoundError: No module named ‘LAC‘ 一、分析问题背景 在开发或运行Python程序时,可能会遇到各种各样的报错,其中“ModuleNo…

安装OpenHarmony编译库和工具集

一、搭建开发环境 1.1、Ubuntu搭建,参考 VMware完美安装Ubuntu20.04-CSDN博客文章浏览阅读286次,点赞5次,收藏3次。详细介绍了VMware下安装Ubuntu20.04https://blog.csdn.net/longyuzi/article/details/139935769 1.2、拉取OpenHarmony源码…

Android studio Logcat 功能介绍

介绍 Android Studio Jellyfish版本下logcat功能,不同的tag会有不同的颜色,不同level等级的log默认也有不同的颜色。log过滤修改的更简洁了,原先的log视图只需要勾选就可以选择不同level的log了,当前需要在输入框中进行过滤器匹配…

正版软件 | R-Studio Corporate:企业级数据恢复的终极解决方案

数据是企业的生命线,而数据丢失可能随时威胁到企业的正常运营。R-Studio Corporate 是一款专为企业环境设计的多功能数据恢复软件,确保您在面临数据危机时,能够迅速、高效地恢复宝贵数据。 跨平台操作,灵活恢复 R-Studio Corporat…

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计(AI与学术的交响:ChatGPT辅助下的实验设计新篇章)。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…

【一生一芯】笔记

文章目录 一级目录二级目录三级目录缓存的验证 一级目录 二级目录 三级目录 缓存的验证

阿里云 CosyVoice 语音合成大模型 API 实践

前言 最近大模型这么火,就想着玩一下,作为非 AI 从业者,最好的方式就是调用云服务的 API 来构建自己的 AI 应用。首选当然是国外的 ChatGPT API,但是说实话那个玩意有点贵,而且最近国内也被封禁不让调用了&#xff0c…

计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计

酒店推荐系统开题报告 一、研究背景与意义 随着旅游业的蓬勃发展和人们生活水平的提高,酒店行业迎来了前所未有的发展机遇。然而,面对众多的酒店选择,消费者往往难以在短时间内找到最适合自己需求和预算的酒店。因此,开发一款高…

晋级国赛!卓翼飞思技术引领,助力辽宁赛区机器人及人工智能大赛圆满收官

近日,第二十六届中国机器人及人工智能大赛—辽宁赛区选拔赛在大连海事大学圆满收官。本次大赛吸引来自辽宁工业大学、大连理工大学等知名高校的10余支队伍参与,充分展现各高校在机器人及人工智能领域的深厚实力和创新精神。其中,由卓翼飞思实…

【排序算法】—— 希尔排序

目录 一、希尔排序原理 二、希尔排序的思路 三、希尔排序为什么快 四、如何取增量 五、源码 希尔排序是简单插入排序的一种升级版,它也是用了插入的思想,而插入排序相比冒泡排序和选择排序的效率要高的多,再将它优化为希尔排序后效率跟原…

51单片机STC89C52RC——12.1 数据存储芯片AT24C02

目的/效果 利用存储芯片AT24C02存储数据,LCD1602显示存储的数据。 一,STC单片机模块 二,AT24C02存储芯片 2.1 介绍 AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功…

通讯录管理系统——查找联系人

功能描述:按照姓名查看指定联系人的信息 查看联系人实现步骤 1.封装查找联系人函数 2.测试查找指定联系人 一、封装查找联系人函数 实现思路:判断用户指定的联系人是否存在,如果存在,显示信息,不存在提示查无此人…

如何在FastAPI服务器中添加黑名单和白名单实现IP访问控制

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 添加黑名单功能步骤1:安装依赖步骤2:创建FastAPI应用步骤3:添加黑名单📝 添加白名单功能步骤1:创建白名单列表步骤2:添加白名单检查⚓️ 相关链接 ⚓️📖 介绍 📖 在现代网络应用开发中,为了增强…