大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(3)
大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3)
- 前言
- 本篇摘要
- 11. Chatbot:融合大模型的多模态聊天机器人
- 11.3 组件Chatbot及ChatMessage
- 11.3.1 Chatbot:聊天机器人组件
- 1. API参数
- 2. 参数type演示
- 3. 使用Gradio组件
- 11.3.2 ChatMessage:聊天消息格式
- 1. API参数
- 2. 简单演示
- 3. metadata键
- 参考文献
前言
本系列文章主要介绍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一定会成为每个技术人员实现各种奇思妙想的最称手工具。
本系列文章目录如下:
- 《Gradio全解1——Gradio简介》
- 《Gradio全解1——Gradio的安装与运行》
- 《Gradio全解2——剖析Hugging Face:详解三类资源models/datasets/spaces》
- 《Gradio全解3——剖析Hugging Face:实战六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum》
- 《Gradio全解4——Gradio的3+1种部署方式实践》
- 《Gradio全解4——浏览器集成Gradio-Lite》
- 《Gradio全解5——Gradio Client:python客户端》
- 《Gradio全解5——Gradio Client:javascript客户端》
- 《Gradio全解5——Gradio Client:curl客户端》
- 《Gradio全解6——Gradio Tools:将Gradio用于LLM Agents》
- 《Gradio全解7——Gradio库的模块架构和环境变量》
- 《Gradio全解8——Interface:高级抽象界面类(上)》
- 《Gradio全解8——Interface:高级抽象界面类(下)》
- 《Gradio全解9——Blocks:底层区块类(上)》
- 《Gradio全解9——Blocks:底层区块类(下)》
- 《Gradio全解10——Additional Features:补充特性(上)》
- 《Gradio全解10——Additional Features:补充特性(下)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(1)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(2)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(4)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(6)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(7)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(8)》
- 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(9)》
- 《Gradio全解系列12——Data Science And Plots:数据科学与绘图》
- 《Gradio全解13——Streaming:数据流(上)》
- 《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.3 组件Chatbot及ChatMessage
本节我们将首先学习聊天机器人组件Chatbot,包括API参数、参数type演示和使用Gradio组件,然后学习消息格式ChatMessage,包括API参数、简单演示和metadata键。
11.3.1 Chatbot:聊天机器人组件
Chatbot聊天机器人组件的调用格式为:gradio.Chatbot(type="messages", ···)
,这可以创建一个聊天机器人,用于显示用户提交的消息和回复。该组件通常用作输出组件,支持部分Markdown语法,包括加粗、斜体、代码、表格等;同时支持音频、视频和图片文件,这些文件会在聊天机器人中显示,而其他类型的文件则会显示为链接。下面讲述该组件的API参数和用法。
1. API参数
Chatbot较为重要或其独有的API参数如下表所示,更详细的API信息请参考官方文档:https://www.gradio.app/docs/gradio/chatbot。
Parameters | style | default | description |
---|---|---|---|
value | list[MessageDict | Message] | TupleFormat | Callable | None | None | 默认显示在聊天机器人中的消息列表,其中每条消息的格式为 {“role”: “user”, “content”: “Help me.”}。role可以是"user"、“assistant"或"system” 之一;content可以是文本或者是通过Gradio组件传递的媒体文件,例如{“content”: gr.Image(“lion.jpg”)}。如果该值为可调用对象,则每当应用加载时都会调用该函数以设置组件的初始值。 |
type | Literal[‘messages’, ‘tuples’] | None | None | 传入fn的chat history参数的消息格式。如果为"messages",则传递的值是一个字典列表,字典中包含OpenAI风格的 “role” 和 “content” 键。“content"键的值应为以下之一:(1)有效的Markdown字符串;(2)包含"path” 键的字典,其值对应要显示的文件;(3)Gradio组件的实例,目前支持Image、Plot、Video、Gallery、Audio和HTML。“role” 键应为 ‘user’ 或 ‘assistant’ 之一,其他角色将不会在输出中显示。如果此参数为’tuples’,则期望传入一个list[list[str | None | tuple]],即一个列表的列表,内部列表应包含2个元素:用户消息和响应消息,但此格式已被弃用。 |
container | bool | True | 如果为True,则会将组件放置在一个容器中——为边框周围提供一些额外的内边距。 |
editable | Literal[‘user’, ‘all’] | None | None | 允许用户编辑聊天机器人中的哪种消息。如果设置为"user",则允许编辑用户消息;如果设置为"all",则还允许编辑助手消息。 |
latex_delimiters | list[dict[str, str | bool]] | None | None | 一个字典列表,格式为{“left”: 左分隔符 (str), “right”: 右分隔符 (str), “display”: 是否在新行显示 (bool)},用于渲染LaTeX表达式。如果未提供,latex_delimiters将设置为[{“left”:“$$”, “right”:“$$”, “display”: True }],因此只有用$$分隔符包裹的表达式才会被渲染为LaTeX,并且在新行中显示;还可以传入一个空列表以禁用LaTeX渲染。更多信息请参阅KaTeX文档:https://katex.org/docs/autorender.html。 |
show_share_button | bool | None | None | 如果设置为True,将在组件的角落显示一个分享图标,允许用户将输出分享到Hugging Face Spaces Discussions。如果设置为False,不会显示分享图标。如果设置为None(默认行为),则当Gradio应用在Spaces上启动时图标会显示,否则不会显示。 |
show_copy_button | bool | False | 如果设置为True,会在每个聊天机器人信息中显示一个copy按钮。 |
show_copy_all_button | <class ‘inspect._empty’> | False | 如果设置为True,将显示一个“copy all”按钮,用于将所有chatbot消息复制到剪贴板。 |
allow_file_downloads | <class ‘inspect._empty’> | True | 如果设置为True,将为包含媒体文件的聊天机器人消息显示download按钮。 |
avatar_images | tuple[str | Path | None, str | Path | None] | None | None | 一个包含两个头像图片路径或URL的元组,分别用于用户和机器人(按此顺序)。如果不想显示用户或机器人的头像,可以传入None。图片路径必须在Gradio应用的工作目录内,或者是一个外部URL。 |
sanitize_html | bool | True | 如果设置为False,将禁用聊天机器人消息的HTML sanitization(HTML净化)。不建议这样做,因为这可能会导致安全漏洞。 |
render_markdown | bool | True | 如果设置为False,将禁用聊天机器人消息的Markdown渲染。 |
line_breaks | bool | True | 如果设置为True(默认),将在聊天机器人消息中启用GitHub风格的Markdown换行符;如果设置为False,单行换行符将被忽略。它仅在render_markdown为True时生效。 |
feedback_options | list[str] | tuple[str, …] | None | (‘Like’, ‘Dislike’) | 一个字符串列表,表示将向用户显示的反馈选项。区分大小写的字符串"Like"和"Dislike"将显示为拇指图标,而其他任何选项将显示在一个单独的旗帜图标下。 |
feedback_value | list[str | None] | None | None | 一个字符串列表,表示整个聊天的反馈状态,仅在type="messages"时生效。列表中的每个条目按顺序对应一条助手消息,其值为用户给出的反馈(例如 “Like”、“Dislike” 或任何自定义反馈选项),如果该消息未收到反馈,则值为None。 |
layout | Literal[‘panel’, ‘bubble’] | None | “bubble” | 如果设置为"panel",将以LLM风格布局显示chatbot;如果设置为"bubble",将以消息气泡的形式显示chatbot,用户和机器人的消息会交替显示在两侧。默认值为"bubble"。 |
group_consecutive_messages | bool | True | 如果设置为True,将把来自同一角色的连续消息显示在同一个气泡中。如果设置为False,则每条消息将显示在单独的气泡中。默认值为True。 |
examples | list[ExampleMessage] | None | None | 一个示例消息列表,用于在显示任何用户/助手消息之前展示在聊天机器人中。每个示例应为一个字典,包含以下可选键:(1)“text”:表示点击示例时应填充到聊天机器人中的消息;(2)“files”:其值应为一个文件列表,用于填充到聊天机器人中;(3)“icon”:其值应为文件路径或图片URL,用于在示例框中显示;(4)“display_text”:其值应为示例框中显示的文本,如果未提供"display_text",则将显示"text"的值。 |
2. 参数type演示
Chatbot组件众多API参数中最重要的是type,下面以type为例讲述Chatbot用法。Chatbot组件接受的数据格式由type参数决定,该参数可以取两个值:‘tuples’ 和 ‘messages’,其中’tuples’类型已被弃用,并将在未来的Gradio版本中移除。如果type为 ‘messages’,则聊天机器人发送或接收的数据将是一个字典列表,每个字典包含role和content键。这种格式符合大多数LLM API(如 HuggingChat、OpenAI、Claude)的预期格式。说明如下:
- role:role键的值为’user’ 或 ‘assistant’,分别表示用户消息和小助手消息;
- content:content键的值可以是字符串(以Markdown/HTML渲染)、包含"path" 键的字典(其值对应要显示的文件)或Gradio组件(用于显示各类文件)。
简单演示如下:
import gradio as grhistory = [{"role": "assistant", content="How can I help you?"}{"role": "user", content="Can you make me a plot of quarterly sales?"}{"role": "assistant", content="I am happy to provide you that report and plot."}
]with gr.Blocks() as demo:gr.Chatbot(history, type='messages')demo.launch()
运行界面如下:
注意,虽然type中的tuples类型已被废弃,但目前版本(5.12.0)仍需要设置type=‘messages’,否则会报错:Error: ‘Data incompatible with tuples format. Each message should be a list of length 2.’
3. 使用Gradio组件
Chatbot组件支持在聊天机器人中使用许多核心Gradio组件(例如gr.Image、gr.Plot、gr.Audio和 gr.HTML)。只需在元组列表中包含这些组件之一即可,以下是一个示例:
import gradio as grdef load():return [("Here's an audio", gr.Audio("https://github.com/gradio-app/gradio/raw/main/test/test_files/audio_sample.wav")),("Here's an video", gr.Video("https://github.com/gradio-app/gradio/raw/main/demo/video_component/files/world.mp4"))]with gr.Blocks() as demo:chatbot = gr.Chatbot()button = gr.Button("Load audio and video")button.click(load, None, chatbot)demo.launch()
注意:这里的消息类型type为当前版本默认的tuples,保留此示例只是为展示tuples的用法,实际应用中还是使用messages,上例load的消息改为messages格式,如下:
return [{"role": "assistant", "content": "Here's an audio"}{"role": "assistant", "content": gr.Audio("https://github.com/gradio-app/gradio/raw/main/test/test_files/audio_sample.wav")}{"role": "assistant", "content": "Here's an video"}{"role": "assistant", "content": gr.Video("https://github.com/gradio-app/gradio/raw/main/demo/video_component/files/world.mp4")}
]
11.3.2 ChatMessage:聊天消息格式
在表示消息时,为了方便起见,可以使用ChatMessage组件,这样文本编辑器可以提供自动补全提示和类型检查。ChatMessage是一个数据类,用于表示Chatbot组件中的消息(type=“messages”),其调用格式为:gradio.ChatMessage(···)
。
1. API参数
ChatMessage的API参数较少,如下表所示,或参考官方文档:https://www.gradio.app/docs/gradio/chatbot。
Parameters | style | default | description |
---|---|---|---|
content | str | FileData | Component | FileDataDict | tuple | list | | 消息的内容,可以是字符串、文件或Gradio组件。 | |
role | Literal[‘user’, ‘assistant’, ‘system’] | “assistant” | 消息的角色,用于确定消息在chatbot中的对齐方式。可以是"user"、“assistant"或"system”,默认值为"assistant"。 |
metadata | MetadataDict | Metadata | _HAS_DEFAULT_FACTORY_CLASS() | 消息的元数据,用于显示中间思考过程或工具使用情况。它应为一个字典,包含以下键:“title”(显示思考内容时为必填项)以及可选项:“id” 和"parent_id"(用于嵌套思考)、“duration”(显示思考的持续时间)、“status”(显示思考的状态)。 |
options | Optional[list[Option]] | None | 消息的选项,是一个Option对象列表,每个对象是一个字典,包含以下键: “label”(选项中显示的文本)以及可选项:“value”(如果Option的值与标签不同,则返回该值)。 |
2. 简单演示
先看一个简单示例,将上一节演示的history内容替换为gr.ChatMessage,代码如下:
history = [gr.ChatMessage(role="assistant", content="How can I help you?"),gr.ChatMessage(role="user", content="Can you make me a plot of quarterly sales?"),gr.ChatMessage(role="assistant", content="I am happy to provide you that report and plot.")
]
运行界面同上,不再重复截图。
3. metadata键
除了role和content键之外,messages字典还接受一个metadata键,可以将它设置为生成响应时使用的任意相关工具的信息,这对于显示LLM代理的思考过程非常有用。目前metadata键接受一个包含单个键title的字典,它将会显示在一个可折叠的框中,其它设置请参考API表。以下是一个示例,展示了代理使用天气API工具来回答用户查询的思考过程:
import gradio as gr
def generate_response(message, history):history.append(gr.ChatMessage(role="user", content="input message: "+ message))history.append(gr.ChatMessage(role="assistant",content="The weather API says it is 20 degrees Celcius in San Francisco.",metadata={"title": "🛠️ Used tool Weather API", "id": 123, "parent_id": "think"}))return "", historywith gr.Blocks() as demo:chatbot = gr.Chatbot(type="messages",value=[{"role": "user", "content": "What is the weather in San Francisco?"},{"role": "assistant", "content": "I need to use the weather API tool","metadata": {"title": "🧠 Thinking", "id": "think"}}])msg = gr.Textbox()msg.submit(generate_response, [msg, chatbot], [msg, chatbot])demo.launch()
输入test后,运行截图如下:
注意:history定义时可添加多条消息,但append追加时,只能一条一条的添加,否则报错:TypeError: list.append() takes exactly one argument (2 given)。
我们也可以使用普通的Python字典来指定元数据,代码如下:
def generate_response(message, history):history.append(dict(role="user", content=message))history.append(dict(role="assistant",content="The weather API says it is 20 degrees Celcius in San Francisco.",metadata={"title": "🛠️ Used tool Weather API"}))return "", history
参考文献
- Gradio - guides - Chatbots
相关文章:
大模型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插件࿰…...
【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 …...
小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作
如何使用信号量进行PV操作 前言信号量1. 信号量简介2. NuttX中信号量的创建与使用2.1 Nuttx信号量的初始化和销毁2.2 信号量的等待和发布 3. 信号量的实际应用:下载任务示例3.1 实际代码3.2 代码说明3.3 执行说明 4. 信号量的优势与应用场景5. 常见应用场景…...
(01)STM32—GPIO
1. GPIO简介 GPIO(General Purpose Input Output)通用输入输出端口。可配置为8种输入输出模式。引脚电平:0V~3.3V,部分引脚可容忍5V。输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时…...
浏览器输入http形式网址后自动跳转https解决方法
一、问题描述 使用浏览器 网上冲浪 时会遇到一个情况: 在浏览器中输入“http域名”后会自动变成“https 域名”的形式,此时“https 域名”的网站可能已停止对外提供服务了,这时会出现如下不友好的网页提示: 二、处理方法&#x…...
mybatis的多对一、一对多的用法
目录 1、使用VO聚合对象(可以解决这两种情况) 多对一: 一对多: 2、非聚合的多对一做法: 3、非聚合的一对多做法: 1、使用VO聚合对象(可以解决这两种情况) 当我需要多对一、一对…...
生产管理看板助力节能科技公司实现数据自动化管理
在节能科技公司的生产过程中,数据管理的自动化是提高生产效率和产品质量的关键。然而,许多公司在数据记录、展示、对比和存档方面仍面临诸多痛点,如产品检测数据无法自动记录、缺乏直观的产线状态展示、检测数据对比繁琐耗时,以及…...
网络科技有限公司网络设计
网络科技有限公司网络设计 摘要:伴随着信息科技发展,上网变得一件必不可少的事情,当然网络安全对我们也是越来越重要。像我们的传统网结构是无法为我们的上网提供一个安全的网络环境。锐雯网络科技有限公司就是以网络安全为基本的对网络惊醒…...
C++没有Y Combinator?使用 C++ 实现 Y Combinator(中英双语)
C 中并没有直接内置的 Y Combinator,但通过现代 C 特性(如 lambda 表达式 和 std::function),我们可以实现一个类似 Y Combinator 的功能。 下面我们来详细讲解如何在 C 中实现 Y Combinator。 使用 C 实现 Y Combinator 目标 …...
YOLOv10-1.1部分代码阅读笔记-loaders.py
loaders.py ultralytics\data\loaders.py 目录 loaders.py 1.所需的库和模块 2.class SourceTypes: 3.class LoadStreams: 4.class LoadScreenshots: 5.class LoadImagesAndVideos: 6.class LoadPilAndNumpy: 7.class LoadTensor: 8.def autocast_list(source…...
《戴森球计划》异地远程联机攻略
文章目录 前言1. 下载MOD2.配置cpolar内网穿透3. 主机开启联机3.1 玩家加入游戏 4. 配置固定的TCP端口5. 游玩体验 前言 《戴森球计划》不仅是一款融合了科幻冒险与经营管理元素的游戏,更是一个让玩家在浩瀚宇宙中尽情探索和创造的平台。在这个游戏中,你…...
【Linux跬步积累】—— 线程
🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮࿰…...
计算机网络 (46)简单网络管理协议SNMP
前言 简单网络管理协议(SNMP,Simple Network Management Protocol)是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议,它使网络管理员能够管理网络效能,发现并解决网…...
模型 前景理论
系列文章 分享模型,了解更多👉 模型_思维模型目录。面对得失,人们更怕失,参考点定输赢。 1 前景理论的应用 1.1 前景理论在投资决策中的应用案例 假设一位投资者面临两个投资方案的选择: 方案A:投资一只…...
Android ScrollView嵌套X5WebView大片空白问题
scrollview嵌套后webview的高度不可控。留有大片空白。 注:官方不建议scrollview嵌套webview 最好让webview自身滚动 解决方案: act_news_detail_wv.setWebViewClient(new WebViewClient() {Overridepublic void onPageFinished(WebView webView, Str…...
频域增强通道注意力机制EFCAM模型详解及代码复现
背景与动机 在深度学习领域,如何有效处理时间序列数据一直是一个重要的研究方向。近年来, 频域分析技术 在时间序列处理中展现出了巨大潜力,特别是离散余弦变换(DCT)因其能够高效捕捉低频信息并避免高频噪声干扰而受到广泛关注。 FECAM模型的开发正是基于这一背景,旨在…...
[计算机网络]一. 计算机网络概论第一部分
作者申明:作者所有文章借助了各个渠道的图片视频以及资料,在此致谢。作者所有文章不用于盈利,只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…...
第十三章:数据库技术
文章目录: 一:基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二:Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…...
中等难度——python实现电子宠物和截图工具
import io # 文件处理 import nt # windows nt 库直接获取对应的磁盘空间 import time # 时间 import zlib # 加解密 import ctypes # 调用 import struct # 处理字节二进制 import base64 # 编解码 import threading # 线程 import tkinter as tk # tk from datetime…...
构建优雅、高效的 Nodejs 命令行工具 - Archons
目录 项目简介安装基本用法样例创建一个简单的命令行工具使用archons上下文创建进度条 最后 项目地址: https://github.com/noctisynth/archons Bug反馈或功能请求:https://github.com/noctisynth/archons/issues 项目简介 Archons意思是“执政官”,我使…...
源码编译安装httpd 2.4,提供系统服务管理脚本并测试
1.安装httpd wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gzbmcv tar -zxvf httpd-2.4.62.tar.gz cd httpd-2.4.62 2.安装依赖包 sudo yum install -y gcc make apr-devel apr-util-devel pcre-devel sudo yum groupinstall "Development Tools"…...
【爬虫】某某查cookie逆向
代码仅供技术人员进行学习和研究使用,请勿将其用于非法用途或以任何方式窃取第三方数据。使用该代码产生的所有风险均由用户自行承担,作者不对用户因使用该代码而造成的任何损失或损害承担任何责任。 加密参数 加密参数主要是cookie,其中只有…...
【华为路由/交换机的ssh远程设置】
华为路由/交换机的ssh远程设置 R1(client):10.1.1.1 R2(server):10.1.1.2 R2服务端配置: 生成本机密钥 查看生成的密钥 设置AAA授权验证方式,并设置支持SSH协议 创建本地用户&…...
Linux:System V - 共享内存
1.System V共享内存的原理 通过为用户提供系统调用接口,让用户可以申请一块空间,进程A/B也可以通过系统调用接口将创建好的内存通过页表映射进进程的地址空间。完成让不同的两个进程看见同一份资源的目的。如果未来不想继续通信,取消进程和内…...