当前位置: 首页 > news >正文

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

  • 前言
  • 本篇摘要
  • 11. Chatbot:融合大模型的多模态聊天机器人
    • 11.4 使用Blocks创建自定义聊天机器人
      • 11.4.1 简单聊天机器人演示
      • 11.4.2 流式传输Chatbot
      • 11.4.3 添加Markdown、Images、Audio或Videos
    • 参考文献

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,可以使用机器学习模型、python函数或API开发多功能界面和部署人工智能模型,是当前热门的非常易于展示机器学习大语言模型LLM及扩散模型DM的WebUI框架。
本系列文章分为前置概念、安装运行与部署、Gradio高级特性、基础功能实战和高级功能实战五部分。第一部分前置概念:先介绍Gradio的详细技术架构、历史、应用场景、与其他框架Gradio/NiceGui/StreamLit/Dash/PyWebIO的区别,然后详细介绍了著名的资源网站Hugging Face,因为Gradio演示中经常用到Hugging Face的models及某些场景需要部署在spaces,这里主要包括三类资源models/datasets/spaces的使用以及六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum实战。第二部分安装运行与部署:讲解多种不同的安装、运行和部署方式,安装包括Linux/Win/Mac三类系统安装,运行包括普通方式和热重载方式,部署包括本地部署、HuggingFace托管、FastAPI挂载和Gradio-Lite浏览器集成。第三部分Gradio高级特性:按照先整体再细节的逻辑,讲解Gradio的多种高级特性,包括三种Gradio Clients(python/javascript/curl)、Gradio Tools、Gradio的模块架构和环境变量等,方便读者对Gradio整体把握。第四部分基础功能实战:深入细节,也是本系列文章的核心,实践基础功能Interface、Blocks和Additional Features。第五部分高级功能实战:详解高级功能Chatbots、Data Science And Plots和Streaming。
本系列文章讲解细致,涵盖Gradio大部分组件和功能,代码均可运行并附有大量运行截图,方便读者理解并应用到开发中,Gradio一定会成为每个技术人员实现各种奇思妙想的最称手工具。

本系列文章目录如下:

  1. 《Gradio全解1——Gradio简介》
  2. 《Gradio全解1——Gradio的安装与运行》
  3. 《Gradio全解2——剖析Hugging Face:详解三类资源models/datasets/spaces》
  4. 《Gradio全解3——剖析Hugging Face:实战六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum》
  5. 《Gradio全解4——Gradio的3+1种部署方式实践》
  6. 《Gradio全解4——浏览器集成Gradio-Lite》
  7. 《Gradio全解5——Gradio Client:python客户端》
  8. 《Gradio全解5——Gradio Client:javascript客户端》
  9. 《Gradio全解5——Gradio Client:curl客户端》
  10. 《Gradio全解6——Gradio Tools:将Gradio用于LLM Agents》
  11. 《Gradio全解7——Gradio库的模块架构和环境变量》
  12. 《Gradio全解8——Interface:高级抽象界面类(上)》
  13. 《Gradio全解8——Interface:高级抽象界面类(下)》
  14. 《Gradio全解9——Blocks:底层区块类(上)》
  15. 《Gradio全解9——Blocks:底层区块类(下)》
  16. 《Gradio全解10——Additional Features:补充特性(上)》
  17. 《Gradio全解10——Additional Features:补充特性(下)》
  18. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(1)》
  19. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(2)》
  20. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3)》
  21. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(4)》
  22. 《Gradio全解系列12——Data Science And Plots:数据科学与绘图》
  23. 《Gradio全解13——Streaming:数据流(上)》
  24. 《Gradio全解13——Streaming:数据流(下)》

本篇摘要

本篇介绍如何使用Gradio创建聊天机器人,主要内容包括gr.ChatInterface快速创建Chatbot、与流行LLM库及API结合、组件Chatbot及消息格式ChatMessage、使用Blocks创建Chatbot、Chatbot的特殊Events、使用Agents和Tools智能代理工具、通过Gradio应用创建Discord Bot/Slack Bot/Website Widget。

