微信扫码
与创始人交个朋友
我要投稿
在前面的文章中,我们深入讲解了向量数据库以及它在大模型中发挥的作用,在本篇文章,我将使用前面提到的 Pinecone 进行一个实战,帮助大家了解向量数据库的实际使用!
注:本次使用Python语言进行说明
1、安装依赖项
pip install pinecone-client pip install sentence-transformers
sentence-transformers 库的作用就是将我们的文本数据编码为向量嵌入,并存储在向量数据库中。
sentence-transformers 提供了各种预训练的架构,例如BERT、RoBERTa和DistilBERT,并专门针对句子嵌入进行了微调。
2、导入依赖
pinecone , sentence_transformers
3、下载并实例化 DistilBERT 模型
我们在前面的文章也提到,DistilBERT 相比于BERT体积减少了40%,所以本次使用这个模型作为示例
model_name = model = SentenceTransformer(model_name)
4、获取密钥
要使用 Pinecone[1] 服务并创建向量数据库,我们需要一个 Pinecone API 密钥。
注册后我们进入如下页面,并从仪表板的左侧面板中获取您的 API 密钥:
使用默认的API Keys,或者创建一个新的都行
5、获取密钥,建立连接
pinecone_key = pc = Pinecone(api_key=pinecone_key)
可以通过 list_indexes 方法测试连接是否成功
(pc.list_indexes()) {: []}
可能会遇到 huggingface 无法访问的问题
有很多种解决方式,这里我是设置了代理
6、创建索引
这里的索引有点像数据库,跟ES的index含义有点类似,创建索引使用的是 create_index 方法,代码如下
pc.create_index( name=, dimension=, metric=, spec=PodSpec(environment=) )
参数说明:
name:索引名称
dimension:存储在这个索引中的向量的维数。你要插入的向量是多少维,这里就该设置多少,因为我们用的是Sentence Transform模型返回的嵌入维数,所以值为768
metric:用于计算向量之间相似性的方法。euclidean 表示使用欧几里得距离
spec:PodSpec 指定了创建索引的环境。在此示例中,索引是在名为gcp-starter的GCP(Google Cloud Platform)环境中创建的
刷新面板也能看到我们创建的索引
7、上传向量数据
现在我们已经创建了索引,我们可以生成向量嵌入数据,并上传到我们的索引。
为此,我们需要创建一些文本数据并使用SentenceTransformer模型对其进行编码,示例数据如下:
data = [ {: , : }, {: , : }, {: , : }, {: , : }, {: , : }, {: , : }, {: , : }, {: , : }, {: , : }, {: , : } ]
我们为这些句子创建向量嵌入,如下所示:
vector_data = [] sentence in data: embedding = model.encode(sentence[]) vector_info = {:sentence[], : embedding.tolist()} vector_data.(vector_info)
vector_data 的数据结构如下(values的长度就是它的维数):
因为一个账户下可以创建多个索引,所以在把向量数据上传前,需要先指定一个索引
index = pc.Index()
这里使用的上传方法是Upsert,它是一种结合了update和insert操作的数据库操作。如果文档尚不存在,它将向集合中插入新文档;如果存在,则更新现有文档(如果你用过MongoDB,你会对这个用法非常熟悉)
>>> index.(vectors=vector_data) {: }
虽然返回结果已经告诉我们插入了10条数据,如果你想双重确认的话,还可以通过 describe_index_stats 再次确认
>>> index.() {: , : , : {: {: }}, : }
返回参数说明:
dimension:存储在索引中的向量的维数
index_fullness:衡量索引有多满的指标,通常表示索引中槽位被占用的百分比。
namespaces:索引中每个命名空间的统计信息。
total_vector_count:所有命名空间的索引中向量的总数
8、相似性搜索
现在向量数据已经存储到索引中,这时可以利用相似性搜索来查看获得的结果。
首先,我们定义搜索文本并生成其嵌入向量:
search_text = search_embedding = model.encode(search_text).tolist()
接着执行下面的查询:
>>> index.(vector=search_embedding, top_k=) {: [{: , : , : []}, {: , : , : []}, {: , : , : []}], : , : {: }}
返回的是最接近的三个文本,因为我们用的是欧几里得算法,所以距离越短,表示两个向量越接近,可以看到相似性分数也是从小到大的。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-04-25
2024-05-14
2024-07-18
2024-08-13
2024-04-26