46.6kデモを予約するログイン無料で始める

検索の進化:伝統的なキーワードマッチングからベクトル検索と生成AIへ

検索の進化、キーワード・マッチング・システムの限界、そしてベクトル検索とGenAIがいかに現代の検索に新たな基準を打ち立てつつあるかを探る。

デジタル時代となり、豊富な情報が手に入るようになった今日、検索エンジンは欠かせないツールとなっている。最新のニュースから特定の研究論文まで、検索エンジンは膨大なデータの中から必要なものを的確に探し出せるよう導いてくれる。しかし、検索エンジンが情報を取得し提示する方法は、初期の単純なキーワードマッチングから、今日のようなベクトル検索や生成AI(GenAI)のような高度なアルゴリズムや技術の台頭まで、大きく進化してきた。

このブログでは、検索の進化、従来のシステムの限界、そして、ベクトル検索やAIのような最新のテクノロジーが、精度と関連性の新たな基準をどのように設定しているのかを探っていく。

従来の検索エンジンの概要

検索エンジンは、広大なインターネットの世界からユーザーのクエリに関連する情報を抽出するソフトウェアシステムである。ウェブブラウザに入力された検索クエリに基づいて、何百万ものウェブページ、文書、リソースをインデックス化し、画像やテキストの要約とともにハイパーリンクのリストからなる結果を提供する。

検索エンジンの初期の技術革新は、1990年頃にシンプルなインデックス作成ツールから始まった。1990年にマギル大学で作られたArchie,は、ファイル転送プロトコル(FTP)に基づいており、インデックスを作成し、ユーザがファイルを見つけるのを助けるものであった。その後、1993年には、Gopherファイルに索引をつけるVeronicaという同様の索引ツールが登場した。GopherファイルはGopherプロトコルに属し、オンラインの階層ディレクトリ・ベースのシステムを使って情報へのアクセスを提供していた。

ウェブベースの検索エンジンの登場は、1994年のWebCrawlerの発明から始まった。その後、Lycos、AltaVista、Yahooと続いた。これらの初期の検索エンジンは、GoogleやBingといった現代の巨大検索エンジンの基礎を築いた。1998年に正式にローンチされたグーグルは、そのPageRankアルゴリズムで瞬く間に人気を博した。キーワードのマッチングを利用し、ウェブページを指すハイパーリンクの関連性と量に基づいて検索結果をランク付けし、正確な結果を生成した。その後、2009年にマイクロソフトが発表したBingは、画像ベースの検索機能と他のマイクロソフト製品との統合で注目を集めた。

検索エンジンの基本機能

検索エンジンは、クロール、インデックス、検索という3つの主要なプロセスによって機能する。

1.**クロール最初のステップは、クローラーまたはスパイダーとして知られるボットの助けを借りて、可能な限りインターネットを探索することです。これらのボットは、あるページから別のページへのリンクをたどり続けることによって、ウェブ上のコンテンツを発見する。

2.**インデックス作成第二のステップは、発見されたコンテンツを分析することである。コンテンツはまず膨大なデータベースに保存され、キーワード、メタデータ、その他の関連情報を使ってインデックス化される。

3.検索:最後のステップは、分析されたコンテンツを検索することである。ユーザーがクエリを入力すると、検索エンジンはデータベースから検索されたコンテンツを関連性の高い順に提示する。

検索エンジンで使用されるアルゴリズムは、検索結果を決定する上で重要な役割を果たす。ユーザーのクエリを評価し、キーワード密度、クリックスルー率、サイトのオーソリティなど数多くの要素を用いて関連性の高い結果を出力する。例えば、GoogleのPageRankアルゴリズムは、そのページを指すリンクの質と数に基づいてウェブページをランク付けします。アルゴリズムはまた、ユーザーの所在地、検索履歴、その他の嗜好に基づいて結果をパーソナライズする。

従来の検索システムの限界

