数据库管理153期 2024-02-21
- 数据库管理-第153期 Oracle Vector DB & AI-05(20240221)
- 1 Oracle Vector的其他特性
- 示例1:
- 示例2
- 2 简单使用Oracle Vector
- 环境
- 创建包含Vector数据类型的表
- 插入向量数据
- 总结
数据库管理-第153期 Oracle Vector DB & AI-05(20240221)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Associate: Database(Oracle与MySQL)
网思科技 DBA总监
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家,ITPUB认证专家,OCM讲师
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭。
继续继续,本期将开始引入部分实操内容。
1 Oracle Vector的其他特性
- SQL Join
支持相似性搜索JOIN关系型数据。 - 复杂、融合SQL
– 支持所有类型的工作负载和数据模型:
Graph, Text, JSON, Spatial, Relational, etc.
– 支持所有 SQL,包括复杂的运算和功能:
Window analytic functions, stored procedures, aggregation - 与向量搜索组合成复杂的、融合的SQL
在企业应用中,相似性搜索Joins关系型数据非常常见。需要企业级基于成本的优化器来决定选择Join和向量索引使用等。就现有的专用向量数据库而言,不可能做到以上功能。
示例1:
返回其中包含与此查询文本相似的文本,其中该书的类型为“小说”,作者来自“危地马拉(Guatemala)”的前5本书
Select pageID from Authors, Books, Pages where Authors.authorID = Books.authorID and Books.bookID = Pages.bookID and Books.bookGenre = 'Fiction' and Author.authorCountry = 'Guatemala'
order by vector_distance(pageVec, :queryVec) fetch approx first 5 rows only;
示例2
显示过去5年中根据与所提供查询图像的相似性按年份分组的前3张照片。这些照片应该是在距离旧金山20英里的范围内拍摄的,至少有100人观看过。
2 简单使用Oracle Vector
环境
项目 | 内容 |
---|---|
OS | OracleLinux 9.3 |
DB | Oracle DB 23c |
HOSTNAME | oradb23c |
CDB | orcl |
PDB | orclpdb1 |
由于Oracle DB 21c开始,Oracle取消了Non-CDB,因此后续操作都在PDB中执行。
创建包含Vector数据类型的表
vector数据类型作为Oracle DB 23c默认自带的数据类型,不需要类似于其他数据库那样的额外操作。
create table flower_vec (id number primary key,flower_image blob,flower_vector vector);
插入向量数据
这里我从百度随便找了一张花的图片,复制到/home/oracle/flower下,文件名为flower_example.png。
首先先创建一个基础表用来生成图片的二进制数据:
create table flower (flower_image blob);
导入图片二进制信息:
create directory flower_dir as '/home/oracle/flower';
declare
l_bfile bfile;
l_blob blob;
begin
insert into flower(flower_image) values (empty_blob()) return flower_image into l_blob;
l_bfile := bfilename ('FLOWER_DIR','flower_example.png');
dbms_lob.open(l_bfile, dbms_lob.file_readonly);
dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob.getlength(l_bfile));
dbms_lob.close(l_bfile);
commit;
end;
/
生成向量数据并导入:
这里使用Python来生成向量数据并插入,关于SQL EMBEDDING放在正式版出来以后再测试:
from towhee import pipe, ops
p = (
pipe.input('path')
.map('path', 'img', ops.image_decode())
.map('img', 'vec', ops.image_embedding.timm(model_name='resnet50'))
.output('vec')
)
vector_data = p('flower_example.png').get()
-->最终生成2048维度的向量,这里感谢我同事郑安宁同学提供的脚本
由于2048维度的向量超过了sqlplus支撑长度(Oracle Vector是支持至少4096维度的),因此只截取了前10个向量:
insert into flower_vec select 1,flower_image,to_vector('[0.050895579159259796,0.002409987384453416,0,0.01872553676366806,0.01558636873960495,0,0.0197914931923151,0,0.00522683234885335]') from flower;
总结
本期介绍了Oracle Vector的其他特性意见简单的实战使用。下一期将依据Oracle Livelabs中的介绍进行进一步探索。
老规矩,知道写了些啥。