チュートリアル: セマンティックテキストを用いたセマンティック検索
この機能はベータ版であり、変更される可能性があります。設計とコードは公式GA機能よりも成熟しておらず、保証なしでそのまま提供されています。ベータ機能は公式GA機能のサポートSLAの対象外です。
このチュートリアルでは、セマンティックテキスト機能を使用してデータに対してセマンティック検索を実行する方法を示します。
セマンティックテキストは、取り込み時に推論を提供し、自動的に合理的なデフォルト値を提供することで推論ワークフローを簡素化します。モデル関連の設定やパラメータを定義したり、推論取り込みパイプラインを作成したりする必要はありません。
Elastic Stackでセマンティック検索を使用する推奨方法は、semantic_text
ワークフローに従うことです。インデックス作成やクエリ設定に対してより多くの制御が必要な場合は、完全な推論ワークフローを使用することもできます(プロセスを確認するにはこのチュートリアルを参照してください)。
このチュートリアルでは、デモンストレーションのためにelser
サービスを使用しますが、Inference APIが提供する任意のサービスとそのサポートされているモデルを使用できます。
要件
semantic_text
フィールドタイプを使用するには、Create inference APIを使用してクラスターに推論エンドポイントをデプロイする必要があります。
推論エンドポイントの作成
Create inference APIを使用して推論エンドポイントを作成します:
Python
resp = client.inference.put(
task_type="sparse_embedding",
inference_id="my-elser-endpoint",
inference_config={
"service": "elser",
"service_settings": {
"num_allocations": 1,
"num_threads": 1
}
},
)
print(resp)
コンソール
PUT _inference/sparse_embedding/my-elser-endpoint
{
"service": "elser",
"service_settings": {
"num_allocations": 1,
"num_threads": 1
}
}
タスクタイプはsparse_embedding で、elser サービスが使用され、ELSERがスパースベクトルを作成します。inference_id はmy-elser-endpoint です。 |
|
この例ではelser サービスが使用されています。 |
Kibanaコンソールを使用しているときに502 Bad Gatewayエラーが応答に表示されることがあります。このエラーは通常、モデルがバックグラウンドでダウンロードされている間のタイムアウトを反映しています。ダウンロードの進行状況はMachine Learning UIで確認できます。Pythonクライアントを使用している場合は、timeout
パラメータをより高い値に設定できます。
インデックスマッピングの作成
推論エンドポイントが入力テキストに基づいて生成する埋め込みを含む宛先インデックスのマッピングを作成する必要があります。宛先インデックスには、使用される推論エンドポイントの出力をインデックスするために、semantic_text
フィールドタイプのフィールドが必要です。
Python
resp = client.indices.create(
index="semantic-embeddings",
mappings={
"properties": {
"content": {
"type": "semantic_text",
"inference_id": "my-elser-endpoint"
}
}
},
)
print(resp)
Js
const response = await client.indices.create({
index: "semantic-embeddings",
mappings: {
properties: {
content: {
type: "semantic_text",
inference_id: "my-elser-endpoint",
},
},
},
});
console.log(response);
コンソール
PUT semantic-embeddings
{
"mappings": {
"properties": {
"content": {
"type": "semantic_text",
"inference_id": "my-elser-endpoint"
}
}
}
}
生成された埋め込みを含むフィールドの名前。 | |
埋め込みを含むフィールドはsemantic_text フィールドです。 |
|
inference_id は前のステップで作成した推論エンドポイントです。それは入力テキストに基づいて埋め込みを生成するために使用されます。 データを関連する semantic_text フィールドに取り込むたびに、このエンドポイントがテキストのベクトル表現を作成するために使用されます。 |
データのロード
このステップでは、後で埋め込みを作成するために使用するデータをロードします。
msmarco-passagetest2019-top1000
データセットを使用します。これはMS MARCO Passage Rankingデータセットのサブセットです。200のクエリが含まれており、それぞれに関連するテキストパッセージのリストが付随しています。すべてのユニークなパッセージとそのIDは、そのデータセットから抽出され、tsvファイルにまとめられています。
ファイルをダウンロードし、Machine Learning UIのData Visualizerを使用してクラスターにアップロードします。データが分析された後、Override settingsをクリックします。Edit field namesの下で、最初の列にid
を、2番目の列にcontent
を割り当てます。Applyをクリックし、次にImportをクリックします。インデックスにtest-data
という名前を付け、Importをクリックします。アップロードが完了すると、182,469ドキュメントを持つtest-data
という名前のインデックスが表示されます。
データの再インデックス化
#### Python
``````python
resp = client.reindex(
wait_for_completion=False,
source={
"index": "test-data",
"size": 10
},
dest={
"index": "semantic-embeddings"
},
)
print(resp)
`
Js
const response = await client.reindex({
wait_for_completion: "false",
source: {
index: "test-data",
size: 10,
},
dest: {
index: "semantic-embeddings",
},
});
console.log(response);
コンソール
POST _reindex?wait_for_completion=false
{
"source": {
"index": "test-data",
"size": 10
},
"dest": {
"index": "semantic-embeddings"
}
}
再インデックス化のデフォルトバッチサイズは1000です。サイズを小さくすると、再インデックス化プロセスの更新が迅速になり、進行状況を密接に追跡し、エラーを早期に検出できます。 |
呼び出しは進行状況を監視するためのタスクIDを返します:
Python
resp = client.tasks.get(
task_id="<task_id>",
)
print(resp)
Js
const response = await client.tasks.get({
task_id: "<task_id>",
});
console.log(response);
コンソール
GET _tasks/<task_id>
大規模なデータセットの再インデックス化には時間がかかることがあります。このワークフローをデータセットのサブセットのみを使用してテストできます。再インデックス化プロセスをキャンセルし、再インデックス化されたサブセットの埋め込みのみを生成することでこれを行います。次のAPIリクエストは再インデックス化タスクをキャンセルします:
Python
resp = client.tasks.cancel(
task_id="<task_id>",
)
print(resp)
Js
const response = await client.tasks.cancel({
task_id: "<task_id>",
});
console.log(response);
コンソール
POST _tasks/<task_id>/_cancel
セマンティック検索
データセットが埋め込みで強化された後、セマンティック検索を使用してデータをクエリできます。semantic_text
フィールド名とsemantic
クエリタイプでクエリテキストを提供します。semantic_text
フィールドの埋め込みを生成するために使用された推論エンドポイントがクエリテキストを処理するために使用されます。
Python
resp = client.search(
index="semantic-embeddings",
query={
"semantic": {
"field": "content",
"query": "How to avoid muscle soreness while running?"
}
},
)
print(resp)
Js
const response = await client.search({
index: "semantic-embeddings",
query: {
semantic: {
field: "content",
query: "How to avoid muscle soreness while running?",
},
},
});
console.log(response);
コンソール
GET semantic-embeddings/_search
{
"query": {
"semantic": {
"field": "content",
"query": "How to avoid muscle soreness while running?"
}
}
}
検索を実行したいsemantic_text フィールド。 |
|
クエリテキスト。 |
その結果、semantic-embedding
インデックスからクエリに最も近い意味を持つ上位10件のドキュメントが返されます:
コンソール-結果
"hits": [
{
"_index": "semantic-embeddings",
"_id": "Jy5065EBBFPLbFsdh_f9",
"_score": 21.487484,
"_source": {
"id": 8836652,
"content": {
"text": "There are a few foods and food groups that will help to fight inflammation and delayed onset muscle soreness (both things that are inevitable after a long, hard workout) when you incorporate them into your postworkout eats, whether immediately after your run or at a meal later in the day. Advertisement. Advertisement.",
"inference": {
"inference_id": "my-elser-endpoint",
"model_settings": {
"task_type": "sparse_embedding"
},
"chunks": [
{
"text": "There are a few foods and food groups that will help to fight inflammation and delayed onset muscle soreness (both things that are inevitable after a long, hard workout) when you incorporate them into your postworkout eats, whether immediately after your run or at a meal later in the day. Advertisement. Advertisement.",
"embeddings": {
(...)
}
}
]
}
}
}
},
{
"_index": "semantic-embeddings",
"_id": "Ji5065EBBFPLbFsdh_f9",
"_score": 18.211695,
"_source": {
"id": 8836651,
"content": {
"text": "During Your Workout. There are a few things you can do during your workout to help prevent muscle injury and soreness. According to personal trainer and writer for Iron Magazine, Marc David, doing warm-ups and cool-downs between sets can help keep muscle soreness to a minimum.",
"inference": {
"inference_id": "my-elser-endpoint",
"model_settings": {
"task_type": "sparse_embedding"
},
"chunks": [
{
"text": "During Your Workout. There are a few things you can do during your workout to help prevent muscle injury and soreness. According to personal trainer and writer for Iron Magazine, Marc David, doing warm-ups and cool-downs between sets can help keep muscle soreness to a minimum.",
"embeddings": {
(...)
}
}
]
}
}
}
},
{
"_index": "semantic-embeddings",
"_id": "Wi5065EBBFPLbFsdh_b9",
"_score": 13.089405,
"_source": {
"id": 8800197,
"content": {
"text": "This is especially important if the soreness is due to a weightlifting routine. For this time period, do not exert more than around 50% of the level of effort (weight, distance and speed) that caused the muscle groups to be sore.",
"inference": {
"inference_id": "my-elser-endpoint",
"model_settings": {
"task_type": "sparse_embedding"
},
"chunks": [
{
"text": "This is especially important if the soreness is due to a weightlifting routine. For this time period, do not exert more than around 50% of the level of effort (weight, distance and speed) that caused the muscle groups to be sore.",
"embeddings": {
(...)
}
}
]
}
}
}
}
]
さらなる例
semantic_text
をハイブリッド検索で使用したい場合は、このノートブックを参照してステップバイステップのガイドを確認してください。