You need to enable JavaScript to run this app.
导航
向量库快速入门
最近更新时间:2025.03.04 21:42:08首次发布时间:2024.04.17 14:21:05
我的收藏
有用
有用
无用
无用

向量数据库 VikingDB 是构建于火山引擎的云基础设施之上的向量数据库系统,其核心功能涵盖了对机器学习模型产生的海量向量数据进行生产、存储、索引以及分析等操作。
在本指南里,我们会引导您在短短几分钟内迅速完成首个向量库的配置工作,让您能够在我们的配置页面走完数据集创建、索引创建以及检索查询的全部流程。

第一步,创建数据集

创建数据集有两种方式:

  • 方式一:首页点击向量数据库,进入控制台的开始使用页面,单击页面上方教程栏第一步中的创建数据集
  • 方式二:首页点击向量数据库,进入控制台。在控制台左侧导航栏单击数据集,进入数据集页面,再点击左上方创建数据集

Image

Image

  1. 您可以通过对图文数据的向量化直接导入已有向量两种方式创建数据集。
    • 如果您已经有向量数据,可选择**“已有向量数据”**;
    • 如果您只有未向量化的文本或多模态数据,请选择**“从向量化开始”,配置完模型后将自动对您导入的向量化字段数据进行向量化。
      本例中我们使用
      从向量化开始**的方法创建数据集。

Image

  1. 创建数据集页面填写相关参数,包括数据集基础信息、向量配置和数据库内字段。参照右图示例完成具体配置。
  2. 填写完成后单击右下角**提交,**完成数据集创建流程。
(示例)

注意

  1. 如果需要添加稀疏向量字段,必须配置稠密向量字段,即稀疏向量不能单独出现。
  2. 用于向量化的字段不用填写在其他字段中;若其他字段中存在的其他 textimage 类型字段仅作为存储数据用途,不会用于向量化,字段名称也不能与向量化字段重复。

数据集配置项目

编号

参数名称

参数说明

1

基础信息(必填)

  • 名称为必填,别名和描述为选填

2

向量信息(必填)

  • 配置向量字段(已有向量字段)或用于向量化的字段(从向量化开始)。

3

字段配置(选填)

  • 配置非向量字段或用于向量化的字段。
  • 字段名称:使用英文字母、数字、下划线_,并以英文字母开头,不能重复。
  • 字段类型:在下拉列表选择字段类型,可选值:string、bool、list、list、int64、float32、text、image。
  • 默认:当字段类型不是 text 和 image 时,可输入默认值。若未填写,且在数据写入时字段数据缺失,将按系统默认设置填写。

4

主键(必填)

  • 主键用于唯一标识一行数据
  • 可选择自动生成主键或从其他字段中的 string/int64 类型字段中选择一个作为主键

5

费用细则与创建数据集

  • 如果配置了向量化模型,将展示模型费用信息
  • 离线存储资源费用将在索引创建后根据存储数据量开始计费

第二步,创建索引
  1. 创建索引页面有三种进入方式:
    • 方式一:在左侧导航栏单击快速使用,单击页面上方教程栏第二步中的创建索引
    • 方式二:在左侧导航栏单击索引,进入索引页面。单击索引列表页面左上角的创建索引,进入创建索引页面。
    • 方式三:在左侧导航栏单击数据集,进入数据集页面。选择想要创建索引的数据集,单击对应数据集卡片右上角"..."按钮下的创建索引

Image
Image
Image

  1. 创建索引页面填写相关参数,包括索引基础信息和具体的索引配置
  2. 填写完成后单击右下角**提交,**完成索引创建流程。

Image

第三步,写入数据
  1. 创建完数据集后,你可以根据弹出的写入数据指引向数据集中写入数据。
  2. 数据集页面,你也可以点击对应数据集卡片的写入数据按钮找到这个弹窗。
  3. 在开始使用页面,你也可以单击页面上方教程栏第三步中的写入数据找到这个弹窗。

Image
Image

数据写入现在支持在线同步写入、在线异步写入、本地数据导入和单条数据插入四种形式。

在线同步写入

适用于在线服务数据实时写入生效场景,提供流式写入接口。

  1. 安装/升级 SDK
# 使用 pip 安装 SDK for Python,支持 Python 3.7 及其以上版本
pip3 install --user volcengine
  1. 初始化SDK
from volcengine.viking_db import *
vikingdb_service = VikingDBService("host", "region")
vikingdb_service.set_ak("Your ak")
vikingdb_service.set_sk("Your sk")
  1. 写入数据
# 获取指定数据集,程序初始化时调用即可,无需重复调用
collection = vikingdb_service.get_collection("example")

def gen_random_vector(dim):    # 构建指定维度的随机向量
    return [random.random() - 0.5 for _ in range(dim)]  # 生成随机向量
field = {
    "doc_id": "11",
    "text_vector": gen_random_vector(12),  # 生成12维随机向量
    "like": 1,
    "price": 1.11,
    "author": ["gy"],
    "aim": True,
}
data = Data(field)
collection.upsert_data([data])  # 插入或更新单条数据

async def upsert_data():
    collection = await vikingdb_service.async_get_collection("async")   # 异步上传示例数据
    field = {
        "doc_id": "111",
        "text_vector": gen_random_vector(10),  # 生成10维随机向量
        "like": 1,
        "price": 1.11,
        "author": ["gy"],
        "aim": True,
    }
    data = Data(field)
    await collection.async_upsert_data([data])  # 异步插入或更新单条数据
asyncio.run(upsert_data())

在线异步写入

完成SDK安装与初始化的基础上,您可以使用在线异步写入的方式写入数据。

