SparkDesk知识库 + ChuanhuChatGPT前端 = 实现轻量化知识库问答

上一篇 讯飞星火知识库文档问答Web API的使用(二)
把星火知识库搞明白了;
然后又花了时间学习了一下gradio的一些基础内容:
在Gradio实现两个下拉框进行联动案例解读:change/click/input实践(三)
在Gradio实现分栏、分页的效果(二)
Gradio的重要函数以及一些代码示例学习(一)

好了,终于可以把笔者最终的想法开始实践了:

SparkDesk知识库 + ChuanhuChatGPT前端 = 实现轻量化知识库问答
为什么有这个想法,是因为…笔者穷啊,没有GPU,搞不了Langchain-Chatchat;搞向量数据库麻烦;PDF文档分chunk也是个技术活,一个人做搞到头发花白了去
笔者设想的是,借大厂的力,随便拉个机器就可以实现大数据知识库,岂不是美哉

目前实现的效果:
在这里插入图片描述
目前需要的功能:

  • 右侧改造【知识库】栏目
    • 新增PDF【上传星火】 的功能
    • 新增根据上传文档进行【文档总结】功能
    • 新增根据输入内容进行问答
  • 【文档总结】和【文档问答】都在中间的对话框显示,且在对话的第一行显示[文档问答] [问答总结]的提示字样

当然你直接用大厂的也是可以的:

在这里插入图片描述


文章目录

  • 1 星火知识库大致页面架构
  • 2 文档问答的输出内容打在对话框中


1 星火知识库大致页面架构

详细可以参考:在Gradio实现两个下拉框进行联动案例解读:change/click/input实践(三)

笔者是设想在右侧加一个知识库上传、知识文档选择的下拉框,然后再主对话框进行对话:

在这里插入图片描述
在与ChuanhuChatGPT结合前,自己先搭了一个大致的框架:

具体效果如下:

上传模块:
在这里插入图片描述

文档总结模块:

在这里插入图片描述

问答模块:
在这里插入图片描述

具体代码我放在了github里面:sparkdesk_document_qa_test.py

因为笔者之前对Gradio一无所知,这里本篇就稍微提一些笔者在实践中的一些特别点

    # 上传星火def upload_button_func(index_files):# 输入:无输入项# 输出:更新【一级下拉】选项,【二级下拉】置空# 触发方式: click点击行为global valid_files_groupfor file in index_files:# file_path = 'aigc相关报告/AIGC+AI生成内容产业展望报告-量子位-34页.pdf'print(file.name)files = {'file': open(file.name, 'rb')}body = {"url": "","fileName": file.name.split('/')[-1],"fileType": "wiki",     # 固定值"needSummary": False,"stepByStep": False,"callbackUrl": "your_callbackUrl",}response = dus.upload_files(files,body)# 赋值valid_files_group[file.name.replace('\\','/').split('/')[-1]] = response.json()["data"]["fileId"]# for file in index_files:#     valid_files_group[file.name.replace('\\','/').split('/')[-1]] = 'fileid'return gr.Dropdown.update(choices=list(valid_files_group.keys()),value = list(valid_files_group.keys())[0]  ),\gr.Dropdown.update(choices=list(valid_files_group.keys()),value = list(valid_files_group.keys())[0]  )upload_button.click(upload_button_func, [index_files], [FileSelectDropdown_first,FileSelectDropdown])

以上传模块为例,主要就是定义这个【上传星火】按钮的输入、输出;
这里的输入项是拖放文件的名地址;输出是:更新+新增下面【文档总结】【文档问答】两个下拉框
在这里插入图片描述
当用户执行上传之后,或者多个文件上传后:

index_files = gr.Files(label="上传", type="file", elem_id="upload-index-file")

之前定义的index_files此时收到的是带一连串绝对路径的文件名列表,比如:

["c:/a/b/c.pdf","c:/a/b/e.pdf"]

之后输出的时候更新下拉框,就直接使用gr.Dropdown.update更新choices以及默认选项value