11. Chatbot:融合大模型的多模态聊天机器人

本章介绍如何使用Gradio创建聊天机器人。聊天机器人是大型语言模型(LLMs)的一个流行应用,通过Gradio,我们可以轻松构建LLM演示并与其它用户分享,或者自己使用直观的聊天机器人界面进行开发尝试。本章主要内容包括gr.ChatInterface快速创建Chatbot、与流行LLM库及API结合、组件Chatbot及消息格式ChatMessage、使用Blocks创建Chatbot、Chatbot的特殊Events、使用Agents和Tools智能代理工具、通过Gradio应用创建Discord Bot/Slack Bot/Website Widget。

11.4 使用Blocks创建自定义聊天机器人

重要提示:如果是初学者,建议使用gr.ChatInterface来创建聊天机器人——这是一个高级抽象,通常只需一行代码,就可以快速创建漂亮的聊天机器人应用程序,请读者参照本章第一节和第二节内容。

有了上一节的知识储备后,本节就可以展示如何使用Gradio的底层Blocks API从头开始构建聊天机器人用户界面,这将使你能够完全控制聊天机器人UI。我们将首先创建一个简单的聊天机器人来显示文本,然后创建一个可以流式传输文本响应的聊天机器人,最后创建一个能够处理媒体文件的聊天机器人。

前提条件:我们将使用gradio.Blocks类来构建我们的聊天机器人演示。如果读者还不熟悉它,可以先阅读《Blocks:底层区块类》。此外,请确保使用最新版本Gradio:pip install --upgrade gradio。

11.4.1 简单聊天机器人演示

让我们从创建简单演示开始,机器人只是随机响应"How are you?"、"Today is a great day"或 “I’m very hungry” 来回应任何输入。以下是使用Blocks创建此功能的代码:

import gradio as gr
import random
import timewith gr.Blocks() as demo:chatbot = gr.Chatbot(type="messages")msg = gr.Textbox()clear = gr.ClearButton([msg, chatbot])def respond(message, chat_history):bot_message = random.choice(["How are you?", "Today is a great day", "I'm very hungry"])chat_history.append({"role": "user", "content": message})chat_history.append({"role": "assistant", "content": bot_message})time.sleep(2)return "", chat_historymsg.submit(respond, [msg, chatbot], [msg, chatbot])demo.launch()

运行界面如下:
在这里插入图片描述
这里使用了三个Gradio组件:

  • Chatbot:它的值存储了整个对话的历史记录,作为用户和机器人之间响应对的列表;
  • Textbox:用户可以在其中输入消息,然后按回车/提交以触发聊天机器人的响应;
  • ClearButton:用于清除文本框和整个聊天机器人历史记录的按钮。

我们有一个函数respond(),它接收聊天机器人的整个历史记录,然后附加一条随机消息,等待2秒钟后返回更新后的聊天历史记录,respond()函数在返回时还会清除文本框。当然在实际应用中,可以将respond()替换为自己更复杂的函数,该函数可能会调用预训练模型或API来生成响应。

11.4.2 流式传输Chatbot

我们可以通过几种方式改进上述聊天机器人的用户体验:首先,我们可以使用流式传输响应,这样用户在生成消息时不必等待太长时间;其次,我们可以在生成聊天机器人的响应时,让用户的消息立即显示在聊天历史记录中。以下是实现此功能的代码:

import gradio as gr
import random
import timewith gr.Blocks() as demo:chatbot = gr.Chatbot(type="messages")msg = gr.Textbox()clear = gr.Button("Clear")def user(user_message, history: list):return "", history + [{"role": "user", "content": user_message}]def bot(history: list):bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])history.append({"role": "assistant", "content": ""})for character in bot_message:history[-1]['content'] += charactertime.sleep(0.05)yield historymsg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(bot, chatbot, chatbot)clear.click(lambda: None, None, chatbot, queue=False)demo.launch()

