Elasticsearch:崭新的打分机制 - Learning To Rank (LTR)

警告:“学习排名 (Learning To Rank)” 功能处于技术预览版,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但此功能不受官方 GA 功能的支持 SLA 的约束。

注意:此功能是在版本 8.12.0 中引入的,并且仅适用于某些订阅级别。 有关更多信息,请参阅 https://www.elastic.co/subscriptions。

Learning To Rank (LTR) 使用经过训练的机器学习(ML)模型来构建搜索引擎的排名函数。通常,该模型用作第二阶段的重新排序器,以提高简单的第一阶段检索算法返回的搜索结果的相关性。LTR 函数接收文档列表和搜索上下文作为输入,并输出排名后的文档:

搜索上下文

除了需要排序的文档列表之外,LTR 函数还需要一个搜索上下文。通常,这个搜索上下文至少包括用户提供的搜索词(上述示例中的 text_query)。搜索上下文还可以提供排名模式中使用的其他信息。这可能是关于执行搜索的用户的信息(例如人口统计数据、地理位置或年龄);关于查询的信息(例如查询长度);或者在查询上下文中的文档信息(例如标题字段的得分)。

评判列表 - judgment list

LTR 模型通常是基于一个评判列表进行训练的,这是一组带有相关性等级的查询和文档的集合。评判列表可以由人工或机器生成:通常通过行为分析数据来填充,并经常有人工监督。评判列表确定了给定搜索查询的结果的理想排序。LTR 的目标是使模型尽可能地符合新查询和文档的评判列表排名。

评判列表是训练模型的主要输入。它包括一个数据集,该数据集包含查询和文档的配对,以及它们对应的相关性标签。相关性判断通常是二元的(相关/不相关)或更细致的标签,例如从0(完全不相关)到4(高度相关)的等级。下面的示例使用了分级的相关性判断。

注意事项:评判列表

虽然评判列表可以由人工手动创建,但也有技术可利用用户参与数据(如点击或转化)自动构建评判列表。

评判列表的数量和质量将极大地影响 LTR 模型的整体性能。在构建评判列表时,应非常注意以下几个方面:

  • 大多数搜索引擎可以使用不同类型的查询进行搜索。例如,在电影搜索引擎中,用户可以按照电影标题、演员或导演进行搜索。在评判列表中,保持每种查询类型的示例数量平衡非常重要。这可以防止过度拟合,并使模型能够在所有查询类型上有效地泛化。
  • 用户通常会提供更多的正面示例而不是负面示例。通过平衡正面和负面示例的数量,可以帮助模型更准确地区分相关和不相关的内容。

特征提取 - feature extraction

仅有查询和文档对并不足以提供足够的信息来训练用于 LTR 的机器学习模型。评判列表中的相关性评分依赖于多种属性或特征。必须提取这些特征,以确定各种组件如何组合以确定文档的相关性。评判列表加上提取的特征构成了 LTR 模型的训练数据集。

这些特征分为三个主要类别:

  • 文档特征:这些特征直接从文档属性中派生。例如:电子商务商店中的产品价格。
  • 查询特征:这些特征直接从用户提交的查询中计算得出。例如:查询中的单词数量。
  • 查询-文档特征:用于提供有关查询上下文中的文档信息的特征。例如:标题字段的 BM25 分数。

为了准备训练数据集,将这些特征添加到评判列表中:

在 Elasticsearch 中,可以使用模板化查询来提取特征,这样做可以在构建训练数据集以及在查询时进行推断。以下是一个模板化查询的示例:

[{"query_extractor": {"feature_name": "title_bm25","query": { "match": { "title": "{{query}}" } }}}
]

模型

LTR 的核心当然是一个机器学习(ML)模型。该模型使用上面描述的训练数据结合一个目标进行训练。在 LTR 的情况下,目标是根据一个排序度量标准(如 nDCG 或 MAP)在最佳方式下对结果文档进行排序,考虑到一个评判列表 (judgment list)。该模型仅依赖于来自训练数据的特征和相关性标签。

