链载Ai

标题: AI 向量数据库 Pinecone 实战 [打印本页]

作者: 链载Ai    时间: 昨天 22:23
标题: AI 向量数据库 Pinecone 实战

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">在前面的文章中,我们深入讲解了向量数据库以及它在大模型中发挥的作用,在本篇文章,我将使用前面提到的 Pinecone 进行一个实战,帮助大家了解向量数据库的实际使用!

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">注:本次使用Python语言进行说明

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">1、安装依赖项

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;">
pipinstallpinecone-client


pipinstallsentence-transformers

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">sentence-transformers 库的作用就是将我们的文本数据编码为向量嵌入,并存储在向量数据库中。

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">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=)
)


参数说明:


刷新面板也能看到我们创建的索引


7、上传向量数据

现在我们已经创建了索引,我们可以生成向量嵌入数据,并上传到我们的索引。


为此,我们需要创建一些文本数据并使用SentenceTransformer模型对其进行编码,示例数据如下:

data=[
{:,:},
{:,:},
{:,:},
{:,:},
{:,:},
{:,:},
{:,:},
{:,:},
{:,:},
{:,:}
]


我们为这些句子创建向量嵌入,如下所示:

vector_data=[]

sentenceindata:
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.()

{:,
:,
:{:{:}},
:}


返回参数说明:

8、相似性搜索

现在向量数据已经存储到索引中,这时可以利用相似性搜索来查看获得的结果。


首先,我们定义搜索文本并生成其嵌入向量:

search_text=
search_embedding=model.encode(search_text).tolist()


接着执行下面的查询:

>>>index.(vector=search_embedding,top_k=)

{:[{:,:,:[]},
{:,:,:[]},
{:,:,:[]}],
:,
:{:}}


返回的是最接近的三个文本,因为我们用的是欧几里得算法,所以距离越短,表示两个向量越接近,可以看到相似性分数也是从小到大的。









欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5