従来の検索システムは多くの点で強力であるが、いくつかの限界がある。

  • 文脈と意味理解の困難さ**。従来の検索システムは、クエリにおけるユーザーの意図を完全に把握できないことが多い。彼らのアプローチはキーワードのマッチングに基づいていたため、言葉の背後にある深い意味を理解するのに苦労し、精度の低い結果につながった。

  • 自然言語クエリを扱う上での課題.ユーザーが入力するクエリは、何気ない会話のような自然言語で構成されているが、検索エンジンは複雑な文章や質問全体ではなく、キーワードだけを理解する能力が高い。

  • 同義語と多義語の問題**。

    • 同義語 - 類似した意味を持つ異なる単語を使用すると、システムが完全一致のみを検索する場合、検索結果を見逃す可能性がある。

    • 多義性 - 複数の意味を持つ単語は、システムが正しい文脈を識別できない場合、関連性のない結果につながる可能性があります。

これらの限界は、自然言語をよりよく理解し処理する、より高度な検索技術の必要性を強調し、最新の検索エンジンの開発への道を開く。

ベクトル類似検索の登場

情報の量と複雑さが増大し続けるにつれ、より洗練された検索手法の必要性が明らかになってきた。ベクトル検索またはベクトル類似検索は、データの意味的な意味を理解することができる最新の検索エンジンで使用されている最新の検索技術である。このアプローチは、より正確で文脈を考慮した情報の検索を可能にする。

ベクトル検索の主な考え方は、テキスト、画像、音声、動画などの非構造化データを、高次元空間のベクトル埋め込みと呼ばれる数値表現で表し、それらのベクトル間の類似性を見つけることである。これらのベクトルの位置が近ければ近いほど、より類似していることになる。この表現により、ユーザーは機械学習アルゴリズムを活用して効果的な処理を行うことができる。キーワードマッチングアプローチに依存する従来の検索システムとは異なり、ベクトル検索はユーザーのクエリのコンテキストとセマンティクスを理解し、より関連性の高い結果を生成することができる。

ベクトル検索の仕組み

1.**エンコーディング最初のステップは、Word2VecやGloVeのような事前に訓練された単語埋め込みモデルや、BERTやRoBERTaのような高度な変換器モデルを使用して、データを埋め込みにエンコードすることです。これらのモデルは、データセットに合わせて微調整することも可能です。

2.インデックス作成:次のステップは、埋め込みデータをMilvusやZilliz Cloud(フルマネージドMilvus)のようなベクトルデータベースに格納することです。インデックス作成アルゴリズムは、これらのベクトルを効率的に整理し、検索プロセスで素早く検索・比較できるようにします。これは、図書館で本がセクションごとに保管されているのと同じだと考えてください。

3.**クエリー最後に、検索クエリが入力されると、それも埋め込みモデルを使ってベクトルにエンコードされる。そして、ベクトル検索システム(通常はベクトルデータベース)は、このクエリーベクトルとインデックス化されたベクトルを比較し、最も類似したものを見つける。