LTR 领域正在快速发展,许多方法和模型类型正在进行实验。在实践中,Elasticsearch 专门依赖于梯度提升决策树(gradient boosted decision tree - GBDT)模型进行 LTR 推断。

请注意,Elasticsearch 支持模型推断,但训练过程必须在 Elasticsearch 之外进行,使用 GBDT 模型。在今天使用的最受欢迎的 LTR 模型中,LambdaMART 在低推断延迟的情况下提供了强大的排名性能。它依赖于 GBDT 模型,因此非常适合用于 Elasticsearch 中的 LTR。

XGBoost 是一个众所周知的库,提供了 LambdaMART 的实现,使其成为 LTR 的热门选择。我们在 eland 中提供了一些辅助工具,以便将训练的 XBGRanker 模型作为你在 Elasticsearch 中的 LTR 模型进行集成。

部署和管理学习排名模型

使用 Eland 训练和部署模型

通常,XGBoost 模型训练过程使用标准的 Python 数据科学工具,如 Pandas 和 scikit-learn。

我们在 elasticsearch-labs 仓库中开发了一个示例 notebook。这个交互式 Python 笔记本详细介绍了端到端的模型训练和部署工作流程。

我们强烈建议在你的工作流程中使用 eland,因为它提供了在 Elasticsearch 中使用 LTR 所需的重要功能。使用 eland 可以:

  • 配置特征提取
  • 提取用于训练的特征
  • 在 Elasticsearch 中部署模型

在 Eland 中配置特征提取

特征提取器是使用模板化查询定义的。Eland 提供了 eland.ml.ltr.QueryFeatureExtractor 来直接在 Python 中定义这些特征提取器:

from eland.ml.ltr import QueryFeatureExtractorfeature_extractors=[# We want to use the score of the match query for the title field as a feature:QueryFeatureExtractor(feature_name="title_bm25",query={"match": {"title": "{{query}}"}}),# We can use a script_score query to get the value# of the field rating directly as a feature:QueryFeatureExtractor(feature_name="popularity",query={"script_score": {"query": {"exists": {"field": "popularity"}},"script": {"source": "return doc['popularity'].value;"},}},),# We can execute a script on the value of the query# and use the return value as a feature:QueryFeatureExtractor(feature_name="query_length",query={"script_score": {"query": {"match_all": {}},"script": {"source": "return params['query'].splitOnToken(' ').length;","params": {"query": "{{query}}",}},}},),
]

一旦定义了特征提取器,它们就会被封装在一个 eland.ml.ltr.LTRModelConfig 对象中,以便在后续的训练步骤中使用:

from eland.ml.ltr import LTRModelConfigltr_config = LTRModelConfig(feature_extractors)

提取特征进行训练

构建数据集是训练过程中的一个关键步骤。这包括提取相关特征并将它们添加到你的判定列表中。我们推荐使用 Eland 的 eland.ml.ltr.FeatureLogger 辅助类来完成此过程。

from eland.ml.ltr import FeatureLogger# Create a feature logger that will be used to query {es} to retrieve the features:
feature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)

FeatureLogger 提供了一个 extract_features 方法,它使您能够从你的判定列表中为一系列特定文档提取特征。同时,你可以传递先前定义的查询参数给特征提取器:

feature_logger.extract_features(query_params={"query": "foo"},doc_ids=["doc-1", "doc-2"]
)

我们的示例 notebook 解释了如何使用 FeatureLogger 构建训练数据集,通过向判定列表添加特征。

有关特征提取需要注意的地方:

  • 我们强烈建议不要自行实现特征提取。在特征提取方面保持一致性非常重要,即在训练环境和 Elasticsearch 中进行推断时。通过使用与 Elasticsearch 开发和测试一起的 eland 工具,你可以确保它们之间保持一致的功能。
  • 特征提取是通过在 Elasticsearch 服务器上执行查询来执行的。这可能会给你的集群带来很大压力,特别是当你的判定列表包含很多示例或具有许多特征时。我们的特征记录器实现旨在最小化发送到服务器的搜索请求数量并减少负载。但是,最好使用与任何面向用户的生产流量隔离的 Elasticsearch 集群构建您的训练数据集。

