Pinecone

在 Pinecone 中,集合是索引的静态且不可查询的副本,因此,与其他向量数据库不同,Pinecone 过程作用于索引而不是集合。

然而,用于处理集合上 CRUD 操作的向量数据库过程通常命名为 apoc.ml.<vdbname>.createCollectionapoc.ml.<vdbname>.deleteCollection,因此为了保持一致性,Pinecone 索引过程命名为 apoc.ml.pinecone.createCollectionapoc.ml.pinecone.deleteCollection

以下是所有可用的 Pinecone 过程列表

名称 描述

apoc.vectordb.pinecone.info(hostOrKey, index, $config)

获取指定现有索引的信息,如果不存在则抛出 404 错误

apoc.vectordb.pinecone.createCollection(hostOrKey, index, similarity, size, $config)

创建一个索引,名称由第 2 个参数指定,并具有指定的 similaritysize。默认端点是 <hostOrKey param>/indexes

apoc.vectordb.pinecone.deleteCollection(hostOrKey, index, $config)

删除名称由第 2 个参数指定的索引。默认端点是 <hostOrKey param>/indexes/<index param>

apoc.vectordb.pinecone.upsert(hostOrKey, index, vectors, $config)

在名称由第 2 个参数指定的索引中,执行 upsert 操作,插入向量 [{id: 'id', vector: '<vectorDb>', medatada: '<metadata>'}]. 默认端点是 <hostOrKey param>/vectors/upsert

apoc.vectordb.pinecone.delete(hostOrKey, index, ids, $config)

删除具有指定 ids 的向量。默认端点是 <hostOrKey param>/indexes/<index param>

apoc.vectordb.pinecone.get(hostOrKey, index, ids, $config)

获取具有指定 ids 的向量。默认端点是 <hostOrKey param>/vectors/fetch

apoc.vectordb.pinecone.getAndUpdate(hostOrKey, index, ids, $config)

获取具有指定 ids 的向量,并可选地创建/更新 Neo4j 实体。默认端点是 <hostOrKey param>/vectors/fetch

apoc.vectordb.pinecone.query(hostOrKey, index, vector, filter, limit, $config)

在名称由第 2 个参数指定的索引中,检索最接近定义的 vector 的向量,结果数量由 limit 指定。默认端点是 <hostOrKey param>/query

apoc.vectordb.pinecone.queryAndUpdate(hostOrKey, index, vector, filter, limit, $config)

在名称由第 2 个参数指定的索引中,检索最接近定义的 vector 的向量,结果数量由 limit 指定,并可选地创建/更新 Neo4j 实体。默认端点是 <hostOrKey param>/query

其中第 1 个参数可以是 apoc 配置 apoc.pinecone.<key>.host=myHost 定义的键。

默认的 hostOrKey 是 `"https://api.pinecone.io"`,因此通常对于 createCollectiondeleteCollection 过程可以为 null,而对于其他过程则等于主机名,即 Pinecone 控制面板中指示的主机名

pinecone index

示例

以下示例假设我们要创建和管理一个名为 test-index 的索引。

