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

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

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

  • 前言
  • 本篇摘要
  • 11. Chatbot:融合大模型的多模态聊天机器人
    • 11.2 使用流行的LLM库和API
      • 11.2.1 Llama Index
      • 11.2.2 LangChain
      • 11.2.3 OpenAI
        • 1. 基本用法
        • 2. 语音聊天
        • 3. Twilio凭据
        • 4. 自定义Interface
      • 11.2.4 Hugging Face transformers
      • 11.2.5 SambaNova
      • 11.2.6 Hyperbolic
      • 11.2.7 Anthropic Claude
    • 参考文献

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,便于开发多功能界面和部署人工智能模型,是当前热门的非常易于开发和展示机器学习大语言模型LLM及扩散模型DM的UI框架。本系列文章分为前置概念和实战演练两部分。前置概念先介绍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 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:融合大模型的多模态聊天机器人(上)》
  19. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(下)》
  20. 《Gradio全解系列12——Data Science And Plots:数据科学与绘图》
  21. 《Gradio全解13——Streaming:数据流(上)》
  22. 《Gradio全解13——Streaming:数据流(下)》

本篇摘要

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

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

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

11.2 使用流行的LLM库和API

在本节中,我们将通过几个示例展示如何将gr.ChatInterface与流行的LLM库和API提供商一起使用,将涵盖以下库和API提供商:

  • Llama Index
  • LangChain
  • OpenAI
  • Hugging Face transformers
  • SambaNova
  • Hyperbolic
  • Anthropic’s Claude

大部分LLM库和提供商都存在社区维护的集成库,这使得启动Gradio应用程序更加容易。我们将在下面的适当部分中引用这些库,下面逐一介绍它们的用法。

11.2.1 Llama Index

让我们从在OpenAI上使用llama-index开始,构建一个RAG聊天机器人。该机器人可以在任意文本或 PDF文件上运行,并且可以在不到30行代码中演示和分享它。此示例需要OpenAI密钥(请继续阅读以获取免费的开源等效方案!),代码如下:

# This is a simple RAG chatbot built on top of Llama Index and Gradio. It allows you to upload any text or PDF files and ask questions about them!
# Before running this, make sure you have exported your OpenAI API key as an environment variable:
# export OPENAI_API_KEY="your-openai-api-key"from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
import gradio as grdef answer(message, history):files = []for msg in history:if msg['role'] == "user" and isinstance(msg['content'], tuple):files.append(msg['content'][0])for file in message["files"]:files.append(file)documents = SimpleDirectoryReader(input_files=files).load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()return str(query_engine.query(message["text"]))demo = gr.ChatInterface(answer,type="messages",title="Llama Index RAG Chatbot",description="Upload any text or pdf files and ask questions about them!",textbox=gr.MultimodalTextbox(file_types=[".pdf", ".txt"]),multimodal=True
)demo.launch()

运行界面如下:
在这里插入图片描述
注意:

  1. 需要安装包llama_index,受限于未知原因,有些代码作者难以运行出结果,请读者将重点放在理解代码,下同;
  2. 如果未设置OPENAI_API_KEY,提交文档后,会在后台报错:Original error:No API key found for OpenAI。OPENAI_API_KEY获取地址:https://platform.openai.com/account/api-keys,使用OPENAI、Google或Microsoft注册账号登录后,创建某组织(可随意填写)并跳过邀请成员后,即可获得。然后在运行环境中键入命令:export OPENAI_API_KEY=“your-openai-api-key”;
  3. 如果设置后还遇到401认证错误,可能是因为OpenAI API客户端无法从环境变量中获取API令牌。此时可以将其保存到Python会话中,或者在代码界面运行:
import os
os.environ["OPENAI_API_KEY"] = ""

11.2.2 LangChain

以下是一个在OpenAI上使用langchain构建通用聊天机器人的示例。与之前一样,此示例需要OpenAI 密钥。

# This is a simple general-purpose chatbot built on top of LangChain and Gradio.
# Before running this, make sure you have exported your OpenAI API key as an environment variable:
# export OPENAI_API_KEY="your-openai-api-key"from langchain_openai import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage
import gradio as grmodel = ChatOpenAI(model="gpt-4o-mini")def predict(message, history):history_langchain_format = []for msg in history:if msg['role'] == "user":history_langchain_format.append(HumanMessage(content=msg['content']))elif msg['role'] == "assistant":history_langchain_format.append(AIMessage(content=msg['content']))history_langchain_format.append(HumanMessage(content=message))gpt_response = model.invoke(history_langchain_format)return gpt_response.contentdemo = gr.ChatInterface(predict,type="messages"
)demo.launch()