将你的模型部署到 Elasticsearch 中

一旦你的模型训练完成,你就可以将其部署到你的 Elasticsearch 集群中。你可以使用 Eland 的 MLModel.import_ltr_model 方法:

from eland.ml import MLModelLEARNING_TO_RANK_MODEL_ID="ltr-model-xgboost"MLModel.import_ltr_model(es_client=es_client,model=ranker,model_id=LEARNING_TO_RANK_MODEL_ID,ltr_model_config=ltr_config,es_if_exists="replace",
)

此方法会将训练后的模型以及学习排名配置(包括特征提取)序列化成 Elasticsearch 能够理解的格式。然后,该模型通过 Create Trained Models API 部署到 Elasticsearch。

目前支持以下类型的模型用于 Elasticsearch 的学习排名(LTR):

  • DecisionTreeRegressor
  • RandomForestRegressor
  • LGBMRegressor
  • XGBRanker
  • XGBRegressor

未来将支持更多类型的模型。

学习排名模型管理

一旦你的模型在 Elasticsearch 中部署,你可以使用 trained model APIs 来管理它。现在,你已经准备好在搜索时使用你的 LTR 模型作为重新评分器。

Demo

安装 Elasticsearch 及 Kibana

接下来,我们将使用一个 Python notebook 来进行展示。

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
  • Kibana:如何在 Linux,MacOS 及 Windows上安装 Elastic 栈中的 Kibana

在安装的时候,我们选择 Elastic Stack 8.x 来进行安装。

在首次启动 Elasticsearch 的时候,我们可以看到如下的输出:

我们需要记住超级用户 elastic 的密码。

为了能够使得 LTR 正常工作(请参考 订阅 | Elastic Stack 产品和支持 | Elastic),我们需要启动白金试用功能:

下载代码并启动 jupyter notebook

我们在地址 GitHub - liu-xiao-guo/elasticsearch-labs: Notebooks & Example Apps for Search & AI Applications with Elasticsearch 下载代码:

git clone https://github.com/liu-xiao-guo/elasticsearch-labs

然后我们进入到如下的目录并启动 jupyter:

$ pwd
/Users/liuxg/python/elasticsearch-labs/notebooks/search
$ ls
00-quick-start.ipynb                README.md
01-keyword-querying-filtering.ipynb _nbtest.setup.ipynb
02-hybrid-search.ipynb              _nbtest.teardown.03-ELSER.ipynb
03-ELSER.ipynb                      _nbtest.teardown.ipynb
04-multilingual.ipynb               articles.json
05-query-rules.ipynb                data.json
06-synonyms-api.ipynb               movies.json
08-learning-to-rank.ipynb           query-rules-data.json
Makefile                            sample_data
$ jupyter notebook

我们选择 08-learning-to-rank.ipynb  文件来进行。

我们在当前的目录下创建一个叫做 .env 的文件:

$ pwd
/Users/liuxg/python/elasticsearch-labs2/notebooks/search
$ ls
00-quick-start.ipynb                _nbtest.setup.ipynb
01-keyword-querying-filtering.ipynb _nbtest.teardown.03-ELSER.ipynb
02-hybrid-search.ipynb              _nbtest.teardown.ipynb
03-ELSER.ipynb                      articles.json
04-multilingual.ipynb               data.json
05-query-rules.ipynb                http_ca.crt
06-synonyms-api.ipynb               movies.json
07-inference.ipynb                  query-rules-data.json
08-learning-to-rank.ipynb           sample_data
README.md
$ ls .env
.env
$ cat .env
ES_USER="elastic"
ES_PASSWORD="wKWgjujKB4gOOKw4Zk=E"
ES_ENDPOINT="localhost"

如上所示,我们可以根据自己的 Elasticsearch 的配置来定义上面的 ES_USER, ES_PASSWORD 及 ES_EDNPINT。

我们同时需要拷贝 Elasticsearch 的证书到当前的目录下:

$ pwd
/Users/liuxg/python/elasticsearch-labs/notebooks/search
$ cp ~/elastic/elasticsearch-8.13.2/config/certs/http_ca.crt .
$ ls http_ca.crt 
http_ca.crt