図1- ベクトルデータベースの仕組み](https://assets.zilliz.com/Figure_1_How_vector_databases_work_344fe30f58.png)

図1:ベクトルデータベースの仕組み

ベクトル検索では、クエリーベクトルと文書ベクトル間の類似度を測定することで、結果の関連性を決定する。よく使われる類似度メトリックス](https://zilliz.com/blog/similarity-metrics-for-vector-search)には以下のようなものがある:

図2-ベクトル検索の類似度指標](https://assets.zilliz.com/Figure_2_Similarity_Metrics_for_Vector_Search_aa2cab5bef.png)

図2:ベクトル探索のための類似度指標_」を参照してください。

  • ユークリッド距離 (L2)** - 座標間の差の二乗和の平方根を計算することにより、2つのベクトル間の直線距離を求める。ベクトルの大きさに敏感です。したがって、大きさが重要な特定のアプリケーションで有用である。

  • 余弦類似度** - 2つのベクトル間の角度の余弦を測定します。このメトリックは、ベクトルの大きさよりも向き(ベクトルがどれだけ密接に整列しているか)に注目するため、一般的に使用され、テキスト埋め込みを比較するのに理想的です。

  • 内積:*** 内積は、一方のベクトルを他方のベクトルに射影したものです。内積の値は、ベクトルの長さを引いたものです。2つのベクトル間の角度が大きいほど、内積は小さくなります。また、内積は小さい方のベクトルの長さに比例する。だから、向きや距離を気にするときには内積を使う。例えば、冷蔵庫まで壁を通って直線距離を走らなければならない。

ベクトル検索の主な利点

  • 意味と文脈の理解** - ベクトル検索は、エンティティ間の複雑な関係と類似性を理解し、より意味のある検索を提供します。従って、自然言語クエリのハンドリングが向上する。

  • スケーラビリティ** - ベクトル検索は計算速度が速いため、非常にスケーラブルである。膨大なデータセットから簡単にクエリを抽出することができる。

  • パーソナライゼーション** - ベクトル検索はサービスのパーソナライゼーションを可能にする。ユーザーの嗜好やアイテムの属性に基づき、小売業者やストリーミングサービスは簡単に類似したアイテムを提示し、より良い体験のためにユーザーベースを引き込むことができる。

ベクトル検索のアプリケーション

  • セマンティック検索**](https://zilliz.com/vector-database-use-cases/semantic-search) - ベクトル検索は、クエリのセマンティックな意味を理解することで、検索エンジンの検索結果の精度と関連性を向上させる。これにより、たとえ正確なキーワードが存在しなくても、ユーザーは自分の意図に合ったコンテンツを見つけることができる。

  • レコメンデーションシステム - ベクトル検索は、ユーザーが接触したことのあるアイテムに似たものを見つけることで、レコメンデーションエンジンに力を与える。ユーザーの好みに合った商品、映画、音楽、コンテンツを提案し、パーソナライゼーションとユーザーの満足度を高めます。

  • 画像、動画、マルチモーダル検索**](https://zilliz.com/vector-database-use-cases/image-similarity-search) - ベクトル検索は、クエリと視覚的に類似した画像や動画を検索します。ベクトルとしてエンコードされた視覚的特徴を比較し、外観やコンテンツの類似性に基づいたマルチメディアコンテンツの効率的な検索と取得を可能にします。

  • RAG(Retrieval Augmented Generation)**](https://zilliz.com/learn/Retrieval-Augmented-Generation):ChatGPT](https://zilliz.com/learn/ChatGPT-Vector-Database-Prompt-as-code)のような大規模言語モデル(LLMs)の台頭により、ベクトル検索は、LLMsに付加的な文脈情報を与えることで、LLMsの幻覚を緩和するために使われる。このテクニックについては以下のセクションで詳しく説明する。

ベクトル検索のその他の使用例については、私たちの使用例のページを参照するか、2024年におけるベクトル検索のトップ使用例を取り上げたこのブログをお読みください。

Milvusによるベクトル検索の実装

Milvusは、あらゆる規模のAIアプリケーションのためのオープンソースのベクトルデータベースです。ミリ秒レベルのレイテンシで10億スケールのベクトルを扱うことができます。Milvusは、Jupyter Notebookでのデモチャットボットの実行からエンタープライズレベルのAI検索の構築まで、プロジェクトに合わせて拡張できる様々なデプロイオプションを提供します。

このセクションでは、Milvusを例に、ベクトル検索を効率的に実装する方法を紹介します、

1.**Milvusのインストール

クライアントアプリケーションに組み込むことができるPymilvusのPythonライブラリであるMilvus Liteを使用します。

Python3.8+がローカル環境で利用可能であることを確認してください。PythonクライアントライブラリとMilvus Liteの両方を含むpymilvusをインストールしましょう。

pip install -U pymilvus

2.**ベクターデータベースのセットアップ

ローカルにMilvusベクトルデータベースを作成するには、milvus_demo.dbのように全てのデータを保存するファイル名を指定してMilvusClientをインスタンス化するだけでよい。

from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")

3.**コレクションを作成する

Milvusでは、ベクタとそれに関連するメタデータを格納するコレクションを作成する必要があります。コレクションを作成するとき、スキーマと様々なインデックスパラメータを定義して、次元数、インデックスタイプ、遠隔メトリックなどのベクタの仕様を設定することができます。今のところ、デフォルトの設定を使用します。

if client.has_collection(collection_name="demo_collection"):
    client.drop_collection(collection_name="demo_collection")
client.create_collection(
    collection_name="demo_collection"、
    dimension=768, # ベクトルの次元は768になります。
)

4.**データの準備

1.**モデルライブラリのインストール

埋め込みモデルを使ってテキストのベクトルを生成する必要があります。PyMilvusはMilvusのPython SDKで、様々な埋め込みモデルをシームレスに統合することができます(https://milvus.io/docs/embeddings.md)。これらの関数は pymilvus[model] ライブラリから簡単に利用できます。

PyTorchのようなMLの必須ツールを含むモデルライブラリをインストールしましょう。

pip install "pymilvus[model]"

2.ベクトル埋め込みを生成する

Milvusは、各々がデータレコードを表す辞書のリストとして整理されたデータを期待します。そこで、まずデータを整理し、デフォルトモデルを使って埋め込みデータを生成してみましょう。

from pymilvus import model

# 埋め込みモデル "paraphrase-albert-small-v2"(~50MB)をダウンロードする。
embedding_fn = model.DefaultEmbeddingFunction()

# 検索対象の文字列
ドキュメント = [
    "人工知能は1956年に学問分野として設立された"、
    "アラン・チューリングはAIの実質的な研究を行った最初の人物である"、
    「チューリングはロンドンのマイダベールで生まれ、イングランド南部で育った、
]

vectors = embedding_fn.encode_documents(docs)

# 出力ベクトルは768次元で、先ほど作成したコレクションと一致します。
print("Dim:", embedding_fn.dim, vectors[0].shape) # 次元: 768 (768,)

各エンティティはid, ベクター表現, 生テキスト, # メタデータのフィルタリングのデモに使用する件名ラベルを持ちます。
# 後でメタデータフィルタリングのデモを行うために使用します。
data = [
    {"id": i, "vector": vectors[i], "text": docs[i], "subject":"history"}.
    for i in range(len(vectors))
]

print("Data has", len(data), "entities, each with fields:", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))

出力する:

Dim: 768 (768,)
データには3つのエンティティがあり、それぞれがフィールドを持つ: dict_keys(['id', 'vector', 'text', 'subject'])
ベクトル dim: 768

5.Insert Data

データをコレクションに挿入してみましょう。

res = client.insert(collection_name="demo_collection", data=data)
print(res)

出力します:

{'insert_count':3, 'ids':[0, 1, 2], 'cost':0}

6.**意味検索

それでは、検索クエリテキストをベクトルとして表現し、Milvus上で類似検索を行うことで、セマンティック検索を行ってみよう。

Milvusは一度に1つまたは複数のベクトル検索リクエストを受け付ける。query_vectors`変数にはベクトルのリストが格納され、各ベクトルは浮動小数点数の配列である。

query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])

res = client.search(
    collection_name="demo_collection", # 対象コレクション
    data=query_vectors, # クエリベクトル
    limit=2, # 返されるエンティティの数
    output_fields=["text", "subject"], # 返されるフィールドの指定
)

print(res)

出力する:

データ["[{'id': 2, 'distance':0.5859944820404053, 'entity':{'text': 'チューリングはロンドンのマイダヴェールで生まれ、イングランド南部で育った。', 'subject': 'history'}}, {'id':1, 'distance':0.5118255615234375, 'entity':{'text': 'アラン・チューリングはAIで実質的な研究を行った最初の人物である', 'subject': 'history'}}]]"] 。extra_info:{'cost':0}

出力は結果のリストであり、それぞれがベクトル検索クエリにマッピングされる。各クエリは結果のリストを含み、各結果にはエンティティの主キー、クエリベクトルとの距離、指定された output_fields によるエンティティの詳細が含まれる。

7.**メタデータフィルタリングによるベクトル検索

Milvusはメタデータフィルタリング機能を提供しています。メタデータの値に特定の条件を指定しながらベクトル検索を行うこともできます。例えば、以下の例では'subject'フィールドで検索をフィルタリングしてみましょう。

# 別の件名のドキュメントをさらに挿入する。
docs = [
    "Machine learning has been used for drug design."、
    「AIアルゴリズムによる計算合成は分子特性を予測する、
    「DDR1は癌や線維症に関与している、
]
vectors = embedding_fn.encode_documents(docs)
data = [
    {"id":3 + i, "vector": vectors[i], "text": docs[i], "subject":「生物学"}.
    for i in range(len(vectors))
]

client.insert(collection_name="demo_collection", data=data)

# これは、クエリベクトルに近いにもかかわらず、"history "件名に含まれるテキストを除外します。
res = client.search(
    コレクション名="demo_collection"、
    data=embedding_fn.encode_queries(["tell me AI related information"])、
    filter="subject == '生物学'"、
    limit=2、
    output_fields=["text", "subject"]、
)

print(res)

出力される:

データを出力する:["[{'id':4, 'distance': 0.27030569314956665:0.27030569314956665, 'entity':{'テキスト': 'AIアルゴリズムによる計算合成で分子特性を予測', 'サブジェクト': '生物学'}}, {'id':3, 'distance':0.16425910592079163, 'entity':id':3、'distance':0.16425910592079163、'entity': {'text': '機械学習は薬剤設計に利用されている。]'コスト': {'コスト': {'コスト': {'コスト{コスト':0}

ベクトル検索以外にも様々な検索が可能です。詳しくはMilvusによるベクトル検索の実装に関する公式ドキュメントをご覧ください。

##現代の検索における生成AIと検索拡張生成(RAG)の役割

検索テクノロジーの進化に伴い、ジェネレーティブAIとRAG(Retrieval Augmented Generation)は、検索のマジックを大幅に強化する変革的なツールとして登場した。

**ChatGPTのような大規模な言語モデルに代表されるGenerative AIは、自然言語を理解し、処理し、答えを生成する能力を強化することで、検索エンジンを再定義した。従来のAI手法とは異なり、ジェネレーティブAIは、事前に訓練された知識から学んだことに基づいて、首尾一貫した、人間のようなテキスト応答を作成することができ、検索エンジンは、より直感的で文脈に正確な結果を提供することができます。この進歩により、検索エンジンとのインタラクションがよりシームレスになり、ユーザーは自分のクエリや意図に近い回答を受け取ることができる。

RAGは、ベクトル検索ベースの検索手法の長所と、悪名高いLLM幻覚を緩和するための生成モデルを融合させた、改良された検索手法である。RAGでは、検索システムはまず、Milvusのようなベクトルデータベースからユーザからのクエリに対してベクトル検索を用いて最も関連性の高い文書や情報の断片を特定し、それをChatGPTのような生成モデルによって包括的で文脈に正確な応答を作成する。このアプローチは、コンテキストを理解し、詳細な回答を提供することが重要であるチャットボット、カスタマーサポート、コンテンツ作成のようなアプリケーションで特に効果的です。

図- RAGチャットボットを促進するベクトルデータベース](https://assets.zilliz.com/Figure_Vector_database_facilitating_RAG_chatbot_1a87eb1206.png)

図3:RAGの仕組み

検索の未来:AI、ベクトル検索、キーワード検索の組み合わせ

検索の未来は、キーワード検索、ベクトル検索、生成的AIの戦略的統合によって形成され、それぞれが特定のニーズに対応する。AIはユーザー行動のパターンを分析することで検索を強化し、複雑なクエリをより深く理解することを可能にする。ベクトル検索は、意味的に類似したコンテンツを検索することに優れ、マルチメディアや文脈に基づいた検索に理想的な検索となる。キーワード検索は、完全一致と正確な結果を必要とするタスクに不可欠であり続けるだろう。これらのテクノロジーを組み合わせることで、正確で、多様な情報の求め方に適応する包括的な検索体験が提供される。

結論

シンプルなキーワードベースのシステムから、ベクトル検索、そしてGenAIを搭載したモダン検索への検索技術の進化は、デジタル時代の複雑さと要求の高まりを反映している。私たちが大量の情報を生成し、消費し続ける中で、これらのテクノロジーは、最も適切で正確なデータに迅速かつ効率的にアクセスできるようにするために重要な役割を果たすだろう。このような最新の検索技術を理解し、活用することが、進化し続ける情報検索の世界で優位に立つための鍵となるでしょう。

ベクトル検索、GenAI、RAGのパワーを活用することに興味のある方は、以下のリソースが理解を深めるのに役立ちます。

  • ベクターデータベースとは何か、どのように機能するのか - Zilliz blog](https://zilliz.com/learn/what-is-vector-database)

  • ベクターデータベース、ベクター検索ライブラリ、プラグインの比較 ](https://zilliz.com/learn/comparing-vector-database-vector-search-library-and-vector-search-plugin)

  • ベクトル検索を支える人気の機械学習アルゴリズム](https://zilliz.com/learn/popular-machine-learning-algorithms-behind-vector-search)

  • 生成AIリソースハブ|Zilliz](https://zilliz.com/learn/generative-ai)

  • あなたのGenAIアプリのためのトップパフォーマンスAIモデル|Zilliz](https://zilliz.com/ai-models)

  • ジェネレーティブAI時代の検索と情報検索](https://zilliz.com/learn/search-still-matters-enhance-information-retrieval-with-genai-and-vector-databases)