在云器 Lakehouse 的同一张表中进行向量和标量检索
数据准备
GitHub 提供15 多种事件类型,包括新提交和分叉事件、打开新票证、评论和向项目添加成员等。这些事件会汇总到每小时存档中,您可以使用任何 HTTP 客户端从 https://www.gharchive.org/ 上访问这些存档。
- 通过 wget 从 https://www.gharchive.org/ 将归档的json.gz文件下载到本地,本文下载了2025-01-01一天的24个文件。
- 通过Lakehouse的PUT命令,将数据PUT到用户 VOLUME(USER VOLUME)上。
- 通过SQL直接读取 USER VOLUME 目录里的文件,然后将IssuesEvent类型的事件写入github_event_issuesevent表中。
- 将数据从 github_event_issuesevent 写入到目标表 github_event_issuesevent_embedding中。
数据向量化
云器Lakehouse的github_event_issuesevent_embedding表里保存了文本字段,需要对该文本字段进行向量化,并保存在同一张表里的向量字段里,方便进行向量和标量的融合检索。
方案实现了同一张表、同一个VCluster,同时支持了文本数据、向量数据以及倒排索引和向量索引的存储。和传统方式相比,不再需要三套系统(数据仓库、文本检索数据库、向量数据库),最大程度了降低了数据副本数量,避免了数据在三套系统之间的同步。
用到的云器Lakehouse的关键Feature:
- 向量存储:原生的Vector数据类型,在普通表里直接增加Vector类型的字段;
- 向量索引:对Vector类型的字段建立索引,加速向量检索的速度;
- 倒排索引:对文本字段建立倒排索引,加速文本检索的速度;
- bloom_filter索引:对ID字段建立索引,加速ID过滤;
- Zettapark
模型服务
- xinference,本地部署xinference,提供embedding和rerank模型服务;
- 本方案采用1024维的向量化表示;
测试数据集介绍
- 数据来源是Github的IssuesEvent事件,全文检索字段为其中的issue_body;
- 向量化表示的是issue_body对应的向量化数据;
- 全表有1.9亿条记录;
数据说明
- 表名:github_event_issuesevent_embedding
- 文本字段:issue_body, string类型
- 向量化字段:issue_body_embedding,vector(float,1024)类型
- 向量化方法:issue_body_embedding的初始值为NULL。调用xinference/ollama本地服务,用bge-m3模型对issue_body字段的文本进行向量化,然后保存在issue_body_embedding字段
issue_body_embedding字段更新方法
-
单条update方法
- 符合传统数据库开发者的习惯,数据更实时,达到秒级数据新鲜度高。但是在大数据平台上用SQL进行频繁的update,会带来明显的弊端:
- 带来大量的小文件需要及时进行合并,以优化性能
- 需要一直启动VCluster,造成计算成本高
-
批量merge into方法
- 牺牲了数据新鲜度,从秒级到分钟级
- 规避了小文件急剧增多的问题
- 大幅降低了计算成本,每5分钟merge into一次,则计算成本下降幅度达到80%,大幅提升了数据向量化的性价比。这对大数据量的向量化非常重要。
融合检索
- 参考并已完成在云器Lakehouse的同一张表中进行向量和标量存储
- 检索过程
源代码
本文提供了Github上基于Notebook的源代码如下:
参考资料
联系我们