这样我们的配置就完成了。

运行 notebook

安装所需的包

!pip3 install -qU elasticsearch eland "eland[scikit-learn]" xgboost tqdmfrom tqdm import tqdm# Setup the progress bar so we can use progress_apply in the notebook.
tqdm.pandas()

配置你的 Elasticsearch 部署

import os
from dotenv import load_dotenv
from elasticsearch import Elasticsearchload_dotenv()ES_USER = os.getenv("ES_USER")
ES_PASSWORD = os.getenv("ES_PASSWORD")
ES_ENDPOINT = os.getenv("ES_ENDPOINT")url = f"https://{ES_USER}:{ES_PASSWORD}@{ES_ENDPOINT}:9200"print(url)es_client = Elasticsearch(hosts=[url], ca_certs = "./http_ca.crt", verify_certs = True)print(es_client.info())

配置数据集

我们将使用源自 MSRD(电影搜索排名数据集)的数据集。

该数据集可在此处获取并包含以下文件:

  • movie_corpus.jsonl.gz:要索引的电影数据集。
  • movie_judgements.tsv.gz:一组查询的相关性判断的判断列表。
  • movie_index_settings.json:要应用于文档和索引的设置。
from urllib.parse import urljoin#DATASET_BASE_URL = "https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/sample_data/learning-to-rank/"
DATASET_BASE_URL = "file:/Users/liuxg/python/elasticsearch-labs/notebooks/search/sample_data/learning-to-rank/"CORPUS_URL = urljoin(DATASET_BASE_URL, "movies-corpus.jsonl.gz")
JUDGEMENTS_FILE_URL = urljoin(DATASET_BASE_URL, "movies-judgments.tsv.gz")
INDEX_SETTINGS_URL = urljoin(DATASET_BASE_URL, "movies-index-settings.json")

我们需要根据自己的文档位置对上面的文件路径进行修改。

导入文档语料库

这一步会将语料库的文档导入到 movies 索引中。

文档包含以下字段:

Field nameDescription
idId of the document
titleMovie title
overviewA short description of the movie
actorsList of actors in the movies
directorDirector of the movie
charactersList of characters that appear in the movie
genresGenres of the movie
yearYear the movie was released
budgetBudget of the movies in USD
votesNumber of votes received by the movie
ratingAverage rating of the movie
popularityNumber use to measure the movie popularity
tagsA list of tags for the movies
import json
import elasticsearch.helpers as es_helpers
import pandas as pd
from urllib.request import urlopenMOVIE_INDEX = "movies"# Delete index
print("Deleting index if it already exists:", MOVIE_INDEX)
es_client.options(ignore_status=[400, 404]).indices.delete(index=MOVIE_INDEX)print("Creating index:", MOVIE_INDEX)
index_settings = json.load(urlopen(INDEX_SETTINGS_URL))
es_client.indices.create(index=MOVIE_INDEX, **index_settings)print(f"Loading the corpus from {CORPUS_URL}")
corpus_df = pd.read_json(CORPUS_URL, lines=True)print(f"Indexing the corpus into {MOVIE_INDEX} ...")
bulk_result = es_helpers.bulk(es_client,actions=[{"_id": movie["id"], "_index": MOVIE_INDEX, **movie}for movie in corpus_df.to_dict("records")],
)
print(f"Indexed {bulk_result[0]} documents into {MOVIE_INDEX}")

我们可以在 Kibana 中进行查看:

上面显示我们写入了 9750 个文档。

加载判断列表

判断列表包含我们将用来训练 “学习排名” 模型的人工评估。

每行代表一个具有关联相关性等级的查询-文档对,并包含以下列:

ColumnDescription
query_idPairs for the same query are grouped together and received a unique id.
queryActual text of the query.
doc_idID of the document.
gradeThe relevance grade of the document for the query.

注意:在此示例中,相关性等级是二进制值(相关或不相关)。 你还可以使用代表相关程度的数字(例如从 0 到 4)。

judgments_df = pd.read_csv(JUDGEMENTS_FILE_URL, delimiter="\t")
judgments_df

