向量数据库落地通常 (向量数据库是什么)
本文基于京东外部向量数据库vearch启动通常。Vearch是对大规模深度学习向量启动高性能相似搜查的弹性散布式系统。详见:
探求
首次意识向量数据库,一脸懵逼?
向量是什么?如何将文本转换为向量?如何确定维度?如何定义表结构?如何选择索引模式,建表参数如何性能?检索参数如何性能?分片数正本数如何选择等等
随着对文档的逐渐相熟以及和vearch相关共事的沟通,以上疑问迎刃而解,详细的不再赘述。关键记住以下几点:
1、文本转向量:驳回大模型网关接口domn/embeddings传入对应的模型如:text-embedding-ada-002-2和待转换的文本即可;
2、向量维度:这个和向量转换所驳回的模型有关,细节不用关注;
3、建表参数的选择以及表结构:关键在于retrieval_type检索模型的选择,详细的可以参考文档。经过综合思考,选择驳回HNSW:
字段标识字段含意类型能否必填备注metric_type计算模式string是L2或许InnerProductnlinks节点街坊数量int是自动32efConstruction构图时寻觅节点街坊环节中在图中遍历的深度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.分段写入向量库:
*将字符串转换为向量并拔出数据库
*目前一切的常识库治理端写入全走这个方法
*@paramdbName数据库称号
*@paramspaceName空间称号
*@paramstr字符串
*@paramflagId标记ID
*@paramchunkIndexId块索引ID
*@paramproperties属性
privatevoidembeddingsAndInsert(StringdbName,StringspaceName,Stringstr,StringflagId,IntegerchunkIndexId,Map<String,Object>properties){
//先向数据库写入一条记载,记载以后文档的写入操作
intsuccess=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)){
KnBaseVecDtoknBaseVecDto=buildKnBaseVecDto(newFeaVector(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}
Stringinsert=VearchUtil.insert(dbName,spaceName,null,newPros);
if(StringUtils.isBlank(insert)||!insert.contains("_index")){
log.error("写入失败的块:{},{}",chunkIndexId,insert);
3、数据记载
上文写常识库的环节有个 knbaseDocRecordService.writeDocRecord 的逻辑,用于记载写入的片段。下文详细引见其中用到的表:
1、表1space记载表
注:关键用于记载创立的space,以及查问管控,如禁用某个space等
CREATETABLE`xxx_vearch_spaces`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主键',
`type`tinyint(3)NOTNULLCOMMENT'类型',
`status`tinyint(3)NOTNULLCOMMENT'形态',
`space`varchar(127)NOTNULLCOMMENT'空间标识',
`db`varchar(127)NOTNULLCOMMENT'库标识',
`desc`varchar(127)NOTNULLCOMMENT'空间形容',
`ext`varchar(4095)NOTNULLDEFAULT''COMMENT'裁减字段',
`creator`varchar(127)NOTNULLDEFAULT''COMMENT'创立人',
`created`timestampNOTNULLCOMMENT'创立期间',
`modifier`varchar(127)NOTNULLDEFAULT''COMMENT'修正人',
`modified`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修正期间',
`deleted`tinyint(3)NOTNULLDEFAULT'0'COMMENT'已删除(0:否;1:是)',
PRIMARYKEY(`id`)USINGBTREE,
UNIQUEKEY`uniq_space_db`(`space`,`db`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=0DEFAULTCHARSET=utf8mb4
2、表2file记载表
注:关键用于记载space下的file,以及查问管控,如禁用某个file,以及关联查问对应的所有片段。
CREATETABLE`xxx_spaces_knbase`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主键',
`status`tinyint(3)NOTNULLCOMMENT'形态',
`space`varchar(127)NOTNULLCOMMENT'空间标识',
`file_name`varchar(255)NOTNULLCOMMENT'文件名',
`file_desc`varchar(511)NOTNULLCOMMENT'文件形容',
`byte_num`bigint(20)unsignedNOTNULLCOMMENT'字符数',
`hit_count`int(10)unsignedNOTNULLCOMMENT'命中次数',
`ext`varchar(4095)NOTNULLDEFAULT''COMMENT'裁减字段',
`creator`varchar(127)NOTNULLDEFAULT''COMMENT'创立人',
`created`timestampNOTNULLCOMMENT'创立期间',
`modifier`varchar(127)NOTNULLDEFAULT''COMMENT'修正人',
`modified`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修正期间',
`deleted`tinyint(3)NOTNULLDEFAULT'0'COMMENT'已删除(0:否;1:是)',
`file_flag_id`varchar(255)DEFAULTNULLCOMMENT'文件惟一标识',
PRIMARYKEY(`id`)USINGBTREE,
KEY`idx_space`(`space`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=0DEFAULTCHARSET=utf8mb4
3、表3paragraph记载表
CREATETABLE`xxx_knbase_doc_record`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主键',
`space`varchar(127)NOTNULLCOMMENT'空间标识',
`file_flag_id`varchar(255)NOTNULLCOMMENT'文件标识',
`d_index`bigint(20)unsignedNOTNULLCOMMENT'文档位置',
`hit_count`int(10)unsignedNOTNULLCOMMENT'命中次数',
`ext`varchar(4095)NOTNULLDEFAULT''COMMENT'裁减字段',
`creator`varchar(127)NOTNULLDEFAULT''COMMENT'创立人',
`created`timestampNOTNULLCOMMENT'创立期间',
`modifier`varchar(127)NOTNULLDEFAULT''COMMENT'修正人',
`modified`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修正期间',
`deleted`tinyint(3)NOTNULLDEFAULT'0'COMMENT'已删除(0:否;1:是)',
PRIMARYKEY(`id`)USINGBTREE,
UNIQUEKEY`uniq_space_file_idx`(`space`,`file_flag_id`,`d_index`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=0DEFAULTCHARSET=utf8mb4
总结
向量数据库关于大模型运行落地来说至关关键,有些无法外露的外部数据可以存储在向量库中,用于外部检索。随着向量库中数据的丰盛,大模型推理回答的才干也将愈加精准。
上文的设计比如space中的chunkFlagId可以关联出原始的整个文件;chunkIndexId可以控制数据的查问范围,另一方面可以经过此字段成功分页(vearch目前不允许分页查问)以及全文导出。xxx_knbase_doc_record表中记载了片段的记载,可用于计算片段的chunkIndexId,一方面防止重复,另一方面保障属性的递增,可用于裁减很多才干。
目前向量数据库的检索只允许基本的向量检索和关键字检索,后续会逐渐优化混合检索等打算以提高检索准确率等。
向量数据库是干嘛用的?
向量数据库是一种新型的数据库,它与传统的关系型数据库不同,采用了一种全新的数据模型。在向数据库中,数据被组织成了一系列的向量,每个向量都包含了一组属性。这些向量之间可以建立关系,通过这种关系来查询数据。
向量数据库的主要作用是用于数据分析和挖掘。传统的数据库主要用来存储数据,而向量数据库则更加注重数据的分析和挖掘。它可以快速地查询和分析大量的数据,从而帮助企业和组织更好地了解他们的业务和市场情况。
向量数据库的另一个重要功能是数据建模。在传统的关系型数据库中,数据建模是一个非常困难的任务。但是向量数据库则提供了一个更加方便的数据建模工具,使得数据建模变得更加简单和高效。
除此之外,向量数据库还可以帮助组织和企业更好地进行数据安全和保护。它可以对数据进行加密和压缩,从而保护数据的机密性和完整性。
总之,向量数据库是一种非常先进的数据库,它主要应用于数据分析和挖掘,数据建模以及数据安全和保护。它可以帮助组织和企业更好地了解他们的业务和市场情况,并且保护他们的数据安全。
数据库向量化是什么意思
数据库向量化是指将数据存储为向量的形式,以便在数据库中更有效地进行查询和分析。 这种技术在许多应用程序中都得到了广泛的应用,如文本分类、图像识别、推荐系统等。 数据库向量化可以使数据库中的数据更易于处理和分析,从而为用户提供更好的数据体验。 通过数据库向量化技术,用户可以更快速地进行查询和分析。 在传统的数据存储模式中,数据库中的数据往往是以完整的文本或图像形式存储的,而这种存储方式会导致查询和分析速度非常缓慢。 通过向量化,数据可以被转换成更具体的形式,以便更快速地进行处理和分析。 数据库向量化技术在许多应用程序中都得到了广泛的应用。 例如,在推荐系统中,向量化可以将用户视为向量,根据用户的购买历史、浏览记录等信息,将其与其他商品的向量进行比较,从而推荐最符合用户兴趣的商品。 在文本分类中,向量化可以将文章转换为向量,然后通过比较不同文章的向量,实现自动分类。 这些应用程序的实现都离不开数据库向量化技术的支持。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。