首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase Vector 与 Ollama 集成
更新时间:2026-04-09 14:12:04
OceanBase 数据库提供了向量类型存储、向量索引、embedding 向量搜索的能力。可以将向量化后的数据存储在 OceanBase 数据库,供下一步的搜索使用。
Ollama 是一个开源工具,让你可以在本地轻松运行和管理大型语言模型(如 gpt-oss, Gemma 3,DeepSeek-R1, Qwen3 等)。
前提条件
您已完成部署 OceanBase 数据库 V4.3.3 及以上版本并且创建了 MySQL 模式租户。创建租户 后,再参考下述步骤操作。
您的环境中已存在可以使用的 MySQL 租户和 MySQL 数据库和账号,并已对数据库账号授读写权限。
安装 Python 3.11 及以上版本。
按照所需的依赖项。
python3 -m pip install pyobvector requests sqlalchemy ollama tqdm确保您已经在租户中设置了
ob_vector_memory_limit_percentage配置项,以启用向量检索功能。V4.3.5 BP3 之前的版本推荐设置值为30,从 V4.3.5 BP3 版本开始推荐保持默认值0。如需更精确设置此配置项,请参考 ob_vector_memory_limit_percentage 计算此值。
步骤一:获取数据库连接信息
联系 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 租户。
步骤二:构建您的 AI 助手
设置环境变量
获取 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
安装 ollama 和拉取模型 qwen3-embedding
curl -fsSL https://ollama.ai/install.sh | sh
export PATH="/usr/local/bin:$PATH"
ollama --version
ollama pull qwen3-embedding:latest
示例代码片段
加载数据
这里以 qwen3-embedding 嵌入模型为例,将 OceanBase Vector 的向量搜索常见问题作为私有知识,并以"#"来分隔文件中的内容。
import requests,os,json,ollama
from tqdm import tqdm
from sqlalchemy import Column, Integer, String
from pyobvector import ObVecClient, VECTOR, IndexParam, l2_distance
# text URL
url = "https://raw.githubusercontent.com/oceanbase/oceanbase-doc/refs/heads/V4.3.5/en-US/640.ob-vector-search/800.ob-vector-search-faq.md"
response = requests.get(url)
text_lines = []
file_text = response.text
text_lines += file_text.split("# ")
def emb_text(text):
response = ollama.embeddings(model="qwen3-embedding", prompt=text)
return response["embedding"]
data = []
for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
data.append({"text": line, "embedding": emb_text(line)})
定义向量表结构并将向量并存入 OceanBase
创建一个名为 ollama_oceanbase_demo_documents 的表,包含存储文本的 text 列、存储嵌入向量的 embedding 列和向量索引信息。利用 qwen3-embedding 为每段文本生成嵌入向量,并存入 OceanBase:
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)
table_name = "ollama_oceanbase_demo_documents"
client.drop_table_if_exist(table_name)
cols = [
Column("id", Integer, primary_key=True, autoincrement=True),
Column("text", String(255), nullable=False),
Column("embedding", VECTOR(4096))
]
# Create vector index
vector_index_params = IndexParam(
index_name="idx_question_embedding",
field_name="embedding",
index_type="HNSW",
distance_metric="l2"
)
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)
语义搜索
通过 qwen3-embedding 嵌入模型生成查询文本的嵌入向量,然后根据查询文本的嵌入向量与向量表中的每个嵌入向量的 l2 距离,搜索最相关的文档:
question = "Which mode supports vector search?"
search_res = client.ann_search(
table_name,
vec_data=emb_text(question),
vec_column_name="embedding",
distance_func=l2_distance,
with_dist=True,
topk=1,
output_column_names=["id","text"],
)
print('- The Most Relevant Document and Its Distance to the Query:')
for row in search_res.fetchall():
print(f' - ID: {row[0]}\n'
f' content: {row[1]}\n'
f' distance: {row[2]}')
预期结果
- ID: 3
content: Which mode supports vector search?
Vector search is supported only in the MySQL mode of OceanBase Database.
distance: 0.509979758468682