运行界面如下:
在这里插入图片描述
提示:本例需安装langchain_openai和langchain。另外,对于快速原型设计,社区维护的langchain-gradio仓库使得在LangChain上构建聊天机器人变得更加容易。

11.2.3 OpenAI

当然我们也可以直接使用openai库,但对于快速原型设计,openai-gradio库使得在OpenAI模型上构建聊天机器人更加容易。openai-gradio是一个 Python包,它使开发者能够非常轻松地创建由OpenAI API驱动的机器学习应用程序。

1. 基本用法

使用以下命令安装openai-gradio:

pip install openai-gradio

同样需要设置OPENAI_API_KEY,然后就可以通过几行代码完成聊天机器人程序:

import gradio as gr
import openai_gradiogr.load(name='gpt-4-turbo',src=openai_gradio.registry,
).launch()

运行后就可以看到连接到OpenAI模型的Gradio界面:
在这里插入图片描述
底层原理:openai-gradio Python库有两个依赖项:openai和gradio,它定义了一个“注册”函数 openai_gradio.registry,该函数接收一个模型名称并返回一个Gradio应用。

2. 语音聊天

OpenAI-Gradio还支持语音聊天功能。我们可以通过以下两种方式启用该功能:

  1. 使用实时模型:
import gradio as gr
import openai_gradiogr.load(name='gpt-4o-realtime-preview-2024-10-01',src=openai_gradio.registry
).launch()
  1. 显式地使用任意实时模型:
import gradio as gr
import openai_gradiogr.load(name='gpt-4o-mini-realtime-preview-2024-12-17',src=openai_gradio.registry,enable_voice=True
).launch()

这将创建一个基于WebRTC的界面,允许与AI模型进行实时语音对话。

3. Twilio凭据

为了实现语音聊天功能,除了OPENAI_API_KEY,还需要Twilio凭据(WebRTC语音聊天所需):

export TWILIO_ACCOUNT_SID=<your Twilio account SID>
export TWILIO_AUTH_TOKEN=<your Twilio auth token>

我们可以通过以下方式获取Twilio的凭证:

  1. 在 Twilio 上创建一个免费账户,地址:https://www.twilio.com/en-us;
  2. 在 Twilio 控制台中获取 Account SID 和 Auth Token。
    如果没有Twilio凭证,语音聊天功能仍然可以工作,但在某些网络环境中可能会遇到连接问题。
4. 自定义Interface

一旦我们可以通过OpenAI端点创建一个Gradio用户界面,就可以通过设置自己的输入和输出组件或任何其他gr.Interface参数来自定义它。演示代码如下:

import gradio as gr
import openai_gradiogr.load(name='gpt-4-turbo',src=openai_gradio.registry,title='OpenAI-Gradio Integration',description="Chat with GPT-4-turbo model.",examples=["Explain quantum gravity to a 5-year old.", "How many R are there in the word Strawberry?"]
).launch()

运行截图如下:
在这里插入图片描述
或者将加载的Interface组合到更大的Gradio Web用户界面中,例如:

import gradio as gr
import openai_gradiowith gr.Blocks() as demo:with gr.Tab("GPT-4-turbo"):gr.load('gpt-4-turbo', src=openai_gradio.registry)with gr.Tab("GPT-3.5-turbo"):gr.load('gpt-3.5-turbo', src=openai_gradio.registry)demo.launch()

OpenAI支持的所有聊天API模型都与该集成兼容。有关可用模型及其详细信息的完整列表,请参阅 OpenAI模型文档:https://platform.openai.com/docs/models。

11.2.4 Hugging Face transformers

在许多情况下,我们可能希望在本地运行聊天机器人。以下是使用Hugging Face transformers库和 SmolLM2-135M-Instruct模型的等效示例:

from transformers import AutoModelForCausalLM, AutoTokenizer
import gradio as grcheckpoint = "HuggingFaceTB/SmolLM2-135M-Instruct"
device = "cpu"  # "cuda" or "cpu"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint).to(device)def predict(message, history):history.append({"role": "user", "content": message})input_text = tokenizer.apply_chat_template(history, tokenize=False)inputs = tokenizer.encode(input_text, return_tensors="pt").to(device)  outputs = model.generate(inputs, max_new_tokens=100, temperature=0.2, top_p=0.9, do_sample=True)decoded = tokenizer.decode(outputs[0])response = decoded.split("<|im_start|>assistant\n")[-1].split("<|im_end|>")[0]return responsedemo = gr.ChatInterface(predict, type="messages")demo.launch()

运行截图如下:

11.2.5 SambaNova

