【OceanBase】通过 OceanBase 的向量检索技术构建图搜图应用

文章目录

  • 一、向量检索概述
    • 1.1 关键概念
      • ① 非结构化数据
      • ② 向量
      • ③ 向量嵌入(Embedding)
      • ④ 向量相似性检索
    • 1.2 应用场景
  • 二、向量检索核心功能
  • 三、图搜图架构
  • 四、操作步骤
    • 4.1 使用 Docker 部署 OceanBase 数据库
    • 4.2 测试OceanBase数据库连通性
    • 4.3 开启数据库向量检索功能
    • 4.4 克隆项目代码仓库至本地
    • 4.5 安装依赖
    • 4.6 设置环境变量
    • 4.7 上传图片数据集至服务器上
    • 4.8 启动图搜图程序
    • 4.9 打开图搜图对应的 UI 界面
  • 五、测试图搜图效果
  • 六、参考链接

一、向量检索概述

OceanBase 数据库具备强大的向量检索能力,支持最高 16,000 维的 Float 类型稠密向量,并可计算曼哈顿距离、欧几里得距离、内积、余弦相似度等多种向量距离类型。其向量索引基于 HNSW(Hierarchical Navigable Small World)技术,支持增量更新和删除操作,且这些操作不会影响召回率。此外,OceanBase 支持带有标量过滤的融合查询,提供灵活的访问方式。用户可以通过 MySQL 协议使用各种语言客户端执行 SQL 查询,也可以通过 Python SDK 进行访问。与此同时,OceanBase 已完成对 LlamaIndex、DB-GPT 等 AI 应用开发框架,以及 AI 应用开发平台 Dify 的适配,进一步优化对 AI 应用开发的支持能力。

1.1 关键概念

① 非结构化数据

非结构化数据是指没有明确定义的数据格式和组织结构的数据。非结构化数据通常包括文本、图像、音频、视频等形式的数据,以及社交媒体内容、电子邮件、日志文件等。由于非结构化数据的复杂性和多样性,处理这些数据需要采用特定的工具和技术,例如自然语言处理、图像识别、机器学习等。

② 向量

向量本质上是一个对象在高维空间的投影。数学意义上向量则是一个浮点数组,有以下两个特点:

数组中每个元素表示向量的某个维度,每个元素都是一个浮点数。

向量数组的大小(元素个数)表示整个向量空间的维度。

③ 向量嵌入(Embedding)

向量嵌入(Embedding) 指的是通过深度学习神经网络提取非结构化数据里的内容和语义,把图片、视频等变成特征向量的过程。Embedding 技术将原始数据从高维度(稀疏)空间映射到低维度(稠密)空间,将具有丰富特征的多模态数据转换为多维数组(向量)。

④ 向量相似性检索

在当今信息爆炸的时代,用户常需要从海量数据中迅速检索所需信息。例如在线文献数据库、电商平台产品目录、以及不断增长的多媒体内容库,都需要高效的检索系统来快速定位到用户感兴趣的内容。随着数据量不断激增,传统的基于关键字的检索方法已经无法满足用户对于检索精度和速度的需求,向量检索技术应运而生。向量相似性检索使用特征提取和向量化技术将文本、图片、音频等不同类型的非结构化数据转换为向量,使用相似性度量方法来比较它们之间的相似性,进而捕捉数据的深层次语义信息,从而提供更为准确和高效的检索结果。

1.2 应用场景

  • 检索增强生成(RAG - Retrieval Augmented Generation)
    RAG 是一种人工智能技术框架,通过从外部知识库中检索事实,为大型语言模型(LLM)提供准确、最新的信息。这一过程不仅提升了模型生成内容的质量,还增强了用户对模型生成过程的理解。RAG 技术常用于智能问答、知识库等应用领域,结合检索与生成技术,优化了信息获取和处理的效率。
  • 个性化推荐
    个性化推荐系统依据用户的历史行为和偏好,为其推荐可能感兴趣的内容。在收到推荐请求时,系统通过分析用户特征进行相似度计算,并返回与用户兴趣相关的推荐结果。此技术广泛应用于饭店、景点等推荐场景,以精准满足用户需求。
  • 图像/文本检索
    图搜图和文本搜图任务指的是在庞大的图像或文本数据库中寻找与指定图像或文本最为相似的内容。通过将图像或文本特征存储在向量数据库,并利用高效的索引技术进行相似度计算,系统能够快速返回匹配的结果。这种技术应用于人脸识别等场景,为用户提供精准、高效的搜索体验。