运行界面如下:
在这里插入图片描述
请注意,此时的消息是流式输出的。另外,当用户提交消息时,通过.then()链式调用两个事件:

  • 第一个方法user():使用用户消息更新聊天机器人并清空输入框。因为我们希望立即执行此操作,所以设置queue=False,这将跳过任何已启用的队列,聊天机器人的历史记录会附加 {“role”: “user”, “content”: user_message}。
  • 第二个方法bot():用机器人的响应更新聊天历史记录。最后我们逐字符构建消息,并在构建过程中生成中间输出。Gradio会自动将任何带有yield关键字的函数转换为流式输出界面,并且yield输出只传递与上一条消息的差异。

当然在实际应用中,我们可以将bot()替换为自己更复杂的函数,该函数可能会调用预训练模型或API来生成响应。

11.4.3 添加Markdown、Images、Audio或Videos

gr.Chatbot组件支持部分Markdown语法,包括加粗、斜体和代码。例如,我们可以编写一个函数,用加粗的“That’s cool!”来响应用户的消息,如下所示:

def bot(history):response = {"role": "assistant", "content": "**That's cool!**"}history.append(response)return history

此外,它还可以处理媒体文件,例如图片、音频和视频。我们可以使用MultimodalTextbox组件轻松上传所有类型的媒体文件到chatbot,还可以通过传递sources参数进一步自定义MultimodalTextbox,该参数是一个启用的来源列表。要传递媒体文件,我们必须将文件作为字典传递,其中path键指向本地文件,alt_text键是可选的,因此可以只传递一个包含单个元素的元组{“path”: “filepath”},如下所示:

def add_message(history, message):for x in message["files"]:history.append({"role": "user", "content": {"path": x}})if message["text"] is not None:history.append({"role": "user", "content": message["text"]})return history, gr.MultimodalTextbox(value=None, interactive=False, file_types=["image"], sources=["upload", "microphone"])

将这些结合起来,我们就可以创建一个多模态聊天机器人,并使用多模态文本框让用户提交文本和媒体文件。其余代码看起来与之前几乎相同:

import gradio as gr
import time# Chatbot demo with multimodal input (text, markdown, LaTeX, code blocks, image, audio, & video). Plus shows support for streaming text.def print_like_dislike(x: gr.LikeData):print(x.index, x.value, x.liked)def add_message(history, message):for x in message["files"]:history.append({"role": "user", "content": {"path": x}})if message["text"] is not None:history.append({"role": "user", "content": message["text"]})print(message)return history, gr.MultimodalTextbox(value=None, interactive=False)def bot(history: list):response = "**That's cool!**"history.append({"role": "assistant", "content": ""})for character in response:history[-1]["content"] += charactertime.sleep(0.05)yield historywith gr.Blocks() as demo:chatbot = gr.Chatbot(elem_id="chatbot", bubble_full_width=False, type="messages")chat_input = gr.MultimodalTextbox(interactive=True,file_count="multiple",placeholder="Enter message or upload file...",show_label=False,sources=["microphone", "upload"],)chat_msg = chat_input.submit(add_message, [chatbot, chat_input], [chatbot, chat_input])bot_msg = chat_msg.then(bot, chatbot, chatbot, api_name="bot_response")bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])chatbot.like(print_like_dislike, None, None, like_user_message=True)demo.launch()

在后台通过命令运行:python XXX.py。打开浏览器,上传文件并输入一段信息后,运行界面如下:
在这里插入图片描述在后台可以看到打印的message格式:

{'text': 'test multimodal textbox', 'files': ['/tmp/gradio/439c333fbe1cde660c82dd81000e1e59b08121367a652b85efdd6e2e22ebb2d8/DeepSeek_V3.pdf']}

在点赞和点踩之后,会在后台输出以下信息:

