您当前的位置:首页 > 电脑百科 > 数据库 > 百科

向量数据库落地实践

时间:2024-04-03 14:11:52  来源:  作者:京东云开发者

本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://Github.com/vearch/zh_docs/blob/v3.3.X/docs/source/overview.rst

探索

初次认识向量数据库,一脸懵逼?

向量是什么?如何将文本转换为向量?如何确定维度?如何定义表结构?如何选择索引方式,建表参数如何配置?检索参数如何配置?分片数副本数如何选择等等

随着对文档的逐渐熟悉以及和vearch相关同事的沟通,以上问题迎刃而解,具体的不再赘述。主要记住以下几点:

1、 文本转向量:采用大模型网关接口 domAIn/embeddings 传入对应的模型如:text-embedding-ada-002-2和待转换的文本即可;

2、 向量维度:这个和向量转换所采用的模型有关,细节不用关注;

3、 建表参数的选择以及表结构:主要在于retrieval_type 检索模型的选择,具体的可以参考文档。经过综合考虑,决定采用 HNSW:

字段标识 字段含义 类型 是否必填 备注 metric_type 计算方式 string 是 L2或者InnerProduct nlinks 节点邻居数量 int 是 默认32 efConstruction 构图时寻找节点邻居过程中在图中遍历的深度 int 是 默认40

"retrieval_type": "HNSW",

"retrieval_param": {

"metric_type": "InnerProduct",

"nlinks": 32,

"efConstruction": 40

}

注意: 1、向量存储只支持MemoryOnly

2、创建索引不需要训练,index_size 值大于0均可

具体的建表示例见后文。

4、 分片数和副本数结合实际数据量评估,如果无法评估,按照最少资源申请即可,后续可扩展。

实践

1、 建表(space)

为了简化操作,实行db(库)-space(表)一对一的方案,弱化库的概念。经过一系列探索之后定义出了通用的space结构:

{

"name": "demphah",

"partition_num": 3,

"replica_num": 3,

"engine": {

"name": "gamma",

"index_size": 1,

"id_type": "String",

"retrieval_type": "HNSW",

"retrieval_param": {

"metric_type": "InnerProduct",

"nlinks": 32,

"efConstruction": 100,

"efSearch": 64

}

},

"properties": {

"vectorVal": {

"type": "vector",

"dimension": 1536

},

"contentVal": {

"type": "string"

},

"chunkFlagId": {

"type": "string",

"index": true

},

"chunkIndexId": {

"type": "integer",

"index": true

}

}

}

字段说明:

engine、partition_num等都是固定的参数,properties中所列字段皆为通用字段,如果有扩展字段如:skuId,storeId追加即可

字段名含义类型说明vectorVal文本向量vector维度与选用模型有关contentVal源文本string

chunkFlagId文件唯一idstring文件的标识id,用于串联分块后的片段chunkIndexId文件分段位置integer从0开始,递增skuId ... 

扩展字段见上

这里file的概念可以理解为一个单元,可能是一个文件,也可能是一个url,总之就是一个数据整体。

2、 分段写入

这里针对通用文件描述,比如提供一个pdf文件如何导入向量库:

a. 首先上传文件到oss,然后根据对应的fileKey获取到文件数据流

b. 再根据各种拆分场景(按行、字节数、正则拆分等)分成片段

c. 分段写入向量库:

/**

* 将字符串转换为向量并插入数据库

* <p>

* 目前所有的知识库管理端写入全走这个方法

* @param dbName 数据库名称

* @param spaceName 空间名称

* @param str 字符串

* @param flagId 标志ID

* @param chunkIndexId 块索引ID

* @param properties 属性

*/