二、向量检索核心功能

OceanBase 提供了存储、索引、检索 Embedding 向量数据的能力。具体包括:

核心功能描述
向量数据类型支持最大 16,000 维的 float 向量数据存储。
向量索引支持精确搜索、近似最近邻搜索。支持计算 L2 距离、内积和余弦 * 距离。支持 HNSW 索引,索引列支持的最大维度为 2000。
向量搜索 SQL 运算符支持向量加、减、乘、比较、聚合等基础运算操作符。

使用限制

  • OceanBase 默认采用 NULL first 比较模式,所以对 NULL 值进行排序时会将其放至最前,建议查询的时候加上 NOT NULL 条件。
  • 暂不支持在一张表上同时定义向量索引和全文索引。

三、图搜图架构

图搜图应用是把图片库以向量形式,存储在数据库内,用户在对应的 UI 界面,上传需要查询的图片,图片会被应用转换为向量,在数据库内查询相似向量,并返回结果,最终以图片形式,在 UI 页面上展示相似图片。

image-20241130234246523

四、操作步骤

4.1 使用 Docker 部署 OceanBase 数据库

安装并启动 Docker 服务。

root@oceanbase:~# apt-get install docker-ce
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
docker-ce is already the newest version (5:27.3.1-1~ubuntu.24.04~noble).
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.

root@oceanbase:~# systemctl start docker && systemctl enable docker
Synchronizing state of docker.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable docker
root@oceanbase:~# systemctl status docker

执行如下命令启动 OceanBase docker 容器,即安装部署oceanbase数据库。

docker run --name=ob433 -e MODE=mini -e OB_MEMORY_LIMIT=8G -e OB_DATAFILE_SIZE=10G -e OB_CLUSTER_NAME=ailab2024 -e OB_SERVER_IP=127.0.0.1 -p 127.0.0.1:2881:2881 -d quay.io/oceanbase/oceanbase-ce:4.3.3.1-101000012024102216

通过执行以下命令,检查 OceanBase 的引导是否完成。

docker logs -f ob433

初始化大约需要 2-3 分钟。当看到以下消息时,引导已完成:boot success! 按下Ctrl+C可退出日志视图。

image-20241202233404049

4.2 测试OceanBase数据库连通性

若采用上述Docker容器进行安装OceanBase数据库,可以执行如下命令测试数据库的连通性。

root@oceanbase:~/image-search# mysql -h127.0.0.1 -P2881 -uroot@test -A -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3221487647
Server version: 5.7.25 OceanBase_CE 4.3.3.1 (r101000012024102216-2df04a2a7a203b498f23e1904d4b7a000457ce43) (Built Oct 22 2024 17:42:50)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

4.3 开启数据库向量检索功能

在使用向量索引前,需要依据租户下的索引数据估计内存占用并进行配置,以下命令表示将向量索引可用内存配置为租户内存的 30%:

mysql> ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;
Query OK, 0 rows affected (0.01 sec)

PS:ob_vector_memory_limit_percentage 的默认值为 0,表示不为向量索引分配内存,创建索引会报错。

4.4 克隆项目代码仓库至本地

git clone https://gitee.com/oceanbase-devhub/image-search.git
cd image-search

image-20241202233532784

4.5 安装依赖

poetry install

如已经安装完依赖,执行上述命令显示如下结果,表示依赖已安装。

root@oceanbase:~/image-search# poetry install --no-root
Installing dependencies from lock file

No dependencies to install or update

4.6 设置环境变量

# 在/image-search路径下,执行该命令。
$ cp .env.example .env
# 更新 .env 文件中的数据库信息
vim .env

更新 .env 中内容如下,保持默认即可。

