快速入口
👉向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com)
前言
OpenAI 掀起AI 变革,让向量数据库越来越受关注。
AIGC 技术迎来大爆发后,国内外科技公司纷纷推出自家大模型产品,这一波浪潮把向量数据库这一原本没那么火爆的赛道推到了聚光灯下。
使用向量数据库可以提升效率、降低成本,加速大模型落地行业场景,同时具有强大的相似性搜索功能,以更复杂的方式构建能够 “理解” 不同数据格式中保存的值的数据存储,降低企业存储成本等优势。本文介绍腾讯云向量数据库实践体验,帮助更多的人认识向量数据库。
1. 向量数据库概念及原理
1.1 向量数据库概念
向量数据库是专门用来存储和查询向量的数据库,其存储的向量来自于对文本、语音、图像、视频等的向量化。与传统数据库相比,向量数据库可以处理更多非结构化数据(比如图像和音频)
1.2 向量数据库核心原理
向量数据库是一种基于向量空间模型的数据库,其工作原理主要包括以下几个方面:
-
数据存储:向量数据库将数据存储为向量形式,每个向量代表一个数据对象。向量的维度数取决于数据对象的特征数,例如一张图片可以表示为一个由像素值组成的向量,一个文本可以表示为一个由词频组成的向量。
-
向量索引:为了加速查询速度,向量数据库使用向量索引来存储向量数据。向量索引是一种数据结构,可以将向量数据按照一定的规则进行划分和组织,以便快速地进行查询和检索。
-
相似度计算:向量数据库的查询操作主要是基于相似度计算。当用户输入一个查询向量时,向量数据库会计算该向量与数据库中所有向量的相似度,并返回相似度最高的前几个向量作为查询结果。
-
查询优化:为了提高查询效率,向量数据库采用了一系列查询优化技术,例如基于向量索引的查询优化、基于近似相似度计算的查询优化等。
总而言之,向量数据库的主要特点是能够高效地存储和查询大规模的向量数据。它通常采用基于向量相似度的查询方式,即根据向量之间的相似度来检索数据。这种查询方式可以用于各种应用场景,例如图像搜索、音乐推荐、文本分类等。维度越高、信息量越大,这些特性都是传统数据库很难做到的。
1.3 向量数据库优缺点
向量数据库是一种新型的数据库技术,它使用向量化计算来处理和存储数据。与传统的关系型数据库不同,向量数据库使用向量作为基本数据类型,可以高效地处理大规模的复杂数据。
-
优点:
-
高效处理大规模数据:向量数据库使用向量化计算,可以高效地处理大规模的复杂数据,比传统的关系型数据库更快。
-
支持高维数据:向量数据库可以处理高维数据,例如图像、音频和视频等,这些数据在传统的关系型数据库中很难处理。
-
支持复杂查询:向量数据库支持复杂的查询操作,例如相似性搜索和聚类分析等,这些操作在传统的关系型数据库中很难实现。
-
易于扩展:向量数据库可以轻松地扩展到多个节点,以处理更大规模的数据。
-
-
缺点:
- 相对较新:向量数据库是一种相对较新的技术,目前市场上的产品和应用还比较少。
- 学习成本高:向量数据库使用向量作为基本数据类型,需要掌握向量化计算的相关知识,学习成本较高。
- 不适用于所有场景:向量数据库适用于处理大规模的复杂数据,但对于一些简单的数据处理场景,传统的关系型数据库可能更加适用。
向量数据库是一种非常有前途的数据库技术,它可以高效地处理大规模的复杂数据,并支持复杂的查询操作。但是,由于它是一种相对较新的技术,目前还存在一些限制和挑战。
1.4 向量数据库与传统数据库的区别
向量数据库与传统数据库的区别主要在以下几个方面:
-
数据类型:向量数据库专门用于存储和管理向量数据,而传统数据库则可以存储各种类型的数据,例如文本、数字、日期等。
-
存储方式:向量数据库通常采用基于向量索引的存储方式,将向量数据映射到高维空间中,即将非结构化数据(如图片、音频、文章等)转换为向量方式来存储。并在这个空间中构建索引结构,以支持高效的相似度查询。而传统数据库则采用关系型模型或其他存储方式。
-
查询方式:向量数据库的查询方式通常是基于向量相似度的查询,即根据向量之间的相似度来检索数据。而传统数据库的查询通常是精确查询,即查询结果要么符合条件要么不符合条件。
-
应用场景:向量数据库主要应用于人工智能、机器学习、大数据等领域,例如图像搜索、音乐推荐、文本分类等。而传统数据库则广泛应用于各种企业应用、网站应用等
-
计算密集型:向量数据库的查询则是计算密集型,需要进行大量的向量计算和比较,而传统数据库的查询主要是事务处理。
2. 腾讯云向量数据库的基本特性及优势
向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com)
腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。
2.1 高性能的向量计算和存储能力
腾讯云向量数据库向量数据库单索引支持10亿级向量数据规模,可支持百万级 QPS 及毫秒级查询延迟。向量数据库提供多副本高可用特性,其多可用区和三节点的架构可用性可达99.99%,显著提高系统的可靠性和容错性,确保数据库在面临节点故障和负载变化等挑战时仍能正常运行。向量数据库架构支持水平扩展,单实例可支持百万级 QPS,轻松满足 AI 场景下的向量存储与检索需求
2.2 灵活的查询和索引功能
方便快速检索和数据分析
向量数据库能够快速检索查询中的类似对象,因为它们已经预先计算过了。其基本概念被称为近似最近邻(Approximate Nearest Neighbor:ANN)搜索,它使用不同的算法来索引和计算相似性。
正如你所能想象的,当你有数百万个嵌入时,用简单的 k 近邻(kNN)算法计算查询和每个嵌入对象之间的相似性可能会变得相当耗时。而使用 ANN 搜索算法,你可以以一定的准确性换取速度,并检索与查询近似最相似的对象。
索引:为此,向量数据库对向量嵌入进行索引。此步骤将向量映射到数据结构,从而实现更快的搜索。
2.3 易于集成到现有的推荐系统中
统计显示,将腾讯云向量数据库用于大模型预训练数据的分类、去重和清洗相比传统方式可以实现 10 倍效率的提升,如果将向量数据库作为外部知识库用于模型推理,则可以将成本降低 2-4 个数量级。
具体而言,在接入层,腾讯云向量数据库支持自然语言文本的输入,同时采用“标量+向量”的查询方式,支持全内存索引,最高支持每秒百万的查询量(QPS);在计算层,AI Native 开发范式能实现全量数据 AI 计算,一站式解决企业在搭建私域知识库时的文本切分(segment)、向量化(embedding)等难题;在存储层,腾讯云向量数据库支持数据智能存储分布,助力企业存储成本降低 50%。
企业原先接入一个大模型需要花 1 个月左右时间,使用腾讯云向量数据库后,3 天时间即可完成,极大降低了企业的接入成本。
3. 相亲社交应用推荐使用腾讯云向量数据库
接下来分享一下向量数据库的使用步骤,目前全球主流的云服务厂商都有对应的向量数据库的服务,这里以腾讯云向量数据库来做简单使用介绍。
3.1 腾讯云向量数据库使用步骤
在开始使用腾讯云向量数据库之前,需要先去进行申请注册操作,注册过程相对简单,只需提供必要的个人信息,即可,注册详细过程这里就不再详细说明。
向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com)
3.1.1 申请/新建向量数据库实例
步骤1:如下图登录账号后我们选择【立即体验】
免费测试版实例每个账号仅限申领1个,其余实例兔费试用时长1个月;若-个月内未使用实例,平台将自动回收。
步骤2:进入到腾讯云向量数据库控制台之后,点击【新建】创建向量数据库实例,在创建实例过程中,需要设置实例的名称等参数,具体如下图所示:
步骤3:创建成功之后控制台就可以看到新建实例如下图
步骤4:选择【管理】->【秘钥管理】复制秘钥
步骤5:选择【管理】->【可视化管理】->【登录】(把刚才复制秘钥粘贴到密码区)
步骤6:进入可视化的【数据库管理】页面就可以操作了 下面是已经创建好的数据库
3.1.2 安全组配置
登录 私有网络控制台
前提条件
1.【打开公网】 配置白名单, 我这里配置的是
0.0.0.0/0
步骤1: 在安全组列表中,找到之前新建向量数据实例时选择的 [安全组] ,添加对应的安全组端口号【TCP:20000】,否则无法连接。
步骤2: ping一下是否能ping通,如下图可以ping通
3.1.3 创建数据库
下面用python 进行演示
- 1.安装腾讯提供的依赖库
pip install tcvectordb
- 2.导入 SDK 所需的模块
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.collection import UpdateQuery
from tcvectordb.model.document import Document, SearchParams, Filter
- 3.在本地创建VectorDBClient,一个向量数据库的客户端对象,用于与向量数据库服务器连接并进行数据交互。
client = tcvectordb.VectorDBClient(url='http://lb-g82y4uco自己的公网地址.clb.ap-guangzhou.tencentclb.com:20000',
username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
VectorDBClient
中的url
和key
填写成自己
- 4.使用以下完整代码创建数据库
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.collection import UpdateQuery
from tcvectordb.model.document import Document, SearchParams, Filter
# 创建数据库连接对象
client = tcvectordb.VectorDBClient(url='http://lb-g82y自己公网地址nj.clb.ap-guangzhou.tencentclb.com:20000', username='root', key='qOTxojUXVRsLwZ2HFytHH自己Key', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 创建数据库
db = client.create_database(database_name='mydb_test01')
print(db.database_name)
刷新一下控制台,看到创建成功
3.1.4 创建集合
Collection
设计索引
- 【重要的事】向量对应的文本字段不要建立索引,会浪费较大的内存,并且没有任何作用。
- 【必须的索引】:主键
id
、向量字段vector
这两个字段目前是固定且必须的,参考下面的例子。- 【其他索引】:检索时需作为条件查询的字段,比如要按书籍的作者进行过滤,这个时候 author 字段就需要建立索引,
否则无法在查询的时候对 author 字段进行过滤,不需要过滤的字段无需加索引,会浪费内存;- 向量数据库支持动态 Schema,写入数据时可以写入任何字段,无需提前定义,类似 MongoDB.
- 例子中创建一个书籍片段的索引,例如书籍片段的信息包括 {id, vector, bookName, author,},
id 为主键需要全局唯一,vector 字段需要建立向量索引,假如我们在查询的时候要查询指定书名称的内容,这个时候需要对 bookName 建立索引,其他字段没有条件查询的需要,无需建立索引。
完整代码创建集合
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency, EmbeddingModel
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.collection import UpdateQuery, Embedding
from tcvectordb.model.document import Document, SearchParams, Filter
# 创建数据库连接对象
client = tcvectordb.VectorDBClient(url='http://lb-g82y4uco自己公网IP6anj.clb.ap-guangzhou.tencentclb.com:20000',
username='root',
key='qOTxojUXVRsLwZ2HFyt自己Key',
read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 创建数据库
# db = client.create_database(database_name='mydb_test01')
# 连接数据库
db = client.database('mydb_test01')
print(db.database_name)
# 第一步,设计索引
index = Index(
FilterIndex(name='id', field_type=FieldType.String, index_type=IndexType.PRIMARY_KEY),
VectorIndex(name='vector', dimension=768, index_type=IndexType.HNSW,
metric_type=MetricType.COSINE, params=HNSWParams(m=16, efconstruction=200)),
)
ebd = Embedding(vector_field='vector', field='text', model=EmbeddingModel.BGE_BASE_ZH)
# 第二步:创建 Collection
coll = db.create_collection(
name='data_test01',
shard=1,
replicas=0,
description='this is a collection of test embedding',
embedding=ebd,
index=index
)
print(vars(coll))
刷新一下控制台,看到集合创建成功
3.1.5 向集合中插入数据
写入数据,可能存在一定延迟
- 支持动态 Schema,除了 id、text 字段必须写入,可以写入其他任意字段,text 字段为创建集合时,设置的文本字段名
- upsert 会执行覆盖写,若文档id已存在,则新数据会直接覆盖原有数据(删除原有数据,再插入新数据)
- 参数 build_index 为 True,指写入数据同时重新创建索引。
完整代码集合中插入数据
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.enum import FieldType, IndexType, MetricType, EmbeddingModel
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.collection import Embedding, UpdateQuery
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.document import Document, Filter, SearchParams
# 创建数据库连接对象
client = tcvectordb.VectorDBClient(url='http://lb-g82y4自己的公网IPqz1v26anj.clb.ap-guangzhou.tencentclb.com:20000',
username='root',
key='qOTxojUXVRsLwZ2HFytHH自己的key',
read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 指定写入原始文本的数据库与集合
db = client.database('mydb_test01')
coll = db.collection('data_test01')
print(db.database_name)
# 写入数据,可能存在一定延迟
res = coll.upsert(
documents=[
Document(
id='11001',
text="钢琴",
username="xiaoyu001",
password='password123',
email='xiaoyu001qq.com',
birthdate="1990/1/1",
gender="男",
location="北京"
),
Document(
id='11002',
text="小提琴",
username="xiaoyu002",
password='password123',
email='xiaoyu002qq.com',
birthdate="1991/1/1",
gender="男",
location="天津"
)
],
build_index=True
)
插入测试数据后,去控制台查看数据如下图所示:
3.1.6 相识度查询
批量导入以下数据
相识度查询
3.2 相亲社交应用背景介绍
随着社会的发展,人们的生活节奏加快,社交圈子逐渐固化,这导致许多单身人士在寻找合适的伴侣时面临困难。传统的相亲方式,虽然直接,但往往受到时间、空间等多种因素的制约,效率不高。在这种背景下,相亲社交应用应运而生,它结合了现代科技与人们的婚恋需求,为单身人士提供了一个更广阔、更便捷的交友平台。
相亲社交应用充分利用了互联网的优势,打破了地域的限制,让用户可以随时随地与全国各地的潜在对象进行交流。这种方式不仅扩大了交友范围,还大大提高了相亲的效率。而且,与传统的相亲方式相比,相亲社交应用更为年轻、个性化,用户可以根据自己的喜好和需求,筛选出更为合适的对象。
3.3 如何将用户社交关系和行为转化为向量表示
推荐系统的目标是根据用户的历史行为和偏好,向用户推荐可能感兴趣人。在这种场景下,将用户行为特征向量化存储在向量数据库。当发起推荐请求时,系统会基于用户特征进行相似度计算,然后返回与用户可能感兴趣的人作为推荐结果。
3.4 相亲社交应用推荐系统的设计和实现
在推荐系统中,用户偏好可以用向量表示,以捕捉其特征和属性。例如,用户可能对绘画,钢琴,篮球等方面有偏好,这些偏好可以用一个数值向量表示。通过计算每个用户对之间的相似度,可以实现个性化的推荐。
推荐系统:根据用户的喜好和行为,从用户中推荐相似的人
以下是一个基本的相亲应用推荐系统设计和实现过程:
简陋的界面
代码(部分)
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
# 读取用户数据
users_df = pd.read_csv('users.csv')
# 根据用户偏好计算相似度矩阵
def calculate_similarity_matrix(users_df):
preferences = users_df.drop(['user_id', 'username'], axis=1)
similarity_matrix = cosine_similarity(preferences)
return similarity_matrix
# 获取前N个最相似的用户
def get_top_similar_users(user_id, similarity_matrix, n):
index = users_df[users_df['user_id'] == user_id].index[0]
similarity_scores = list(enumerate(similarity_matrix[index]))
similarity_scores = sorted(similarity_scores, key=lambda x: x[1], reverse=True)
similarity_scores = similarity_scores[1:n+1] # 排除自己,取前N个最相似的用户
top_similar_users = [users_df['username'][i] for i, score in similarity_scores]
return top_similar_users
# 根据用户行为推荐合适的人
def recommend_users(user_id, user_behavior):
# 计算相似度矩阵
similarity_matrix = calculate_similarity_matrix(users_df)
# 获取与用户行为相似的用户
behavior_similarity = cosine_similarity(user_behavior.reshape(1, -1), users_df.drop(['id', 'name'], axis=1))
behavior_scores = list(enumerate(behavior_similarity[0]))
behavior_scores = sorted(behavior_scores, key=lambda x: x[1], reverse=True)
# 获取前N个最相似的用户,并排除已经喜欢的用户
top_similar_users = get_top_similar_users(user_id, similarity_matrix, 5)
recommended_users = [users_df['username'][i] for i, score in behavior_scores if users_df['name'][i] not in top_similar_users]
return recommended_users[:3] # 返回前3个推荐用户
# 使用了一个用户ID和用户行为向量来测试推荐算法,并打印出推荐的用户姓名。
user_id = 11001
user_behavior = [1, 0, 1, 0, 1, 0, 0, 1, 1] # 用户行为向量,1表示喜欢,0表示不喜欢
recommended_users = recommend_users(user_id, user_behavior)
print("Recommended users:", recommended_users)
表结构设计(部分)
3.5 进行实际的测评操作和结果分析
- 测试概况
本次测试旨在验证腾讯云向量数据库在相亲社交应用中的性能和效果。我们采用了真实的相亲社交应用场景,并设计了一系列测试用例,以评估向量数据库在数据存储、检索、匹配等方面的表现。
- 测试环境
本次测试使用了腾讯云提供的向量数据库服务,并搭建了相应的相亲社交应用环境。测试数据包括用户信息、个人信息、交友偏好等。
-
测试结果
-
数据存储性能
:腾讯云向量数据库在存储大量用户数据时表现出色,写入和读取速度均非常快速,能够满足相亲社交应用对于数据存储的需求。 -
数据检索效率
:通过向量数据库的高效索引和检索机制,我们能够迅速找到与用户兴趣相似的潜在对象。测试结果显示,检索时间低于毫秒级,确保了用户在使用过程中的流畅体验。 -
个性化匹配效果
:利用腾讯云向量数据库的个性化推荐功能,我们根据用户的行为、兴趣和偏好进行了匹配测试。结果显示,匹配准确度较高,推荐的对象与用户的实际需求相符,提高了相亲成功的可能性。
-
4.总结
4.1 腾讯云向量数据库在社交应用中的价值
随着向量数据库和 AI 的结合更加紧密,客户向量数据库的易用性会有更高要求。大模型加速向量数据库进入飞速发展期。
腾讯云向量数据库在相亲社交APP应用中具有重要价值。以下是几个方面的考虑:
- 数据存储和管理:相亲社交APP通常需要存储大量用户数据,包括个人信息、照片、聊天记录等。腾讯云向量数据库提供了高效、可扩展的存储解决方案,能够确保数据的安全性和可靠性。这使得相亲社交APP能够轻松地管理用户数据,并提供更好的用户体验。
- 高性能搜索和匹配:相亲社交APP的核心功能之一是根据用户的喜好和条件进行搜索和匹配。腾讯云向量数据库支持高效的多维向量检索和分析,可以快速地找到与用户兴趣相似的潜在对象。这种高性能的搜索和匹配功能可以提高用户的满意度,并增加相亲成功的机会。
- 个性化推荐:腾讯云向量数据库还具备强大的机器学习和人工智能能力,可以对用户数据进行深度分析,提供个性化的推荐。相亲社交APP可以利用这一功能,根据用户的行为、兴趣和偏好,推荐更符合其需求的对象和活动。这有助于提升用户的参与度和留存率。
- 数据安全和隐私保护:相亲社交APP涉及用户的个人隐私和敏感信息,因此数据安全和隐私保护至关重要。腾讯云向量数据库具备严格的数据加密、访问控制和隐私保护措施,可以确保用户数据的安全性和隐私性。这有助于建立用户对相亲社交APP的信任,并促进平台的健康发展。
综上所述,腾讯云向量数据库在相亲社交APP应用中具有重要价值,可以提供高效的数据存储和管理、高性能搜索和匹配、个性化推荐以及数据安全和隐私保护等功能。这些功能可以提升相亲社交APP的用户体验、满意度和安全性,推动平台的增长和发展。
4.2 腾讯云向量数据库用户隐私和数据安全问题
- 数据加密:腾讯云向量数据库使用强大的加密算法对数据进行加密存储和传输,以确保数据在传输和存储过程中的安全性。
- 访问控制:通过严格的访问控制机制,腾讯云向量数据库确保只有授权用户才能访问和操作数据库。这可以防止未经授权的访问和使用用户数据。
- 隐私保护:腾讯云向量数据库遵循严格的隐私保护原则,不会将用户的数据共享给第三方,除非获得用户的明确授权或法律要求。
- 安全审计:腾讯云向量数据库提供安全审计功能,可以追踪和记录数据库的操作和访问行为,帮助用户发现和应对潜在的安全威胁。
- 灾备恢复:腾讯云向量数据库具备完善的灾备恢复机制,确保在发生意外情况时,用户数据可以及时恢复,减少数据丢失的风险。
需要注意的是,尽管腾讯云向量数据库采取了这些安全措施,但用户在使用数据库时仍需保持警惕,并遵循最佳实践和安全建议。例如,定期更新密码、限制不必要的访问权限、定期备份数据等。通过综合使用这些安全措施和最佳实践,可以最大程度地保护用户隐私和数据安全。
4.3 个人使用体验感受
个人觉得向量数据库的出现,给我们提供了一种全新的数据组织方式,它打破了传统关系型数据库的局限,为有需要者处理非结构化数据提供了高效的解决方案。
- 腾讯云官方产品文档分类详细,方便使用
-
操作便捷: 很多功能 都有快速进入 文档介绍的入口 很方便
-
提供了实例的 CPU,内存、QPS,时延等关键性能指标监控