暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

数据库管理-第153期 Oracle Vector DB & AI-05(20240221)

原创 胖头鱼的鱼缸 2024-02-21
693

数据库管理153期 2024-02-21

数据库管理-第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本书

image.png

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人观看过。

image.png

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);

image.png

插入向量数据

这里我从百度随便找了一张花的图片,复制到/home/oracle/flower下,文件名为flower_example.png。
image.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; /

image.png
生成向量数据并导入:
这里使用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;

image.png
image.png

总结

本期介绍了Oracle Vector的其他特性意见简单的实战使用。下一期将依据Oracle Livelabs中的介绍进行进一步探索。
老规矩,知道写了些啥。

最后修改时间:2024-02-21 17:23:22
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论