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

【NLP】无服务器问答系统

一、说明

在NLP的眼见的应用,就是在“  当你在谷歌上提出一个问题并立即得到答案时会发生什么?例如,如果我们在谷歌搜索中询问谁是美国总统,我们会得到以下回答:Joe Biden;这是一个搜索问题,同时又是一个QA问答问题,本文将叙述,在Google的搜索引擎种,NLP库hume-face库的部署,可以作为应用参考。

二、谷歌的问答和搜索

        它显示,Google 最初在 1.6 秒内搜索并排名了 1 亿个页面,然后执行了额外的处理步骤以从页面中找到答案片段。第一个任务是谷歌作为搜索引擎的核心产品。第二个处理步骤(从网页中查找问题的答案)是问答 (QA) NLP 问题。QA NLP 系统是一种 NLP 系统,旨在回答以自然语言(如英语或中文)提出的问题。这些系统使用自然语言理解和知识表示技术的组合来分析问题并提供相关且准确的响应。这些系统通常用于搜索引擎、客户服务聊天机器人和虚拟助手等应用程序。

        在QA NLP系统中,问题和上下文被传递给模型,模型从上下文中提取答案。此方法可用于构建企业级 QA 系统。例如,文档搜索引擎(如弹性搜索)可用于对获得问题答案概率最高的文档进行排名,并使用 QA 模型在该文档中查找答案。这些系统通常被称为读者检索器系统,其中文档搜索是检索器的任务,找到问题的答案是阅读的任务。由专注于NLP的德国公司Deepset开发的Haystack库可用于构建企业级的读取器检索器系统。但是,本文将只关注系统的QA回答(读者)部分,我们有一个上下文和一个问题,并希望得到答案。

图 2,使用 Haystack 库的 QA 系统(取自 Haystack GitHub 存储库)

图 3 显示了用于问答 NLP 系统的读取器-检索器架构示例。

用于问答系统的读取器-检索器架构

图 3:问答系统的读取器-检索器架构

2.1 带变压器的 QA NLP

        现代自然语言处理(NLP)应用程序通常使用Google研究人员在2017年提出的转换器架构构建。1 这些架构优于递归神经网络(RNN)和长短期记忆(LSTM)网络,并使NLP领域的迁移学习成为可能。为大多数NLP应用提供动力的两种最流行的变压器架构是生成式预训练变压器(GPT)2和来自变压器的双向编码器表示(BERT)。3

        最初的转换器论文基于编码器和解码器架构,通常用于机器翻译等任务,其中单词序列从一种语言到另一种语言(图 4)。后来,编码器和解码器模块在许多NLP模型中被改编为独立模型。仅编码器模型将输入标记转换为丰富的数字表示形式,非常适合文本分类或命名实体识别等问题。BERT,RoBERTa和DistilBERT是一些使用仅编码器变压器块的型号。仅解码器模型(即 GPT 模型)通常用于文本生成或自动完成任务,其中每个任务的表示形式取决于左侧上下文。

        

图4 变压器架构(摘自变压器原文))

        变压器还使NLP领域的迁移学习成为可能。迁移学习是计算机视觉中的一种普遍实践,其中卷积神经网络在一项任务上进行训练,然后在新任务上进行微调和采用。在架构上,这涉及将模型拆分为主体和头部,其中头部是特定于任务的网络。在训练期间,体重从大规模数据集(如 ImageNet)中学习广泛的特征,这些数据集用于为新任务初始化新模型。这种方法成为计算机视觉的标准方法。生产中的大多数计算机视觉模型都是使用迁移学习技术进行训练的。

        

        

图 5 迁移学习,其中一个域的主体用于另一个域。

在变压器架构支持NLP中的变压器学习之后,许多机构发布了他们训练有素的NLP模型,供学者和从业者使用。GPT 和 BERT 是两个预先训练的模型,它们在各种 NLP 基准测试中采用了新的技术水平,并开创了变压器时代。随着时间的推移,不同的研究机构发布了转换器架构的不同变体,一些使用PyTorch,另一些使用Tensorflow,这使得从业者很难使用这些模型。HuggingFace创建了一组统一的API和一组预先训练的模型和数据集,简化了从业者采用最先进的NLP模型的过程。