获取索引信息(它利用 此 API
CALL apoc.vectordb.pinecone.info(hostOrKey, 'test-index', {<optional config>})
表 1. 示例结果

{ "dimension": 3, "environment": "us-east1-gcp", "name": "tiny-index", "size": 3126700, "status": "Ready", "vector_count": 99 }

创建一个索引(它利用 此 API
CALL apoc.vectordb.pinecone.createCollection(null, 'test-index', 'cosine', 4, {<optional config>})
删除一个索引(它利用 此 API
CALL apoc.vectordb.pinecone.deleteCollection(null, 'test-index', {<optional config>})
Upsert 向量(它利用 此 API
CALL apoc.vectordb.pinecone.upsert('https://test-index-ilx67g5.svc.aped-4627-b74a.pinecone.io',
  'test-index',
  [
    {id: '1', vector: [0.05, 0.61, 0.76, 0.74], metadata: {city: "Berlin", foo: "one"}},
    {id: '2', vector: [0.19, 0.81, 0.75, 0.11], metadata: {city: "London", foo: "two"}}
  ],
  {<optional config>})
获取向量(它利用 此 API
CALL apoc.vectordb.pinecone.get($host, 'test-index', [1,2], {<optional config>})
表 2. 示例结果
得分 元数据 id 向量 文本 实体

null

{city: "Berlin", foo: "one"}

null

null

null

null

null

{city: "Berlin", foo: "two"}

null

null

null

null

使用 {allResults: true} 获取向量
CALL apoc.vectordb.pinecone.get($host, 'test-index', ['1','2'], {allResults: true, <optional config>})
表 3. 示例结果
得分 元数据 id 向量 文本 实体

null

{city: "Berlin", foo: "one"}

1

[…​]

null

null

null

{city: "Berlin", foo: "two"}

2

[…​]

null

null

查询向量(它利用 此 API
CALL apoc.vectordb.pinecone.query($host,
    'test-index',
    [0.2, 0.1, 0.9, 0.7],
    { city: { `$eq`: "London" } },
    5,
    {allResults: true, <optional config>})
表 4. 示例结果
得分 元数据 id 向量 文本 实体

1,

{city: "Berlin", foo: "one"}

1

[…​]

null

null

0.1

{city: "Berlin", foo: "two"}

2

[…​]

null

null

我们可以通过利用向量元数据来定义映射,以自动创建一/多个节点和关系。

例如,如果我们使用上面的 upsert 过程创建了 2 个向量,我们可以填充一些现有节点(即 (:Test {myId: 'one'})(:Test {myId: 'two'})

CALL apoc.vectordb.pinecone.queryAndUpdate($host, 'test-index',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            embeddingKey: "vect",
            nodeLabel: "Test",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })

这将填充这两个节点为:(:Test {myId: 'one', city: 'Berlin', vect: [vector1]})(:Test {myId: 'two', city: 'London', vect: [vector2]}),它们将作为 entity 列的结果返回。

我们还可以将映射配置 mode 设置为 CREATE_IF_MISSING(如果节点不存在则创建)、READ_ONLY(仅搜索节点/关系,不进行更新)或 UPDATE_EXISTING(默认行为)

CALL apoc.vectordb.pinecone.queryAndUpdate($host, 'test-index',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            mode: "CREATE_IF_MISSING",
            embeddingKey: "vect",
            nodeLabel: "Test",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })

这将创建并像上面一样创建 2 个新节点。

或者,我们可以填充现有关系(即 (:Start)-[:TEST {myId: 'one'}]→(:End)(:Start)-[:TEST {myId: 'two'}]→(:End)

CALL apoc.vectordb.pinecone.queryAndUpdate($host, 'test-index',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            embeddingKey: "vect",
            relType: "TEST",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })

这将填充这两个关系为:()-[:TEST {myId: 'one', city: 'Berlin', vect: [vector1]}]-()()-[:TEST {myId: 'two', city: 'London', vect: [vector2]}]-(),它们将作为 entity 列的结果返回。

我们还可以将映射用于 apoc.vectordb.pinecone.query 过程,以搜索符合标签/类型和元数据键的节点/关系,而无需进行更新(即,相当于具有 mode: "READ_ONLY" 映射配置的 *.queryOrUpdate 过程)。

例如,对于前面的关系,我们可以执行以下过程,该过程仅返回 rel 列中的关系

CALL apoc.vectordb.pinecone.query($host, 'test-index',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            embeddingKey: "vect",
            relType: "TEST",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })

我们也可以将映射与 apoc.vectordb.pinecone.get* 过程一起使用

为了优化性能,我们可以选择在使用 apoc.vectordb.pinecone.query*apoc.vectordb.pinecone.get* 过程时 YIELD 什么。

例如,通过执行 CALL apoc.vectordb.pinecone.query(…​) YIELD metadata, score, id,RestAPI 请求将包含 {"with_payload": false, "with_vectors": false},这样我们就不会返回不需要的其他值。

可以如下所示将向量数据库过程与 apoc.ml.rag 一起执行

CALL apoc.vectordb.pinecone.getAndUpdate($host, $index, [<id1>, <id2>], $conf) YIELD node, metadata, id, vector
WITH collect(node) as paths
CALL apoc.ml.rag(paths, $attributes, $question, $confPrompt) YIELD value
RETURN value
删除向量(它利用 此 API
CALL apoc.vectordb.pinecone.delete($host, 'test-index', ['1','2'], {<optional config>})
© . All rights reserved.