0 [{'component': 'file', 'value': {'path': '/tmp/gradio/439c333fbe1cde660c82dd81000e1e59b08121367a652b85efdd6e2e22ebb2d8/DeepSeek_V3.pdf', 'url': 'http://127.0.0.1:7862/gradio_api/file=/tmp/gradio/439c333fbe1cde660c82dd81000e1e59b08121367a652b85efdd6e2e22ebb2d8/DeepSeek_V3.pdf', 'size': None, 'orig_name': None, 'mime_type': 'application/pdf', 'is_stream': False, 'meta': {'_type': 'gradio.FileData'}}, 'alt_text': None, 'constructor_args': {}, 'props': {}}, 'test multimodal textbox.'] True
2 ["**That's cool!**"] False

以上就是为聊天机器人模型构建界面所需的全部代码。最后,将在结尾提供一些运行在Spaces上的聊天机器人链接,以便你了解其他可能的功能:

  • project-baize/Baize-7B:一个风格化的聊天机器人,可以停止生成或重新生成响应;
  • MAGAer13/mPLUG-Owl:一个多模态聊天机器人,可以对响应进行点赞和点踩。

参考文献

  1. Gradio - guides - Chatbots

相关文章:

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 流式传输Chatbot11.4.3 添…...

[操作系统] 深入理解操作系统的概念及定位

概念 任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。 其核心功能如图片所示,包括: 内核 (Kernel): 内核是操作系统的核心部分,被认为是狭义上的操作系统,直接与硬件打交道。负责进程管理、内…...

redhat安装docker 24.0.7

