Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

时间:2022-12-21 19:02:46

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

自然语言处理 (NLP) 是人工智能 (AI) 的一个分支,旨在通过将计算语言学与统计、机器学习和深度学习模型相结合,尽可能接近人类解释地理解人类语言。

NLP 的最大挑战之一是在考虑到各种语言表示的情况下预训练文本数据的过程。

2018 年,谷歌采购了一种称为 BERTBidirectional Encoder Representations from Transformers)的预训练 NLP 新技术,不再需要以任何固定顺序处理数据,从而允许在更大量的数据上进行训练,并提高理解上下文的能力和语言的歧义。

与任何其他预训练过程一样,数据越多越好。 因此,使用了未标记的文本数据集,例如整个英文*。 然后预训练作为构建的 “知识” 层。

为了支持使用与 BERT 相同的分词器的模型,Elastic 支持 PyTorch 库,这是最流行的机器学习库之一,它支持像 BERT 使用的 Transformer 架构这样的神经网络,支持 NLP 任务并将这些任务合并为数据的一部分流水线到 Elasticsearch。

一般来说,任何具有受支持架构的训练模型都可以部署在 Elasticsearch 中,包括 BERT 和变体,例如:

  • RoBERTa
  • DistilBERT
  • RetriBERT
  • MobileBERT
  • ELECTRA

这些模型按 NLP 任务列出。

目前,这些是支持的任务:

  1. Named entity recognition
  2. Fill-mask
  3. Question answering
  1. Language identification
  2. Text classification
  3. Zero-shot text classification
  1. Text embedding
  2. Text similarity

与 classfification 和 regression 的情况一样,导入经过训练的模型后,你可以使用它进行预测(推理 inference)。

对于我们今天的这个演示,我们将使用这些任务之一 -> information extraction:Question answering

此任务允许我们在给定上下文(文本)和问题的情况下获得答案,从提供的文本中提取信息以回答提供的问题。

在这种情况下,它不像具有对话流的聊天机器人,但有助于自动响应常见问题,或者甚至在处理之前未映射的开放式问题时使用对话流。

我们现在要做的是使用我们的 eland 库QA 模型导入你的 Elastic Stack,这是一个用于在 Elasticsearch 中探索和分析数据的 Python Elasticsearch 客户端,我们有一些简单的方法和脚本可以让你从中提取模型Hugging Face 模型中心,一个用于构建、训练和部署开源机器学习模型的 AI 社区。

在这种情况下,我们将导入 Hugging Face 上可用的模型 deepset/minilm-uncased-squad2

将 PyTorch 模型上传到你的集群后,你将能够将该模型分配给特定的机器学习节点,将其加载到内存中并启动本机 libtorch 进程。

一旦模型分配完成,我们就可以进行推理,使用推理处理器来评估模型。 对于这个演示,我们将使用圣诞歌词作为我们的背景,这将允许我们对我们最喜欢的圣诞歌曲提问。

让我们开始吧!在今天的展示中,我将使用最新的 Elastic Stack 8.5.3 来进行展示。

安装

Elasticsearch 及 Kibana

如果你还没安装好自己的 Elasticsearch 及 Kibana,请参阅如下的文章来进行安装:

如果你还没安装好自己的 Elasticsearch 及 Kibana,请参阅如下的文章来进行安装:

请注意文章中的 8.x 的安装部分。由于使用 eland 上传模型是白金版或者是企业版的功能,在我们的演示中,我们需要启动白金版试用功能:

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈 

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈 

Eland

Eland 可以通过 pip 从 PyPI 安装。在安装之前,我们需要安装好自己的 Python。

$ python --version
Python 3.10.2

可以使用 Pip 从 PyPI 安装 Eland:

python -m pip install eland

也可以使用 Conda 从 Conda Forge 安装 Eland:

conda install -c conda-forge eland

希望在不安装 Eland 的情况下使用它的用户,为了只运行可用的脚本,可以构建 Docker 容器:

git clone https://github.com/elastic/eland
cd eland
docker build -t elastic/eland .

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

Eland 将 Hugging Face 转换器模型到其 TorchScript 表示的转换和分块过程封装在一个 Python 方法中; 因此,这是推荐的导入方法。

  1. 安装 Eland Python 客户端
  2. 运行 eland_import_hub_model 脚本。 例如:
eland_import_hub_model --url <clusterUrl> \ 
--hub-model-id elastic/distilbert-base-cased-finetuned-conll03-english \ 
--task-type ner 
  • 指定 URL 以访问你的集群。 例如,https://<user>:<password>@<hostname>:<port>。
  • 在 Hugging Face 模型中心中指定模型的标识符。
  • 指定 NLP 任务的类型。 支持的值为 fill_mask、ner、text_classification、text_embedding, question_answering 和 zero_shot_classification。

上传 QA model

在此演示中,我们将使用随机 QA 模型,但你可以随意导入要使用的模型。 你可以在 Hugging Face 网页上阅读有关此模型的更多详细信息。

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

从上面,我们可以看出来,给定一定的上下文,我们提问,就可以得到我们需要的答案。 

打开我们的终端并使用我们的端点和 model 名称更新以下命令:

eland_import_hub_model --url https://<user>:<password>@<hostname>:<port> \
--hub-model-id <model_name> \
--task-type <task_type>

针对我的情况,我使用如下的命令:

eland_import_hub_model --url https://elastic:3Q5_PqiMCP-=8xcRIvCS@localhost:9200 \
	--hub-model-id deepset/minilm-uncased-squad2 \
	--task-type question_answering \
	--ca-cert /Users/liuxg/elastic/elasticsearch-8.5.3/config/certs/http_ca.crt
	--start

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

