Zillizでレキシカル検索とセマンティック検索を使いこなす
レキシカルサーチとセマンティックサーチの仕組み、応用、メリット、そしてZillizでの実行方法を学びます。
シリーズ全体を読む
- 筏か否か?クラウドネイティブデータベースにおけるデータ一貫性のベストソリューション
- Faiss(フェイスブックAI類似検索)を理解する
- 情報検索メトリクス
- ベクターデータベースにおける高度なクエリー技術
- ベクトル検索を支える人気の機械学習アルゴリズム
- ハイブリッド検索:テキストと画像を組み合わせて検索機能を強化
- ベクターデータベースの高可用性の確保
- ランキングモデル:ランキングモデルとは何か?
- Zillizでレキシカル検索とセマンティック検索を使いこなす
- バイナリ量子化とMilvusによるベクトル検索の効率化
- モデルプロバイダーオープンソースとクローズドソースの比較
- Milvusによる多言語言語の埋め込みとクエリー
- 構造化データのベクトル化とクエリの究極ガイド
- HNSWlibを理解する:高速近似最近傍探索のためのグラフベースライブラリ
- ScaNN(Scalable Nearest Neighbors)とは?
- ScaNNを始める
- 次世代検索:クロスエンコーダとスパース行列因子分解がk-NN検索を再定義する方法
- ボイジャーとは?
- 迷惑とは何か?
業界全体の情報は常に拡大しており、広範なデータベースをキーワード検索に頼っても最良の結果は得られない。キーワードでは、ユーザーのクエリの背後にあるコンテキストや、概念間の関係を把握できないからです。高度な検索技術は、ユーザーの意図を理解し、高度にパーソナライズされた結果を生成する高度なアルゴリズムを使用して、この制限を解決します。これらのアルゴリズムは、ニューラルネットワーク(NN)と類似検索技術を使用し、ユーザーのクエリに基づいた信頼性の高い検索結果を提供します。Zillizは語彙分析と意味分析を通じて検索機能に革命をもたらします。語彙分析と意味分析は、複雑な情報の海から、より速く、より柔軟で、より正確な検索結果を提供します。
この記事では、これらの検索方法論がデータの解釈と検索に与える変革の影響を検証する。また、レキシカル検索とセマンティック検索がどのように機能するのか、そしてZillizがどのように検索機能を強化するためにこれらのパワーを組み合わせるのかを探ります。
語彙検索を読み解く
レキシカル検索は、データベースから関連文書を検索するために、正確なキーワードマッチに依存します。検索クエリで指定されたキーワードをすべてのデータベースオブジェクトと比較し、一対一で一致するものがあればどこでも返します。その厳密な性質のため、検索の精度は提供されたキーワードのバリエーションに依存する。検索アルゴリズムはコンテキストやセマンティクスを考慮しないため、検索空間は提供された検索キーワードに制限される。さらに、比較的単純なアルゴリズムであるにもかかわらず、検索空間が大きいと(大規模なデータベース)、検索速度と効率に影響を与える可能性がある。
Zillizクラウドでは、語彙検索の効率を向上させるために、最新のインデックスアプローチを実装しています。ベクトルデータベースは、クエリーオブジェクトのインデックス化を可能にし、検索効率を飛躍的に向上させます。さらに、ベクトル化されたオブジェクトは類似性に基づいてサブセットに分割される。キーワード検索クエリは最も関連性の高いサブセットに向けられるため、検索空間が縮小され、検索速度が向上し、精度が若干犠牲になります。
意味検索の探求
辞書的検索は正確な単語マッチングにより正確な結果をもたらしますが、ユーザーの意図を理解したり、同義語や文法のバリエーションを解読することはできません。自然言語処理(NLP)と機械学習(ML)を利用したセマンティック検索は、ユーザーの意図を理解し、適切なデータ検索を可能にします。BERTのような最新のNLPアルゴリズムは、非構造化データをベクトル埋め込みに分解し、高次元ベクトル空間に表現する。そして、類似検索アルゴリズムを使って、検索クエリに似たデータポイントを特定する。また、現在のセマンティック検索エンジンは、ナレッジグラフ(KG)を使用して、異なるデータポイント間の関係を把握し、より深い意味や単語間のつながりをターゲットにしている。
Zillizベクトルデータベースは、セマンティック検索による高度な検索機能を提供します。高度な情報検索アルゴリズムを使用し、ユーザーのクエリを理解し、複雑な情報の網から最も関連性の高いベクトル埋め込みを検索します。Zilliz Cloud上のセマンティック検索パイプラインは、比類のない精度と容易なスケーリングを提供します。
Zillizにおけるレキシカル検索とセマンティック検索の相乗効果
Zillizはデータポイントをベクトル埋め込みとして保存するベクトルデータベースであり、正確で意味のあるベクトル検索のためにセマンティック検索をサポートしています。しかし、Zillizは、最新のインデックス作成技術により、様々なデータ型に対するCRUD操作を可能にすることで、字句検索もサポートしています。これにより、ユーザーは検索ニーズごとに異なるデータインフラを管理する必要がなくなります。
ベクターデータベースはリレーショナルデータベースのCRUD操作に最適化されていないため、Zillizはリレーショナルデータベースのテーブルと同様の方法でデータを保存します。字句検索では、テーブルを表すコレクションとしてデータを保存し、各コレクションは独自のスキーマを持つ。
字句検索と意味検索の両方をサポートするZillizは、優れた検索体験を提供する理想的なデータストアです。データのニーズが変化しても、ベクトル検索機能やJSONデータストアのようなデータを保存する他のデータベースが必要であっても、インフラを最適化することができます。
レキシカル検索とセマンティック検索のハイブリダイゼーションの実例
レキシカル検索とセマンティック検索の利点を組み合わせることで、様々な実世界のアプリケーションに力を与えることができる。レキシカル検索とセマンティック検索のハイブリッド化の一般的な例として、以下の2つが挙げられる:
1.Eコマース商品検索
従来、eコマースの商品検索は、辞書的検索、つまりキーワードマッチに頼っていた。 例えば、ユーザーが "soft light socks "と検索すると、eコマース検索エンジンは説明文にそのキーワードを含む商品を検索する。しかし、セマンティック検索はNLPを活用してユーザーの意図を理解し、よりパーソナライズされた検索体験を提供する。これらの技術を組み合わせることで、関連性が高く、かつ高速な検索システムを実現することができる。
レキシカル検索とセマンティック検索のハイブリッド化は、eコマース検索システムにセマンティック検索のレイヤーを追加することで機能する。ユーザーがクエリを入力すると、システムはクエリの複雑さと希望する精度に応じて、どの検索方法が適しているかを識別する。この結果、セマンティック検索の助けにより、最初の検索が速くなり、精度が向上する。
もう一つのシナリオは、ユーザーがスペルミスのクエリを入力することである。辞書的検索では曖昧さ、つまりタイプミスを扱えないため、関連商品を見つけることができない。しかし、すぐにエラーを投げるのではなく、セマンティック技術を使用して追加の検索を実行することで、ユーザーエクスペリエンスが向上します。
複数の企業が、eコマースにおいて、辞書的検索とセマンティック検索の複合力を採用している。例えば、楽天ファッションはセマンティック検索を使ってユーザー体験を改善し、ZalandoはNLPを使ってユーザーの意図を理解している。
2.短いテキストの分類
語彙検索と意味検索のハイブリッド化という同じアプローチが、文脈を考慮したテキスト分類システムの開発にも使われている。語彙検索システムを基礎として、セマンティック検索によってシステムはユーザーの意図を理解することができる。システムの機能は、まず語彙検索を最初のキーワード検索に使い、次にNLPを使って高度な文脈検索を行う。
Combining Lexical and Semantic Features for Short Text Classificationは、より豊かなテキスト分析と分類のためのAIを活用した検索機能を提供します。
テクニカル・ディープダイブZillizを使った構築
Zilliz Cloudは、語彙検索と意味検索の実装にわかりやすいアプローチを提供している。ここでは、Zilliz Cloudにおけるセマンティック検索とレキシカル検索の実装をそれぞれ紹介します:
Zillizでのセマンティック検索の実装
ZillizはすべてのRESTful APIエンドポイントとMilvus SDKをサポートしています。Python、Java、Go、Node.jsを含むすべてのSDKの実装はZilliz documentationで確認できます。ここでは、Python SDKを使ってZillizのベクトル検索の仕組みを理解します。
Python SDKのインストール
以下のコマンドをPythonコンソールにコピーして、Python SDKであるPyMilvusをインストールします。Pythonのバージョンが3.8以上であることを確認してください。
# 特定のPyMilvusをインストールする
python -m pip install pymilvus==2.3.7
# PyMilvusを最新版にアップデートする
python -m pip install --upgrade pymilvus
# インストールの成功を確認する
python -m pip list | grep pymilvus
クラスタを作成する
クラスタの作成とは、データベースを実行する複数のコンピュータをセットアップすることです。クラスタはデータの保存と処理に必要なリソースを提供します。クラスタがセットアップされると、クラスタの認証情報を入力するよう促されます。次のコード例は、RESTful API を使用してクラスタを作成する方法を示すものです:
curl --request POST
--url "https://controller.api.${CLOUD_REGION}.zillizcloud.com/v1/clusters/create" ୧-͈ᴗ-͈
--header "Authorization:ベアラ ${API_KEY}"\
--header "accept: application/json" ¦コンテンツタイプ:application/json
--header "content-type: application/json" ¦データを読み込む。
--data-raw "{".
\"plan":\"Standard"、
\clusterName\cluster-standard"、
\cuSize1,
\Ÿ "cuType\Performance-optimized っぽい、
\projectId\"${プロジェクトID}"
}"
あるいは、Zilliz consoleを使用してクラスタを作成することもできます。どの方法を選択するにしても、クラスタを作成する前にサブスクリプションプランを追加してください。
Zillizクラスタへの接続
クラスタの認証情報を取得したので、クラスタに接続できます。以下のコードを実行して Zilliz Cloud クラスターに接続します:
from pymilvus import MilvusClient, DataType
cluster_endpoint = "your_cluster_endpoint"
token = "your_cluster_token"
# Milvusクライアントをセットアップする
クライアント = MilvusClient(
uri=CLUSTER_ENDPOINT、
token=TOKEN
)
コレクションの作成
Zilliz Cloudはベクトル埋め込みをコレクションとして保存します。同じコレクションに格納されたベクトル埋め込みは、同じ次元を持ち、類似検索のための距離メトリックを持ちます。
# クイックセットアップモードでコレクションを作成
client.create_collection(
collection_name="quick_setup"、
ディメンション=5
)
上記のセットアップでは、類似度測定にデフォルトのコサイン・メトリックを使用しています。プライマリフィールドは整数を受け取り、自動的にインクリメントされません。そして、$metaという予約されたJSONフィールドが、スキーマで定義されていないフィールドとその値を保存するために使われます。
データの挿入
コレクションを作成したら、データベースにデータを挿入できます。以下のコードをコピーして、コレクションに同じデータを追加してください:
# 4.コレクションにデータを挿入する
# 4.1.データの準備
data=[
{"id":0, "vector":[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color":「pink_8682"}、
{"id":1, "vector":[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "color":「red_7025"}、
{"id":2, "vector":[0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color":「orange_6781"}、
{"id":3, "vector":「pink_9298"}、
{"id":4, "vector":[0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color":「red_4794"}、
{"id":5, "vector":「yellow_4222"}、
{"id":6, "vector":[0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color":「red_9392"}、
{"id":7, "vector":「grey_8510"}、
{"id":8, "vector":「white_9381"}、
{"id":9, "vector":「purple_4976"}.
]
# 4.2.データの挿入
res = client.insert(
コレクション名="quick_setup"、
data=data
)
print(res)
# 出力
#
# {
# "insert_count":10,
# "ids":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# }
- データtは辞書のリストであり、各辞書はデータレコードを表し、エンティティと呼ばれる。
- 各ディクショナリには、color という名前の、スキーマで定義されていないフィールドが含まれます。
- 各ディクショナリには、定義済みフィールドと動的フィールドの両方に対応するキーが含まれます。
類似検索
データをコレクションに挿入した後、数秒間待ちます。そうしないと、非同期操作なので、空の結果が得られます。検索を実行するには、お好みに応じて3つの方法のいずれかを使用できます:
**1.単一ベクトル検索
その名の通り、単一ベクトル検索は単一のクエリ・ベクトルで検索を行う。クエリ・ベクトルは、ベクトル次元を表す埋め込みベクトルのサブリストを含んでいます。
# 6.単一ベクトル検索
# 6.1.クエリーベクターを用意する
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]
# 6.2.検索開始
res = client.search(
collection_name="quick_setup", # 対象コレクション
data=query_vectors, # クエリベクトル
limit=3, # 返されるエンティティの数
)
print(res)
# 出力
#
# [
# [
# {
# "id":548,
# "distance":0.08589144051074982,
# "entity":{}
# },
# {
# "id":736,
# "distance":0.07866684347391129,
# "entity":{}
# },
# {
# "id":928,
# "distance":0.07650312781333923,
# "entity":{}
# }
# ]
# ]
**2.一括ベクトル検索 **
一括ベクトル検索は、複数のクエリーベクトルを使って検索を行う。以下は一括意味検索を行うためのコードである:
# 7.複数ベクトルによる検索
# 7.1.クエリベクターの準備
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],
[0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]
]
# 7.2.検索開始
res = client.search(
collection_name="quick_setup"、
data=query_vectors、
limit=3、
)
print(res)
# 出力
#
# [
# [
# {
# "id":548,
# "distance":0.08589144051074982,
# "entity":{}
# },
# {
# "id":736,
# "distance":0.07866684347391129,
# "entity":{}
# },
# {
# "id":928,
# "distance":0.07650312781333923,
# "entity":{}
# }
# ],
# [
# {
# "id":532,
# "distance":0.044551681727170944,
# "entity":{}
# },
# {
# "id":149,
# "distance":0.044386886060237885,
# "entity":{}
# },
# {
# "id":271,
# "distance":0.0442606583237648,
# "entity":{}
# }
# ]
# ]
**3.フィルタリング検索
クエリにフィルタを含めると、検索リクエストで出力フィールドを指定することにより、検索がさらに強化されます。以下はスキーマ定義フィールドを使用したフィルタリング検索の例です:
# 8.スキーマ定義フィールドを使ったフィルター式検索
# 1 クエリーベクターを準備する
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]
# 2.検索開始
res = client.search(
コレクション名="quick_setup"、
data=query_vectors、
filter="500 < id < 800"、
limit=3
)
print(res)
# 出力
#
# [
# [
# {
# "id":548,
# "distance":0.08589144051074982,
# "entity":{}
# },
# {
# "id":736,
# "distance":0.07866684347391129,
# "entity":{}
# },
# {
# "id":505,
# "distance":0.0749310627579689,
# "entity":{}
# }
# ]
# ]
Zillizでレキシカルサーチを実装する
ZillizクラウドはJSONデータストアとして動作し、文字列のCRUD操作を許可することで、字句検索をサポートしている。以下はZillizでのレキシカル検索の実装です:
スキーマの設定
from pymilvus import Collection, CollectionSchema, DataType, FieldSchema
fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True, max_length=100), FieldSchema(name="_unused", dtype=DataType.FLOAT_VECTOR, dim=1)].
schema = CollectionSchema(fields, "NoSQL data", enable_dynamic_field=True)
collection = Collection("json_data", schema)
collection.load()
レキシカル検索
以下のコード・スニペットでは、GovTrackからデータセットをダウンロードし、語彙検索を行っている。どんなデータでも使うことができる:
import requestsr = requests.get("https://www.govtrack.us/api/v2/role?current=true&role_type=senator")データ = r.json()["オブジェクト"]len(データ)
データをダウンロードしたら、それをデータベースに挿入する。以下のコマンドはMilvusにデータをロードします:
rows = [{"_unused": [0]}|d for d in data]collection.insert(rows)| d for d in data]collection.insert(rows)
これで検索の準備は完了だ。以下のコードでは、クエリに基づいて上位1レコードを検索しています。レコードはいくつでも検索できます:
top_k = 1
collection.query(
expr="state in ['OR'] and senator_rank in ['senior']"、
limit=top_k、
output_fields=["person"])
)
検索機能の最適化
検索機能の最適化は、適切な検索テクニックを使うことにとどまらない。関連性、スケーラビリティ、パフォーマンスといった要素が検索機能に影響を与え、ユーザーエクスペリエンスを定義します。ここでは、検索機能を実装するための課題とベストプラクティスを紹介する:
** 1. スケーラビリティ
データベースのパフォーマンスは、データ量の増加、最適でない構成、ハードウェアの制限によって低下します。データベースがスケーラブルでない場合、膨大な量の情報から類似の項目を見つけるのが遅くなり、精度も低下する。
**ソリューション
分散検索アーキテクチャを使用し、検索インデックスをシャードに分割することで、より高速でスケーラブルなデータ管理を実現します。Zilliz Cloudの分散機能は、クラスタを500CUまで拡張でき、1000億以上のアイテムに対応します。
** 2.パフォーマンス
ベクトル・データベースは精度が高いが、スピードと精度のバランスをとるのは難しい。複雑なアルゴリズムが正確な結果を得るためには、より多くの処理能力を必要とするからです。
**ソリューション
インデックス戦略、レイジーローディング、フィルタリングを最適化することで、精度の高い高速な結果を得ることができます。Zillizは、アルゴリズム、エンジニアリング、低レベルの最適化を行うCardinal検索エンジンを採用し、ベクトル検索を10倍高速化します。
**3.精度
検索システムにおいて精度を維持することは、ユーザーエクスペリエンスを向上させ、一貫性を持たせるために極めて重要である。しかし、一貫して正確な結果を提供することは、データの不整合やあいまいなクエリのために困難な場合があります。
ソリューション
クエリの背後にあるユーザーの意図を理解するためにNLPを使用すると、検索結果の関連性が向上します。また、定期的な分析とモニタリングは、長期的な検索システムの改善に役立ちます。Zillizは、ディープラーニングアルゴリズムのパワーを活用し、非構造化データを検索可能なフォーマットに変換し、高精度でパーソナライズされた検索結果に導きます。
進化する検索能力:Zillizの役割
Milvus上に構築されたZilliz Cloudは、最もパフォーマンスの高いベクターデータベースです。その高度な機能により、Zillizは検索体験を再定義する最先端技術を駆使したゲームチェンジャーです。ここでは、Zillizがどのように検索イノベーションの新しい基準を打ち立てているかをご紹介します:
カーディナル・サーチ・エンジン](https://zilliz.com/blog/cardinal-most-performant-vector-search-engine)は、ベクトル検索において最もパフォーマンスの高い検索エンジンであり、ZillizをMilvusの10倍高速にします。
AUTOINDEX](https://docs.zilliz.com/docs/autoindex-explained)インデックスタイプにより、正しいインデックスタイプを選択する必要がありません。
エンタープライズグレードのセキュリティにより、顧客データは安全に保護され、データ保護ポリシーに準拠しています。
機械学習とディープラーニング主導のベクトル検索は、パーソナライズされた検索体験を強化します。
多様な類似性メトリクスにより、カスタマイズされた分類およびクラスタリングソリューションが可能です。
ニーズの変化に応じて語彙検索と意味検索を切り替える機能により、Zillizはあらゆる形式のデータを一元管理します。
コンポーネントベースのアーキテクチャにより、ワークロードの変動に関係なく、容易に水平スケーリングが可能です。
検索テクノロジーの未来
新しいテクノロジーは常に検索イノベーションを推進し、より適切でパーソナライズされたシステムを生み出している。ここでは、検索テクノロジーの未来について説明する:
1.AIによる検索の高速化
検索クエリの文脈を理解するためにNLPを使用すると、処理オーバーヘッドが増える。そこで、従来の語彙検索がセマンティック検索を補完する。しかし、より洗練されたアルゴリズムにより、AI主導の検索はより高速になる。
2.多言語検索
研究者たちは、クロスリンガル検索システムを実現する技術を模索している。これらのシステムは言語のギャップを埋め、世界の異なる地域をより密接に結びつけるだろう。
3.説明可能性
より複雑なアルゴリズムが開発されるにつれ、ユーザーは基礎となるロジックを理解する必要が出てくる。説明可能なAI(XAI)技術は、ユーザーにモデル機能の説明を提供し、AIを活用した検索に対する信頼性を高めるために一般的になるだろう。
結論
Zilliz Cloudは、キーワードマッチングを超えてユーザーの意図を理解し、データ駆動型の検索結果を提供する。従来の辞書的検索アプローチは単純化された実装を提供しますが、複雑で曖昧なシナリオでは失敗します。一方、セマンティック検索アルゴリズムは、検索結果を改善するためにNLPを活用しますが、追加の処理オーバーヘッドを伴います。
ハイブリッド検索アプローチは、語彙的アルゴリズムと意味的アルゴリズムを統合し、両者の長所を活用する。最終的なアルゴリズムは、速度と精度を提供し、ユーザーエクスペリエンスを向上させ、データ駆動型の洞察力を強化する堅牢なソリューションです。
Zillizは、リレーショナルデータベース用の辞書的検索と、セマンティック検索機能によるより深い検索を提供します。このハイブリッド・アプローチにより、ベクトル・データベースとリレーショナル・データベースの両方に適したインフラを持ちながら、両方を一箇所で管理することができます。
さらにZillizは、セキュリティとガバナンスを優先しつつ、高いスループット機能を提供することで、多様なデータ要求を持つ企業の検索エクスペリエンスに革命をもたらします。
Zillizの高度な検索ソリューションで、データの可能性を引き出してください。Zillizのコミュニティは、データから有益なパターンを特定し、卓越したユーザーエクスペリエンスを提供しようとするすべての人に開かれています。Zillizのトレーニングや有益なオンラインリソースで疑問を解消し、エコシステムに貢献し、高度な検索テクノロジーを実装するためのサポートを受けることができます。