private void embeddingsAndInsert(String dbName, String spaceName, String str, String flagId, Integer chunkIndexId, Map<String, Object> properties) {

// 先向数据库写入一条记录,记录当前文档的写入操作

int success = knbaseDocRecordService.writeDocRecord(spaceName, flagId, chunkIndexId.longValue(), 0, str);

if (success <= 0) {

log.error("writeDocRecord失败 {},{},{}", spaceName, flagId, chunkIndexId);

}

// 分块转向量并写入

List<Float> embeddings = GatewayUtil.baseEmbeddings(str);

if (CollectionUtils.isEmpty(embeddings)) {

return;

}

KnBaseVecDto knBaseVecDto = buildKnBaseVecDto(new FeaVector(embeddings),flagId,chunkIndexId,str);

Map<String, Object> newPros = JsonUtil.obj2Map(knBaseVecDto);

if (MapUtils.isNotEmpty(properties)) {

newPros.putAll(properties);

}

// {"_index":"kn_base_file_db","_type":"kn_base_file_space","_id":"-8182839813441244911","status":200}

String insert = VearchUtil.insert(dbName, spaceName, null, newPros);

if (StringUtils.isBlank(insert) || !insert.contains("_index")) {

log.error("写入失败的块:{},{}", chunkIndexId, insert);

}

}

3、 数据记录

上文写知识库的过程有个 knbaseDocRecordService.writeDocRecord 的逻辑,用于记录写入的片段。下文详细介绍其中用到的MySQL表:

1、 表1 space记录表

注:主要用于记录创建的space,以及查询管控,如禁用某个space等

CREATE TABLE `xxx_vearch_spaces` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`type` tinyint(3) NOT NULL COMMENT '类型',

`status` tinyint(3) NOT NULL COMMENT '状态',

`space` varchar(127) NOT NULL COMMENT '空间标识',

`db` varchar(127) NOT NULL COMMENT '库标识',

`desc` varchar(127) NOT NULL COMMENT '空间描述',

`ext` varchar(4095) NOT NULL DEFAULT '' COMMENT '扩展字段',

`creator` varchar(127) NOT NULL DEFAULT '' COMMENT '创建人',

`created` timestamp NOT NULL COMMENT '创建时间',

`modifier` varchar(127) NOT NULL DEFAULT '' COMMENT '修改人',

`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

`deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '已删除(0:否;1:是)',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uniq_space_db` (`space`,`db`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='xxx向量空间'

2、 表2 file记录表

注:主要用于记录space下的file,以及查询管控,如禁用某个file,以及关联查询对应的全部片段。

CREATE TABLE `xxx_spaces_knbase` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`status` tinyint(3) NOT NULL COMMENT '状态',

`space` varchar(127) NOT NULL COMMENT '空间标识',

`file_name` varchar(255) NOT NULL COMMENT '文件名',

`file_desc` varchar(511) NOT NULL COMMENT '文件描述',

`byte_num` bigint(20) unsigned NOT NULL COMMENT '字符数',

`hit_count` int(10) unsigned NOT NULL COMMENT '命中次数',

`ext` varchar(4095) NOT NULL DEFAULT '' COMMENT '扩展字段',

`creator` varchar(127) NOT NULL DEFAULT '' COMMENT '创建人',

`created` timestamp NOT NULL COMMENT '创建时间',

`modifier` varchar(127) NOT NULL DEFAULT '' COMMENT '修改人',

`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

`deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '已删除(0:否;1:是)',

`file_flag_id` varchar(255) DEFAULT NULL COMMENT '文件唯一标识',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_space` (`space`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='xxx空间知识库'

3、 表3 paragraph记录表

注:主要用于记录file拆分的片段,包括当前位置,查询命中数等。

CREATE TABLE `xxx_knbase_doc_record` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`space` varchar(127) NOT NULL COMMENT '空间标识',

`file_flag_id` varchar(255) NOT NULL COMMENT '文件标识',

`d_index` bigint(20) unsigned NOT NULL COMMENT '文档位置',

`hit_count` int(10) unsigned NOT NULL COMMENT '命中次数',

`ext` varchar(4095) NOT NULL DEFAULT '' COMMENT '扩展字段',

`creator` varchar(127) NOT NULL DEFAULT '' COMMENT '创建人',

`created` timestamp NOT NULL COMMENT '创建时间',

`modifier` varchar(127) NOT NULL DEFAULT '' COMMENT '修改人',

`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

`deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '已删除(0:否;1:是)',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uniq_space_file_idx` (`space`,`file_flag_id`,`d_index`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='xxx知识文档记录'

总结

向量数据库对于大模型应用落地来说至关重要,有些不可外露的内部数据可以存储在向量库中,用于内部检索。随着向量库中数据的丰富,大模型推理回答的能力也将更加精准。

上文的设计比如space中的chunkFlagId可以关联出原始的整个文件;chunkIndexId可以控制数据的查询范围,另一方面可以通过此字段实现分页(vearch目前不支持分页查询)以及全文导出。xxx_knbase_doc_record表中记录了片段的记录,可用于计算片段的chunkIndexId,一方面避免重复,另一方面保证属性的递增,可用于扩展很多能力。

目前向量数据库的检索只支持基本的向量检索和关键字检索,后续会逐步优化混合检索等方案以提高检索准确率等。



Tags:向量数据库   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  Search: 向量数据库  点击:(0)  评论:(0)  加入收藏
简易百科之什么是向量数据库
随着大数据时代的到来,数据存储和处理成为了一个重要的问题。传统的关系型数据库已经无法满足一些场景的需求,例如大规模高维数据的处理和分析。在这样的背景下,向量数据库应运...【详细内容】
2024-01-15  Search: 向量数据库  点击:(155)  评论:(0)  加入收藏
腾讯云把向量数据库“卷”到哪一步了?
“不是我不明白,这世界变化快”,崔健在20世纪写下的这句歌词,放在刚刚过去的2023年,也同样适用。技术风向的变化之快,让不少人感到惊讶,向量数据库这一年的潮起潮落,就是一个典型的...【详细内容】
2024-01-14  Search: 向量数据库  点击:(63)  评论:(0)  加入收藏
纯向量数据库和向量插件都有局限,那未来发展有其他方向吗?
作者 | 张颖峰导读:向量数据库的争议差不多一年了,但我们一直缺少一篇能透彻讲解向量数据库相关问题的文章,这导致在这个领域的讨论一直没有得到充分的澄清。在这篇文章中,我们将...【详细内容】
2024-01-11  Search: 向量数据库  点击:(11)  评论:(0)  加入收藏
探秘向量数据库:从原理到商业应用的旅程
当我们谈及数据库技术,大部分人的第一反应可能是传统的关系型数据库,如MySQL、Oracle或SQL Server。这些数据库技术凭借其成熟稳定的关系型数据模型,已经在企业级应用中占据了...【详细内容】
2023-12-28  Search: 向量数据库  点击:(106)  评论:(0)  加入收藏
一文了解托管在亚马逊云科技的向量数据库MyScale
MyScale是一款完全托管于亚马逊云科技,支持SQL的高效向量数据库。MyScale的优势在于,它在提供与专用向量数据库相匹敌甚至优于的性能的同时,还支持完整的SQL语法。以下内容,将阐...【详细内容】
2023-12-28  Search: 向量数据库  点击:(97)  评论:(0)  加入收藏
如何评估向量数据库
导语:没有通用的“最 佳”向量数据库&mdash;&mdash;选择取决于您的需求。评估可扩展性、功能性、性能以及与用例的兼容性至关重要。在当今数据驱动的世界里,非结构化数据的指...【详细内容】
2023-12-26  Search: 向量数据库  点击:(103)  评论:(0)  加入收藏
解读向量数据库
不论是RAG,还是Agent,几乎每个LLM 驱动的应用程序都可能会用到向量数据库。那么,向量数据库是什么?与传统数据库有何不同? 又如何选择向量数据库呢? 本文是老码农关于向量数据库的...【详细内容】
2023-11-27  Search: 向量数据库  点击:(131)  评论:(0)  加入收藏
初识向量数据库与pgvector实践
随着大语言模型的兴起,向量数据库正愈发受到人们的关注。作为对向量数据库的一名小白,近期简单对这一新技术方向做了些了解,特分享给大家。 1. 大火的向量数据库 1).什么是向...【详细内容】
2023-11-17  Search: 向量数据库  点击:(204)  评论:(0)  加入收藏
国内首个向量数据库标准发布
科技日报北京11月15日电 (记者都芃)15日,中国信通院联合腾讯云计算(北京)有限责任公司、中移(苏州)软件技术有限公司等多家企业共同编制的、国内首个向量数据库标准正式发布,...【详细内容】
2023-11-16  Search: 向量数据库  点击:(204)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(0)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(1)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(10)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(10)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(6)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(11)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 &darr;select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(4)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(3)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(23)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, &#39;研发部(RD)&#39;, &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(19)  评论:(0)  加入收藏
站内最新
站内热门
站内头条