SambaNova Cloud API提供了对全精度开源模型(例如Llama系列)的访问权限。以下是一个围绕SambaNova API构建Gradio应用的示例(注意这里需要设置SAMBANOVA_API_KEY,申请地址:https://sambanova.ai/):

# This is a simple general-purpose chatbot built on top of SambaNova API. 
# Before running this, make sure you have exported your SambaNova API key as an environment variable:
# export SAMBANOVA_API_KEY="your-sambanova-api-key"import os
import gradio as gr
from openai import OpenAIapi_key = os.getenv("SAMBANOVA_API_KEY")client = OpenAI(base_url="https://api.sambanova.ai/v1/",api_key=api_key,
)def predict(message, history):history.append({"role": "user", "content": message})stream = client.chat.completions.create(messages=history, model="Meta-Llama-3.1-70B-Instruct-8k", stream=True)chunks = []for chunk in stream:chunks.append(chunk.choices[0].delta.content or "")yield "".join(chunks)demo = gr.ChatInterface(predict, type="messages")demo.launch()

提示:对于快速原型设计,sambanova-gradio库使得在SambaNova模型上构建聊天机器人变得更加容易。

11.2.6 Hyperbolic

Hyperbolic AI API提供了对许多开源模型(例如Llama系列)的访问权限。以下是一个通过SambaNova API构建Gradio应用的示例(这里同样需要设置HYPERBOLIC_API_KEY):

# This is a simple general-purpose chatbot built on top of Hyperbolic API. 
# Before running this, make sure you have exported your Hyperbolic API key as an environment variable:
# export HYPERBOLIC_API_KEY="your-hyperbolic-api-key"import os
import gradio as gr
from openai import OpenAIapi_key = os.getenv("HYPERBOLIC_API_KEY")client = OpenAI(base_url="https://api.hyperbolic.xyz/v1/",api_key=api_key,
)def predict(message, history):history.append({"role": "user", "content": message})stream = client.chat.completions.create(messages=history, model="gpt-4o-mini", stream=True)chunks = []for chunk in stream:chunks.append(chunk.choices[0].delta.content or "")yield "".join(chunks)demo = gr.ChatInterface(predict, type="messages")demo.launch()

提示:对于快速原型设计,hyperbolic-gradio库使得在Hyperbolic模型上构建聊天机器人变得更加容易。

11.2.7 Anthropic Claude

Anthropic的Claude模型也可以通过API使用。以下是一个基于Anthropic API构建的简单20个问题风格的游戏示例:

# This is a simple 20 questions-style game built on top of the Anthropic API.
# Before running this, make sure you have exported your Anthropic API key as an environment variable:
# export ANTHROPIC_API_KEY="your-anthropic-api-key"import anthropic
import gradio as grclient = anthropic.Anthropic()def predict(message, history):keys_to_keep = ["role", "content"]history = [{k: d[k] for k in keys_to_keep if k in d} for d in history]history.append({"role": "user", "content": message})if len(history) > 20:history.append({"role": "user", "content": "DONE"})output = client.messages.create(messages=history,  model="claude-3-5-sonnet-20241022",max_tokens=1000,system="You are guessing an object that the user is thinking of. You can ask 10 yes/no questions. Keep asking questions until the user says DONE")return {"role": "assistant","content": output.content[0].text,  "options": [{"value": "Yes"}, {"value": "No"}]}placeholder = """
<center><h1>10 Questions</h1><br>Think of a person, place, or thing. I'll ask you 10 yes/no questions to try and guess it.
</center>
"""demo = gr.ChatInterface(predict,examples=["Start!"],chatbot=gr.Chatbot(placeholder=placeholder),type="messages"
)demo.launch()

参考文献

  1. Gradio - guides - Additional Features
  2. openai-gradio

相关文章:

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

大模型WebUI&#xff1a;Gradio全解11——Chatbots&#xff1a;融合大模型的聊天机器人&#xff08;2&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...

如何用 Python 实现简单的 AI 模型?

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

单片机-直流电机实验

1、ULN2003芯片介绍 ULN2003&#xff0c; 该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来 驱动直流电机&#xff0c;还可用来驱动五线四相步进电机。支持驱动大功率电器 因为 ULN2003 的输出是集电极开路&#xff0c;ULN2003 要输出高电平&#xff0…...

python【数据结构】

1. 列表 Python 中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff1b;即&#xff0c;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的方法&#xff1a; 方法描述list.append(x)把一个元素添加到列表的结尾&#xff0c;相当…...

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner&#xff0c;最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…...

《笔记》青蛙跳台阶——斐波那契数列

斐波那契数列 斐波那契数列&#xff08;Fibonacci Sequence&#xff09;是一个经典的数学数列&#xff0c;其特点是每一项都是前两项的和。数列的前两项通常定义为 0 和 1&#xff08;或 1 和 1&#xff09;&#xff0c;后续每一项都是前两项的和。 斐波那契数列的定义 斐波那…...

SpringBoot3动态切换数据源

背景 随着公司业务战略的发展&#xff0c;相关的软件服务也逐步的向多元化转变&#xff0c;之前是单纯的拿项目&#xff0c;赚人工钱&#xff0c;现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战&#xff1a;了解SAAS模型&#xff0c;考虑怎么将公司的产品转换成多租…...

OSPF - 特殊区域

OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不断扩大时&#xff0c;LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务&#xff0c;那么该区域内的路由器就没有必要维护本区域外的链路状态数据库。  OSPF通过划分区域可以减少网…...

Linux 系统下磁盘相关指令:df、du、fdisk、lsblk

文章目录 I df、du、fdisk、lsblk指令df命令用于显示文件系统的磁盘空间使用情况du命令用于估算目录或文件的磁盘空间使用情况fdisk命令用于对磁盘进行分区操作lsblk指令查看设备信息II 应用du估算目录或文件的磁盘空间使用情况lsblk查看服务器上查看硬盘个数III 知识扩展磁盘阵…...

基于单片机的肺功能MVV简单测算

肺功能MVV一般是指肺部每分钟的最大通气量。 MVV本身是最大值的英文缩写&#xff0c;在临床上&#xff0c;肺功能MVV表示肺部每分钟最大通气量&#xff0c;用以衡量气道的通畅度&#xff0c;以及肺部和胸廓的弹性、呼吸肌的力量。 肺部每分钟的最大通气量的参考值男性与女性之…...

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…...

腾讯云AI代码助手编程挑战赛-百事一点通

作品简介 百事通问答是一款功能强大的智能问答工具。它依托海量知识储备&#xff0c;无论你是想了解生活窍门、学习难点&#xff0c;还是工作中的专业疑惑&#xff0c;只需输入问题&#xff0c;就能瞬间获得精准解答&#xff0c;以简洁易懂的方式呈现&#xff0c;随时随地为你…...

Spring学习笔记1

目录 1 什么是spring2 spring的优势3 IOC的概念和作用3.1 无参数构造函数的实例化方式3.2 使用工厂中的普通方法实例化对象 4 Bean4.1 Bean相关概念4.2 Bean对象的作用范围 5 DI5.1 构造函数注入5.2 set方法注入5.3 复杂类型数据注入5.4 基于注解的IOC5.4.1 包扫描5.4.2 Compon…...

LeetCode 2185. Counting Words With a Given Prefix

&#x1f517; https://leetcode.com/problems/counting-words-with-a-given-prefix 题目 给一个字符串数组&#xff0c;返回其中前缀为 pref 的个数 思路 模拟 代码 class Solution { public:int prefixCount(vector<string>& words, string pref) {int count…...

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…...

前端开发中页面优化的方法

前端页面优化是指通过改进网页的加载速度、提高用户体验和SEO优化等手段来优化页面性能的过程。以下是一些常见的前端页面优化方法&#xff1a; 压缩和合并文件&#xff1a;通过压缩CSS和JavaScript文件&#xff0c;并将多个文件合并成一个文件&#xff0c;减少网络传输和HTTP请…...

Qt QDockWidget详解以及例程

Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列)&#xff0c;也可以作为QMainWindow上的顶级窗口浮动 (类似一…...

机器学习之贝叶斯分类器和混淆矩阵可视化

贝叶斯分类器 目录 贝叶斯分类器1 贝叶斯分类器1.1 概念1.2算法理解1.3 算法导入1.4 函数 2 混淆矩阵可视化2.1 概念2.2 理解2.3 函数导入2.4 函数及参数2.5 绘制函数 3 实际预测3.1 数据及理解3.2 代码测试 1 贝叶斯分类器 1.1 概念 贝叶斯分类器是基于贝叶斯定理构建的分类…...

关于大数据的基础知识(一)——定义特征结构要素

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;一&a…...

2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅

在科技的浪潮中&#xff0c;AI 技术与开源探索的火花不断碰撞&#xff0c;催生出无限可能。2025 年 1 月 4 日&#xff0c;由 GitCode 联合 CSDN COC 城市开发者社区精心打造的开年首场开发者活动&#xff1a;冬日嘉年华在北京中关村 • 鼎好 DH3-A 座 22 层盛大举行&#xff0…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...