2.2 用于 NLP 的 “抱面”humg-face 库

        拥抱面变压器是最受欢迎的 NLP 库之一,为各种转换器模型以及代码和工具提供了标准化接口,以使这些模型适应新的用例。它还支持三个主要的深度学习框架:Pytorch,Tensorflow和JAX。Hugging Face 生态系统主要由两部分组成:一系列库和 Hub,如下所示。库提供代码,Hub 提供预先训练的模型权重、数据集、评估指标脚本等。

图 6 拥抱脸库的组件。

2.3 质量保证模型构建

        我们使用squad_v2数据集从拥抱面模型中心微调预训练的变压器模型。Squad_v2将 SQuAD100.000 中的 1,1 个问题与众包工作者对抗性编写的 50,000 多个无法回答的问题结合起来,看起来与可回答的问题相似。系统尽可能回答问题,确定段落何时支持不回答并放弃回答。我们将使用MobileBert,流行的BERT模型的压缩版本。在 SQuAD v1.1/v2.0 问答任务中,MobileBERT 获得了 1.90/0.79 的 dev F2 分数(比 BERT_BASE 高 1.5/2.1)1。

        我们将从拥抱面库中引入预先训练的模型和分词器。由于这将是一个同步的无服务器应用程序,我们将使用BERT模型(mobilebert)的小型版本来加快处理时间。以下 python 代码将在数据集上微调Squad_v2 mobilebert 模型下载到目录中。./model

from transformers import AutoModelForQuestionAnswering, AutoTokenizerdef get_model(model):"""Loads model from Huggin face model hub intothe ./model directory"""try:model = AutoModelForQuestionAnswering.from_pretrained(model, use_cdn=True)model.save_pretrained("./model")except Exception as e:raise (e)
get_model("mrm8488/mobilebert-uncased-finetuned-squadv2")

        以下 python 代码将 mibilbert 分词器下载到目录中。./model

def get_tokenizer(tokenizer):"""Loads tokenizer from Huggin face model hub intothe ./model directory"""try:tokenizer = AutoTokenizer.from_pretrained(tokenizer)tokenizer.save_pretrained("./model")except Exception as e:raise (e)get_tokenizer("mrm8488/mobilebert-uncased-finetuned-squadv2")

        一旦我们有了分词器,我们就可以对进入模型的数据进行编码,并对来自模型的响应进行解码。以下代码适用于编码器函数,该函数接受问题、上下文和分词器并返回将传递给模型的 。attention_masksinpud_ids

def encode(tokenizer, question, context):"""encodes the question and context with a given tokenizerthat is understandable to the model"""encoded = tokenizer.encode_plus(question, context)return encoded["input_ids"], encoded["attention_mask"]

此代码片段会将模型的答案解码为人类可读的字符串格式。

def decode(tokenizer, token):"""decodes the tokens to the answer with a given tokenizerto return human readable response in a string format"""answer_tokens = tokenizer.convert_ids_to_tokens(token, skip_special_tokens=True)return tokenizer.convert_tokens_to_string(answer_tokens)

我们必须将编码器、模型预测和解码器组合在一个方法中。下面的代码首先从目录中加载模型和分词器,并通过前面定义的编码器方法传递问题和上下文。然后,输出通过模型传递,最后,答案标记通过解码方法传递,以字符串格式获取答案。./model

from transformers import AutoModelForQuestionAnswering, AutoTokenizer, AutoConfig
import torchdef serverless_pipeline(model_path="./model"):"""Initializes the model and tokenzier and returns a predictfunction that ca be used as pipeline"""tokenizer = AutoTokenizer.from_pretrained(model_path)model = AutoModelForQuestionAnswering.from_pretrained(model_path)def predict(question, context):"""predicts the answer on an given question and context.Uses encode and decode method from above"""input_ids, attention_mask = encode(tokenizer, question, context)start_scores, end_scores = model(torch.tensor([input_ids]), attention_mask=torch.tensor([attention_mask]))ans_tokens = input_ids[torch.argmax(start_scores) : torch.argmax(end_scores) + 1]answer = decode(tokenizer, ans_tokens)return answerreturn predict

三、无服务器架构

        图 1 显示了使用 AWS 云的 QA NLP 应用程序的无服务器架构。该应用程序的无服务器后端使用 AWS lambda、DynamoDB、API 网关和 ECR 进行容器注册表。Lambda 函数是包装在 docker 映像中并上传到 AWS ECR 的推理服务器。AWS API 网关将 POST 请求负载发送到 lambda 函数。AWS DynamoDB 存储发送到推理服务器的数据以进行监控。Lambda 可以使用仅允许对数据库进行写入访问的 IAM 角色与 DynamoDB 通信。