在上面,我使用 --ca-cert 选项来设置我的自签名证书的证书。当然你也可以选择如下的方式来忽略自签名证书:

eland_import_hub_model --url https://elastic:3Q5_PqiMCP-=8xcRIvCS@localhost:9200 \
	--hub-model-id deepset/minilm-uncased-squad2 \
	--task-type question_answering \
	--insecure
	--start

我们可以到机器学习的页面来查看:

 Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈 

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

如果你在之前的命令中没有添加 --start 选项,那么你需要点击上面的 play 按钮来进行启动:

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈 

部署后,State 列的值为 started,Actions 下的 Start deployment 选项将被禁用,这意味着部署已经完。

让我们测试一下我们的模型吧!

复制上面的模型 ID deepset__minilm-uncased-squad2。

在 Kibana 菜单中,单击开 Dev Tools。

在此 UI 中,你将有一个控制台来与你的数据进行交互。

让我们使用推理处理器(inference processor)来推理经过训练的模型。

Christmas song

我们选择为这首歌提问:Mariah Carey - All I Want For Christmas Is You

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

好吧,2022 年又是第一名。我们使用如下的命令格式来进行推理:

POST _ml/trained_models/<model_id>/deployment/_infer
{
  "docs": [{"text_field": "<input>"}],
  "inference_config": {"question_answering": {"question": "<question_to_be_answered>"}}
}

此 POST 方法包含一个文档数组,其中包含一个与你配置的训练模型输入匹配的字段,通常字段名称为 text_field。 text_field 值是你要推断的输入。 对于提到的 QA 模型,除了我们将提供的文本作为输入外,问题是必需的,inference_config 包含推理的配置,对于 QA 模型,针对你的 text_field 提出问题。

在我添加歌曲歌词的示例中,这将是:

问题:我在意礼物吗?

POST _ml/trained_models/deepset__minilm-uncased-squad2/deployment/_infer
{
    "docs": [{"text_field": "I don't want a lot for Christmas There's just one thing I need I don't care about presents Underneath the Christmas tree I just want you for my own More than you could ever know Make my wish come true All I want for Christmas is you. I don't want a lot for Christmas There is just one thing I need I don't care about presents Underneath the Christmas tree I don't need to hang my stocking There upon the fireplace Santa Claus won't make me happy With a toy on Christmas day I just want you for for my own More than you could ever know Make my wish come true All I want for Christmas is you You baby I won't ask for much this Christmas I won't even wish for snow I'm just gonna keep on waiting Underneath the mistletoe I won't make a list and send it To the North Pole for Saint Nick I won't even stay awake to Hear those magic reindeer click 'Cause I just want you here tonight Holding on to me so tight What more can I do Baby all I want for Christmas is you All the lights are shining So brightly everywhere And the sound of children's Laughter fills the air And everyone is singing I hear those sleigh bells ringing Santa won't you bring me the one I really need Won't you please bring my baby to me Oh, I don't want a lot for Christmas This is all I'm asking for I just want to see my baby Standing right outside my door Oh I just want him for my own More than you could ever know Make my wish come true Baby all I want for Christmas is you All I want for Christmas is you baby All I want for Christmas is you baby."}],
    "inference_config": {"question_answering": {"question": "Do I care about presents?"}}
}

单击播放图标,你可以发送请求。

答案由下面的对象显示:

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

predicted_value 包含你的答案。显然不在乎礼物,而是在乎的是人 :)

I don't care about presents Underneath the Christmas tree.

此外,你还有 start_offset 和 end_offset 记录您的 predicted_value 的开始和结束字符偏移量以及此预测的概率,即 prediction_probability 字段。 

让我们提出另外一个问题:

问题:圣诞节我想要什么?

我们的命令格式是:

POST _ml/trained_models/deepset__minilm-uncased-squad2/deployment/_infer
{
    "docs": [{"text_field": "I don't want a lot for Christmas There's just one thing I need I don't care about presents Underneath the Christmas tree I just want you for my own More than you could ever know Make my wish come true All I want for Christmas is you. I don't want a lot for Christmas There is just one thing I need I don't care about presents Underneath the Christmas tree I don't need to hang my stocking There upon the fireplace Santa Claus won't make me happy With a toy on Christmas day I just want you for for my own More than you could ever know Make my wish come true All I want for Christmas is you You baby I won't ask for much this Christmas I won't even wish for snow I'm just gonna keep on waiting Underneath the mistletoe I won't make a list and send it To the North Pole for Saint Nick I won't even stay awake to Hear those magic reindeer click 'Cause I just want you here tonight Holding on to me so tight What more can I do Baby all I want for Christmas is you All the lights are shining So brightly everywhere And the sound of children's Laughter fills the air And everyone is singing I hear those sleigh bells ringing Santa won't you bring me the one I really need Won't you please bring my baby to me Oh, I don't want a lot for Christmas This is all I'm asking for I just want to see my baby Standing right outside my door Oh I just want him for my own More than you could ever know Make my wish come true Baby all I want for Christmas is you All I want for Christmas is you baby All I want for Christmas is you baby."}],
    "inference_config": {"question_answering": {"question": "What do I want for Christmas?"}}
}

Elasticsearch:使用 NLP 问答模型与你喜欢的圣诞歌曲交谈

我们可以提更多的问题:

  • Will Santa Claus make me happy?
  • Are the lights shining?

当然你可以试其它的歌曲或者文字。

我希望你喜欢将 NLP 与 Elastic Stack 结合使用! 随时欢迎反馈。