当前位置: 首页 > news >正文

【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 fileNo dependencies to install or update

4.6 设置环境变量

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

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

HF_ENDPOINT=https://hf-mirror.comDB_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 数据库文档-分布式数据库使用文档

相关文章:

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

文章目录 一、向量检索概述1.1 关键概念① 非结构化数据② 向量③ 向量嵌入(Embedding)④ 向量相似性检索 1.2 应用场景 二、向量检索核心功能三、图搜图架构四、操作步骤4.1 使用 Docker 部署 OceanBase 数据库4.2 测试OceanBase数据库连通性4.3 开启数据库向量检索功能4.4 克…...

Linux 安装运行gatk的教程

1.下载安装 wget https://github.com/broadinstitute/gatk/releases/download/4.1.8.1/gatk-4.1.8.1.zip2.解压 unzip *.zip3.查看 gatk --help 如下显示表示安装成功: 注意:仅限在该包所在位置的路径下能使用...

什么是unit l2 norm

1. L2 Norm 定义 L2 norm(或称欧几里得范数)是用来衡量一个向量的“长度”或“大小”的一种方式。在 n 维空间中,给定一个向量V(V1,V2,…,Vn),其 L2 norm 定义为: 也可以理解为该向量与原点之间的欧几里得距离。 2…...

手写顺序流程图组件

效果图 完整代码 <template><div><div class"container" :style"{ width: ${spacingX * (colNum - 1) itemWidth * colNum}px }"><divv-for"(item, i) in recordList":key"i"class"list-box":style&…...

适配器模式概述

大体介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心目的是通过提供一个适配器类来使得原本接口不兼容的类可以一起工作。它通过将一个类的接口转换成客户端所期望的接口&#xff0c;使得原本因接口不兼容而无法一起工作的类可…...

Logo设计免费生成器:轻松设计个性化标志

在当今这个信息爆炸的时代&#xff0c;一个好的Logo标志已经成为品牌和企业的名片。它不仅是品牌的象征&#xff0c;也是企业文化和价值观的体现。然而&#xff0c;很多初创企业或小型团队往往因为预算有限&#xff0c;无法请专业的设计师来打造专属的Logo。这时候&#xff0c;…...

智能停车场车牌识别计费系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

谷歌开通第三方平台OAuth登录及Java对接步骤

调研起因&#xff1a; 当然还是因为手头的海外项目&#xff0c;用户注册通常要用邮箱&#xff0c;正常流程需要给用户邮箱发送验证码&#xff0c;再让用户输入密码进行注册。 为了简化流程&#xff0c;让用户使用谷歌邮箱一键完成注册或登录&#xff0c; 我们直接获取谷歌邮箱、…...

人体:精妙绝伦的生命之躯

人体&#xff1a;精妙绝伦的生命之躯 在浩瀚宇宙中&#xff0c;人体犹如一颗璀璨的明珠&#xff0c;是自然界最伟大的杰作之一。它是一个高度复杂且精妙绝伦的有机系统&#xff0c;承载着生命的奥秘与奇迹&#xff0c;展现出令人惊叹的适应性、协调性和自我修复能力。从微观的…...

python的urllib模块和http模块

1.python的urllib库用于操作网页&#xff0c;并对网页内容进行处理 urllib包有如下模块&#xff1a; urllib.request&#xff1a;打开和读取URL urllib.error&#xff1a; 包含urllib.request抛出的异常 urllib.parse&#xff1a; 解析URL urllib.robotparser&#xff1…...

Java [后端] 开发日常记录(1)

目录 1、常用的注解 2、对字符串的处理 3、对JSON串的处理 -- The End -- 详细如下&#xff1a; 1、常用的注解 若返回的字段中有NUll&#xff0c;则不返回 JsonInclude(value JsonInclude.Include.NON_NULL) //在实体类中添加这个注解 JsonInclude(JsonInclude.Include.NON…...

jetbrain 安装 copilot

问题一&#xff1a;Sign in failed. Reason: Request signInInitiate failed with message: Request to /github.com/login/device/code> timed out after 30000ms, request id: 11, error code: -32603 解决方案&#xff1a; 参考资料&#xff1a;https://github.com/orgs/…...

万里数据库GreatSQL监控解析

GreatSQL是MySQL的一个分支&#xff0c;专注于提升MGR&#xff08;MySQL Group Replication&#xff09;的可靠性及性能。乐维监控平台可以有效地监控GreatSQL&#xff0c;帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理&#xff0c;收集数据库性…...

OpenCV-Python实战(9)——滤波降噪

一、均值滤波器 cv2.blur() img cv2.blur(src*,ksize*,anchor*,borderType*)img&#xff1a;目标图像。 src&#xff1a;原始图像。 ksize&#xff1a;滤波核大小&#xff0c;&#xff08;width&#xff0c;height&#xff09;。 anchor&#xff1a;滤波核锚点&#xff0c…...

Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集DTA介绍算法流程 DTA代码实现DTA算法实现攻击效果 代码汇总dta.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建…...