说明

异步写入可以提供比同步写入大10倍的写入带宽,适用于更大规模数据量级的实时更新场景。

import multiprocessing
import struct, base64, uuid, tqdm, time
from volcengine.viking_db import *

queue = multiprocessing.Queue(maxsize=10)
event = multiprocessing.Event()
def consumer():
    """消费者函数:从队列中取出数据并处理"""
    vikingdb_service = VikingDBService()
    vikingdb_service.set_ak("ak")
    vikingdb_service.set_sk("sk")
    collection = vikingdb_service.get_collection("")
    items = []
    while not event.is_set() or not queue.empty():
        item = queue.get()
        items.append(item)
        if len(items) == 50:
            collection.upsert_data(items, async_upsert=True)
            items = []
    print("Consumer received event. Exiting...")
if __name__ == "__main__":         # 创建消费者进程
    processors = []
    for i in range(10):
        p = multiprocessing.Process(target=consumer)
        p.start()
        processors.append(p)
    datas = []      #  准备数据
    for i in range(100000):       # 压缩向量
        float_array = [0.124135132531424]*1024
        packed_data = struct.pack('f'*len(float_array), *float_array)
        s =  base64.b64encode(packed_data).decode()
        uuid4 = uuid.uuid4()  # 此处用户可修改为自己希望的id
        datas.append(Data({"id": str(uuid4), "text_vertor": s}))
    for data in tqdm.tqdm(datas):
        queue.put(data)
    event.set()        # 通知消费者停止工作
    for p in processors:
        p.join()
    print("Main process exiting...")

本地数据导入

适用于首次建库,一次性大批量离线数据上传场景,提供大批量处理能力,速度更快。

  1. TOS 服务开通及授权
    • TOS 服务开通
    • 授权 VikingDB 访问
      • 授权 VikingDB 服务可以访问您的 TOS 权限。去授权
  2. 本地数据导入
    1. 安装/升级 SDK
# 使用 pip 安装 SDK for Python,支持 Python 3.7 及其以上版本
pip3 install --user volcengine
  1. 本地数据导入

您可以下载代码样例文件后通过文件导入本地数据

pythonDemo.py
未知大小

单条数据插入

此外,你还可以在数据集详情页面插入单条数据

  1. 数据集页面点击您想要写入数据的数据集卡片进入数据集详情页面,点击右上角插入数据按钮。
  2. 在弹出的插入数据弹窗内输入对应的字段值后,点击插入按钮即可完成数据插入。

Image
Image

写入数据后,您可以在数据集详情页面通过主键对数据进行查询

Image

在线异步写入示例

如您在第一步中按示例创建了数据集,并完成了SDK的初始化,您可以使用以下代码写入一份测试数据。

import asyncio
import nest_asyncio

nest_asyncio.apply()
# 异步插入数据函数
async def upsert_data():
    try:     # 获取异步集合对象     
        collection = await vikingdb_service.async_get_collection("VikingDB_Example")
        fields = [  # 数据内容
            {"ID": 1, "description": "苹果是红色的", "title": "水果", "date": "202408"},
            {"ID": 2, "description": "香蕉是黄色的", "title": "水果", "date": "202408"},
            {"ID": 3, "description": "苹果长在苹果树上", "title": "水果", "date": "202410"},
            {"ID": 4, "description": "鱼生活在水里", "title": "动物", "date": "202411"},
            {"ID": 5, "description": "欢迎使用VikingDB", "title": "欢迎", "date": "202412"}
        ]        
        datas = [   # 构造数据对象列表
            Data({
                "ID": str(field["ID"]),          # 文档唯一标识符
                "description": field["description"],  # 文本描述
                "title": field["title"],         # 数据分类
                "date": field["date"]            # 日期字段
            }) 
            for field in fields
        ]        
        await collection.async_upsert_data(datas)     # 异步插入或更新数据
        print("数据插入完成!")  # 日志输出
    except Exception as e:     # 捕获并处理可能的异常        
        print(f"插入数据时发生错误: {e}")
# 执行异步函数
await upsert_data()

第四步,检索查询
  1. 索引列表页面操作列,单击指定索引的检索测试按钮,进入检索测试页面。

Image

  1. 检索测试页会根据您的数据集配置给出对应的测试方法。

    • 您可以输入查询向量限制(Top-K)子索引进行检索测试
    • 如果您按照上面的示例配置,在创建数据集时配置了向量化模型,您可以在输入框中输入文本来进行端到端的文本检索。
    • 检索测试将会有dense_weight参数,用于控制混合检索中稠密向量的权重。
  2. 点击查询后,页面右侧会按照输入的查询向量检索出相似的 K 个向量,查询结果默认按照 score 从高到低排序。

  3. 如果您创建了直接导入向量的数据集,且包含了稠密向量和稀疏向量的混合索引,您需要同时输入稠密向量和稀疏向量进行检索。

Image

(配置了文本向量化模型可直接进行文本检索)

Image

(配置了图文向量化模型可直接进行多模态检索)

Image

(稠密向量和稀疏向量的混合检索)

此外,我们在开始使用页面还为您准备了探索指南,您可以根据需要按照指引深入探索VikingDB向量数据库:

  • **快速入门:**了解如何开始使用并快速创建您的向量数据库。
  • **最佳实践:**学习在多模态搜索、多模态标注等高频场景下向量数据库最佳实践,帮助找到符合您场景的使用方式。
  • **常见问题:**解答您在使用过程中遇到的常见问题,提供解决方案和建议。
  • **SDK参考:**查阅 SDK 的详细文档,包括 API、示例代码和集成指南,帮助您高效开发。

Image