1、下载docker镜像包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz 2、解压 tar -xvf docker-24.0.7.tgz 3、解压的docker文件夹全部移动至/usr/bin目录 cd docker cp -p docker/* /usr/bin 4、注册服务 vi /usr/lib/systemd/syste…...

数据库基础实验1(创建表,设置外键,检查,不为空,主键等约束)安装mysql详细步骤

安装MySQL详细步骤 1. 下载 MySQL 安装程序 访问 MySQL 官方网站:MySQL Downloads。在下载页面,选择 "MySQL Community (GPL) Downloads"。在 "MySQL Community Server" 部分,根据你的操作系统(Windows&…...

如何攻击一个服务器(仅用于教育及娱乐实验目的)

import socket import osdef create_virus():# 创建一个简单的病毒脚本,它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…...

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)

在开发一款影视APP时,首页的轮播图是一个非常重要的部分。它不仅能够吸引用户的注意力,还能有效地推广重点内容。为了提升应用的性能和用户体验,可以实现轮播图的懒加载功能。本文将详细介绍如何在HarmonyOS NEXT应用开发中实现这一功能。 1.…...

Jmeter 简单使用、生成测试报告(一)

一、下载Jmter 去官网下载,我下载的是apache-jmeter-5.6.3.zip,解压后就能用。 二、安装java环境 JMeter是基于Java开发的,运行JMeter需要Java环境。 1.下载JDK、安装Jdk 2.配置java环境变量 3.验证安装是否成功(java -versio…...

采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)

目录 一、采用海豚调度器+Doris开发平替CDH Hdfs + Yarn + Hive + Oozie的理由。 1. 架构复杂性 2. 数据处理性能 3. 数据同步与更新 4. 资源利用率与成本 6. 生态系统与兼容性 7. 符合信创或国产化要求 二、ODS层接入数据 接入kafka实时数据 踩坑的问题细节 三、海…...

大疆最新款无人机发布,可照亮百米之外目标

近日,DJI 大疆发布全新小型智能多光旗舰 DJI Matrice 4 系列,包含 Matrice 4T 和 Matrice 4E 两款机型。DJI Matrice 4E 价格为27888 元起,DJI Matrice 4T价格为38888元起。 图片来源:大疆官网 DJI Matrice 4E DJI Matrice 4T D…...

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用,它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…...

踏上 C++ 编程之旅:开篇之作

踏上 C 编程之旅:开篇之作 在计算机编程的广袤天地中,C 宛如一座巍峨的高峰,吸引着无数开发者攀登探索。今天,就让我们一同开启这段充满挑战与惊喜的 C 编程之旅,在代码的世界里开辟属于自己的道路。 一、为什么选择…...

JS逆向系列之某考古站数据解密

声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 文章目录 声明本次目标网址逆向分析ing代码python实现最近太忙了,博客摆烂了好久,狗头保命.jpg。 本次目标网址 aHR0cHM6Ly93d3cua2F…...

idea 如何安装 github copilot

idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot,可以按照以下步骤操作: 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings(Windows/Linux)或 Prefere…...

html5各行各业官网模板源码下载 (4)

文章目录 1.来源2.源码模板2.1 html实现酷炫美观的可视化大屏(十种风格示例,附源码)2.2 HTML5实现古典音乐网站源码模板22.3 HTML5实现古典音乐网站源码模板32.4 HTML5实现小鸟过管道小游戏源码2.5 HTML5实现俄罗斯方块小游戏2.5 HTML5实现剪刀石头布小游戏(附源码)…...

2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一

2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一) 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1:网络平台搭建任务 2:网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二:网络安全事件…...

理解CPU负载与使用率

目录 CPU使用率 CPU负载 CPU使用率 定义:就像看一个工人干活的时间占他上班时间的比例。比如工人上班8小时,实际干活6小时,干活时间占比就是68100%75%。对于CPU,单核的看它被占用的时间占总时间的比例,多核的就把每个…...

鸿蒙-点击Notification通知并打开App的具体页面

意图通知 获取router事件中传递参数并跳转 目前点击通知消息打开应用的指定页面,通过为通知添加行为意图的方式。也就是在wants的parameters中设置自定义参数,然后在UIAbility的onNewWant或者onCreate方法中 解析配置的自定义参数信息判断跳转不同页面&a…...

Jmeter分布式测试的注意事项和常见问题

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是一款开源的性能测试工具,使用Jmeter进行分布式测试时,也需要注意一些细节和问题,否则可能会影响测试结果的准确性和可靠…...

w~Transformer~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍!字节跳动开源8比特混合精度Transformer引擎,近年来,Transformer 已经成为了 NLP 和 CV 等领域的主流模型,但庞大的模型参数限制了它的高效训练和推理。…...

YOLOv10-1.1部分代码阅读笔记-build.py

build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...

c++ 中的容器 vector、deque 和 list 的区别

表格汇总: 容器存储结构随机访问性能中间插入/删除性能两端插入/删除性能内存管理特点迭代器类型适用场景vector连续存储的动态数组 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)(需要移动元素)末尾: O ( 1 ) O(1) O(1),头部…...

‌如何有效学习PyTorch:从基础到实践的全面指南‌

随着人工智能和深度学习技术的飞速发展,PyTorch作为当前最流行的深度学习框架之一,凭借其动态计算图、灵活的编程模型以及强大的社区支持,在学术界和工业界均得到了广泛应用。本文旨在为初学者和有一定基础的读者提供一套系统、全面的PyTorch…...

大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(3)

大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.3 组件Chatbot及ChatMessage11.3.1 Chatbot:聊天机器人组件1. API参数2.…...

MTK6768 Android13 亮度条均匀调节实现

文章目录 需求:问题现象:需求实现疑难问题点:相关资源修改的文件调试技巧具体需求实现去除亮度弹框设置去掉跳转逻辑SystemUI亮度条长按跳转屏蔽 实现亮度均匀调节PhoneWindowManager.javaBrightnessUtils convertLinearToGammaFloatBrightne…...

力扣560和为K的数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入:nums [1,2,3], …...

【MVCC过程中会加锁吗?】

MVCC过程中会加锁吗? 一、MVCC的工作原理二、MVCC的并发控制三、MVCC中的加锁情况在MVCC(Multi-Version Concurrency Control,多版本并发控制)过程中, 通常不需要加锁来控制并发访问。 MVCC是一种数据并发控制技术,它允许在不同的事务中对同一数据进行并发访问,而不需要…...

LeetCode100之搜索二维矩阵(46)--Java

1.问题描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回…...

Android BottomNavigationView不加icon使text垂直居中,完美解决。

这个问题网上千篇一律的设置iconsize为0,labale固定什么的,都没有效果。我的这个基本上所有人用都会有效果。 问题解决之前的效果:垂直方向,文本不居中,看着很难受 问题解决之后:舒服多了 其实很简单&…...

cmake + vscode + mingw 开发环境配置

1.软件准备 准备如下软件: mingw64(安装完成之后检测是否有环境变量,如果没有需要配置) cmake(安装完成之后检测是否有环境变量,如果没有需要配置) vscode(安装CMake插件&#xff0…...

【GPON实战】ONT和OLT的vlan处理机制(一)

引言 ONT和OLT支持多种vlan配置,包括单层tag vlan,默认vlan(PVID),vlan转换,vlan翻译,双层vlan等等。那ONT和OLT是如何处理的呢?本文将介绍ONT和OLT对vlan的处理机制,第一篇介绍单层vlan场景ONT和OLT如何打vlan和剥离vlan,第二篇将介绍OLT是如何通过omci消息将vlan的…...

Qt模块概览(核心模块、GUI模块等)

Qt 模块概览 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)程序,在前面的章节中,我们已经介绍了许多控件、布局的用法,这些都属于QT的GUI模块,当然QT也支持非 GUI 程序的开发,也就是核心模块。 Qt 框架由多个模块组成,每个模块提供特定的功能。…...

七大排序算法

文章目录 排序的概念及引用1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.代码排序部分的测试9.代码加效果大致测试时间(仅供参考) 排序的概念及引用 排序:将数据按照特定的规律排成递增或递减的操作 稳定性:…...

代理模式实现

一、概念:代理模式属于结构型设计模式。客户端不能直接访问一个对象,可以通过代理的第三者来间接访问该对象,代理对象控制着对于原对象的访问,并允许在客户端访问对象的前后进行一些扩展和处理;这种设置模式称为代理模…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice 实现后台批量生成PDF文档

PageOffice 国产版 :支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。 PageOffice 版本&…...

基于若依的脚手架,扩展了flowable、mybatisPlus、lombok、前端美化

前言 若依框架可以说是非常优秀的框架,奈何前端一直有点丑,而且集成的东西比较少,我就基于若依,做了一个轻美化版本,主要集成了工作流、mybatisPlus、lombok等工具。 因为我也在用这个框架为公司做系统,所…...

LeetCode 热题 100 | 矩阵

矩阵基础 使用哈希数组来标记当前行或者列是否出现0按层模拟 73. 矩阵置零 题目讲解:LeetCode 重点: 使用标记数组:用两个标记数组分别记录每一行和每一列是否有零出现。使用两个标记变量:用矩阵的第一行和第一列代替两个标记数组…...

(经过验证)在 Ubuntu 系统中为 VSCode、PyCharm 终端及 Jupyter Notebook 配置代理的完整方案

文章目录 1. 通过系统环境变量配置代理步骤一:打开终端步骤二:编辑 ~/.bashrc 文件步骤三:添加代理环境变量步骤四:保存并关闭文件步骤五:使配置生效步骤六:重启相关应用步骤七:使用代理函数 2.…...

【Linux】sed编辑器二

一、处理多行命令 sed编辑器有3种可用于处理多行文本的特殊命令。 N:加入数据流中的下一行,创建一个多行组进行处理;D:删除多行组中的一行;P:打印多行组中的一行。 1、next命令:N 单行next命…...

STM32 FreeRTOS移植

目录 FreeRTOS源码结构介绍 获取源码 1、 官网下载 2、 Github下载 源码结构介绍 源码整体结构 FreeRTOS文件夹结构 Source文件夹结构如下 portable文件夹结构 RVDS文件夹 MemMang文件夹 FreeRTOS在基于寄存器项目中移植步骤 目录添加源码文件 工程添加源码文件 …...

python 寻找数据拐点

import numpy as np import cv2 from scipy.signal import find_peaks# 示例数据 y_data [365.63258786, 318.34824281, 258.28434505, 228.8913738, 190.87220447, 158.28434505, 129.53035144, 111.95846645, 111.95846645, 120.26517572, 140.71246006, 161.79872204, 180.…...

Windows 蓝牙驱动开发-蓝牙设备栈

蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈,已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中,设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块,以…...

css hover样式调试

调试 hover后才出现的元素如何调试 打开开发者工具,鼠标放在hover时才出现的元素上,然后点击右键不要选中任何选项,将鼠标移动到开发者工具的调试面板中按下N键,此时悬浮的元素不会消失,定位成功 调试元素悬浮样式 …...

【Unity】unity3D 调用LoadSceneAsync 场景切换后比较暗 部门材质丢失

解决方法:两个场景使用同样灯光 现象 直接进入第二个场景是可以正常显示 调用LoadSceneAsync来切换后,第二个场景出现比较暗的情况 解决方法:两个场景使用同样灯光,在loading 的场景中加入灯光。 Light—Directional Light 如果…...

代码随想录二刷|字符串总结

代码随想录二刷|字符串 反转数字 题干 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 思路 class Soluti…...

Linux浅谈——管道、网络配置和客户端软件的使用

目录 一、管道 1、管道符 2、过滤功能 3、特殊功能 4、扩展处理 5、xargs命令扩展 二、网络配置 1、ifconfig查看网络信息 2、配置文件详解 网卡配置文件位置 3、systemctl查看网卡状态 4、systemctl启动/重启/停止网卡 三、客户端软件 1、什么是SSH 2、常用SSH终…...

HBASE学习(一)

1.HBASE基础架构, 1.1 参考: HBase集群架构与读写优化:理解核心机制与性能提升-CSDN博客 1.2问题: 1.FLUSH对hbase的影响 2. HLog和memstore的区别 hlog中存储的是操作记录,比如写、删除。而memstor中存储的是写入…...

深入解析 Linux 内核中的 IPoIB 驱动:ipoib.h 文件分析

引言 InfiniBand 是一种高性能、低延迟的网络互联技术,广泛应用于高性能计算(HPC)和数据中心。为了在 InfiniBand 网络上运行传统的 IP 协议栈,Linux 内核提供了 IP over InfiniBand (IPoIB) 驱动。ipoib.h 是 IPoIB 驱动的核心头文件,定义了驱动所需的数据结构、常量、宏…...

2025-01-16 思考-人生下半场的归途-那温和的良夜

摘要: 转眼已经不再年轻,生命赠与的礼物,也可以说开始陷入归途。不再被外界推着走之后,发现可以有更多的精力和时间可以用来内视,不被外界种种束缚。 在人生的下半场,其实更多的是接受失去,正如人生上半场…...

【C++篇】红黑树的实现

目录 前言: 一,红黑树的概念 1.1,红黑树的规则 1.2,红黑树的最长路径 1.3,红黑树的效率分析 二,红黑树的实现 2.1,红黑树的结构 2.2,红黑树的插入 2.2.1,大致过程…...

Linux的常用命令(一)

目录 一、文件处理命令 1.文件处理命令ls 2.文件处理命令cd 3.文件处理命令pwd 4.文件处理命令touch 5.文件处理命令mkdir 6.文件处理命令cp 7.文件处理命令mv 8.文件处理命令rm 9.文件处理命令cat 10.文件处理命令more 11.文件处理命令head 12.文件处理命令tail …...