跳到主要内容

seekdb Vector 与 Jina AI 集成

seekdb 提供了向量类型存储、向量索引、embedding 向量搜索的能力。可以将向量化后的数据存储在 seekdb,供下一步的搜索使用。

Jina AI 是一个专注于多模态搜索和向量搜索的 AI 平台框架。 它提供了构建企业级搜索增强生成 AI 应用程序所需的核心组件和工具,可以帮助企业和开发者构建基于多模态搜索的 RAG(搜索增强生成)应用。

前提条件

  • 您已完成部署 seekdb 数据库。

  • 您的环境中已存在可以使用的 MySQL 数据库和账号,并已对数据库账号授读写权限。

  • 安装 Python 3.11 及以上版本。

  • 安装依赖。

    python3 -m pip install pyobvector requests sqlalchemy

步骤一:获取数据库连接信息

联系 seekdb 数据库部署人员或者管理员获取相应的数据库连接串,例如:

obclient -h$host -P$port -u$user_name -p$password -D$database_name

参数说明:

  • $host:提供 seekdb 连接 IP 地址。

  • $port:提供 seekdb 连接端口,默认是 2881

  • $database_name:需要访问的数据库名称。

    提示

    连接的用户需要拥有该数据库的 CREATEINSERTDROPSELECT 权限。

  • $user_name:提供数据库连接账户。

  • $password:提供账户密码。

步骤二:构建您的 AI 助手

设置 Jina AI API key 环境变量

获取 Jina AI API 密钥,并同 seekdb 连接信息配置环境变量中。

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 提供了多种嵌入模型,用户可以根据自己的需求选择对应的模型使用。

ModelParameter SizeEmbedding DimensionText
jina-embeddings-v3570Mflexible embedding size (Default: 1024)multilingual text embeddings; supports 94 language in total
jina-embeddings-v2-small-en33M512English monolingual embeddings
jina-embeddings-v2-base-en137M768English monolingual embeddings
jina-embeddings-v2-base-zh161M768Chinese-English Bilingual embeddings
jina-embeddings-v2-base-de161M768German-English Bilingual embeddings
jina-embeddings-v2-base-code161M768English and programming languages

这里以 jina-embeddings-v3 为例,定义一个 generate_embeddings 辅助函数,用于调用 Jina AI 嵌入 API:

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")

定义向量表结构并将向量并存入 seekdb

创建一个名为 jinaai_oceanbase_demo_documents 的表,包含存储文本的 content 列、存储嵌入向量的 content_vec 列和向量索引信息。并将向量数据存入 seekdb:

# Step 2. Connect seekdb 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