ファセット検索: AI を活用して検索範囲と結果を改善する
Elasticsearch のファセット検索を使用して、カテゴリ内のオプションをすばやく絞り込む方法を説明します。
この記事では、人工知能 (AI)、特に GPT-4 などの高度な言語モデルを使用することで、よりコンテキストに沿ったファセットを作成し、ユーザーにとってさらに関連性と有用性を高めることができる方法について説明します。
ファセット検索は、電子商取引プラットフォームにおける強力なツールです。表示されるアイテムの特性に基づいて検索結果を整理および絞り込むのに役立ちます。フィルターと混同されることがよくありますが、ファセットの動作は異なります。フィルターは、製品のカテゴリや形式など、インデックスに常に存在する情報によって定義される固定属性です。一方、ファセットは動的であり、実行された検索によって返された結果から生成されます。
衣料品のカタログを想像してください。「カテゴリ」(例:T シャツ、ズボン)や「性別」(例:男性、女性)などのフィールドは、結果を絞り込むのに役立つフィルターです。ただし、ファセットは、一般的な色、利用可能なサイズ、素材など、結果に表示される製品の特定の特性を反映します。これにより、より適応性の高いコンテキストに応じた検索エクスペリエンスが可能になります。
以下は、ファセットを操作し、ファセットによってフィルタリングされた検索結果を確認できる画像です。

