向量数据库( VectorDB)专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。鹅厂的云向量数据库可以实现数据写入/检索自动向量化,对齐传统数据库的使用体验,用户无需关注向量生成过程,极大降低使用门槛。
可以使用Python或者java版本的SDK/API创建向量数据库,本文为了方便演示使用完成相关操作。
一、新建数据库
略。。。
二、创建数据库下的集合
在向量数据库中,集合是指一组文档组,类似于关系型数据库中的表,其中可包含多条文档数据。集合没有固定的结构,可以插入不同格式和类型的数据。向量数据库支持集合维度的多分片、多副本特性,可以在创建集合时按需指定分片数和副本数。
注意开启“Embedding”嵌入即向量化,token化,使大语言模型对原始数据处理的关键一环,才能进行后续处理。
新建集合
其余配置参数如图:
vector使用HNSW,其他的索引类型参考官方文档。
desc启用向量化
三、向集合插入数据
使用如下json插入几条数据:
{
"database": "guo_db",
"collection": "Product_recommendation",
"buildIndex": true,
"documents": [
{
"id": "1",
"desc": "Xiaomi/小米 笔记本Pro i7笔记本新品轻薄学习办公游戏笔记本电脑",
"name": "笔记本电脑",
"link": "https://item.taobao.com/item.htm?spm=a21n57.1.0.0.1b82523cwleRnp&id=732913405210&ns=1&abbucket=13#detail"
},
{
"id": "2",
"desc": "小米14手机壳新款小米14pro保护套防窥透明双面玻璃防摔小米14Ultra女曲面屏专用全包防摔mi14Por男创意高端",
"name": "小米手机壳",
"link": "https://detail.tmall.com/item.htm?ali_refid=a3_430582_1006:1307590102:H:hYlkg1LN3aaPEMltPrqhcIZuKNOtKBV2:d531df1012d324b0dc9fe44f6c976570&ali_trackid=282_d531df1012d324b0dc9fe44f6c976570&id=745504122315&spm=a21n57.1.0.0"
},
{
"id": "3",
"desc": "ThinkPad P15 至强处理器 15.6英寸16G独显设计图形移动工作站IBM笔记本电脑官方旗舰",
"name": "thinkpad电脑",
"link": "https://detail.tmall.com/item.htm?abbucket=13&id=642908199467&ns=1&spm=a21n57.1.0.0.1b82523cwleRnp&sku_properties=1627207:19284974778"
},
{
"id": "4",
"desc": "小米 原装充电器套装120W氮化镓充电器+双Typc-C接口数据线支持PD快充 便携充电器 适用小米/手机/笔记本",
"name": "小米充电器",
"link": "https://detail.tmall.com/item.htm?abbucket=13&id=671557292589&ns=1&spm=a21n57.1.0.0.1b82523cwleRnp&skuId=5009510186581"
},
{
"id": "5",
"desc": "小米14Pro手机新品新款上市小米徕卡我心澎湃小米官方旗舰店官网小米澎湃OS高通骁龙8Gen3",
"name": "小米手机",
"link": "https://detail.tmall.com/item.htm?abbucket=13&id=645529287798&ns=1&spm=a21n57.1.0.0.1b82523cwleRnp&sku_properties=5919063:6536025"
}
]
}
详细API参考如下SDK,将documents替换上面内容即可:
import tcvectordb
from tcvectordb.model.collection import UpdateQuery
from tcvectordb.model.document import Document, SearchParams, Filter
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
#create a database client object
client = tcvectordb.VectorDBClient(url='http://10.0.X.X', username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 指定写入数据的数据库与集合
db = client.database('db-test')
coll = db.collection('book-vector')
# 写入数据。
# 参数 build_index 为 True,指写入数据同时重新创建索引。
res = coll.upsert(
documents=[
Document(id='0001', vector=[
0.2123, 0.23, 0.213], author='罗贯中', bookName='三国演义', page=21, tags=['曹操','诸葛亮','刘备']),
Document(id='0002', vector=[
0.2123, 0.22, 0.213], author='吴承恩', bookName='西游记', page=22, tags=['孙悟空','猪八戒','唐僧']),
Document(id='0003', vector=[
0.2123, 0.21, 0.213], author='曹雪芹', bookName='红楼梦', page=23, tags=['贾宝玉','林黛玉','王熙凤'])
],
build_index=True
)
四、基于相似度方法查询
从向量数据库进行相似度查询,示例代码:
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, EmbeddingModel, ReadConsistency
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.document import Document, Filter, SearchParams
#create a database client object
client = tcvectordb.VectorDBClient(url='http://10.0.X.X', username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
db = client.database('db-test')
coll = db.collection('book-emb')
# search by text
# embeddingItems 指定了检索的文本
# filter 指定了过滤条件
# params 指定索引类型对应的查询参数,HNSW 类型需要设置 ef,指定查询的遍历范围;IVF 系列需要设置 nprobe,指定查询的单位数量
# limit 指定返回最相似的 Top K 条结果。如果插入的数据不足 K 条,则返回实际插入的 Document 数量。
# output_fields 指定输出字段
doc_lists = coll.searchByText(
embeddingItems=['天下大势,分久必合,合久必分'],
filter=Filter(Filter.In("bookName",["三国演义", "西游记"])),
params=SearchParams(ef=200),
limit=3,
retrieve_vector=False,
output_fields=['bookName','author']
)
# printf
for i, docs in enumerate(doc_lists.get("documents")):
print(i)
for doc in docs:
print(doc)
当我们输入“office”和“电脑”2个搜索条件,从返回结果可以看到相似度最高的是thinkpad笔记本电脑这条数据。它的score最高0.797445
,即79.74%的相似度。
[
{
"id": "3",
"score": 0.797445,
"link": "https://detail.tmall.com/item.htm?abbucket=13&id=642908199467&ns=1&spm=a21n57.1.0.0.1b82523cwleRnp&sku_properties=1627207:19284974778",
"name": "thinkpad电脑",
"desc": "ThinkPad P15 至强处理器 15.6英寸16G独显设计图形移动工作站IBM笔记本电脑官方旗舰"
},
{
"id": "1",
"score": 0.750497,
"desc": "Xiaomi/小米 笔记本Pro i7笔记本新品轻薄学习办公游戏笔记本电脑",
"link": "https://item.taobao.com/item.htm?spm=a21n57.1.0.0.1b82523cwleRnp&id=732913405210&ns=1&abbucket=13#detail",
"name": "笔记本电脑"
}
......
]
推荐系统的目标是根据用户的历史行为和偏好,向用户推荐可能感兴趣的物品。在这种场景下,将用户行为特征向量化存储在向量数据库。当发起推荐请求时,系统会基于用户特征进行相似度计算,然后返回与用户可能感兴趣的物品作为推荐结果。原理示意图:
由于使用了深度学习模型,基于向量数据库的推荐系统较传统推荐系统更先进,由于数据已经实现了向量化,支持各种常用的相似度计算指标,包括欧氏距离、内积、余弦相似度等。可以根据应用需求来选择最有效的向量相似度计算方式,得到更精确的相似度。
网友评论