OceanBaseデータベースは、ベクトル型データの格納、ベクトルインデックス、そしてembeddingベクトル検索機能を提供しています。これにより、ベクトル化したデータをOceanBaseデータベースに保存し、次の検索処理で利用できます。
Jina AIは、マルチモーダル検索とベクトル検索に特化したAIプラットフォームフレームワークです。エンタープライズ向けの検索強化型生成AIアプリケーションを構築するために必要なコアコンポーネントとツールを提供し、企業や開発者がマルチモーダル検索に基づくRAG(Search-Augmented Generation)アプリケーションを構築するのを支援します。
前提条件
OceanBaseデータベースV4.4.0以降をデプロイし、MySQLテナントを作成していること。テナントの作成後、以下の手順を参照して操作してください。
環境に使用可能なMySQLテナント、MySQLデータベース、およびデータベースアカウントが既に存在し、データベースアカウントに読み書き権限が付与されていること。
Python 3.11以降をインストールしていること。
依存関係をインストールしていること。
python3 -m pip install pyobvector requests sqlalchemyベクトル検索機能を有効にするために、テナントで
ob_vector_memory_limit_percentageパラメータが設定されていることを確認してください。V4.4.1以前のバージョンでは値を30に設定することを推奨しますが、V4.4.1以降のバージョンではデフォルト値の0のままにしておくことを推奨します。このパラメータをより正確に設定する必要がある場合は、ob_vector_memory_limit_percentageを参照してこの値を計算してください。
ステップ1:データベース接続情報を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、対応するデータベース接続文字列を取得します。例:
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースへの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセスするデータベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、DROP、およびSELECT権限が付与されていなければなりません。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
接続文字列の詳細については、OBClientを使用したOceanBaseテナントへの接続を参照してください。
ステップ2:AIアシスタントを構築する
Jina AI APIキーの環境変数を設定する
Jina AI APIキーを取得し、OceanBaseの接続情報と共に環境変数に設定します。
export OCEANBASE_DATABASE_URL=YOUR_OCEANBASE_DATABASE_URL
export OCEANBASE_DATABASE_USER=YOUR_OCEANBASE_DATABASE_USER
export OCEANBASE_DATABASE_DB_NAME=YOUR_OCEANBASE_DATABASE_DB_NAME
export OCEANBASE_DATABASE_PASSWORD=YOUR_OCEANBASE_DATABASE_PASSWORD
export JINAAI_API_KEY=YOUR_JINAAI_API_KEY
サンプルコード
Jina AIの埋め込みベクトルを取得する
Jina AIはさまざまな埋め込みモデルを提供しており、ユーザーは自身のニーズに応じて対応するモデルを選択して使用できます。
Model |
Parameter Size |
Embedding Dimension |
Text |
|---|---|---|---|
| jina-embeddings-v3 | 570M | flexible embedding size (Default: 1024) | multilingual text embeddings; supports 94 language in total |
| jina-embeddings-v2-small-en | 33M | 512 | English monolingual embeddings |
| jina-embeddings-v2-base-en | 137M | 768 | English monolingual embeddings |
| jina-embeddings-v2-base-zh | 161M | 768 | Chinese-English Bilingual embeddings |
| jina-embeddings-v2-base-de | 161M | 768 | German-English Bilingual embeddings |
| jina-embeddings-v2-base-code | 161M | 768 | English and programming languages |
ここでは、jina-embeddings-v3を例に、Jina AIの埋め込みAPIを呼び出すためのgenerate_embeddings補助関数を定義します。
import os
import requests
from sqlalchemy import Column, Integer, String
from pyobvector import ObVecClient, VECTOR, IndexParam, cosine_distance
JINAAI_API_KEY = os.getenv('JINAAI_API_KEY')
# Step 1. Text Data Vectorization
def generate_embeddings(text: str):
JINAAI_API_URL = 'https://api.jina.ai/v1/embeddings'
JINAAI_HEADERS = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {JINAAI_API_KEY}'
}
JINAAI_REQUEST_DATA = {
'input': [text],
'model': 'jina-embeddings-v3'
}
response = requests.post(JINAAI_API_URL, headers=JINAAI_HEADERS, json=JINAAI_REQUEST_DATA)
response_json = response.json()
return response_json['data'][0]['embedding']
TEXTS = [
'Jina AI offers best-in-class embeddings, reranker and prompt optimizer, enabling advanced multimodal AI.',
'OceanBase Database is an enterprise-level, native distributed database independently developed by the OceanBase team. It is cloud-native, highly consistent, and highly compatible with Oracle and MySQL.',
'OceanBase is a native distributed relational database that supports HTAP hybrid transaction analysis and processing. It features enterprise-level characteristics such as high availability, transparent scalability, and multi-tenancy, and is compatible with MySQL/Oracle protocols.'
]
data = []
for text in TEXTS:
# Generate the embedding for the text via Jina AI API.
embedding = generate_embeddings(text)
data.append({
'content': text,
'content_vec': embedding
})
print(f"Successfully processed {len(data)} texts")
ベクトルテーブル構造の定義とベクトルのOceanBaseへの同時格納
jinaai_oceanbase_demo_documents という名前のテーブルを作成し、テキストを格納する content 列、埋め込みベクトルを格納する content_vec 列、およびベクトルインデックス情報を含みます。そして、ベクトルデータをOceanBaseに格納します。
# Step 2. Connect OceanBase Serverless
OCEANBASE_DATABASE_URL = os.getenv('OCEANBASE_DATABASE_URL')
OCEANBASE_DATABASE_USER = os.getenv('OCEANBASE_DATABASE_USER')
OCEANBASE_DATABASE_DB_NAME = os.getenv('OCEANBASE_DATABASE_DB_NAME')
OCEANBASE_DATABASE_PASSWORD = os.getenv('OCEANBASE_DATABASE_PASSWORD')
client = ObVecClient(uri=OCEANBASE_DATABASE_URL, user=OCEANBASE_DATABASE_USER,password=OCEANBASE_DATABASE_PASSWORD,db_name=OCEANBASE_DATABASE_DB_NAME)
# Step 3. Create the vector table.
table_name = "jinaai_oceanbase_demo_documents"
client.drop_table_if_exist(table_name)
cols = [
Column("id", Integer, primary_key=True, autoincrement=True),
Column("content", String(500), nullable=False),
Column("content_vec", VECTOR(1024))
]
# Create vector index
vector_index_params = IndexParam(
index_name="idx_content_vec",
field_name="content_vec",
index_type="HNSW",
distance_metric="cosine"
)
client.create_table_with_index_params(
table_name=table_name,
columns=cols,
vidxs=[vector_index_params]
)
print('- Inserting Data to OceanBase...')
client.insert(table_name, data=data)
セマンティック検索
Jina AIの埋め込みAPIを使用してクエリテキストの埋め込みベクトルを生成し、その後、クエリテキストの埋め込みベクトルとベクトルテーブル内の各埋め込みベクトルとのコサイン距離に基づいて、最も関連性の高いドキュメントを検索します。
# Step 4. Query the most relevant document based on the query.
query = 'What is OceanBase?'
# Generate the embedding for the query via Jina AI API.
query_embedding = generate_embeddings(query)
res = client.ann_search(
table_name,
vec_data=query_embedding,
vec_column_name="content_vec",
distance_func=cosine_distance, # コサイン距離関数を使用
with_dist=True,
topk=1,
output_column_names=["id", "content"],
)
print('- The Most Relevant Document and Its Distance to the Query:')
for row in res.fetchall():
print(f' - ID: {row[0]}\n'
f' content: {row[1]}\n'
f' distance: {row[2]}')
期待される結果
- ID: 2
content: OceanBase Database is an enterprise-level, native distributed database independently developed by the OceanBase team. It is cloud-native, highly consistent, and highly compatible with Oracle and MySQL.
distance: 0.14733879001870276