基于GPT搭建私有知识库聊天机器人(六)仿chatGPT打字机效果

文章链接:

基于GPT搭建私有知识库聊天机器人(一)实现原理

基于GPT搭建私有知识库聊天机器人(二)环境安装

基于GPT搭建私有知识库聊天机器人(三)向量数据训练

基于GPT搭建私有知识库聊天机器人(四)问答实现

基于GPT搭建私有知识库聊天机器人(五)函数调用


在前几篇文章中,我们已经了解了如何使用 GPT 模型来搭建一个简单的聊天机器人,并在后端使用私有知识库来提供答案。

现在,我们将继续改进我们的聊天界面,实现类似chatGPT打字机的效果聊天,避免长时间等待接口数据返回,以提升用户体验。

1、效果展示

PS:一本正经的胡说八道

2、Server-Sent Events (SSE) 技术简介

在本篇文章中,我们将使用 SSE 技术来实现打字机效果输出。SSE 是一种 HTML5 技术,允许服务器向客户端推送数据,而不需要客户端主动请求。通过 SSE,我们可以在服务器端有新消息时,实时将消息推送到前端,从而实现动态的聊天效果。

3、前端代码

首先,我们需要编写前端的JavaScript 代码,以便使用 SSE 技术与服务器进行实时通信。

<!DOCTYPE html>
<html>
<head><title>ChatGPT-like Interface</title><link rel="stylesheet" href="static/styles.css">
</head>
<body><div class="chat-container"><div class="chat-history" id="chatHistory"><!-- Chat messages will be dynamically added here --></div><div class="user-input"><input type="text" id="userInput" placeholder="请输入您的问题..."><button id="sendButton">发送</button></div></div><script>// Your existing chat interface code here...// Server communication codevar eventSource; // Declare the eventSource variable outside the click handlerdocument.getElementById("sendButton").addEventListener("click", function () {var userMessage = document.getElementById("userInput").value.trim();if (userMessage === '') {alert('Please enter a message!');return;}appendMessage('user', userMessage); // Add the user's message to the chat history// Close the previous SSE connection (if exists)if (eventSource) {eventSource.close();}// Establish SSE connection with the user's message as a parametereventSource = new EventSource(`/print_stream?question=${encodeURIComponent(userMessage)}`);eventSource.onmessage = function (event) {var botMessage = event.data;appendMessage('bot', botMessage);};eventSource.onerror = function (error) {console.error("Error occurred with SSE connection:", error);// Handle the error if necessaryisFirstToken = true;eventSource.close();};document.getElementById("userInput").value = '';});var chatHistoryDiv = document.getElementById("chatHistory"); // 获取 chatHistory 的元素var isFirstToken = true; // 用于跟踪是否是第一次返回 tokenfunction appendMessage(sender, message) {if (isFirstToken) {// 如果是第一次返回 token,创建新的 <div> 元素,并将 isFirstToken 设置为 falsevar messageDiv = document.createElement('div');messageDiv.className = `chat-message ${sender === 'user' ? 'user-message' : 'bot-message'}`;chatHistoryDiv.appendChild(messageDiv);if(sender === 'bot') {isFirstToken = false;}} else {// 如果不是第一次返回 token,直接获取最后一个 <div> 元素,将新的消息内容追加到现有的元素中var messageDiv = chatHistoryDiv.lastElementChild;}messageDiv.innerText += message; // 将新的消息内容追加到 <div> 中chatHistoryDiv.scrollTop = chatHistoryDiv.scrollHeight; // 将滚动条滚动到最底部}</script>
</body>
</html>

为了实现对话效果,我们需要调整 CSS 样式表中的部分样式。以下是 CSS 样式表:

body {font-family: Arial, sans-serif;background-color: #f0f0f0;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;min-height: 100vh;
}.chat-container {width: 800px;border: 1px solid #ccc;border-radius: 5px;box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);background-color: #fff;overflow: hidden;
}.chat-history {max-height: 800px;overflow-y: auto;padding: 10px;
}.chat-message {margin-bottom: 10px;padding: 8px 12px;border-radius: 20px;max-width: 70%; /* 设置最大宽度,使得消息在一行中不会过长 */align-self: flex-end; /* 靠右显示 */word-wrap: break-word; /* 处理长文本的自动换行 */overflow-wrap: break-word; /* 处理长文本的自动换行 */
}.user-message {color: #007bff;background-color: #e6e6e6; /* 用户消息气泡背景色 */text-align: right; /* 靠右显示文本内容 */align-self: flex-end; /* 靠右显示气泡 */margin-left: auto; /* 添加额外的间距,让气泡靠右 */
}.bot-message {color: #555;background-color: #d9edf7; /* 机器人消息气泡背景色 */text-align: left; /* 靠左显示文本内容 */align-self: flex-start; /* 靠左显示气泡 */margin-right: auto; /* 添加额外的间距,让气泡靠左 */
}.user-input {display: flex;align-items: center;padding: 10px;
}#userInput {flex-grow: 1;padding: 8px;border: 1px solid #ccc;border-radius: 5px;margin-right: 10px;
}#sendButton {padding: 8px 15px;border: none;border-radius: 5px;background-color: #007bff;color: #fff;cursor: pointer;
}#sendButton:hover {background-color: #0056b3;
}

4、后端代码

本文依旧使用的langchain框架实现访问openAI,以及利用回调函数接收token数据。

首先,是API入口:

from flask import Flask, request, Response, stream_with_context@app.route("/print_stream")
def print_stream():question = request.args.get('question')ans = search_schedule(question)return Response(stream_with_context(ans), content_type='text/event-stream')

其次,是访问openAI代码(不太了解的可以看下前几篇文章):

def search_schedule(query: str) -> str:stream_to_web = StreamToWeb()llm = ChatOpenAI(temperature=0,model="gpt-3.5-turbo-0613",callback_manager=CallbackManager([stream_to_web]),streaming=True)bus_tools = [BusTool()]open_ai_agent = initialize_agent(bus_tools,llm,agent=AgentType.OPENAI_FUNCTIONS,verbose=True)chain_thread = threading.Thread(target=process_query,kwargs={"question": query,"open_ai_agent": open_ai_agent})chain_thread.start()resp = stream_to_web.generate_tokens()return resp

注意:上面调用openai部分代码必须使用异步执行,才能做到一边接收返回token,一边返回前端,否则无法实现打字机效果。

最后,打字机效果核心代码:

class StreamToWeb(StreamingStdOutCallbackHandler):def __init__(self):self.tokens = []# 记得结束后这里置trueself.finish = Falsedef on_llm_new_token(self, token: str, **kwargs):self.tokens.append(token)def on_llm_end(self, response: any, **kwargs: any) -> None:self.finish = 1def on_llm_error(self, error: Exception, **kwargs: any) -> None:print(str(error))self.tokens.append(str(error))def generate_tokens(self):while not self.finish or self.tokens:if self.tokens:data = self.tokens.pop(0)yield f"data: {data}\n\n"else:pass

注意:yield f"data: {data}\n\n" ,data是前端接受数据的参数,\n\n在SSE要求中必须添加。

5、总结

通过使用 SSE 技术和打字机样式输出,我们成功改进了聊天机器人的界面,实现了更加动态和流畅的聊天体验。这样的用户界面使得聊天机器人更加接近真实对话,提升了用户体验。

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

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

相关文章

Js 如何实现一个类似 chatGPT 打字机效果