图 7 AWS 上的无服务器 QA NLP 架构

3.1 在 DynamoDB 中存储日志

        DynamoDB 是一个完全托管的无服务器 NoSQL 数据库,非常适合存储模型的输入和输出,以便监控和评估模型。我们使用 boto3 库将日志放入我们的数据库中。我们将 DynamoDB 的名称保留在 Lambda 的环境变量中。我们希望将时间、有效载荷上下文和问题以及模型的答案存储在数据库中。以下代码在 DyanmoDB 中编写问题、上下文和模型答案。DYNAMO_TABLE

import boto3
import os
import uuid
import timedynamodb = boto3.resource("dynamodb", region_name="us-east-1")
table = dynamodb.Table(os.environ["DYNAMODB_TABLE"])timestamp = str(time.time())
item = {"primary_key": str(uuid.uuid1()),"createdAt": timestamp,"context": body["context"],"question": body["question"],"answer": answer,
}
table.put_item(Item=item)

3.2 λ函数

Lambda 是来自 AWS 的无服务器计算服务,将在其中提供推理服务。Lambda 处理程序是来自 API 请求的信息通过函数并将输出返回到 API 的地方。我们还将包括用于在函数中编写代码的 DynamoDB。

def handler(event, context):try:# loads the incoming event into a dictonarybody = json.loads(event["body"])# uses the pipeline to predict the answeranswer = question_answering_pipeline(question=body["question"], context=body["context"])timestamp = str(time.time())item = {"primary_key": str(uuid.uuid1()),"createdAt": timestamp,"context": body["context"],"question": body["question"],"answer": answer,}table.put_item(Item=item)return {"statusCode": 200,"headers": {"Content-Type": "application/json","Access-Control-Allow-Origin": "*","Access-Control-Allow-Credentials": True,},"body": json.dumps({"answer": answer}),}except Exception as e:print(repr(e))return {"statusCode": 500,"headers": {"Content-Type": "application/json","Access-Control-Allow-Origin": "*","Access-Control-Allow-Credentials": True,},"body": json.dumps({"error": repr(e)}),}

3.3 Dockerize Lambda 函数

        由于 Lambda 函数现在支持 docker 映像,因此我们可以将所有内容 dockerize 并将其上传到 Amazon Elastic Container Registry (Amazon ECR) 存储库。Lambda 函数将访问此图像以进行预测。Dockerfile 使用 AWS 发布的基础映像来执行 Lambda 函数。

FROM public.ecr.aws/lambda/python:3.8# Copy function code and models into our /var/task
COPY ./ ${LAMBDA_TASK_ROOT}/# install our dependencies
RUN python3 -m pip install -r requirements.txt --target ${LAMBDA_TASK_ROOT}# run get_model.py to get model weights and tokenizers
RUN python3 get_model.py# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "handler.handler" ]

        我们需要发送以构建、标记 docker 镜像并将其推送到 ECR 存储库。首先,我们必须使用 AWS CLI 登录到我们的 ECR 存储库。

aws_region=<your aws region>
aws_account_id=<your aws account>aws ecr get-login-password --region $aws_region \
| docker login username AWS --password-stdin $aws_account_id.dkr.ecr.$aws_region.amazonaws.com

然后构建、标记 docker 镜像并将其推送到 ECR 存储库。

docker build -t nlp-lambda:v1 serverless-bert/.
docker tag nlp-lambda:v1 $aws_account_id.dkr.ecr.$aws_region.amazonaws.com/nlp-lambda:v1
docker push $aws_account_id.dkr.ecr.$aws_region.amazonaws.com/nlp-lambda:v1

3.4 部署无服务器应用程序

我们将使用 Serverless 库,这是一个开源且与云无关的库,适用于所有主要的公共云提供商。使用 npm 安装无服务器(如果计算机上尚未安装)。如果您的计算机上没有 npm,请按照此处的安装说明进行操作。

npm install -g serverless

下面是一个无服务器配置文件示例,用于使用 API 网关和 DynamoDB 部署 Lambda 函数,类似于图 7 中所示的架构:

service: serverless-bert-qa-lambda-dockerprovider:name: aws # providerregion: us-east-1 # aws regionmemorySize: 5120 # optional, in MBtimeout: 30 # optional, in secondsenvironment:DYNAMODB_TABLE: ${self:service}-Table-${sls:stage}iamRoleStatements:- Effect: "Allow"Action:- "dynamodb:PutItem"Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-Table-${sls:stage}
functions:questionanswering:image: ${ACOUNT_NUMBER}.dkr.ecr.us-east-1.amazonaws.com/bert-lambda:v1 #ecr urlevents:- http:path: qa # http pathmethod: post # http method
resources:Resources:CustomerTable:Type: AWS::DynamoDB::TableProperties:AttributeDefinitions:- AttributeName: primary_keyAttributeType: SBillingMode: PAY_PER_REQUESTKeySchema:- AttributeName: primary_keyKeyType: HASHTableName: ${self:service}-Table-${sls:stage}

无服务器框架需要 AWS 凭证才能代表我们访问 AWS 资源。如果您没有 IAM 用户,请按照此说明创建 IAM 用户,并使用该用户设置凭证。建议使用 AWS-CLI 配置 AWS 凭证。要通过 进行设置,请先安装它,然后运行以配置 AWS-CLI 和凭证:aws-cliaws configure

$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]: 

一切准备就绪后,以下命令将使用无服务器配置文件并将基础设施部署到 AWS。确保您与配置文件位于同一目录中。

serverless deploy

        部署完成后,无服务器将返回可用于测试模型的 API 网关的 URL。您可以使用 Postman、javascript 或 curl 来调用模型。在此项目的 GitHub 存储库中,创建了一个使用 HTML、CSS 和 javascript 的简单前端应用程序,用于与部署的 API 网关进行交互。

图 8 QA NLP 应用程序的前端应用程序

四、总结

问答 NLP 模型通常用于搜索引擎、客户服务聊天机器人和虚拟助手等应用程序。这篇博文描述了 QA NLP 问题,并使用 HuggingFace 库和 AWS 基础设施构建和部署了一个全栈无服务器 QA NLP 应用程序。无服务器 ML 应用程序可能不是适用于所有用例的良好部署方法,但它是您将模型投入生产而无需担心底层基础设施的重要第一步。

相关文章:

【NLP】无服务器问答系统

一、说明 在NLP的眼见的应用&#xff0c;就是在“ 当你在谷歌上提出一个问题并立即得到答案时会发生什么&#xff1f;例如&#xff0c;如果我们在谷歌搜索中询问谁是美国总统&#xff0c;我们会得到以下回答&#xff1a;Joe Biden&#xff1b;这是一个搜索问题&#xff0c;同时…...

Dubbo

Dubbo 简介Dubbo的快速入门Dubbo的基本架构安装DubboAdmin入门案例Dubbo的最佳实践 Dubbo的高级特性启动检查多版本超时与重试负载均衡SpringCloud整合Dubbo案例 简介 Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 致力于提高性能和透明化的RPC远程服务调用方…...

Java设计模式之策略(Strategy)模式

策略&#xff08;Strategy&#xff09;设计模式定义了一系列算法&#xff0c;将它们封装起来&#xff0c;并且可以相互替换使用&#xff0c;从而使得算法可以独立于使用它的客户而变化。 什么是策略模式 策略&#xff08;Strategy&#xff09;设计模式是一种行为型设计模式&a…...

Vue引入CDN JS或本地JS文件之后 使用报错

加载问题 正常情况 在public引入script - js文件加载 - 写入内存 - 使用 但使用之前 有可能这个文件还没执行写入内存或者还未加载完毕 此时 需要一个promiss解决 1. 引入script 在 public / index.html 文件内引入你的script标签 <script type"text/javascript"…...

NRF52832-扩展广播

nordic论坛 我想要设置广播名称为 “一二三四五”&#xff0c;当广播名称为FULL_NAME时&#xff0c;但是广播显示还是“一&#xff1f;”&#xff0c;“&#xff1f;”是乱码&#xff0c;后来打开nrf connect观察广播&#xff0c;在没连接的时候&#xff0c;点击一下&#xff0…...

springboot项目新增子module

1. 拉取项目 2. file-new-module 3. 选择版本 4. 1-2-3-4 5. 注释请求统一前缀 (SwaggerConfig.java)...

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…...

《向量数据库指南》:向量数据库Pinecone故障排除

目录 无法pip安装 空闲后索引丢失 上传缓慢或延迟高 批处理带来的高查询延迟 使用gRPC客户端进行Upsert限流 Pods已满 安全问题 CORS错误 本节介绍常见问题以及如何解决它们。需要帮助吗?在我们的支持论坛中提问。标准、企业和专用客户还可以联系支持人员寻求帮助。...

