本文使用文本嵌入模型(text_embedding)對用戶查詢進行深度語義解析,突破傳統關鍵詞匹配的局限,從海量數據中準確提取高度相關的內容。使用問答模型(question_answering)對關聯文本進行精細解讀,精準抽取答案,回答與文本相關的問題。文本嵌入模型和問答模型的組合可以用于智能搜索引擎、個性化推薦等場景,可以提升信息檢索和問題解答的精準度。
準備工作
上傳模型
本文選擇huggingface倉庫中的question_answering模型luhua/chinese_pretrain_mrc_macbert_large和text_embedding模型thenlper/gte-large-zh。將模型上傳到阿里云ES中,請參見通過Eland上傳第三方NLP模型。
由于中國內地網絡訪問huggingface較慢,本文采用離線上傳模型的方式。
下載模型。
將模型上傳到ECS中。
在ECS的根目錄下新建一個文件夾,例如model,將模型上傳到該文件夾中,請不要將模型上傳到/root/目錄下。
由于模型比較大,建議通過WinSCP的方式上傳,請參見通過WinSCP上傳或下載文件(本地主機為Windows)。
在ECS中執行如下命令,在模型文件目錄下解壓模型。
cd /model/ tar -xzvf luhua--chinese_pretrain_mrc_macbert_large.tar.gz tar -xzvf thenlper--gte-large-zh.tar.gz cd
在ECS中執行如下命令,將模型上傳到ES中。
上傳問答模型luhua--chinese_pretrain_mrc_macbert_large:
eland_import_hub_model --url 'http://es-cn-lbj3l7erv0009****.elasticsearch.aliyuncs.com:9200' --hub-model-id '/model/root/.cache/huggingface/hub/models--luhua--chinese_pretrain_mrc_macbert_large/snapshots/f2d95d06f16a3043002c9702f66c834f4e0aa944' --task-type question_answering --es-username elastic --es-password **** --es-model-id models--luhua--chinese_pretrain_mrc_macbert_large \
上傳文本嵌入模型thenlper--gte-large-zh:
eland_import_hub_model --url 'http://es-cn-lbj3l7erv0009****.elasticsearch.aliyuncs.com:9200' --hub-model-id '/model/root/.cache/huggingface/hub/models--thenlper--gte-large-zh/snapshots/952432e6b99137bbfd8397d5ad92f920be5f22e9' --task-type text_embedding --es-username elastic --es-password **** --es-model-id models--thenlper--gte-large-zh \
部署模型
登錄Kibana。具體操作,請參見登錄Kibana控制臺。
單擊Kibana頁面左上角的圖標,選擇Analytics > Machine Learning。
在左側菜單欄,單擊模型管理(Model Management) > 已訓練模型(Trained Models)。
(可選)在頁面上方,單擊同步作業和已訓練模型(Synchronize your jobs and trained models),在彈出的面板中單擊同步(Synchronize)。
將鼠標移動到目標模型操作(Actions)列的前面,單擊圖標,啟動模型。
在彈出的對話框中,配置模型后,單擊啟動(Start)。
頁面右下角彈出已成功啟動的提示對話框,表明模型部署成功。
說明模型無法啟動可能是集群內存不足,升配集群后再試。無法啟動的具體原因,請在提示對話框中單擊請參閱完整的錯誤信息查看。
驗證模型的可用性
單擊Kibana頁面左上角的圖標,選擇Management > 開發工具(Dev Tools)。
驗證模型的可用性
執行以下命令,驗證問答模型models--luhua--chinese_pretrain_mrc_macbert_large的可用性。
POST /_ml/trained_models/models--luhua--chinese_pretrain_mrc_macbert_large/_infer { "docs":[{"text_field": "沒有必要。安裝兩個殺毒軟件可以增強電腦的安全性,但是會導致以下弊端: 占用硬盤資源過多; 在同時啟用兩款軟件的實時防護時,會導致系統硬件資源大量損耗,例如CPU處理過多,導致計算機工作能力下降; >在進行殺毒時,會導致系統占用資源過多,不但可能影響系統工作能力,還可能誤報對方組件,導致.."}], "inference_config": {"question_answering": {"question": "電腦可以同時安裝多個殺毒軟件嗎"}} }
返回結果如下所示,結果符合預期。
{ "inference_results": [ { "predicted_value": "沒有必要", "start_offset": 0, "end_offset": 4, "prediction_probability": 0.8775923604355836 } ] }
執行以下命令,驗證文本嵌入模型models--thenlper--gte-large-zh的可用性。
POST /_ml/trained_models/models--thenlper--gte-large-zh/_infer { "docs":[{"text_field": "沒有必要。安裝兩個殺毒軟件可以增強電腦的安全性,但是會導致以下弊端: 占用硬盤資源過多; 在同時啟用兩款軟件的實時防護時,會導致系統硬件資源大量損耗,例如CPU處理過多,導致計算機工作能力下降; >在進行殺毒時,會導致系統占用資源過多,不但可能影響系統工作能力,還可能誤報對方組件,導致.."}] }
部分返回結果如下所示,結果符合預期。
{ "inference_results": [ { "predicted_value": [ 1.389997959136963, -0.6398589611053467, -0.5746312737464905, -0.5629222393035889, -0.49914881587028503, 0.5277091264724731, -1.2194437980651855, 0.19847321510314941, .............. 0.6711148619651794, 1.6224931478500366, 2.0970489978790283, -0.4506820738315582, -0.298383504152298 ] } ] }
準備數據集
索引數據時需要示例數據集。
下載示例數據集。
文本以extracted_data.json數據集為例,請參見extracted_data.json。
將數據集上傳到ECS中,例如文本將數據集上傳到/model/目錄下。
步驟一:索引數據
通過ingest pipeline在索引中配置模型,以便在數據寫入過程中完成文本轉換。
說明針對索引已存儲數據需要應用模型完成向量轉換,請參見reindex方式重建索引。
PUT _ingest/pipeline/text-embedding-pipeline { "processors": [ { "inference": { "model_id": "models--thenlper--gte-large-zh", "target_field": "text_embedding", "field_map": { "context": "text_field" } } } ] } #####創建索引mapping,指定ingest pipeline PUT question_answering { "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 1, "default_pipeline": "text-embedding-pipeline" } }, "mappings": { "properties": { "text_embedding.predicted_value": { "type": "dense_vector", "dims": 1024, "index": true, "similarity": "l2_norm" }, "context": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } }
通過Python導入準備的數據集(python 3.10):
# -*- coding:utf-8 -*- import json from pprint import pprint import os import time from elasticsearch import helpers import time from elasticsearch import Elasticsearch elastic_user="elastic" elastic_password="****" elastic_endpoint="es-cn-lbj3l7erv0009****.elasticsearch.aliyuncs.com" url = f"http://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200" es = Elasticsearch(url) print(es.info()) with open('/model/extracted_data.json') as f: data_json = json.load(f) # Prepare the documents to be indexed documents = [] for doc in data_json: documents.append({ "_index": "question_answering", "_source": doc, }) # Use helpers.bulk to index helpers.bulk(es, documents) print("Done indexing documents into `question_answering` index!") time.sleep(5)
步驟二、通過kibana檢索
以“阿里云Elasticsearch應用場景有哪些”問題為例,在kibana上進行檢索演示:
單擊Kibana頁面左上角的圖標,選擇Management > 開發工具(Dev Tools)。
調用阿里云ES機器學習推理接口,將文檔轉換為向量數據。
ES 8.7及以上版本
ES 8.7及以上版本可以通過query_vector_builder構建。
GET question_answering/_search { "_source": ["context","title"], "knn": { "field": "text_embedding.predicted_value", "k": 5, "num_candidates": 10, "query_vector_builder": { "text_embedding": { "model_id": "models--thenlper--gte-large-zh", "model_text": "阿里云elasticsearch應用場景有哪些" } } } }
返回結果如下所示,可以看出前5條文檔和ES相關性比較大,第一條內容主要介紹阿里云ES服務。
{ "took": 30, "timed_out": false, "_shards": { "total": 2, "successful": 2, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 5, "relation": "eq" }, "max_score": 0.003581697, "hits": [ { "_index": "question_answering", "_id": "evdbaI0BU_1of7kX5_Hn", "_score": 0.003581697, "_source": { "context": "阿里云Elasticsearch是基于開源Elasticsearch構建的全托管Elasticsearch云服務,在100%兼容開源功能的同時,支持開箱即用、按需付費。不僅提供云上開箱即用的Elasticsearch、Logstash、Kibana、Beats在內的Elastic Stack生態組件,還與Elastic官方合作提供免費X-Pack(白金版高級特性)商業插件,集成了安全、SQL、機器學習、告警、監控等高級特性,被廣泛應用于實時日志分析處理、信息檢索、以及數據的多維查詢和統計分析等場景。", "title": "什么是阿里云Elasticsearch" } }, { "_index": "question_answering", "_id": "2VBdaI0Bg5EzGjIAN-Tx", "_score": 0.003581697, "_source": { "context": "阿里云Elasticsearch是基于開源Elasticsearch構建的全托管Elasticsearch云服務,在100%兼容開源功能的同時,支持開箱即用、按需付費。不僅提供云上開箱即用的Elasticsearch、Logstash、Kibana、Beats在內的Elastic Stack生態組件,還與Elastic官方合作提供免費X-Pack(白金版高級特性)商業插件,集成了安全、SQL、機器學習、告警、監控等高級特性,被廣泛應用于實時日志分析處理、信息檢索、以及數據的多維查詢和統計分析等場景。", "title": "什么是阿里云Elasticsearch" } }, { "_index": "question_answering", "_id": "t49gaI0BNqB2ciGcDbmF", "_score": 0.003581697, "_source": { "context": "阿里云Elasticsearch是基于開源Elasticsearch構建的全托管Elasticsearch云服務,在100%兼容開源功能的同時,支持開箱即用、按需付費。不僅提供云上開箱即用的Elasticsearch、Logstash、Kibana、Beats在內的Elastic Stack生態組件,還與Elastic官方合作提供免費X-Pack(白金版高級特性)商業插件,集成了安全、SQL、機器學習、告警、監控等高級特性,被廣泛應用于實時日志分析處理、信息檢索、以及數據的多維查詢和統計分析等場景。", "title": "什么是阿里云Elasticsearch" } }, { "_index": "question_answering", "_id": "efdbaI0BU_1of7kX5_Hn", "_score": 0.0027631863, "_source": { "context": "登錄Kibana控制臺的具體操作,請參見登錄Kibana控制臺。Kibana控制臺的用戶名默認為elastic,密碼為您創建阿里云Elasticsearch實例時設置的密碼。如果忘記密碼可以重置,重置密碼的注意事項及具體操作,請參見重置實例訪問密碼。", "title": "如何登錄Kibana控制臺,用戶名和密碼是什么?" } }, { "_index": "question_answering", "_id": "2FBdaI0Bg5EzGjIAN-Tx", "_score": 0.0027631863, "_source": { "context": "登錄Kibana控制臺的具體操作,請參見登錄Kibana控制臺。Kibana控制臺的用戶名默認為elastic,密碼為您創建阿里云Elasticsearch實例時設置的密碼。如果忘記密碼可以重置,重置密碼的注意事項及具體操作,請參見重置實例訪問密碼。", "title": "如何登錄Kibana控制臺,用戶名和密碼是什么?" } } ] } }
ES 8.7以下版本
調用ES機器學習推理接口。
POST /_ml/trained_models/thenlper__gte-large-zh/_infer { "docs":[{"text_field": "阿里云elasticsearch應用場景有哪些"}] }
返回結果如下所示:
復制向量數據,使用knn搜索索引中相似的文檔。
GET question_answering/_search { "_source": ["context","title"], "knn": { "field": "text_embedding.predicted_value", "k": 5, "num_candidates": 10, "query_vector": [ 0.2767493426799774, 0.05577810853719711, 0.2760164141654968, -0.9484721422195435, .............. 0.8358230590820312, 0.6053569316864014, -0.5380803942680359 ] } }
將第一個文檔的context復制下來調用QA模型實現問答。
POST /_ml/trained_models/models--luhua--chinese_pretrain_mrc_macbert_large/_infer { "docs":[{"text_field": "阿里云Elasticsearch是基于開源Elasticsearch構建的全托管Elasticsearch云服務,在100%兼容開源功能的同時,支持開箱即用、按需付費。不僅提供云上開箱即用的Elasticsearch、Logstash、Kibana、Beats在內的Elastic Stack生態組件,還與Elastic官方合作提供免費X-Pack(白金版高級特性)商業插件,集成了安全、SQL、機器學習、告警、監控等高級特性,被廣泛應用于實時日志分析處理、信息檢索、以及數據的多維查詢和統計分析等場景"}], "inference_config": {"question_answering": {"question": "阿里云elasticsearch應用場景有哪些"}} }
返回結果如下:
{ "inference_results": [ { "predicted_value": "實時日志分析處理", "start_offset": 220, "end_offset": 228, "prediction_probability": 0.014678373776954107 } ] }
步驟三:模擬問答場景
在ECS中執行Python3
加載Python環境后,執行以下命令模擬問答場景。
# -*- coding:utf-8 -*-
import json
from pprint import pprint
import os
import time
from elasticsearch import helpers
import time
from elasticsearch import Elasticsearch
elastic_user="elastic"
elastic_password="Es123456"
elastic_endpoint="es-cn-lbj3l7erv0009bz81.public.elasticsearch.aliyuncs.com"
url = f"http://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
es = Elasticsearch(url)
question = input("請輸入您的問題: ")
query_args = {
"field": "text_embedding.predicted_value",
"k": 5,
"num_candidates": 10,
"query_vector_builder": {
"text_embedding": {
"model_id": "models--thenlper--gte-large-zh",
"model_text": question
}
}
}
result=es.search(index="question_answering",source=["context","title"],knn=query_args)
# print(result["hits"]["hits"])
concatenated_content = ""
for hit in result["hits"]["hits"]:
context=hit["_source"]["context"]
concatenated_content += context+" "
#print(concatenated_content)
docs=[{"text_field": concatenated_content}]
inference_config= {"question_answering": {"question": question}}
response=es.ml.infer_trained_model(model_id="models--luhua--chinese_pretrain_mrc_macbert_large",docs=docs,inference_config=inference_config)
print("推理結果是: ")
print(response["inference_results"][0]["predicted_value"])
返回結果如下所示。
請輸入您的問題:
張家港高鐵站位置在哪
推理結果是:
塘橋鎮新204國道東側,人民路北路