在使用chatGPT的时候,会有一个打字机的效果,以下是分别使用原生Js和Vue实现 原生 JS 实现 如下是示例代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Printer 打字机效果</title><style>* {margin: 0;bor…

自然语言大模型介绍

1 简介 最近一直被大语言模型刷屏。本文是周末技术分享会的提纲&#xff0c;总结了一些自然语言模型相关的重要技术&#xff0c;以及各个主流公司的研究方向和进展&#xff0c;和大家共同学习。 2 Transformer 目前的大模型基本都是Transformer及其变种。本部分将介绍Transf…

chatgpt赋能python:Python中怎么打开图片

Python中怎么打开图片 在Python中&#xff0c;打开并处理图片是常见的任务。本文将介绍如何使用Python打开和显示图像文件&#xff0c;以及一些其他关于处理图像的有用技巧。 打开图片 Python提供了许多库来处理图片。其中最流行的是Pillow和OpenCV&#xff0c;但是还有其他…

chatgpt赋能python:使用Python修改照片属性:让你的照片更美丽

使用Python修改照片属性&#xff1a;让你的照片更美丽 介绍 随着数字摄影的发展&#xff0c;人们不再满足于只是拍照&#xff0c;更追求照片的美感和创意。虽然相机和手机等设备都已经默认提供了各种滤镜和编辑功能&#xff0c;但有时它们并不能满足我们的要求。那么&#xf…

独家 | Scikit-LLM:Sklearn邂逅大语言模型

作者&#xff1a;Fareed Khan翻译&#xff1a;陈之炎 校对&#xff1a;赵茹萱本文约2600字&#xff0c;建议阅读8分钟 本文为您介绍文本分析的工具包Scikit-LLM。 标签&#xff1a;LLM Scikit-LLM是文本分析的游戏规则改变者&#xff0c;它将功能强大的ChatGPT语言模型和scikit…

LLM应用的技术栈与设计模式详解

大型语言模型是构建软件的强大新原语。 但由于它们是如此新&#xff0c;并且其行为与普通计算资源如此不同&#xff0c;因此如何使用它们并不总是显而易见的。 在这篇文章中&#xff0c;我们将分享新兴 LLM 应用程序的参考架构。 它展示了我们所见过的人工智能初创公司和先进科…

GPT模型微调教程:打造您专属的ChatGPT模型

一、前言 通过前面对大语言模型的介绍&#xff0c;我们了解到&#xff0c;其实像目前已经发布的一些主流大语言模型如OpenAI公司发布的的GPT-3.5、GPT-4、Google发布的Bard和PaLM 2多模态模型、Anthropic最近推出的Claude 2、亦或是国内清华大学联合智普AI发布的ChatGLM 2等都…

[AI医学] ChatDoctor:借助医学知识库生成微调样本构建医疗领域大模型

关键词&#xff1a;AI医疗&#xff0c;医疗大模型&#xff0c;chatdoctor&#xff0c;大模型finetuning&#xff0c;基于疾病知识库的数据生成 ChatDoctor 在LLaMA模型的基础上进行fine tuning训练&#xff0c;样本数据采用100k在线真实医患对话&#xff0c;同时加入自主知识…

LLM/ChatGPT与多模态必读论文150篇(已更至第100篇)

目录 前言 第一部分 OpenAI/Google的基础语言大模型(11篇&#xff0c;总11篇) 第二部分 LLM的关键技术&#xff1a;ICL/CoT/RLHF/词嵌入/位置编码/加速/与KG结合等(34篇&#xff0c;总45篇) 第三部分 Meta等公司发布的类ChatGPT开源模型和各种微调(7篇&#xff0c;总52篇) …

讲课大师 把微信消息同步转发到企业微信中

讲课大师现在可以把微信中的语音、文字、图片等消息&#xff0c;转播到企业微信中了。开发这个功能&#xff0c;花了快三周的时间&#xff0c;主要是各种事情把我弄得太苦逼&#xff0c;让我无法集中精力&#xff0c;感谢上海杜总红包的鼓励&#xff0c;现在终于可以发布第一个…

好文转载 【ChatGPT】ChatGPT+MindShow三分钟生成PPT

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 第一步&#xff1a;获取PPT内容大概&#xff1a; 1.打开ChatGPT镜像 2.向他提问&#xff0c;提问格式如下&#xff0c;主题替换成你想获得的信息。比如某本书的拆解&#xff0c;自媒…

全面上新!阿里 2023 版(Java 岗)面试突击手册,Github 已标星 37K

程序员面试背八股&#xff0c;几乎已经是互联网不可逆的一个形式了。自从面试**八股文火了之后&#xff0c;网上出现了不少 Java 相关的面试题&#xff0c;很多朋友盲目收集背诵&#xff0c;**但网上大部分的面试题&#xff0c;大多存在这几个问题&#xff1a;第一&#xff0c;…

来阿里一年后我迎来了第一次工作变动....

你怎么不更新啦&#xff1f;怎么最近动态也变少啦&#xff1f;都去干吗了&#xff1f;工作很忙么&#xff1f; 算起来我也阶段性停更一年半了&#xff0c;这一年半不仅是在不断尝试自媒体不同的内容和方向&#xff0c;工作上的巨大转变也推着我去学习尝试了很多全新的东西。 …

阿里P8新年自爆内部使用的十万字面试手册

这份面试手册本来是我们部门面试时自用的【大厂的员工很辛苦的&#xff0c;不仅要敲代码还要去帮忙内推和面试】&#xff0c;可后来越来越多的朋友找到我&#xff0c;让我帮他们给一些面试的资料和面试上的指引&#xff0c;而且这些关系也不太好拒绝&#xff0c;我本就不是那种…

946页神仙文档, 四面阿里斩获offer,直接定级P7级

前言 最近气温逐渐回暖&#xff0c;几个朋友聚在一起聊天的时候统一发现&#xff0c;新的一波招聘旺季&#xff0c;马上要到来&#xff0c;毕竟年一过就金三银四了&#xff0c;这次的招聘依旧竞争压力山大&#xff0c;作为一个开发人员&#xff0c;你是否面上了自己理想的公司…

阿里高效沟通的秘密:向上沟通,跨部门沟通,PREP汇报...这5招绝了!

点击“技术领导力”关注∆ 每天早上8:30推送 来源&#xff1a;淘系技术 作者&#xff1a;鲁佳(鹿迦) 世界上有两件最难的事&#xff1a;把别人的钱装进自己的口袋&#xff1b;把自己的思想装进别人的脑袋。 为什么沟通那么重要 谁都知道在工作中沟通是非常重要的&#xff0…

阿里巴巴6大行业报告免费分享啦!

云栖君导读&#xff1a;飞天战略营将全方位研究人工智能、大数据与关键行业的合作、联动&#xff01;更有前沿案例深度解读成功企业的发展突破点&#xff0c;帮你抢占科技红利&#xff01;全球前沿科技领域的热门新闻评论为你带来前瞻性、专业性的阅读体验&#xff01; 飞天战略…

聊聊我在阿里第一年375晋升的心得

前言 思来想去&#xff0c;觉得这个事情除了领导赏识大佬抬爱之外&#xff0c;还是挺不容易的&#xff0c;主观认为有一定的参考价值&#xff0c;然后也是复盘一下&#xff0c;继续完善自己。 绩效 首先晋升的条件就是要有个好绩效&#xff0c;那么我们就先基于绩效这个维度…

在阿里晋升3次,4年拿下P8岗位,这份pdf或许对你有帮助

前言&#xff1a; 每一个互联网工作者都拥有一个阿里梦&#xff0c;而这个阿里梦的实现&#xff0c;除了幸运&#xff0c;还要靠努力。 初入阿里&#xff0c;是P5的位置进去的&#xff0c;当时校招顺利&#xff0c;很快就接到阿里的意向书&#xff0c;最后成功入职阿里。这个职…

在阿里晋升3次,5年拿下P8岗位,这份pdf记录了我的整个成长过程

前言&#xff1a; 每一个互联网工作者都拥有一个阿里梦&#xff0c;而这个阿里梦的实现&#xff0c;除了幸运&#xff0c;还要靠努力。 初入阿里&#xff0c;是P5的位置进去的&#xff0c;当时校招顺利&#xff0c;很快就接到阿里的意向书&#xff0c;最后成功入职阿里。这个职…