AIがファセット生成を改善する方法
人工知能は、セマンティック検索や埋め込みと関連付けられることが多いですが、ファセットについてはどうでしょうか?AI を活用して、ファセットをより便利にし、各検索のコンテキストに特化したものにするにはどうすればよいでしょうか?
興味深い可能性の 1 つは、AI を使用して、インデックスの従来の分類を超えた新しい分類を作成することです。コンテンツの特定の特性を分析することにより、これらの新しいカテゴリは、より豊富で正確なコンテキスト化を提供でき、ファセットの関連性が高まり、ユーザーのニーズに合致したものになります。これにより、元のドキュメント カテゴリと比較して、結果をより意味のあるものに絞り込むことができます。
AIが映画の分類を改善し、より良い検索を実現する方法
現在ドラマのジャンルに分類されている以下の映画を分析してみましょう。
レクイエム・フォー・ドリーム 概要: コニーアイランドに住む 4 人の薬物依存者のユートピアは、中毒が深刻化して崩壊します。
アメリカン・ビューティー 概要: 郊外に住む性的欲求不満の父親は、娘の親友に夢中になったことで中年の危機に陥る。
『グッド・ウィル・ハンティング』 履歴書: MIT の清掃員であるウィル・ハンティングは数学の才能に恵まれていますが、人生の方向性を見つけるために心理学者の助けが必要です。
このジャンル分類では、各映画の微妙な違いや独自の背景を捉えることができません。AI を活用してあらすじや中心テーマを分析することで、各映画の真の文脈をよりよく反映する新しいカテゴリを作成できます。例えば:
レクイエム・フォー・ドリーム - 新カテゴリー:「依存症と依存」
アメリカン・ビューティー - 新カテゴリー:「中年の危機」
『グッド・ウィル・ハンティング』 - 新カテゴリー:「知的闘争」
これらの新しいカテゴリにより、検索の精度が大幅に向上し、結果を絞り込むためのより有意義なフィルターがユーザーに提供されます。このアプローチは、元のカテゴリが過度に一般的な場合に特に効果的であり、ユーザーが探しているものを簡単に見つけることができます。
GPT-4 で新しいカテゴリを作成する: ファセット検索の例
この例では、AI モデルを使用して、より正確で各作品のコンテキストに合わせた新しい映画カテゴリを作成する方法を示します。このプロセスをデモンストレーションするために、Elastic シミュレーション パイプラインを OpenAI 推論サービスと組み合わせて使用します。推論プロセッサで実行されるプロンプトを作成し、新しいカテゴリを決定できるスクリプト プロセッサを含む、複数のプロセッサを持つパイプラインが作成されます。他のプロセッサは、パイプライン実行中に生成されたデータおよび補助フィールドを操作するために使用されます。このロジックは他の同様のツールやモデルにも適用できることは言及する価値があります。
まず、推論エンドポイントを作成し、OpenAI としてのサービス、サービスにアクセスするために必要なトークン、およびモデルを定義する必要があります。この例では、gpt-4o-mini を使用しています。OpenAI 推論サービスの詳細については、ここをクリックしてください。
PUT _inference/completion/generate_topics_ia
{
"service": "openai",
"service_settings": {
"api_key": "your-token",
"model_id": "gpt-4o-mini"
}
}エンドポイントが作成されたので、それを使用して新しいカテゴリを作成する準備が整いました。以下は、ドキュメント データの操作とプロンプト生成のプロセス全体を処理するパイプラインです。各プロセッサの機能について詳しく説明します。
最初のプロセッサはプロンプトの構築を担当します。AI がトピックを正しく分析して識別できるように、指示を明確に詳細に記述することが非常に重要です。このプロンプトでは、映画のタイトル、説明、ジャンルの分析に基づいて 2 つのトピックを要求しています。
{
"script": {
"source": """
ctx.prompt = "You are an expert in semantic analysis and audiovisual content categorization. Your task is to generate only subcategories (max 2 topics) that describe specific aspects of movies based on their genres and descriptions. The output should be like: 'n1, n2, ...n'. Here is a movie info to analyze: Title: " + ctx.title + "Genres: " + ctx.genres + "Description: " + ctx.description;
"""
}次のパイプラインは推論パイプラインで、プロンプトを受信して generate_topics_iaエンドポイントに送信します。モデルによって生成された応答は結果フィールドに保存されます。
{
"inference": {
"model_id": "generate_topics_ia",
"input_output": {
"input_field": "prompt",
"output_field": "result"
}
}
}次に、作成した一時フィールドを削除するだけでなく、応答を操作してトピック フィールドに設定するために使用される 3 つのプロセッサがあります。
このパイプラインを実行すると、以下の結果が得られます。
{
"docs": [
{
"doc": {
"_index": "index",
"_version": "-3",
"_id": "1",
"_source": {
"description": "While Frodo and Sam edge closer to Mordor with the help of the shifty Gollum, the divided fellowship makes a stand against Sauron's new ally, Saruman, and his hordes of Isengard.",
"model_id": "generate_topics_ia",
"title": "The Lord of the Rings: The Fellowship of the Ring",
"genres": [
"Action",
"Adventure",
"Drama"
],
"topics": [
"Fantasy",
"Quest"
]
},
"_ingest": {
"timestamp": "2024-11-22T17:51:51.340010257Z"
}
}
},
{
"doc": {
"_index": "index",
"_version": "-3",
"_id": "2",
"_source": {
"description": "A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival.",
"model_id": "generate_topics_ia",
"title": "Interstellar",
"genres": [
"Adventure",
"Drama",
"Sci-Fi"
],
"topics": [
"space exploration",
"human survival"
]
},
"_ingest": {
"timestamp": "2024-11-22T17:51:51.340413173Z"
}
}
},
{
"doc": {
"_index": "index",
"_version": "-3",
"_id": "3",
"_source": {
"description": "An astronaut becomes stranded on Mars after his team assume him dead, and must rely on his ingenuity to find a way to signal to Earth that he is alive.",
"model_id": "generate_topics_ia",
"title": "The Martian",
"genres": [
"Adventure",
"Drama",
"Sci-Fi"
],
"topics": [
"survival",
"ingenuity"
]
},
"_ingest": {
"timestamp": "2024-11-22T17:51:51.340427965Z"
}
}
}
]
}いくつかは元々同じジャンルですが、映画のコンテキストにさらに関連した新しいカテゴリがあることに注意してください。
これで、これらの新しいカテゴリを使用して、ドキュメントと一緒にインデックスを作成できるようになりました。このように、ファセットを生成する際に、主要なカテゴリに加えて、映画のコンテキストに合わせたより具体的なサブカテゴリが作成されます。
さらに、これらの新しいカテゴリをベクトル化し、ベクトル検索で使用することもできます。つまり、新しいカテゴリはフィルターとして機能するだけでなく、検索用語との意味上の類似性を計算するためにも使用できるため、表示される結果の関連性がさらに高まります。
完全なパイプライン:
POST /_ingest/pipeline/_simulate
{
"pipeline": {
"processors": [
{
"script": {
"source": """
ctx.prompt = "You are an expert in semantic analysis and audiovisual content categorization. Your task is to generate only subcategories (max 2 topics) that describe specific aspects of movies based on their genres and descriptions. The output should be like string: 'n1, n2m ...n'. Here is a movies info to analyze: Title: " + ctx.title + "Genres: " + ctx.genres + "Description: " + ctx.description;
"""
}
},
{
"inference": {
"model_id": "generate_topics_ia",
"input_output": {
"input_field": "prompt",
"output_field": "result"
}
}
},
{
"split": {
"field": "result",
"target_field": "topics",
"separator": ", "
}
},
{
"remove": {
"field": "result"
}
},
{
"remove": {
"field": "prompt"
}
}
]
},
"docs": [
{
"_index": "index",
"_id": "1",
"_source": {
"title": "The Lord of the Rings: The Fellowship of the Ring",
"description": "While Frodo and Sam edge closer to Mordor with the help of the shifty Gollum, the divided fellowship makes a stand against Sauron's new ally, Saruman, and his hordes of Isengard.",
"genres": [
"Action",
"Adventure",
"Drama"
]
}
},
{
"_index": "index",
"_id": "2",
"_source": {
"title": "Interstellar",
"description": "A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival.",
"genres": [
"Adventure", "Drama", "Sci-Fi"
]
}
},
{
"_index": "index",
"_id": "3",
"_source": {
"title": "The Martian",
"description": "An astronaut becomes stranded on Mars after his team assume him dead, and must rely on his ingenuity to find a way to signal to Earth that he is alive.",
"genres": [
"Adventure", "Drama", "Sci-Fi"
]
}
}
]
}まとめ
AI を使用してファセットを改善すると、結果がより具体的かつ文脈的になり、検索エクスペリエンスを変革できます。多くの場合、範囲が広い固定カテゴリとは異なり、AI 生成のカテゴリはコンテキストをより適切に反映できます。たとえば、映画を再分類する場合、主要なカテゴリでは見逃されていたコンテキストを捉えて、より関連性の高いグループ化を提供できます。
これらの新しいカテゴリをインデックスに追加すると、ファセットが改善されるだけでなく、ベクター検索も可能になります。その結果、コンテキストに合わせたフィルターを使用した、より効率的な検索エクスペリエンスが実現します。
参照資料
https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-openai.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/simulate-pipeline-api.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/script-processor.html
よくあるご質問
ファセット検索とは何ですか?
ファセット検索は、電子商取引プラットフォームのツールです。表示されるアイテムの特性に基づいて検索結果を整理および絞り込むのに役立ちます。
AI はファセット検索をどのように改善できるのでしょうか?
AI は、インデックス内の従来の分類を超えた新しい分類を作成し、結果をより具体的かつ文脈に沿ったものにすることで、検索におけるファセット生成を改善できます。