Linux性能测试简介

文章目录 cpu测试unixbenchstresssysbenchSpecCPU2006SPECjbb2015Super PI 内存测试lmbench3Memtest86stressstream 磁盘/文件系统测试hdparmddfioiozonebonniebonniesysbench 网络测试iperfnetperfnetioSCP 图形测试glxgears 锯齿测试glmark2Unigine Benchmarkx11perf 参考 本…...

Kile5支持包的安装

安装STM32器件支持包 两种方式 离线安装 在线安装 离线 在线 所有可以用Kile软件来开发的芯片都可以找到&#xff0c;就是网速比较慢...

【Ubuntu 系统 之 开启远程桌面SSH登录】

【Ubuntu 系统 之 开启远程桌面&SSH登录】 一、开启 SSH 登录二、开启远程桌面1、更新包管理器并安装 xrdp1.1、遇到错误1.2、解决方法 2、安装桌面环境&#xff08;如果服务器上没有 GUI&#xff09;3、配置 xrdp 使用默认的 GNOME 桌面环境4、配置防火墙允许远程桌面连接…...

MySQL 索引分类及区别与特点

MySQL 索引分类及区别与特点 索引是数据库中用于加速数据检索的数据结构。MySQL 支持多种类型的索引&#xff0c;每种索引有其特定的使用场景和特点。以下是 MySQL 中常见的索引分类及其区别与特点&#xff1a; 1. 按数据结构分类 (1) BTree 索引 特点&#xff1a; 默认的索…...

对中文乱码的理解,遇到乱码该怎么办。

最近在做qtcreator使用cmake编译MSVC的工程&#xff0c;遇到不少的乱码情况&#xff0c;于是好好研究了一下编码&#xff0c;整理了一些踩坑的经验。 一、中文乱码的来源 目前常见到的中文编码其实就两种&#xff0c;UTF8和GBK。 我们遇到的绝大多数乱码&#xff0c;就是系统…...

《机器学习》从入门到实战——逻辑回归

目录 一、简介 二、逻辑回归的原理 1、线性回归部分 2、逻辑函数&#xff08;Sigmoid函数&#xff09; 3、分类决策 4、转换为概率的形式使用似然函数求解 5、对数似然函数 ​编辑 6、转换为梯度下降任务 三、逻辑回归拓展知识 1、数据标准化 &#xff08;1&#xf…...

svn不能添加.a文件

解决办法 在home目录下有一个.subversion文件夹&#xff0c;文件夹内有个config文件&#xff0c;里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore&#xff0c;这样就会不顾config中的规则&#xff0c;将指定路径的文件都添加到版本库中 rockyrocky:/e…...

23.Java 时间日期扩展(新时间日期、新时间日期格式化与解析、时间戳、计算时间日期差、时间矫正器、时区)

一、旧时间日期问题 在 java.util 和 java.sql 包下都有时间日期类 java.util.Date 类包含时间和日期 java.sql.Date 类值包含日期 java.util.Date 类线程不安全&#xff0c;Date 对象可变 时间日期格式化类在 java.text 包下 时区处理困难&#xff0c;并不支持国际化&…...

C语言渗透和好网站

渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…...

mysql系列7—Innodb的redolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过&#xff1a;数据和索引保存在磁盘上…...

静态时序分析:线负载模型的选择机制

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 线负载模型及其选择 线负载模型仅在Design Compiler线负载模式&#xff08;非拓扑模式&#xff09;下时使用&#xff0c;它估算了导线长度和扇出对网线的电阻、电容和面积的影响&#xff…...

git 中 工作目录 和 暂存区 的区别理解

比喻解释 可以把工作目录和暂存区想象成两个篮子&#xff1a; 工作目录是你把所有东西&#xff08;文件和更改&#xff09;扔进去的地方。你正在修改的东西都放在这里。暂存区则是你整理好的东西放进第二个篮子&#xff0c;准备提交给老板&#xff08;提交到仓库&#xff09;…...

C++ 变量:深入理解与应用

C 变量&#xff1a;深入理解与应用 一、引言 C作为一种强大且广泛应用的编程语言&#xff0c;变量是其程序设计的基础构建块之一。变量允许我们在程序中存储、操作和访问数据&#xff0c;对于实现各种复杂的功能至关重要。正确地理解和使用变量&#xff0c;能够编写出高效、可…...

http报头解析

http报文 http报文主要有两类是常见的&#xff0c;第一类是请求报文&#xff0c;第二类是响应报文&#xff0c;每个报头除了第一行&#xff0c;都是采用键值对进行传输数据&#xff0c;请求报文的第一行主要包括http方法&#xff08;GET&#xff0c;PUT&#xff0c; POST&#…...

数据库的概念和操作

目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…...