HF_ENDPOINT=https://hf-mirror.com

DB_HOST="127.0.0.1"   ## 设置对应租户的 IP
DB_PORT="2881"   ## 设置对应的端口
DB_USER="root@test" ## 设置对应的租户及用户名
DB_NAME="test"   ## 设置对应的数据库名
DB_PASSWORD=""  ## 设置对应的租户用户的密码

4.7 上传图片数据集至服务器上

上传好先前准备好的图片数据集后,可以将文件夹上传到指定的服务器的目录下,记住该文件夹存储的绝对路径。本实验的文件夹存储路径为/home/ubuntu/zebra/

image-20241203211702633

也可以通过命令提示符窗口,进行查验图片集是否上传成功。

image-20241203212152736

4.8 启动图搜图程序

执行该命令,如相关

poetry run streamlit run --server.runOnSave false image_search_ui.py

image-20241203000401007

成功启用图搜图程序如下截图显示:

image-20241203213937547

通过能获取到的URL进行图搜图UI界面的访问。

image-20241203214220422

4.9 打开图搜图对应的 UI 界面

在 图片加载设置下,图片加载目录内填写服务器上图片所存放目录的绝对路径。点击 加载图片。等图片加载完成后即可进行图搜图操作。

image-20241203212247459

等待图片加载完成。

image-20241203151029796

所有图片加载完成!

image-20241203154156967

五、测试图搜图效果

点击上传文件,选择提前准备好的一张zebra的图片。

image-20241203212546208

上传完之后,立马给出了图片集中所有相似图片,包括距离、文件路径等信息。

image-20241203212712128

至此,我们通过 OceanBase 的向量检索技术构建图搜图应用已完成。

六、参考链接

基于 OceanBase 构建图搜图应用-V4.3.4-OceanBase 数据库文档-分布式数据库使用文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们,报告好消息!我的小程序用户数量已经涨到16个了!没错,真没拉朋友圈亲戚好友来撑场子,全靠实力(和一点点运气)吸引了16位陌生小伙伴光临!这波进步,连我自己都感动了…

Python:交互式物质三态知识讲解小工具

学着物理写着Python 以下是一个使用Python的Tkinter库实现的简单示例程序,通过图形界面展示并讲解固态、液态、气态的一些特点,代码中有详细的注释来帮助你理解各部分功能: 完整代码 import tkinter as tk from tkinter import ttk import …

ESP32-S3遇见OpenAI:OpenAI官方发布ESP32嵌入式实时RTC SDK

目录 OpenAI RTC SDK简介应用场景详解智能家居控制系统个人健康助手教育玩具 技术亮点解析低功耗设计快速响应高精度RTC安全性保障开发者指南 最近,OpenAI官方发布了一款针对ESP32-S3的嵌入式实时RTC(实时时钟)SDK,这标志着ESP32-…

Windows 11 关闭 VBS(基于虚拟化的安全性)

注:本文为 “Windows 11 关闭 VBS” 相关方法文章合辑。 重传部分 csdn 转储异常图片,未整理去重。 Win11 关闭 VBS 的几种方法 适用机型:台式 / ThinkCentre / 笔记本 / ThinkPad 分析 Virtualization-based Security (VBS) 基于虚拟化的…

小程序租赁系统的优势与应用探索

内容概要 小程序租赁系统,听起来很高大上,但实际上它比你想象的要实用得多!设想一下,几乎所有的租赁需求都能通过手机轻松解决。这种系统的便捷性体现在让用户随时随地都能发起租赁请求,而不再受制于传统繁琐的手续。…

简历_专业技能_熟悉Redis常用数据结构及其操作命令

系列博客目录 文章目录 系列博客目录1.Redis通用命令2.String类型3.Hash类型4.List类型5.Set类型6.Sorted类型7.StringRedisTemplate 1.Redis通用命令 通用指令是部分数据类型的,都可以使用的指令,常见的有: KEYS:查看符合模板的…

USB 驱动开发 --- Gadget 设备连接 Windows 免驱

