基于向量数据库的推荐系统

向量数据库( 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": "笔记本电脑"
    }
......
]

推荐系统的目标是根据用户的历史行为和偏好,向用户推荐可能感兴趣的物品。在这种场景下,将用户行为特征向量化存储在向量数据库。当发起推荐请求时,系统会基于用户特征进行相似度计算,然后返回与用户可能感兴趣的物品作为推荐结果。原理示意图:


由于使用了深度学习模型,基于向量数据库的推荐系统较传统推荐系统更先进,由于数据已经实现了向量化,支持各种常用的相似度计算指标,包括欧氏距离、内积、余弦相似度等。可以根据应用需求来选择最有效的向量相似度计算方式,得到更精确的相似度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容