weaviate能做什么
人工智能时代来临,大语言模型逐渐成为程序组成的一部分,但是大语言模型使用上下文的记忆能力有限,需要一个数据库用于储存上下文关系,所以向量数据库应运而生.向量数据库是一种专门存储、管理和搜索高维向量嵌入(数字形式的非结构化数据表示,如文本、图像、音频)的数据库,核心在于通过向量的语义相似性实现高效检索,而非传统数据库的精确关键词匹配,主要应用在大型语言模型(LLM)问答、推荐系统、图像/语音识别等AI领域,通过ANN算法加速搜索,支持“检索增强生成”(RAG)以提高AI的准确性.
向量数据库如何工作的
嵌入模型会将各种数据 (例如文本、图像、图表和视频) 转换为数值向量,以便捕捉其在多维向量空间中的含义和细微差别。
使用相似性搜索 (也称为向量搜索、向量相似性搜索或语义搜索) 是指人工智能应用程序根据指定的相似性度量标准,从数据库中高效地检索与给定查询的向量嵌入在语义上相似的向量.
现在的向量数据库有哪些选择
Weaviate: weaviate 是一个开源的矢量数据库,具有健壮、可拓展、云原生以及快速等特性
Redis: redis 通过RedisSearch 模块,也原生支持向量检索。
Qdrant: Qdrant 是面向下一代的生成式AI向量数据库,同时也具备云原生的特性。
Milvus: 面向下一代的生成式AI向量数据库,支持云原生。
Chroma: 一个开源的向量数据库。 可以快速基于Python和JavaScript构建内存级LLM应用
Elasticsearch:大名鼎鼎的搜索引擎,同样支持向量搜索
Weaviate客户端:
weaviate官方没有提供一个本地的客户端,所以本人开发了一个初步可用的版本,地址在下方.
https://github.com/bleuesprit/Weaviate-Admin
这个版本实现了基础的collection管理和object管理,欢迎大家下载使用
本篇文档的作用
本篇文档只介绍最最基本的概念,可以作为weaviate的概念扫盲使用,让大家有能力去阅读weaviate的文档.不会涉及到很多深入的原理性东西
Weaviate的基本概念
collection: 类比成mysql的表
object:类比成mysql表的一条记录
uuid: 记录的id
vector: 用于进行嵌入查询的向量,可以理解成一个特殊的字段
property:记录的字段
Collection的设置
collection名字
类比mysql的数据表名
property
collection的字段,weaviate可以预先定义每个property的字段和数据类型
weaviate支持自动property, 和es一样,对没有事先定义的property会自动创建
这个特性可以关闭
property可以指定是否参与 关键字搜索.
property分词方式
可以是定propery的分词器,这个分词器用在关键字查询
vector
用于存储一条记录的嵌入向量.当然一个记录的vector可以有好几个,叫做named Vector,在搜索的时候,可以指定要搜索哪个vector,这样一个向量可以被不同的场景使用.
vector产生方有几种
- collection可以使用一个内在支持的emding模型把记录的property
- weaviate可以自动使用api调用外部模型进行嵌入
- 插入collection的时候直接把vector也传入
vector的底层实现方法:
有两种实现方法
- HNSW : 可以理解成高维的跳表,这种方法适合大量数据,
- flat:最暴力的匹配方式,适合小数据,并且结果一定准确
- 动态:先使用flat匹配,等数据量大了weaviate自动切换成HNSW
vector量化
默认的嵌入向量都是小数表示,并且很长.这种实现方式当记录条数多的时候,存储量会爆炸.所以需要采用一定的方法进行量化.(可以联想一下llm模型的量化)主要就是通过降低一个数字的精度来节省存储资源
官方文档
weaviate支持4中量化方式:
Rotational Quantization (RQ) 这种是weaviate推荐的方式,查资料得知这中方式还可能是weaviate独创的.
Product Quantization (PQ)
Binary Quantization (BQ) 最差的量化方式
Scalar Quantization (SQ)
这四种量化方式各有利弊.且实现原理很复杂.有的量化需要根据现有数据进行聚类一番才能使用(如 PQ),所以消耗资源会非常大,有的不需要基于数据学习.
倒排索引
weaviate不仅支持嵌入向量的语义查询,还支持传统搜索引擎的搜索查询和关键字匹配的查询.
可以在collection创建的时候,指定一个property是否参与倒排索引和关键字匹配.
Object管理
官方文档
weaviate支持api进行数据的增删改查.
需要注意的是UUID,可以理解成数据库的主键,如果插入的时候不提供uuid,weaviate会自动生成一个.
weaviate有一个最佳实践,即根据object的property算出一个uuid.这样使得相同属性的记录uuid相同,避免重复插入.
批量导入
支持批量导入数据
查询和搜索
向量搜索
向量搜索可是使用官方的SDK,有python,java,js,go,c# 如果使用api搜索,需要使用Graphql语言查询.每个object和查询有一个距离结果.
查询的入参可以是字符串,也可以直接输入向量.
可以指定查询过滤器:对某个property进行精确匹配
并且可以指使用那个vector查询,可以匹配的最大距离,结果返回最大条数
返回的结果可以使用属性做groupby处理,可以指定最多返回多少个分组,和每个分组最多有多少个记录
关键词搜索(BM25 search)
官方文档
类似搜索引擎,使用倒排索引进行查找
每个文档会通过算法得出一个相关性分数scores 然后通过排序给出最佳匹配结果
可以指定查询那些property,并且可以指定每个property的权重,用于改变scores的记录方式
混合搜索
官方文档
把向量搜索和关键词搜索结合起来的方式,并且可以通过参数alpha 设置更加看中哪种搜索方式产生的结果
数据
数据分片
weaviate支持自动数据分片,目前只能使用uuid进行分片,使用64bit Murmur-3 hash
[水平扩展](https://docs.weaviate.io/weaviate/concepts/cluster)
数据副本
weaviate 在collection定义的时候,可以指定这个collection需要多少个副本.
数据一致性
集群基础信息
集群基本信息使用raft算法达成一致
集合
集合信息读取一致性:
LeaderOnly (default):只考虑leader数据
LocalOnly:只使用本地缓存
LeaderOnMismatch:检查本地缓存是否过期,过期就从远程读取.
ojbect
读写一致性:
ONE - 一副本成功即可
QUORUM - 超过半数副本成功
ALL -所有副本成功
默认情况下,增,删,改,weaviate会等待所有副本返回.
高可用
官方文档
weaviate支持集群方式搭建
Weaviate向量数据库入门指南
749

被折叠的 条评论
为什么被折叠?