配置特征提取

特征是我们模型的输入。 它们表示有关单独查询、单独结果文档或查询上下文中的结果文档的信息,例如 BM25 分数。

特征是使用标准模板查询和查询 DSL 定义的。

为了简化训练期间定义和细化特征提取的过程,我们直接在 eland 中合并了许多 primitives。

from eland.ml.ltr import LTRModelConfig, QueryFeatureExtractorltr_config = LTRModelConfig(feature_extractors=[# For the following field we want to use the score of the match query for the field as a features:QueryFeatureExtractor(feature_name="title_bm25", query={"match": {"title": "{{query}}"}}),QueryFeatureExtractor(feature_name="actors_bm25", query={"match": {"actors": "{{query}}"}}),# We could also use a more strict matching clause as an additional features. Here we want all the terms of our query to match.QueryFeatureExtractor(feature_name="title_all_terms_bm25",query={"match": {"title": {"query": "{{query}}", "minimum_should_match": "100%"}}},),QueryFeatureExtractor(feature_name="actors_all_terms_bm25",query={"match": {"actors": {"query": "{{query}}", "minimum_should_match": "100%"}}},),# Also we can use a script_score query to get the document field values directly as a feature.QueryFeatureExtractor(feature_name="popularity",query={"script_score": {"query": {"exists": {"field": "popularity"}},"script": {"source": "return doc['popularity'].value;"},}},),]
)

构建训练数据集

现在我们已经加载了基本数据集并配置了特征提取,我们将使用我们的判断列表来得出最终的训练数据集。 数据集将由包含 <query, document> 对的行以及训练模型所需的所有特征组成。 为了生成此数据集,我们将从判断列表中运行每个查询,并将提取的特征添加为每个标记结果文档的列。

例如,如果我们有一个包含两个标记文档 d3 和 d9 的查询 q1,训练数据集最终将有两行 — 每对 <q1, d3> 和 <q1, d9> 一行。

请注意,由于这会在您的 Elasticsearch 集群上执行查询,因此运行此操作的时间将根据集群的托管位置以及此笔记本的运行位置而有所不同。 例如,如果你在与 Elasticsearch 集群相同的服务器或主机上运行笔记本,则此操作往往会在示例数据集上运行得非常快(< 2 分钟)

import numpyfrom eland.ml.ltr import FeatureLogger# First we create a feature logger that will be used to query Elasticsearch to retrieve the features:
feature_logger = FeatureLogger(es_client, MOVIE_INDEX, ltr_config)# This method will be applied for each query group in the judgment log:
def _extract_query_features(query_judgements_group):# Retrieve document ids in the query group as strings.doc_ids = query_judgements_group["doc_id"].astype("str").to_list()# Resolve query params for the current query group (e.g.: {"query": "batman"}).query_params = {"query": query_judgements_group["query"].iloc[0]}# Extract the features for the documents in the query group:doc_features = feature_logger.extract_features(query_params, doc_ids)# Adding a column to the dataframe for each feature:for feature_index, feature_name in enumerate(ltr_config.feature_names):query_judgements_group[feature_name] = numpy.array([doc_features[doc_id][feature_index] for doc_id in doc_ids])return query_judgements_groupjudgments_with_features = judgments_df.groupby("query_id", group_keys=False
).progress_apply(_extract_query_features)judgments_with_features

从上面,我们可以看出提取的特征值。

创建并训练模型

LTR rescorer 支持 XGBRanker 训练的模型。

在 XGBoost 文档中了解更多信息。

from xgboost import XGBRanker
from sklearn.model_selection import GroupShuffleSplit# Create the ranker model:
ranker = XGBRanker(objective="rank:ndcg",eval_metric=["ndcg@10"],early_stopping_rounds=20,
)# Shaping training and eval data in the expected format.
X = judgments_with_features[ltr_config.feature_names]
y = judgments_with_features["grade"]
groups = judgments_with_features["query_id"]# Split the dataset in two parts respectively used for training and evaluation of the model.
group_preserving_splitter = GroupShuffleSplit(n_splits=1, train_size=0.7).split(X, y, groups
)
train_idx, eval_idx = next(group_preserving_splitter)train_features, eval_features = X.loc[train_idx], X.loc[eval_idx]
train_target, eval_target = y.loc[train_idx], y.loc[eval_idx]
train_query_groups, eval_query_groups = groups.loc[train_idx], groups.loc[eval_idx]# Training the model
ranker.fit(X=train_features,y=train_target,group=train_query_groups.value_counts().sort_index().values,eval_set=[(eval_features, eval_target)],eval_group=[eval_query_groups.value_counts().sort_index().values],verbose=True,
)