gr.Dropdown.update(choices=list(valid_files_group.keys()),value = list(valid_files_group.keys())[0]  )

2 文档问答的输出内容打在对话框中

在这里插入图片描述
这里有一个问题就是点击[文档总结]后,希望将输出内容显示在中间的主对话框之中,此时就需要了解gr.chatbot的一些功能。

其中ChuanhuChatGPT项目中,中间的对话是由gr.chatbot构造:

 chatbot = gr.Chatbot(label="Chuanhu Chat",elem_id="chuanhu-chatbot",latex_delimiters=latex_delimiters_set,# height=700,show_label=False,avatar_images=[config.user_avatar, config.bot_avatar],show_share_button=False,)

那么需要的功能就只有在点击【文档总结】的时候,输出在gr.chatbot中即可,那么大概可以改造:

# 文档总结
def doc_summary_button_func(FileSelectDropdown_first,chatbot):# 输入:无输入项# 输出:更新【一级下拉】选项,【二级下拉】置空# 触发方式: click点击行为fileid = valid_files_group[FileSelectDropdown_first]# print('fileid',fileid)response = dus.file_summary(fileid)summary = response.json()# spark_output_text = f"文件名是:{'++'.join(FileSelectDropdown)},输入是:{SparkInputText}"print('summary',summary)if (summary['code'] == 0)&(summary['data']==summary['data']):      return chatbot+[['[文档总结]\n'+ FileSelectDropdown_first,summary['data']['summary']]]else:return chatbot+[['[文档总结]\n'+ FileSelectDropdown_first,f'未调用成功,报错输出为:{str(summary)}']]doc_summary_btn.click(doc_summary_button_func, [FileSelectDropdown_first,chatbot], [chatbot])

其实就是把【1 星火知识库大致页面架构】里面的return到gr.chatbot
不过要传给chatbot,需要的是一个列表,大致为:

[("用户提问1","回答1"),("用户提问2","回答2")]

关于gr.chatbot可以在 Gradio的重要函数以及一些代码示例学习(一) 细究

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

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

相关文章

49-设计问题-最小栈

原题链接: 198. 打家劫舍 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入&a…

作为IT行业的过来人,宝贵的经验分享给刚入行的你

恍然间,发现自己已经在这个行业五年之久,回顾过往,思绪良多,一路走来,或多或少都经历过一些坎坷,也碰到过不少大大小小的困难。在此就不多加叙述了。 本篇文章主要想写给刚入门的程序员几个忠告&#xff0…

vue项目门店官网页面, 根据视口大小自动跳转页面逻辑(pc --> mobile / mobile -->pc)

vue门店官网页面, 根据视口大小自动跳转页面逻辑(pc --> mobile / mobile -->pc) 在app.html文件添加以下代码逻辑 pc --> mobile // PC切换M端 ;(function () {function resizeEventHandler() {var isMobile /(iPhone|iPad|iPod|iOS|Android)/i.test(window.navig…

数据结构与算法编程题27

计算二叉树深度 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }BiTNo…

2023中学生古诗文阅读专辑(初中适用)使用和备考的几点建议

上周六的2023年第八届小学生古诗文大会复选结束后&#xff0c;很多孩子和家长大呼“太难了”&#xff0c;平时刷的题好像都没用&#xff0c;蓦然回首&#xff0c;发现很多题目都在主办方出版的《古诗文阅读专辑》上&#xff0c;只是考得非常的细。 所以&#xff0c;昨天有家长在…

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(系统概述与环境搭建)

计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现&#xff08;系统概述与环境搭建&#xff09; 该项目分析着重于设计和实现基于SpringBootMyBatis框架的电脑商城。首先&#xff0c;通过深入分析项目所需数据&#xff0c;包括用户、商品、商品类别、收藏、订单…

Vue组件的自定义属性Props

