このドキュメントでは、ベクトル検索におけるベクトル埋め込み技術について説明します。
ベクトル埋め込みとは?
ベクトル埋め込みは、非構造化データを数値ベクトルに変換する技術です。これらのベクトルは非構造化データの意味情報を捉えることができ、コンピュータが非構造化データの意味を「理解」し、処理することを可能にします。具体的には:
- ベクトル埋め込みは、テキスト、画像、音声・動画などの非構造化データを高次元ベクトル空間上の点にマッピングします。
- このベクトル空間では、意味的に類似した非構造化データは互いに近い位置にマッピングされます。
- ベクトルは通常、数百の数字で構成されます(例:512次元、1024次元など)。
- ベクトル間の類似度は、数学的手法(例:コサイン類似度)を用いて計算できます。
- 一般的なベクトル埋め込みモデルには、Word2Vec、BERT、BGEなどがあります。例えば、RAGアプリケーションを開発する際、通常はテキストデータを埋め込み処理によってベクトルデータに変換した後、ベクトルデータベースに格納し、他の構造化データはリレーショナルデータベースに格納します。
OceanBase 4.3.3バージョンから、ベクトルデータをデータ型の一種としてリレーショナルテーブルに格納できるようになりました。これにより、ベクトルと従来のスカラーデータをOceanBaseという単一のデータベースに、秩序立てて効率的に格納することが可能になります。
OceanBaseにおけるAI関数サービスを利用したベクトル埋め込みの生成
OceanBaseデータベースV4.4.1バージョンから、AI関数サービスを利用したベクトル埋め込みの生成がサポートされています。ユーザーは依存関係をインストールする必要はなく、モデル情報を登録するだけで、OceanBaseデータベース内でAI関数サービスを利用してベクトル埋め込みを生成できます。詳細については、AI関数の構文と例を参照してください。
一般的なテキスト埋め込み手法
このセクションでは、テキスト埋め込み手法について説明します。
手順の準備
事前に pip コマンドをインストールしておく必要があります。
オフラインのローカル事前学習済み埋め込みモデルの使用
事前学習済みモデルを使用してローカルでテキスト埋め込みを行うのは最も柔軟な方法ですが、大規模な計算リソースが必要です。よく使われるモデルには以下のものがあります:
Sentence Transformersの使用
Sentence Transformersは、自然言語処理(NLP)に用いられるモデルであり、文や段落をベクトル埋め込みに変換することを目的としています。深層学習技術、特にトランスフォーマー(Transformer)アーキテクチャを基にしており、テキストの意味情報を効果的に捉えることができます。中国国内から直接Hugging Faceのドメインにアクセスするとタイムアウトが発生することが多いため、事前にHugging Faceのミラーアドレス export HF_ENDPOINT=https://hf-mirror.com を設定してください。設定後、以下のコードを実行します:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-m3")
sentences = [
"That is a happy person",
"That is a happy dog",
"That is a very happy person",
"Today is a sunny day"
]
embeddings = model.encode(sentences)
print(embeddings)
# [[-0.01178016 0.00884024 -0.05844684 ... 0.00750248 -0.04790139
# 0.00330675]
# [-0.03470375 -0.00886354 -0.05242309 ... 0.00899352 -0.02396279
# 0.02985837]
# [-0.01356584 0.01900942 -0.05800966 ... 0.00523864 -0.05689549
# 0.00077098]
# [-0.02149693 0.02998871 -0.05638731 ... 0.01443702 -0.02131325
# -0.00112451]]
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# torch.Size([4, 4])
Hugging Face Transformersの使用
Hugging Face Transformersは、オープンソースライブラリであり、特に自然言語処理(NLP)タスク向けの事前学習済み深層学習モデルを多数提供しています。地域によっては、直接Hugging Faceのドメインにアクセスするとタイムアウトが発生する可能性があるため、事前にHugging Faceのミラーアドレス export HF_ENDPOINT=https://hf-mirror.com` を設定してください。
from transformers import AutoTokenizer, AutoModel
import torch
# モデルとトークナイザーのロード
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-m3")
model = AutoModel.from_pretrained("BAAI/bge-m3")
# 入力の準備
texts = ["これはサンプルテキストです"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# 埋め込みの生成
with torch.no_grad():
outputs = model(**inputs)
embeddings = outputs.last_hidden_state[:, 0] # [CLS]トークンの出力を使用
print(embeddings)
# tensor([[-1.4136, 0.7477, -0.9914, ..., 0.0937, -0.0362, -0.1650]])
print(embeddings.shape)
# torch.Size([1, 1024])
Ollama
Ollamaは、オープンソースのモデルです。ランタイムでは、ユーザーがローカル環境でさまざまな大規模言語モデルを簡単に実行、管理、利用できるようにします。Llama 3やMistralなどのオープンソース言語モデルに加え、bge-m3などの埋め込みモデルもサポートしています。
Ollamaのデプロイ
MacOSおよびWindowsでは、公式Webサイトから直接インストーラーをダウンロードしてインストールできます。インストール方法については、Ollamaの公式Webサイトを参照してください。インストール完了後、Ollamaはサービスとしてバックグラウンドで実行されます。
LinuxへのOllamaインストール:
curl -fsSL https://ollama.ai/install.sh | sh埋め込みモデルの取得
Ollamaは、テキスト埋め込みにbge-m3モデルの使用をサポートしています:
ollama pull bge-m3Ollamaを使用したテキスト埋め込み
Ollamaの埋め込み機能は、HTTP APIやPython SDKなどを通じて利用できます:
HTTP APIによる方法
import requests def get_embedding(text: str) -> list: """OllamaのHTTP APIを使用してテキスト埋め込みを取得する""" response = requests.post( 'http://localhost:11434/api/embeddings', json={ 'model': 'bge-m3', 'prompt': text } ) return response.json()['embedding'] # 使用例 text = "これはサンプルテキストです" embedding = get_embedding(text) print(embedding) # [-1.4269912242889404, 0.9092104434967041, ...]Python SDKによる方法
まず、OllamaのPython SDKをインストールします:
pip install ollamaその後、次のように使用できます:
import ollama # 使用例 texts = ["最初の文", "2番目の文"] embeddings = ollama.embed(model="bge-m3", input=texts)['embeddings'] print(embeddings) # [[0.03486196, 0.0625187, ...], [...]]
Ollamaの利点と制約
利点:
- 完全なローカルデプロイで、ネットワーク接続不要
- オープンソースで無料、APIキー不要
- 複数のモデルをサポートし、切り替えや比較が容易
- リソース消費が比較的少ない
制約:
- 利用可能な埋め込みモデルが少ない
- 性能が商用サービスに及ばない可能性がある
- 自身でメンテナンスと更新が必要
- エンタープライズレベルのサポートが欠けている
Ollamaの使用を検討する際は、これらの要素を考慮して判断する必要があります。アプリケーションのプライバシー要件が厳しい場合や、完全なオフライン動作を希望する場合、Ollamaは優れた選択肢です。しかし、より安定したサービス品質と高性能が必要な場合は、商用サービスを検討する方が適しているかもしれません。
オンライン・リモート型の埋め込みサービスの利用
オフラインのローカル埋め込みモデルは、通常、デプロイするマシンのスペック要件が高く、モデルのロードやアンロードなどのプロセス管理も複雑です。多くのユーザーはオンラインの埋め込みサービスを求めており、現在では多くのAI推論サービスプロバイダーが対応するテキスト埋め込みサービスを提供しています。例えば、通義千問のテキスト埋め込みサービスを利用する場合、まずAlibaba Cloud Model Studioアカウントに登録してAPI Keyを取得し、その後、公開されているインターフェースを呼び出すことでテキスト埋め込みの結果を得ることができます。



HTTP呼び出し
取得後、以下のコードでテキスト埋め込みを試すことができます。Python環境にrequestsパッケージがインストールされていない場合は、ネットワークリクエストを送信するために、まず pip install requests でインストールしてください。
import requests
from typing import List
class RemoteEmbedding():
def __init__(
self,
base_url: str,
api_key: str,
model: str,
dimensions: int = 1024,
**kwargs,
):
self._base_url = base_url
self._api_key = api_key
self._model = model
self._dimensions = dimensions
"""
OpenAI compatible embedding API. Tongyi, Baichuan, Doubao, etc.
"""
def embed_documents(
self,
texts: List[str],
) -> List[List[float]]:
"""Embed search docs.
Args:
texts: List of text to embed.
Returns:
List of embeddings.
"""
res = requests.post(
f"{self._base_url}",
headers={"Authorization": f"Bearer {self._api_key}"},
json={
"input": texts,
"model": self._model,
"encoding_format": "float",
"dimensions": self._dimensions,
},
)
data = res.json()
embeddings = []
try:
for d in data["data"]:
embeddings.append(d["embedding"][: self._dimensions])
return embeddings
except Exception as e:
print(data)
print("Error", e)
raise e
def embed_query(self, text: str, **kwargs) -> List[float]:
"""Embed query text.
Args:
text: Text to embed.
Returns:
Embedding.
"""
return self.embed_documents([text])[0]
embedding = RemoteEmbedding(
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings", # https://bailian.console.aliyun.com を参照
api_key="your-api-key", # あなたのAPI Keyを入力してください
model="text-embedding-v3",
)
print("Embedding result:", embedding.embed_query("今天天气不错"), "\n")
# Embedding result: [-0.03573227673768997, 0.0645645260810852, ...]
print("Embedding results:", embedding.embed_documents(["今天天气不错", "明天呢?"]), "\n")
# Embedding results: [[-0.03573227673768997, 0.0645645260810852, ...], [-0.05443647876381874, 0.07368793338537216, ...]]
Qwen SDKの使用
Qwenは、モデル機能を迅速に呼び出すためのdashscopeというSDKを提供しています。pip install dashscope でインストール後、テキスト埋め込みの内容を取得できます。
import dashscope
from dashscope import TextEmbedding
# API Keyの設定
dashscope.api_key = "your-api-key"
# 入力テキストの準備
texts = ["これは最初の文です", "これは2番目の文です"]
# 埋め込みサービスの呼び出し
response = TextEmbedding.call(
model="text-embedding-v3",
input=texts
)
# 埋め込み結果の取得
if response.status_code == 200:
print(response.output['embeddings'])
# [{"embedding": [-0.03193652629852295, 0.08152323216199875, ...]}, {"embedding": [...]}]
一般的な画像埋め込み手法
このセクションでは、画像埋め込み手法について説明します。
オフラインのローカル事前学習済み埋め込みモデルの使用
CLIPの使用
CLIP(Contrastive Language-Image Pretraining)は、OpenAIが提案した、画像とテキストを組み合わせてマルチモーダル学習を行うモデルです。CLIPは画像とテキストの関係を理解し処理できるため、画像分類、画像検索、テキスト生成など、さまざまなタスクで優れた性能を発揮します。
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 入力画像の準備
image = Image.open("path_to_your_image.jpg")
texts = ["これは最初の文です", "これは2番目の文です"]
# 埋め込みサービスの呼び出し
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
# 埋め込み結果の取得
if outputs.status_code == 200:
print(outputs.output['embeddings'])
# [{"embedding": [-0.03193652629852295, 0.08152323216199875, ...]}, {"embedding": [...]}]