将模型导入 Elasticsearch

模型训练完成后,我们可以使用 Eland 将其加载到 Elasticsearch 中。

请注意,MLModel.import_ltr_model 方法包含 LTRModelConfig 对象,该对象定义如何为导入的模型提取特征。

from eland.ml import MLModelLEARNING_TO_RANK_MODEL_ID = "ltr-model-xgboost"MLModel.import_ltr_model(es_client=es_client,model=ranker,model_id=LEARNING_TO_RANK_MODEL_ID,ltr_model_config=ltr_config,es_if_exists="replace",
)

一旦部署完毕,我们可以在  Kibana 中进行查看:

使用 rescorer

将模型上传到 Elasticsearch 后,你将能够在 _search API 中将其用作 rescorer,如本示例所示:

GET /movies/_search
{"query" : {"multi_match" : {"query": "star wars","fields": ["title", "overview", "actors", "director", "tags", "characters"]}},"rescore" : {"window_size" : 50,"learning_to_rank" : {"model_id": "ltr-model-xgboost","params": { "query": "star wars"}}}
}
query = "star wars"# First let's display the result when not using the rescorer:
search_fields = ["title", "overview", "actors", "director", "tags", "characters"]
bm25_query = {"multi_match": {"query": query, "fields": search_fields}}bm25_search_response = es_client.search(index=MOVIE_INDEX, query=bm25_query)[(movie["_source"]["title"], movie["_score"], movie["_id"])for movie in bm25_search_response["hits"]["hits"]
]

# Now let's display result when using the rescorer:ltr_rescorer = {"learning_to_rank": {"model_id": LEARNING_TO_RANK_MODEL_ID,"params": {"query": query},},"window_size": 100,
}rescored_search_response = es_client.search(index=MOVIE_INDEX, query=bm25_query, rescore=ltr_rescorer
)[(movie["_source"]["title"], movie["_score"], movie["_id"])for movie in rescored_search_response["hits"]["hits"]
]

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

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

相关文章

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站&#xff0c;并且想让更多的人知道你的网站&#xff0c;那么无非就是两种途径 一、自己进行宣传&#xff0c;或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点&#xff0c;别说是自然流量&#xff0c;就算是使用特定语句【sit…

文件上传服务器、文件展示等异步问题

问题&#xff1a; 文件上传模块&#xff1a;当文件已经上传完成&#xff0c;文件进度已经走完了&#xff0c;但是服务器响应还没有返回结果&#xff0c;出现了&#xff0c;获取不到上传后的文件路径&#xff0c;需要等待服务器返回结果后&#xff0c;才能获取文件路径并点击跳…

excel中怎么用乘法、加法来替代AND和OR函数

你可以使用乘法和加法来替代Excel中的AND和OR函数&#xff0c;虽然这样做可能会增加公式的复杂度&#xff0c;但在某些情况下是可行的。 1. 使用乘法替代AND函数&#xff1a;AND函数用于判断一系列条件是否同时成立&#xff0c;如果所有条件都为TRUE&#xff0c;则返回TRUE&…

IOMMU和SMMU详解

前言&#xff1a; IOMMU&#xff08;输入输出内存管理单元&#xff09;的原理与CPU中的MMU&#xff08;内存管理单元&#xff09;相似。它的作用是管理设备的内存访问请求&#xff0c;允许安全、高效地在设备和内存之间直接传输数据。IOMMU通常用于支持高速数据传输的设备&…

java生成数据库数据到excel当做下拉选择,copy就完事~