Vue的组件相当于HTML中的自定义标签&#xff0c;与HTML标签属性对应的概念就是组件的Props。组件的Props是给父组件使用的&#xff0c;使用时需要明确指定属性的值&#xff0c;或者是在组件定义时&#xff0c;给属性提供默认值。组件对象使用Props时&#xff0c;要更多的地应用…

基于C#实现十字链表

上一篇我们看了矩阵的顺序存储&#xff0c;这篇我们再看看一种链式存储方法“十字链表”&#xff0c;当然目的都是一样&#xff0c;压缩空间。 一、概念 既然要用链表节点来模拟矩阵中的非零元素&#xff0c;肯定需要如下 5 个元素(row,col,val,down,right)&#xff0c;其中&…

初识数据结构

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 熬过了我们不想要的生活&#xf…

麒麟V10服务器搭建FTP服务

概念 1.1介绍 FTP&#xff1a;File transfer protocol 文件传输协议 1.2原理 默认采用被动模式 被动模式FTP 为了解决服务器发起到客户的连接的问题&#xff0c;人们开发了一种不同的FTP连接方式。这就是所谓的被 动方式&#xff0c;或者叫做PASV&#xff0c;当客户端通…

删除巨大文本文件的最后一行

用truncate去年最后的字节数。 export file"abc.json"tail -n 1 "$file" | wc -c | xargs -I {} truncate "$file" -s -{}mac上面truncate需要安装一下。 参考&#xff1a; Remove the last line from a file in Bash - Stack Overflow

Vue路由器(详细教程)

路由&#xff1a; 1.理解&#xff1a;一个路由(route)就是一组映射关系&#xff08;key-value)&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。 2.前端路由&#xff1a;key是路径&#xff0c;value是组件。 1、先安装vue-router路由 npm i vue-route…

车载通信架构 —— 传统车内通信网络LIN总线(低成本覆盖低速场景)

车载通信架构 —— 传统车内通信网络LIN总线(低成本覆盖低速场景) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是…

go的HTTP网络编程

欢迎大家到我的博客浏览。go的HTTP网络编程 | YinKais Blog go的HTTP网络编程 1、http编程--server示例 package main ​ import ("fmt""net/http" ) ​ func main() {// 注册处理函数&#xff0c;定义 URL 路由和对应的处理函数http.HandleFunc("…

redisserver一闪而过 redis闪退解决版本

1.进入Redis根目录 2.输入redis-server 或 redis-server.exe redis.windows.conf 启动redis命令&#xff0c;看是否成功。 执 一闪而过的问题 可能是因为已启动或者其他问题&#xff0c;需要重启 先输入redis-cli.exe再输入shutdown再输入redis-server.exe redis.windows.c…

扩散模型实战(十二):使用调度器DDIM反转来优化图像编辑

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

ajax请求接口数据和显示在页面里 Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法

$.ajax({ url:"这里是你要请求的地址", data:{"id":id}, //以键/值对的形式 async : false, dataType : "json", success : function(data) { for(int i 0; i < data.length; i) { //循环后台传过来的Json数组 var datas data…

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(用户上传头像+用户收货管理)

计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现&#xff08;用户上传头像&#xff09; 该项目分析着重于设计和实现基于SpringBootMyBatis框架的电脑商城。首先&#xff0c;通过深入分析项目所需数据&#xff0c;包括用户、商品、商品类别、收藏、订单、购物…

redisson实现分布式锁(支持redis单例/集群)

redisson实现分布式锁 前言一、引入redisson依赖二、redis 配置三、redisson 配置1.集群配置2.单例配置 四、分布式锁使用-业务层demo 前言 还是在工作中遇到的问题&#xff1a; 1&#xff1a;新增商铺信息时&#xff0c;同一个商铺有多条信息。 异步的情况&#xff0c;根据商…

NX二次开发UF_CURVE_ask_parameterization 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_parameterization Defined in: uf_curve.h int UF_CURVE_ask_parameterization(tag_t object, double param_range [ 2 ] , int * periodicity ) overview 概述 Retu…