NLP 端到端教程
本指南专注于一个具体的任务:将训练好的机器学习模型加载到 Elasticsearch 中,并设置该模型以丰富您的文档。
Elasticsearch 支持多种使用机器学习模型的方式。在本指南中,我们将使用在 Kibana 内容 (Content) UI 中配置的采集管道,在数据摄入时使用训练好的模型来丰富文档。
在本指南中,我们将通过以下步骤来实现上述目标
- 设置云部署:我们将使用 Elastic Cloud 来托管我们的部署,因为它能轻松扩展机器学习节点。
- 使用 Eland 加载模型:我们将使用 Eland Elasticsearch 客户端将我们选择的模型导入到 Elasticsearch 中。一旦我们验证模型已加载,就可以在采集管道中使用它。
- 设置机器学习推理管道:我们将创建一个具有预定义映射的 Elasticsearch 索引,并添加一个推理管道。
- 展示丰富后的结果:我们将一些数据摄入到索引中,并观察管道如何丰富我们的文档。
按照说明加载一个文本分类模型,并将其设置为丰富一些照片评论数据。一旦您熟悉了相关步骤,就可以将本指南作为使用其他训练好的机器学习模型的蓝图。
目录:
您的部署需要一个机器学习实例来上传和部署训练好的模型。
如果您的团队已经拥有 Elastic Cloud 部署,请确保它至少有一个机器学习实例。如果没有,请编辑 (Edit) 您的部署以增加容量。对于本教程,我们需要单个机器学习实例至少有 2GB 的内存 (RAM)。
如果您的团队没有 Elastic Cloud 部署,请先注册一个 免费 Elastic Cloud 试用版。创建账户后,您将拥有一个有效订阅,并会收到创建首次部署的提示。
按照步骤创建 (Create) 新部署。在创建部署之前,请务必在高级设置 (Advanced settings) 下为机器学习实例 (Machine Learning instances) 增加容量。为了简化扩展,请开启自动扩展此部署 (Autoscale this deployment) 功能。如果您使用自动扩展,则应增加机器学习实例的最小 RAM。对于本教程,我们需要至少 2GB 的 RAM。更多详细信息,请参阅 Elastic Cloud 文档中的 创建部署^。
Elastic 的 Eland 工具可以通过 Docker 轻松地将训练好的模型上传到您的部署中。
Eland 是一个专门用于探索和操作数据的 Elasticsearch 客户端,我们可以用它将训练好的模型上传到 Elasticsearch。
要使用 Docker 克隆并构建 Eland,请运行以下命令
git clone git@github.com:elastic/eland.git
cd eland
docker build -t elastic/eland .
现在您已经有了部署和上传模型的方法,您需要选择一个适合您数据的训练模型。Hugging Face 拥有大量公开的训练模型库。您选择的模型将取决于您的数据以及您希望对其进行什么操作。
就本指南而言,假设我们有一组照片评论数据。为了在我们平台上营造积极的氛围,我们希望每张照片的前几条评论都是正面评论。对于此任务,distilbert-base-uncased-finetuned-sst-2-english 模型非常合适。
要将此模型上传到您的部署,您需要一些数据
- 部署 URL。您可以通过部署管理屏幕上“Elasticsearch”旁边的复制端点 (Copy endpoint) 链接获取。它看起来像
https://ml-test.es.us-west1.gcp.cloud.es.io:443。如果端口不存在,请务必附加端口,因为 Eland 要求 URL 必须包含方案、主机和端口。443 是 HTTPS 的默认端口。 - 您的部署的用户名和密码。此信息在部署创建时会显示一次。它看起来像
elastic和xUjaFNTyycG34tQx5Iq9JIIA。 - 训练好的模型 ID。这来自 Hugging Face。它看起来像
distilbert-base-uncased-finetuned-sst-2-english。 - 训练好的模型任务类型。这是模型旨在实现的机器学习任务种类。它将是以下之一:
fill_mask、ner、text_classification、text_embedding和zero_shot_classification。对于我们的用例,我们将使用text_classification。
现在,我们可以通过向 Eland 提供这些选项,将我们选择的模型上传到 Elasticsearch。
docker run -it --rm --network host \
elastic/eland \
eland_import_hub_model \
--url https://ml-test.es.us-west1.gcp.cloud.es.io:443 \
-u elastic -p <PASSWORD> \
--hub-model-id distilbert-base-uncased-finetuned-sst-2-english \
--task-type text_classification \
--start
此脚本运行大约需要 2-3 分钟。模型成功部署到您的 Elastic 部署后,导航到 Kibana 的训练模型 (Trained Models) 页面以验证它是否就绪。您可以在机器学习 > 分析 (Machine Learning > Analytics) 菜单下找到此页面,然后选择训练模型 > 模型管理 (Trained Models > Model Management)。如果您在列表中没有看到您的模型,您可能需要单击同步您的作业和训练模型 (Synchronize your jobs and trained models)。您的模型现在可以使用了。
现在,我们可以使用 Kibana 的内容 (Content) UI 通过推理数据来丰富我们的文档了。在将照片评论摄入到 Elasticsearch 之前,我们首先创建一个机器学习推理管道。该管道将使用推理数据来丰富传入的照片评论,以指示这些评论是否为正面。
假设我们的照片评论作为文档上传到 Elasticsearch 时是这样的
{
"photo_id": "78sdv71-8vdkjaj-knew629-vc8459p",
"body": "your dog is so cute!",
...
}
我们希望通过一个推理处理器运行我们的文档,该处理器使用我们上传的训练模型来确定评论是否为正面。为此,我们需要首先设置一个 Elasticsearch 索引。
- 从 Kibana 主页开始,点击“搜索 (Search)”卡片。
- 点击按钮以创建 Elasticsearch 索引 (Create an Elasticsearch index)。
- 选择使用 API (Use the API) 并为您的索引命名。它将自动添加
search-前缀。对于此演示,我们将索引命名为search-photo-comments。 - 点击创建索引 (Create Index) 后,您将被重定向到新索引的概览页面。
要配置机器学习推理管道,我们需要索引具有现有的字段映射,以便我们可以选择要分析的字段。这可以通过 Kibana 开发工具中的 索引映射 API 或简单地通过 cURL 命令来完成
PUT search-photo-comments/_mapping
{
"properties": {
"photo_id": { "type": "keyword" },
"body": { "type": "text" }
}
}
现在是时候创建一个推理管道了。
- 在“搜索 (Search)”中,从您的
search-photo-comments索引的概览页面,点击管道 (Pipelines) 选项卡。默认情况下,Elasticsearch 不会创建任何特定于索引的采集管道。 - 因为我们想要自定义这些管道,所以我们需要复制并自定义 (Copy and customize)
search-default-ingestion采集管道。在search-default-ingestion采集管道的设置上方找到此选项。这将创建两个新的特定于索引的采集管道。
接下来,我们将添加一个推理管道。
- 找到机器学习推理管道 (Machine Learning Inference Pipelines) 部分,然后选择添加推理管道 (Add inference pipeline)。
- 为您的推理管道命名,选择我们上传的训练模型,并选择要分析的
body字段。 - (可选) 选择一个字段名称来存储输出。我们将其命名为
positivity_result。
您还可以通过模拟器运行示例文档,并在创建管道之前对其进行审查。
至此,一切准备就绪,可以在索引时丰富文档。
从 Kibana 开发控制台 (Dev Console),或者简单地使用 cURL 命令,我们可以索引一个文档。我们将使用 _run_ml_inference 标志来告诉 search-photo-comments 管道运行我们创建的特定于索引的机器学习推理管道。该字段不会在文档中被索引。
POST search-photo-comments/_doc/my-new-doc?pipeline=search-photo-comments
{
"photo_id": "78sdv71-8vdkjaj-knew629-vc8459p",
"body": "your dog is so cute!",
"_run_ml_inference": true
}
文档索引完成后,使用 API 检索它并查看丰富后的数据。
GET search-photo-comments/_doc/my-new-doc
{
"_index": "search-photo-comments",
"_id": "_MQggoQBKYghsSwHbDvG",
...
"_source": {
...
"photo_id": "78sdv71-8vdkjaj-knew629-vc8459p",
"body": "your dog is so cute!",
"ml": {
"inference": {
"positivity_result": {
"predicted_value": "POSITIVE",
"prediction_probability": 0.9998022925461774,
"model_id": "distilbert-base-uncased-finetuned-sst-2-english"
}
}
}
}
}
文档有了包含丰富数据的新字段。ml.inference.positivity_result 字段是一个对象,其中包含来自机器学习模型的分析结果。我们使用的模型以 99.98% 的置信度预测所分析的文本是正面的。
从这里,我们可以编写搜索查询来提升 ml.inference.positivity_result.predicted_value 的权重。如果模型置信度足够高,该字段也将存储在顶层的 positivity_result 字段中。
在本指南中,我们介绍了如何
- 在 Elastic Cloud 上设置包含机器学习实例的部署。
- 使用 Eland Elasticsearch 客户端部署训练好的机器学习模型。
- 配置推理管道,以便在 Elasticsearch 中使用训练好的模型。
- 在摄入时使用来自训练模型的推理结果丰富文档。
- 查询您的搜索引擎并按
positivity_result排序。