创新实训(十三) 项目开发——实现用户终止对话功能
思路分析:
如何实现用户终止AI正在进行的回答?
分析实现思路如下:
- 首先是在用户点击发送后,切换终止对话,点击后大模型终止对话,停止sse,不再接收后端的消息。
- 同时因为对话记录存入数据库是后端的任务,所以这里也要在后端增加一个接口处理。
前端有三种情况:
- 还未接收到回答
- 此时直接将对话内容切换为 (用户已终止回答)
- 返回后端的doc和ans都为空
- 已经显示了知识库的检索内容doc,但是还未显示回答
- 因为dac是一次生成的而不是多次拼接,所以doc只有 有和没有 两种情况
- 返回后端的doc,ans置空
- 显示了回答
- 终止接收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');
}
测试问题:
- 周易第一卦是什么?
- 周易第二卦是什么?
- 周易第三卦是什么?
- 周易第四卦是什么?
- 周易第五卦是什么?
- 周易第六卦是什么?
- 周易第七卦是什么?
实现效果
- 第一种情况

- 第二种情况

- 第三种情况

相关文章:
创新实训(十三) 项目开发——实现用户终止对话功能
思路分析: 如何实现用户终止AI正在进行的回答? 分析实现思路如下: 首先是在用户点击发送后,切换终止对话,点击后大模型终止对话,停止sse,不再接收后端的消息。同时因为对话记录存入数据库是后…...
基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)
💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…...
LeetCode 53.最大子数组和(dp)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:…...
IOS17闪退问题Assertion failure in void _UIGraphicsBeginImageContextWithOptions
最近项目更新到最新版本IOS17,发现一个以前的页面突然闪退了。原来是IOS17下,这个方法 UIGraphicsBeginImageContext(CGSize size) 已经被移除,原参数如果size为0的话,会出现闪退现象。 根据说明,上述方法已经被替换…...
float8格式
产生背景 在人工智能神经元网络中,一个参数用1字节表示即可,或者说,这是个猜想:因为图像的颜色用8比特表示就够了,所以说,猜想神经元的区分度应该小于256。 数字的分配 8比特有256个码位,分为…...
云效BizDevOps上手亲测
云效BizDevOps上手亲测 什么是云效项目协作Projex配置2023业务空间原始诉求字段原始诉求工作流创建原始诉求配置2023产品空间创建主题业务原始诉求关联主题配置2023研发空间新建需求需求关联主题 与传统区别云效开发流程传统开发流程云效BizDevOps 操作体验 什么是云效 在说到…...
亚太杯赛题思路发布(中文版)
导读: 本文将继续修炼回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归…...
【Linux】部署 GitLab 服务
1、配置实验环境 安装git apt install git 安装docker apt install docker 安装tree apt install tree 2、安装 Gitlab 下载官方库与安装包 下载官方库的安装脚本 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bas…...
cs与msf权限传递以及mimikatz抓取win2012明文密码
启动服务端 进入客户端 建立监听 制作脚本 客户端运行程序 主机上线 打开msf 调用handler模块 创建监听 11.cs->msf 传递会话 12.传参完成 msf->cs会话传递 抓取密码(null) 修改注册表 shell reg add "HKEY_LOC…...
C++ 矩阵的最小路径和解法
描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。 数据范围: 1≤𝑛,𝑚≤5001≤n,m≤500,矩阵中任意值都满足 0≤𝑎𝑖,𝑗≤1000≤ai,j≤100 要求…...
http服务网络请求如何确保数据安全(含python示例源码)
深度学习类文章回顾 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整体流程…...
网络构建关键技术_2.IPv4与IPv6融合组网技术
互联网数字分配机构(IANA)在2016年已向国际互联网工程任务组(IETF)提出建议,要求新制定的国际互联网标准只支持IPv6,不再兼容IPv4。目前,IPv6已经成为唯一公认的下一代互联网商用解决方案&#…...
数仓建模—数据生命周期管理
数仓建模—数据生命周期管理 数据生命周期管理 (DLM) 是一种在从数据输入到数据销毁的整个生命周期内管理数据的方法。 数据根据不同的条件分处不同的阶段,随着其完成不同的任务或满足特定要求而逐次经历这些阶段。 一个出色的 DLM 流程提供针对企业数据的结构和组织,帮助实…...
【INTEL(ALTERA)】Nios II软件开发人员手册中设计位置的错误示例
目录 说明 解决方法 说明 Nios II软件开发人员手册正确无误 请参阅 Nios 中包含的Nios II硬件设计示例 II 嵌入式设计套件 (EDS)。提供设计示例 设计上 Altera网站的示例页面。 Nios II软件开发人员手册正确无误 请参阅 创建本应用程序和创建本 bsp …...
jeecg导入excel 含图片(嵌入式,浮动式)
jeecgboot的excel导入 含图片(嵌入式,浮动式) 一、啰嗦二、准备三、 代码1、代码(修改覆写的ExcelImportServer)2、代码(修改覆写的PoiPublicUtil)3、代码(新增类SAXParserHandler&a…...
GPT-5 一年半后发布?对此你有何期待?
GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,…...
SHELL脚本学习(十二)sed进阶
一、多行命令 概述 sed 编辑器的基础命令都是对一行文本进行操作。如果要处理的数据分布在多行中,sed基础命令是没办法处理的。 幸运的是,sed编辑器的设计人员已经考虑了这个问题的解决方案。sed编辑器提供了3个处理多行文本的特殊命令。 命令描述N加…...
【python】一篇文零基础到入门:快来玩吧~
本笔记材料源于: PyCharm | 创建你的第一个项目_哔哩哔哩_bilibili Python 语法及入门 (超全超详细) 专为Python零基础 一篇博客让你完全掌握Python语法-CSDN博客 0为什么安装python和pycharm? 不同于c,c࿰…...
Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六)
Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六) 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装,我们进入 ThinkPHP漏洞环境,可以 cd ThinkPHP,然后通过 …...
2024.6.28刷题记录
目录 一、13. 罗马数字转整数 贪心 二、16. 最接近的三数之和 排序指针 三、17. 电话号码的字母组合 dfs(深度优先搜索) 四、19. 删除链表的倒数第 N 个结点 1.模拟 2.前后同步指针 五、20. 有效的括号 栈 六、21. 合并两个有序链表 1.递归 …...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