背景&#xff1a;由于需要下载模板&#xff0c;模板包含下拉选择框&#xff0c;但是下拉选择框不想手写&#xff0c;并且需要从数据库读取&#xff0c;由于直接设置excel会有单元格最大255个字符长度限制&#xff0c;所以用到以下部分代码。 思路&#xff1a;由于数据模板在sh…

怎么通过Javascript脚本实现远程控制一路开关

怎么通过Javascript脚本实现远程控制一路开关呢&#xff1f; 本文描述了使用Javascript脚本调用HTTP接口&#xff0c;实现控制一路开关。一路开关可控制一路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1智能WiFi…

JSON Web Token 入门

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。 2、服务器验证通过后&#xff0c;在当前对话&…

基于微信小程序的宠物寄养小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Redis中的慢查询日志和监视器

慢查询 添加新日志 在每次执行命令的之前和之后&#xff0c;程序都会记录微妙格式的当前UNIX时间戳&#xff0c;这两个时间戳之间的差就是服务器执行命令所耗费的时长&#xff0c;服务器会将这个时长作为参数之一传给slowlogPushEntryIfNeeded函数&#xff0c;而slowlogPushE…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

System Dashboard for Mac:强大的系统监控与管理工具

System Dashboard for Mac是一款专为苹果电脑设计的系统监控与管理工具&#xff0c;以其直观易用的界面和全面的功能&#xff0c;深受用户喜爱。 System Dashboard for Mac v1.10.11激活版下载 这款软件能够实时监测系统的重要参数&#xff0c;包括CPU使用率、内存利用率、硬盘…

nginxtomcat笔记

nginx是一个轻量级高性能的http和反向代理web服务器&#xff0c;优点&#xff1a;占用内存少&#xff0c;并发能力强 实验主机&#xff1a;192.168.200.141 192.168.200.142 1.虚拟主机 1.1基于域名&#xff1a;一台服务器&#xff0c;一个端口&#xff0c;部署多个网站 在ng…

yolov5 的几个问题,讲的比较清楚

yolov5, 几个问题 【BCELoss】pytorch中的BCELoss理解 三个损失函数原理讲解 https://zhuanlan.zhihu.com/p/458597638 yolov5源码解析–输出 YOLOv5系列(十) 解析损失部分loss(详尽) 1、输入数据是 xywh, 针对原图的, 然后,变成 0-1, x/原图w, y/原图h, w/原图w, h/原图h,…

51-43 DragNUWA,集成文本、图像和轨迹实现视频生成细粒度控制

微软 NWA 系列主要功能及发布时间如下&#xff1a; 22年11月&#xff0c;微软亚洲研究院、北京大学联合提出同时覆盖语言、图像和视频的统一多模态生成模型女娲NWA&#xff0c;直接包揽草图转图像、图像补全、视频预测、文字指导修改视频等8项SOTA。23年3月&#xff0c;微软亚…

LLM学习之自然语言处理简单叙述

自然语言处理基础 自然语言处理&#xff1a;让计算机读懂人所写好的这些文本&#xff0c;能够像人一样进行交互。 自然语言处理的任务和应用 任务&#xff1a; 词性标注 part of speech tagging 动词&#xff0c;名词&#xff0c;形容词&#xff1f; 命名实体的识别 name…

【Java基础】23.接口

文章目录 一、接口的概念1.接口介绍2.接口与类相似点3.接口与类的区别4.接口特性5.抽象类和接口的区别 二、接口的声明三、接口的实现四、接口的继承五、接口的多继承六、标记接口 一、接口的概念 1.接口介绍 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xf…

Springboot+Vue项目-基于Java+MySQL的海滨体育馆管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Mongodb支持事务吗?

一、概念 1.1、MongoDB事务简介 MongoDB 是一个非关系型数据库管理系统&#xff0c;最初并不支持事务。然而&#xff0c;随着时间的推移&#xff0c;MongoDB 在其4.0版本中引入了多文档事务支持&#xff0c;使得在单个集合中执行多个操作成为可能。 In MongoDB, an operation…

iStat Menus for Mac:强大的系统监控工具

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for Mac v6.73 (1239)中文版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动…