ベクトル・データベースは、機械学習モデルによって生成された高次元データを格納し、インデックスを付けることができる。ベクターデータベースは現代のAIの基礎であり、文脈に沿った情報の保存や意味のある意味での検索をサポートする。
多くの場合、検索拡張世代(RAG)と関連付けられるが、その用途はそれだけにとどまらない。詳細には、セマンティック検索、推薦システム、異常検知、その他多くのアプリケーションに力を発揮する。
このガイドに従って、ベクター・データベースとは何か、どのように機能するのか、完全な例でどのように使用するのか、そしてベクター・データベースの将来について理解しよう!
ベクターデータベースとは?
ベクトルデータベースは、ベクトルデータを保持するために設計されたストレージシステムである。この文脈では、ベクトルとは、テキスト、画像、音声などの非構造化データを表す数値埋め込みを指し、一般に機械学習モデルによって生成される。
従来のデータベースとは異なり、ベクトルデータベースは高次元データを高密度の数値ベクトルとして格納し、N次元空間にインデックスを付けることで、最適化された類似度ベースの検索を可能にする。
AI/MLで高まるベクター・データベースの重要性
ほとんどの場合、従来のSQLデータベースはAIや機械学習のタスクには適していない。その理由は、構造化されたデータを保存し、完全一致クエリや限定的な類似検索しかサポートしていないからだ。そのため、非構造化コンテンツを扱ったり、データポイント間の意味的関係を把握したりするのに苦労している。
現在、AIアプリケーションはデータの文脈的理解を必要としている。これは、リレーショナル・データベースが保存やクエリに最適化されていないエンベッディングで実現できる。ベクターデータベースは、意味と文脈を反映した類似度ベースの検索をサポートすることで、こうした制限に対処し、データの意味理解への扉を開く。
この技術の最も一般的なシナリオは検索補強世代(RAG)であるが、他の使用例も考えられる:
- セマンティック検索エンジン
- 推薦システム
- 時系列データにおける異常検知
- コンピュータビジョンにおける画像の分類と検索
- 自然言語処理(NLP)アプリケーション
ベクター・データベースの仕組み
ベクトルデータベースは、高次元空間に存在するベクトル埋め込みとしてデータを管理する。各次元はデータの特徴を表し、MLモデルによって解釈される元のデータ(埋め込みとして表現される)の特定の特徴に対応します。エンベッディングの次元が高ければ高いほど、より詳細な表現が可能になり、データの構造をより豊かに理解できるようになります。
意味的に類似したデータを見つけるために、ベクトル・データベースは以下のような類似性メトリクスを使用する:
- コサイン類似度:2つのベクトル間の角度の余弦を測定し、その方向がどれだけ似ているかを評価する。テキストデータによく使われる。
- ユークリッド距離:方向と大きさの両方が重要な空間データに便利。
- ドット積の類似度:対応するベクトル成分の積を計算し、ドット積が大きいほど類似度が高いことを示す。推薦システムやランキングタスクに役立つ。
SQLデータベースやNoSQLデータベースがインデックスを使用してデータクエリを高速化するのと同様に、ベクトルデータベースも次のような高度なインデックス技術を利用することができる:
- 近似最近傍(ANN):最近接ベクトルを近似することで類似検索を高速化し、厳密な検索に比べて計算コストを削減します。
- HNSW(Hierarchical Navigable Small World):ベクトルをグラフ構造で表現し、大規模な高次元空間での迅速なナビゲーションを可能にする。
さらに、パーティショニングやクラスタリング技術を適用することで、ベクトルデータをより小さく管理しやすいグループに整理することができる。これらの手法は、ストレージ効率と検索性能の両方を向上させる。
人気のベクターデータベースオプション
ベクターデータベースとは何か、そのAIデータ基盤がどのように機能するのかを理解したところで、最も一般的なベクターデータベースのオプションを検討する準備が整った。それぞれのデータベースを以下の観点から分析する:
- 建築
- パフォーマンス特性
- 統合能力
- 価格設定モデル
- 最良の使用例
どのベクター・データベースが際立っているか知りたい方は、以下の表をご覧ください:
データベース名 | オープンソース/商用 | ホスティングオプション | 最適 | 特異な側面 | 統合の複雑さ |
---|---|---|---|---|---|
松ぼっくり | コマーシャル | フルマネージドサーバーレスクラウド | セマンティック検索、Q&A、チャットボット | パラレルリード/ライト、シームレスなOpenAI/Vercel統合、長期メモリサポート | 低 – 多くの言語に対応したSDK、プラグアンドプレイ統合 |
ウィービエイト | オープンソースと商用 | セルフホスト、サーバーレスクラウド、マネージドエンタープライズクラウド | メディア/テキスト検索、分類、顔認識 | HNSW + フラットベクターインデックス、インバーテッドインデックス、リッチエコシステムインテグレーション | 中 – 幅広い統合サーフェス、若干の学習曲線 |
ミルバス | オープンソースと商用 | セルフホスト、Zilliz Cloud | RAG、推薦、メディア検索、異常検知 | データシャーディング、ストリーミング取り込み、マルチモーダルデータインデキシング | 中 – 多くのSDKがあり、主要なAI/LLMフレームワークで動作する。 |
クロマ | オープンソースと商用 | セルフホスト、Chroma Cloud | 軽量アプリ、履歴書検索、AIチャットボット | インメモリモード、Swagger経由のREST API、豊富なエンベッディング統合 | 低 – 使いやすさを追求したPythonとTypeScriptのSDK |
クドラント | オープンソースと商用 | セルフホストクラウド、マネージドクラウド、ハイブリッドクラウド、プライベートクラウド | RAG、高度な検索、アナリティクス、AIエージェント | モジュール式ペイロード/ベクトルインデックス、HNSW、きめ細かい更新 | 中規模 – 幅広いAPI/クライアントをサポートし、スケーラブルでモジュール化されている。 |
選択したベクター・データベースのオプションを掘り下げる時が来た!
松ぼっくり
- アーキテクチャフルマネージド、サーバーレス
- パフォーマンス特性
:ポリラング・プレースホルダーは変更しない
- 統合機能
:Polylangプレースホルダを変更しない
- 価格モデル
:Polylangプレースホルダは変更しないでください。
- 最適な使用例
:ポリラン・プレースホルダを変更しない
ウィービエイト
- アーキテクチャモジュラー、クラウドネイティブ
- パフォーマンス特性
:ポリラング・プレースホルダーは変更しない
- 統合機能
:Polylangプレースホルダを変更しない
- 価格モデル
:Polylangプレースホルダは変更しないでください。
- 最適な使用例
:ポリラン・プレースホルダを変更しない
ミルバス
- アーキテクチャ水平スケーラビリティのためのストレージとコンピューティングの分離を備えた共有ストレージアーキテクチャ
- パフォーマンス特性
:ポリラング・プレースホルダーは変更しない
- 統合機能
:Polylangプレースホルダを変更しない
- 価格モデル
:Polylangプレースホルダは変更しないでください。
- 最適な使用例
:ポリラン・プレースホルダを変更しない
クロマ
- アーキテクチャ小規模なアプリケーションにはシングルノードサーバー、大規模なアプリケーションにはクラウドに分散配置
- パフォーマンス特性
:ポリラング・プレースホルダーは変更しない
- 統合機能
:Polylangプレースホルダを変更しない
- 価格モデル
:Polylangプレースホルダは変更しないでください。
- 最適な使用例
:ポリラン・プレースホルダを変更しない
クドラント
- アーキテクチャローカルのセルフホスティング、または大規模でマルチテナントなアプリケーションのための分散クラウドデプロイメント
- パフォーマンス特性
:ポリラング・プレースホルダーは変更しない
- 統合機能
:Polylangプレースホルダを変更しない
- 価格モデル
:Polylangプレースホルダは変更しないでください。
- 最適な使用例
:ポリラン・プレースホルダを変更しない
明るいデータでベクターデータベースを活性化する
ベクトル埋込みの品質に影響を与える2つの重要な側面は以下の通りである:
- 埋め込みデータを生成するために使用される機械学習モデル。
- そのモデルに投入される入力データの質。
このことは、ベクターデータベースのパイプラインが、いかに強力であるかということを浮き彫りにしている。エンベッディングが低品質、不完全、あるいはノイズの多いデータから生成された場合、どんなに優れたMLモデルやベクトルデータベースであっても、結果は芳しくありません。
クリーンで豊富かつ包括的なデータを収集することがなぜ重要なのか、ご理解いただけたと思います!
Bright Dataは、高品質のウェブデータを倫理的かつ効率的に収集できる、ウェブスクレイピングおよびデータ収集プラットフォームのリーディングカンパニーです。そのデータ収集ソリューションは、何百ものドメインから構造化されたリアルタイムのデータを抽出することができます。また、これらのソリューションは、お客様のワークフローに直接統合して、カスタムスクレイピングスクリプトのパフォーマンスを向上させることができます。
このデータソーシングアプローチの主な利点は、Bright Dataがすべてを引き受けることです。インフラを管理し、IPローテーションを処理し、アンチボットプロテクションを回避し、HTMLデータを解析し、コンプライアンスを完全にカバーします。
これらのWebスクレイピングツールは、Webページから直接、新鮮で構造化されたデータにアクセスするのに役立ちます。ウェブが最大のデータ源であることを考えると、それを利用することは、コンテキストに富んだベクトル埋め込みを生成するのに理想的である。これらのエンベッディングは、以下のような幅広いAIや検索アプリケーションを支援することができる:
- eコマース推奨製品情報
- セマンティック検索と文脈検索のためのニュース記事
- トレンド検出と分析のためのソーシャルメディアコンテンツ
- 場所を意識した体験のためのビジネス・リスティング
生データからベクトル埋め込みへ:変換プロセス
生データをベクトル埋め込みに変換するプロセスには、2つのステップが必要である:
- データ前処理
- エンベディング世代
それぞれのステップの仕組みと内容をよりよく理解するために、これらを分解してみよう。
ステップ1.データの前処理
生データはノイズが多く、冗長で、構造化されていない傾向がある。生データを埋め込みデータに変換する最初のステップは、データのクリーニングと正規化です。この処理により、埋め込み生成のために機械学習モデルに入力する前に、入力データの品質と一貫性が向上します。
例えば、機械学習でウェブデータを使用する場合、一般的な前処理ステップには次のようなものがある:
- 生のHTMLを解析し、構造化されたコンテンツを抽出する。
- 空白をトリミングし、データ形式を標準化する(価格、日付、通貨記号など)。
- 小文字への変換、句読点の削除、HTMLの特殊文字の処理など、テキストの正規化。
- 冗長な情報を避けるためにコンテンツを重複排除する。
ステップ2.埋め込み生成
いったんデータがクリーニングされ、前処理されると、ML埋め込みモデルに通すことができる。これにより、高密度の数値ベクトルに変換される。
埋め込みモデルの選択は、入力データの種類と希望する出力品質に依存する。以下は、一般的な手法です:
- OpenAIの埋め込みモデル:優れた意味理解を持つ、高品質で汎用的なベクトルを生成します。
- Sentence Transformers:オープンソースのPythonフレームワーク。ローカルで動作し、多くの事前学習済みモデルをサポートしている。
- ドメイン固有の埋め込みモデル:財務報告書、法律文書、生物医学テキストなどのニッチなデータセットで微調整を行い、特定のシナリオで高いパフォーマンスを実現。
例えば、OpenAIのエンベッディング・モデルを使ってエンベッディングを生成するには、次のようにします。
# requirement: pip install openai
from openai import OpenAI
client = OpenAI() # Reading the OpenAI key from the "OPENAI_API_KEY" env
# Sample input data (replace it with your input data)
input_data = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""
# Use an OpenAI embedding model for embedding generation
response = client.embeddings.create(
model="text-embedding-3-large",
input=input_data
)
# Get the embedding and print it
embedding = response.data[0].embedding
print(embedding)
のような3072次元のベクトルが出力される:
[
-0.005813355557620525,
# other 3070 elements...,
-0.006388738751411438
]
同様に、センテンス・トランスフォーマーを使って
埋め込みを生成する方法を紹介しよう:
# requirement: pip install sentence_transformers
from sentence_transformers import SentenceTransformer
# Sample input data (replace it with your input data)
input_data = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
"""
# Load a pretrained Sentence Transformer model
model = SentenceTransformer("all-MiniLM-L6-v2")
# Embedding generation
embedding = model.encode(input_data)
# Print the resulting embedding
print(embedding)
今回は、より短い384次元のベクトルが出力される:
[
-0.034803513,
# other 381 elements...,
-0.046595078
]
エンベッディングの品質と計算効率はトレードオフの関係にある。OpenAIが提供するような大規模なモデルは、リッチで高精度な埋め込みを生成するが、時間がかかり、プレミアムAIモデルとのネットワークコールが必要になることもある。一方、SentenceTransformersのようなローカルモデルは、無料で非常に高速ですが、意味的なニュアンスが犠牲になる可能性があります。
適切な埋め込み戦略の選択は、パフォーマンス要件と達成したいセマンティック精度のレベルによって決まります。
実践的な統合:ステップ・バイ・ステップ・ガイド
以下の手順に従って、Pythonスクリプトを使って、ウェブページ上の生データから効果的なセマンティック検索を行う方法を学んでください。
このチュートリアル・セクションでは、以下のプロセスを説明する:
- Bright DataのWeb Scraper APIを使ってBBCからニュース記事を取得。
- スクレイピングされたデータを前処理し、エンベッディング生成の準備をする。
- SentenceTransformersを使ったテキスト埋め込み生成。
- ミルバスをセットアップする
- 処理されたテキストと埋め込みをベクトルデータベースに入力する。
- 検索クエリに基づいて、意味的に関連するニュース記事を取得するための検索を実行します。
さあ、飛び込もう!
前提条件
始める前に、以下のことを確認してください:
- Python 3+をローカルにインストール
- ローカルにインストールされたDocker
- ブライトデータのアカウント
まだの場合は、PythonとDockerをマシンにインストールし、無料のBright Dataアカウントを作成してください。
ステップ1:Bright DataのWeb Scraper APIを使ったデータ収集
ニュース記事のスクレイピングは、多くのニュースポータルがスクレイピングやボット対策でページを保護しているため、必ずしも容易ではない。これらの保護を確実に回避し、BBCから新鮮なデータを取得するために、Bright DataのWeb Scraper APIを使用する。
このAPIは、BBCを含む120以上の人気ウェブサイトから構造化データを収集するための専用エンドポイントを公開している。これがスクレイピングの仕組みだ:
- 指定されたドメイン上の指定されたURLのスクレイピングタスクをトリガーするために、適切なエンドポイントにPOSTリクエストを行う。
- Bright Dataはクラウド上でスクレイピング作業を行う。
- スクレイピングされたデータが(JSON、CSV、その他のフォーマットで)準備できるまで、別のエンドポイントを定期的にポーリングする。
Pythonのコードに入る前に、Requestsライブラリをインストールしてください:
pip install requests
次に、Bright Dataのドキュメントを参照して、Web Scraper APIに慣れる。また、APIキーを取得する。
では、以下のコードを使ってBBCニュースからデータを取得してみよう:
import requests
import json
import time
def trigger_bbc_news_articles_scraping(api_key, urls):
# Endpoint to trigger the Web Scraper API task
url = "https://api.brightdata.com/datasets/v3/trigger"
params = {
"dataset_id": "gd_ly5lkfzd1h8c85feyh", # ID of the BBC web scraper
"include_errors": "true",
}
# Convert the input data in the desired format to call the API
data = [{"url": url} for url in urls]
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
}
response = requests.post(url, headers=headers, params=params, json=data)
if response.status_code == 200:
snapshot_id = response.json()["snapshot_id"]
print(f"Request successful! Response: {snapshot_id}")
return response.json()["snapshot_id"]
else:
print(f"Request failed! Error: {response.status_code}")
print(response.text)
def poll_and_retrieve_snapshot(api_key, snapshot_id, output_file, polling_timeout=20):
snapshot_url = f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json"
headers = {
"Authorization": f"Bearer {api_key}"
}
print(f"Polling snapshot for ID: {snapshot_id}...")
while True:
response = requests.get(snapshot_url, headers=headers)
if response.status_code == 200:
print("Snapshot is ready. Downloading...")
snapshot_data = response.json()
# Write the snapshot to an output json file
with open(output_file, "w", encoding="utf-8") as file:
json.dump(snapshot_data, file, indent=4)
print(f"Snapshot saved to {output_file}")
return
elif response.status_code == 202:
print(F"Snapshot is not ready yet. Retrying in {polling_timeout} seconds...")
time.sleep(polling_timeout)
else:
print(f"Request failed! Error: {response.status_code}")
print(response.text)
break
if __name__ == "__main__":
BRIGHT_DATA_API_KEY = "<YOUR_BRIGHT_DATA_API_KEY>" # Replace it with your Bright Data's Web Scraper API key
# URLs of BBC articles to retrieve data from
urls = [
"https://www.bbc.com/sport/formula1/articles/c9dj0elnexyo",
"https://www.bbc.com/sport/formula1/articles/cgenqvv9309o",
"https://www.bbc.com/sport/formula1/articles/c78jng0q2dxo",
"https://www.bbc.com/sport/formula1/articles/cdrgdm4ye53o",
"https://www.bbc.com/sport/formula1/articles/czed4jk7eeeo",
"https://www.bbc.com/sport/football/articles/c807p94r41do",
"https://www.bbc.com/sport/football/articles/crgglxwge10o",
"https://www.bbc.com/sport/tennis/articles/cy700xne614o",
"https://www.bbc.com/sport/tennis/articles/c787dk9923ro",
"https://www.bbc.com/sport/golf/articles/ce3vjjq4dqzo"
]
snapshot_id = trigger_bbc_news_articles_scraping(BRIGHT_DATA_API_KEY, urls)
poll_and_retrieve_snapshot(BRIGHT_DATA_API_KEY, snapshot_id, "news-data.json")
選んだ入力URLはすべてBBCのスポーツ記事を参照していることに注意。上記のスクリプトを起動すると、次のような出力が得られる:
Request successful! Response: s_m9in0ojm4tu1v8h78
Polling snapshot for ID: s_m9in0ojm4tu1v8h78...
Snapshot is not ready yet. Retrying in 20 seconds...
# ...
Snapshot is not ready yet. Retrying in 20 seconds...
Snapshot is ready. Downloading...
Snapshot saved to news-data.json
ご覧のように、スクリプトはデータの準備ができるまでポーリングを続けます。処理が完了すると、スクレイピングされた記事データが構造化されたJSON形式で格納されたnews-data.jsonという
ファイルがプロジェクトフォルダに作成されます。
ステップ2:スクレイピングされたデータのクリーニングと準備
出力されたデータファイルを開くと、次のようなニュースの配列が表示される:
[
{
"input": {
"url": "https://www.bbc.com/sport/football/articles/c807p94r41do",
"keyword": ""
},
"id": "c807p94r41do",
"url": "https://www.bbc.com/sport/football/articles/c807p94r41do",
"author": "BBC",
"headline": "Man City Women: What has gone wrong for WSL side this season?",
"topics": [
"Football",
"Women's Football"
],
"publication_date": "2025-04-13T19:35:45.288Z",
"content": "With their Women's Champions League qualification ...",
"videos": [],
"images": [
// ...
],
"related_articles": [
// ...
],
"keyword": null,
"timestamp": "2025-04-15T13:14:27.754Z"
}
// ...
]
さて、データが手に入ったので、次のステップは、このファイルをインポートし、コンテンツをクリーンにして、ML埋め込み生成の準備をすることです。
このような場合、Bright Dataがほとんどの作業を代行します。スクレイピングされたデータは、解析され構造化されたフォーマットで返されるため、HTMLデータの解析を心配する必要はありません。
その代わりに、あなたがしたいことは何ですか?
- テキスト内容の空白、改行、タブを正規化する。
- 記事の見出しと本文を組み合わせて、埋め込み生成に適した単一のきれいなテキスト文字列を形成する。
データの取り扱いを簡単にするために、Pandasの使用を推奨する。でインストールできる:
pip install pandas
前のステップからnews-data.json
ファイルをロードし、データ処理ロジックを実行する:
import pandas as pd
import json
import re
# Load your JSON array
with open("news-data.json", "r") as f:
news_data = json.load(f)
# Normalize whitespaces/newlines/tabs for better embedding quality
def clean_text(text):
text = re.sub(r"\s+", " ", text)
return text.strip()
# Create a DataFrame
df = pd.DataFrame(news_data)
# Combine headline and cleaned content for embedding input
df["text_for_embedding"] = df["headline"].map(clean_text) + ". " + df["content"].map(clean_text)
# Ensure ID is a string
df["id"] = df["id"].astype(str)
新しいtext_for_embedding
フィールドは、埋め込み生成の準備が整った、集約されクリーニングされたテキストコンテンツを含んでいることに注意してください。
ステップ 3: 埋め込みの生成
SentenceTransformerを使用して、text_for_embedding
フィールドから埋め込みを生成する:
from sentence_transformers import SentenceTransformer
# Step 2 ...
# Initialize a model for embedding generation
model = SentenceTransformer("all-MiniLM-L6-v2")
# Generate embeddings
texts = df["text_for_embedding"].tolist()
embeddings = model.encode(texts, show_progress_bar=True, batch_size=16)
# Store the resulting emebeddings in the DataFrame
df["embedding"] = embeddings.tolist()
show_progress_barが
Trueに
設定されているので、sentence_transformersは
埋め込み生成中にターミナルにプログレスバーを表示します。これは、特に大きなデータセットを処理するときに便利です。
生成された埋め込みベクトルは、ステップ1から元のDataFrameの埋め込み
カラムに直接格納されます。
ステップ4:ベクターデータベースの選択と設定
Milvusはフリーでオープンソースであり、セマンティック検索を主な使用例の一つとしてサポートしているため、この例ではベクターデータベースとして最適である。
ローカルマシンにMilvusをインストールするには、公式ドキュメントのページに従ってください:
ポート19530で
ローカルにMilvusインスタンスが動作しているはずです。
次に、Python Milvusクライアントであるpymilvusを
インストールする:
pip install pymilvus
注意: MilvusサーバのバージョンはPythonクライアントのバージョンと一致している必要があります。互換性のないバージョンは接続エラーにつながる可能性があります。サポートされているバージョンの組み合わせはMilvus GitHub releases pageで確認できます。この記事を書いている時点では、以下の組み合わせで動作します:
- Milvusサーバーバージョン:
2.5.9
pymilvus
バージョン:2.5.6
ステップ5:埋め込みデータをベクトルデータベースに読み込む
pymilvusを
使用してローカルのMilvusサーバーに接続し、news_articles
コレクションを作成し、スキーマとインデックスを定義し、埋め込みデータを入力します:
from pymilvus import connections, utility, CollectionSchema, FieldSchema, DataType, Collection
# Step 4...
# Connect to Milvus
connections.connect("default", host="localhost", port="19530")
# Drop the "news_articles" collection if it already exists
if utility.has_collection("news_articles"):
utility.drop_collection("news_articles")
# Define the collection's schema
fields = [
FieldSchema(name="id", dtype=DataType.VARCHAR, is_primary=True, max_length=64),
FieldSchema(name="url", dtype=DataType.VARCHAR, max_length=65535),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384),
]
schema = CollectionSchema(fields, description="News article embeddings for semantic search")
collection = Collection(name="news_articles", schema=schema)
# Create an index on the embedding field
index_params = {
"metric_type": "COSINE",
"index_type": "HNSW",
}
collection.create_index(field_name="embedding", index_params=index_params)
# Load the collection for the first time
collection.load()
# Prepare data for insertion
ids = df["id"].tolist()
urls = df["url"].tolist()
texts = df["text_for_embedding"].tolist()
vectors = df["embedding"].tolist()
# Insert the data into the Milvus collection
collection.insert([ids, urls, texts, vectors])
collection.flush()
これらのコード行の後、ローカルMilvusサーバー上のnews_articles
コレクションは埋め込みデータを含み、セマンティック検索クエリをサポートする準備が整います。
ステップ6:意味検索の実行
news_articles
コレクションに対してセマンティック検索を行う関数を定義する:
# Step 5...
def search_news(query: str, top_k=3, score_threshold=0.5):
query_embedding = model.encode([query])
search_params = {"metric_type": "COSINE"}
results = collection.search(
data=query_embedding,
anns_field="embedding",
param=search_params,
limit=top_k,
output_fields=["id", "url", "text"]
)
for hits in results:
for hit in hits:
if hit.score >= score_threshold:
print(f"Score: {hit.score:.4f}")
print(f"URL: {hit.fields["url"]}")
print(f"Text: {hit.fields["text"][:300]}...\n")
これは、指定されたクエリと意味的に一致する上位3つの結果を検索し、類似度スコアが0.5
以上のものだけを返します。コサイン類似度を使用しているので、スコアは-1
(完全に反対)から1
(完全に一致)の範囲です。
F1におけるレッドブル・レーシングチームの未来」というクエリでセマンティック検索ができるようになった:
search_news("Future of the Red Bull racing team in Formula 1")
出力はこうなる:
Score: 0.5736
URL: https://www.bbc.com/sport/formula1/articles/c9dj0elnexyo
Text: Max Verstappen: Red Bull adviser Helmut Marko has 'great concern' about world champion's future with team. Saudi Arabian Grand PrixVenue: Jeddah Dates: 18-20 April Race start: 18:00 BST on SundayCoverage: Live radio commentary of practice, qualifying and race online and BBC 5 Sports Extra; live text...
Score: 0.5715
URL: https://www.bbc.com/sport/formula1/articles/czed4jk7eeeo
Text: F1 engines: A return to V10 or hybrid - what's the future?. Christian Horner's phone rang. It was Bernie Ecclestone. Red Bull's team principal picked up, switched to speakerphone and placed it on the table in front of the assembled Formula 1 bosses.We're in the F1 Commission, Horner told Ecclestone....
検索された記事を読むと、クエリがテキストに文字通り存在しないことがわかる。それでも、検索された記事は明らかにF1におけるレッドブルの将来について書かれている!
ベクターデータベースのパフォーマンスの最適化
ベクターデータベースを最大限に活用するには、データを意味のあるコレクションに整理することから始めましょう。次に、データのシャーディングとクラスタリングの実装を検討し、特定のクエリパターンに最適化されたインデックス戦略を定義します。
これらの最適化の多くは、ベクター・データベース・プロセスが成熟したときに最も効果的であることを覚えておいてください。それは、どのデータが最も頻繁にクエリされるかをしっかり理解したときです。そうなって初めて、早合点するのではなく、実際の使用パターンに基づいてパフォーマンスを最適化する必要があります。
その他の一般的なパフォーマンス上の課題には、エンベッディング・ドリフト、一貫性のないベクトル次元、古くなったデータや重複したデータなどがあります。定期的な再埋め込み、高次元データのスキーマ一貫性の確保、自動クリーンアップタスクの設定によって、これらの問題に対処しましょう。
新しいデータがシステムに入ってきたら、リアルタイムのベクトル更新か、スケジュールされたバッチ挿入をサポートする必要があります。この点で、検証されていないデータを取り込むと、ノイズの多いエンベッディングや信頼性の低い検索結果になる可能性があることを覚えておいてください。
最後に、シングルノード・データベースを最適化するには、インデックスの精度、 ベクトルの次元数、シャード数などのパラメータを調整することを検討する。ワークロードが増大するにつれて、垂直方向のスケーリングよりも水平方向のスケーリングが一般的に好まれます。そのため、通常はクラウド上に複数の分散ノードを設置することになります。
ベクターデータベースの今後の動向
現代のAIシステムはまだ比較的新しく、エコシステムは急速に進化している。ベクトル・データベースはAIの動きの多くを支えるエンジンとして機能しているため、テクノロジー自体も、ますます複雑化する実世界のアプリケーションをサポートするために継続的に適応している。
今後、ベクター・データベースの将来を形作る興味深いトレンドは次のようなものだろう:
- ハイブリッド検索の統合:ベクトル検索を従来のリレーショナルシステムやNoSQLシステムと組み合わせることで、構造化・非構造化データに対してより柔軟なクエリーを可能にする。
- ネイティブのマルチモーダルサポート:テキスト、画像、音声、ビデオなどの多様なソースからの埋め込みを統一的に保存し、照会することができます。
- よりスマートなインデックス作成とチューニング:自動チューニングされたパラメータ、コスト効率の高いストレージ、SQLデータベース統合などの機能を使用して、スケーラビリティとエンタープライズ対応力を向上させます。
結論
このガイドで学んだように、ベクトル・データベースは機械学習データ・ストレージの中核をなすコンポーネントだ。特に、ベクトル・データベースとは何か、どのように機能するのか、業界で現在利用可能なトップ・オプション、最新のAIデータ・インフラストラクチャにおける重要な役割について理解しただろう。
また、セマンティック検索のユースケースのために、生データからベクターデータベースに格納されたエンベッディングに移行する方法をご覧いただきました。これは、包括的で信頼できる最新のデータから始めることの重要性を強調したもので、まさにBright Dataのウェブスクレイピングソリューションが活躍する場です。
Bright Dataの無料トライアルを開始し、ベクターデータベースアプリケーションに必要な高品質のデータを入手してください!
クレジットカードは必要ありません