环境信息 测试使用 DuoS(Arm CA53, Linux 5.10) 搭建方案验证环境,使用 USB sniff Wirekshark 抓包分析,合照如下: 注:左侧图中设备:1. 蓝色,USB sniff 非侵入工 USB 抓包工具;2. …

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍: 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名,时光如川浪淘…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(三)

****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 3.2 全局解释(Global Explanation) 与旨在解释模型个体预测的局部解释不同,全局解释提供了对语言模型…

体验谷歌最新Gemini 2.0 Flash原生多模态音视频对话桌面分享功能

Gemini 2.0是谷歌最新推出的原生多模态输入输出的AI模型。Gemini 2.0 Flash是2.0家族第一个模型,以多模态输入输出和Agent技术为核心,速度比 1.5 Pro快两倍,关键性能指标超过 1.5 Pro。模型支持原生工具调用和实时音视频流输入,提…

Leecode刷题C语言之我的日程安排表③

执行结果:通过 执行用时和内存消耗如下: typedef struct {int size;int maxIntersection;int** books;// #ifdef DEBUG// int runCount;// #endif } MyCalendarThree;void insert(MyCalendarThree*, int, int, int, int); int* binarySearch(int*, int, int);MyCal…

C++ 函数名字后面带const

C++中,在函数名后面加上const关键字表示该函数是一个常量成员函数。 常量成员函数,可以在const对象上被调用,并且不会修改对象的状态。 VC6新建一个单文档工程;添加一个一般类; 把类的代码做好; // MyClass.h: interface for the MyClass class. // //#if !defined(AFX_…

SMTP发送邮件的过程

(1)SMTP客户端首先请求与服务器端的25号端口建立TCP连接(1分)。(2)连接建立成功后,客户端和服务器通过握手阶段验证双方身份(1分)。(3)验证成功后,客户端首先向服务器端通告邮件发送…

qml Rectangle详解

1、概述 Rectangle是Qt Quick中的一个基础图形元素,用于在QML界面上绘制一个可带边框和可填充的矩形区域。它继承自Item类,因此具有Item的所有属性和功能,如位置、尺寸、变换等。通过Rectangle,可以创建各种矩形形状,…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段,要设计软件体系结构,即是确定软件系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。同时把模块组织成良好的层次系统:顶层模块通过调用它的下层…

Innodisk iSMART V6使用说明_SSD还能用多久?已经读写了多少次数?……

Innodisk iSMART是一款SSD健康数据读取软件。它能轻松获取大部分SSD内部寄存器中的健康数据,并以简洁的图形界面展示给用户。在程序界面的顶部,是页面标签,点击页面标签就能切换到相应的页面。页面标签的下面是磁盘选择栏。点击磁盘编号&…

windows11(或centos7)安装nvidia显卡驱动、CUDA、cuDNN

本文是我瞎搞时写的问题汇总及参考文献,记录了一些问题解决的进度及对问题的思考。 最近一次更新时间:2025年1月4日 一、安装或更新nvidia显卡驱动 首先,需要确保你的设备安装了最新的显卡驱动。 (1)centos7安装显…

2、蓝牙打印机点灯-GPIO输出控制

1、硬件 1.1、看原理图 初始状态位高电平. 需要驱动PA1输出高低电平控制PA1. 1.2、看手册 a、系统架构图 GPIOA在APB2总线上。 b、RCC使能 GPIOA在第2位。 c、GPIO寄存器配置 端口:PA1 模式:通用推挽输出模式 -- 输出0、1即可 速度:5…

WPS表格技巧01-项目管理中的基本功能-计划和每日记录的对应

前言: 在项目管理中,一般就是用些项目管理工具来管理这个任务和 task,但是就是要学这些工具很麻烦,比较好的方法,通用的方法就是用 Excel 表格去做(这非常适合松散的团队组织),然后…

Vue 项目中实现打印功能:基于目标 ID 的便捷打印方案

一、引言 在 Vue 项目开发中,实现打印功能是一个常见的需求。本文将介绍如何封装一个打印方法,使得用户只需传入需要打印的目标 ID 名称,即可轻松实现预览并打印的功能。这种方法不仅简单易用,还具有一定的通用性,适合…