[86] 分割链表

题目链接&#xff1a;86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09; 第一种方法&#xff1a;类似双指针 自己想的&#xff0c;不知道读者是否能看懂&#xff0c;参考注释 ListNode* partition(ListNode* head, int x) {ListNode* bigpos nullptr;ListNode* littlep…...

【python】 清空socket缓冲区

在Python中使用Socket进行网络通信时&#xff0c;可以通过调用socket.recv()函数来接收数据&#xff0c;数据会被存储在缓冲区中。有时候&#xff0c;可能想要先清空缓冲区&#xff0c;以便后续的数据不会被之前的数据影响。以下是一种清空Python Socket缓冲区的方法&#xff1…...

108、RocketMQ的底层实现原理(不需要长篇大论)

RocketMQ的底层实现原理 RocketMQ由NameServer集群、Producer集群、Consumer集群、Broker集群组成&#xff0c;消息生产和消费的大致原理如下: Broker在启动的时候向所有的NameServer注册&#xff0c;并保持长连接&#xff0c;每30s发送一次心跳Producer在发送消息的时候从Na…...

怎么把PDF转为word?1分钟解决难题

PDF文件在我们的电脑上应用非常广泛&#xff0c;由于其较高的安全性和兼容性&#xff0c;得到了广泛的认可。然而&#xff0c;对于一些人来说&#xff0c;PDF文件不能直接进行编辑和修改可能是一个问题。因此&#xff0c;通常我们需要将其转换为Word格式&#xff0c;以便在Word…...

Mysql权限-系统表user,db,talbes_priv,columns_priv详解

一、MySQL 权限场景 可以根据登录用户限制用户访问资源(库、表)可以根据登录用户限制用户的操作权限(能对哪些库、表执行增删改查操作)可以指定用户登录IP或者域名可以限制用户权限分配 二、Mysql五个层级权限级别分析 Mysql权限级别分为了五个层级&#xff0c;并且每个级别…...

GPT-4 模型详细教程

GPT-4&#xff08;Generative Pretrained Transformer 4&#xff09;是 OpenAI 的最新语言生成模型&#xff0c;其在各类文本生成任务中表现优秀&#xff0c;深受开发者和研究者喜爱。这篇教程将帮助你理解 GPT-4 的基本概念&#xff0c;并向你展示如何使用它来生成文本。 什么…...

智慧环保:创造绿色未来

随着全球环境问题的日益严重&#xff0c;智慧环保成为推动绿色发展的关键。智慧环保利用先进的技术手段和智能化设备&#xff0c;致力于解决环境问题&#xff0c;保护生态环境&#xff0c;实现可持续发展。它融合了物联网、人工智能、大数据等技术&#xff0c;将科技的力量与环…...

虚拟 DOM和render()函数和Vue.js模板语法

[TOC](虚拟 DOM和render()函数) 1. 虚拟DOM 虚拟DOM是Vue中非常重要的概念&#xff0c;它是一个虚拟的内存中的数据结构&#xff0c;用来表示真实的DOM树。Vue使用虚拟DOM来减少对真实DOM的操作次数&#xff0c;从而提高页面的性能。 虚拟DOM的工作原理如下&#xff1a; Vu…...

k8s Service网络详解(一)

k8s Service网络详解&#xff08;一&#xff09; 有关K8s网络的几个概念K8s网络模型k8s网络插件ServiceService的访问方式Service的种类无头服务&#xff08;Headless Services&#xff09;带选择算符的服务无选择算符的服务 Service的类型ClusterIPNodeportLoadBalancerExtern…...

抖音账号矩阵系统开发源码

一、技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 部分源码分享&#xff1a; ic function indexAction() { //面包屑 $breadcrumbs [ [tit…...

Python+Texturepacker自动化处理图片

前言 本篇在讲什么 PythonTexturepacker自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖Texturepacker工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…...

K8s Service网络详解(二)

K8s Service网络详解&#xff08;二&#xff09; Kube Proxy调度模式Kube-proxy IptablesKube-proxy IPVS Service SelectorPod DNS种常见的 DNS 服务Kube-DNSCoreDNSCorefile 配置 DNS 记录DNS 记录 ServiceDNS 记录 PodDNS 配置策略 Pod 的主机名设置优先级 Ingress Kube Pro…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...