GenAI 集成
要使用 GenAI 插件,您需要以下任一 GenAI 提供商的账户和 API 凭据:Vertex AI、OpenAI、Azure OpenAI 和 Amazon Bedrock。
要了解更多关于在 Neo4j 中使用嵌入的信息,请参阅向量索引 → Neo4j 中的向量和嵌入。
有关如何使用 GenAI 插件的实践指南,请参阅GenAI 文档 - 嵌入和向量索引教程 → 使用云 AI 提供商创建嵌入。
安装
GenAI 插件在 Neo4j Aura 中默认启用。
该插件需要安装在自管实例上。具体操作是将 neo4j-genai.jar
文件从 Neo4j 主目录中的 /products
移动到 /plugins
,或者如果您使用 Docker,则通过添加额外参数 --env NEO4J_PLUGINS='["genai"]'
来启动 Docker 容器。欲了解更多信息,请参阅操作手册 → 配置插件。
在 Neo4j 5.23 之前,GenAI 插件仅在 Neo4j Enterprise Edition 中可用。 |
示例图
本页的示例使用Neo4j 电影推荐数据集,重点关注 Movie
节点的 plot
和 title
属性。
该图包含 28863 个节点和 332522 条关系。其中有 9083 个 Movie
节点具有 plot
和 title
属性。
此处的嵌入是使用 OpenAI(模型 text-embedding-ada-002 )生成的,生成 1536 维向量。 |
生成并存储单个嵌入
使用 genai.vector.encode()
函数为单个值生成向量嵌入。
genai.vector.encode()
的签名 函数genai.vector.encode(resource :: STRING, provider :: STRING, configuration :: MAP = {}) :: LIST<FLOAT>
该函数每次调用都会发送一个 API 请求,这可能导致大量的网络流量和延迟开销。如果您想一次性生成多个嵌入,请使用批量生成并存储嵌入。 |
使用 db.create.setNodeVectorProperty
过程将嵌入存储到节点属性中。
db.create.setNodeVectorProperty
的签名 过程db.create.setNodeVectorProperty(node :: NODE, key :: STRING, vector :: ANY)
使用 db.create.setRelationshipVectorProperty
过程将嵌入存储到关系属性中。
db.create.setRelationshipVectorProperty
的签名 过程 在 5.18 中引入db.create.setRelationshipVectorProperty(relationship :: RELATIONSHIP, key :: STRING, vector :: ANY)
-
node
或relationship
是将存储新属性的实体。 -
key
(一个STRING
)是包含嵌入的新属性的名称。 -
vector
是包含嵌入的对象。
嵌入作为属性存储在节点或关系上,类型为 LIST<INTEGER | FLOAT>
。
MATCH (m:Movie {title:'Godfather, The'})
WHERE m.plot IS NOT NULL AND m.title IS NOT NULL
WITH m, m.title || ' ' || m.plot AS titleAndPlot (1)
WITH m, genai.vector.encode(titleAndPlot, 'OpenAI', { token: $token }) AS propertyVector (2)
CALL db.create.setNodeVectorProperty(m, 'embedding', propertyVector) (3)
RETURN m.embedding AS embedding
1 | 将 Movie 的 title 和 plot 连接成一个 STRING 。 |
2 | 从 titleAndPlot 创建一个 1536 维的嵌入。 |
3 | 将 propertyVector 作为新的 embedding 属性存储到《教父》节点上。 |
+----------------------------------------------------------------------------------------------------+
| embedding |
+----------------------------------------------------------------------------------------------------+
| [0.005239539314061403, -0.039358530193567276, -0.0005175105179660022, -0.038706034421920776, ... ] |
+----------------------------------------------------------------------------------------------------+
此结果仅显示 1536 个嵌入数字中的前 4 个。 |
批量生成并存储嵌入
使用 genai.vector.encodeBatch
过程通过单个 API 请求生成多个向量嵌入。该过程将资源列表作为输入,并返回相同数量的结果行,而不是单个结果行。
该过程尝试在单个 API 请求中为所有提供的资源生成嵌入。因此,建议查阅相应提供商的文档,以了解例如每次请求可生成的最大嵌入数量的详细信息。 |
genai.vector.encodeBatch
的签名 过程genai.vector.encodeBatch(resources :: LIST<STRING>, provider :: STRING, configuration :: MAP = {}) :: (index :: INTEGER, resource :: STRING, vector :: LIST<FLOAT>)
每个返回的行包含以下列
-
index
(一个INTEGER
)是输入列表中相应元素的索引,用于帮助将结果与输入关联起来。 -
resource
(一个STRING
)是输入资源的名称。 -
vector
(一个LIST<FLOAT>
)是此资源生成的向量嵌入。
MATCH (m:Movie WHERE m.plot IS NOT NULL)
WITH m
LIMIT 20
WITH collect(m) AS moviesList (1)
WITH moviesList, [movie IN moviesList | movie.title || ': ' || movie.plot] AS batch (2)
CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $token }) YIELD index, vector
WITH moviesList, index, vector
CALL db.create.setNodeVectorProperty(moviesList[index], 'embedding', vector) (3)
MATCH (m:Movie WHERE m.plot IS NOT NULL)
WITH collect(m) AS moviesList, (1)
count(*) AS total,
100 AS batchSize (2)
UNWIND range(0, total-1, batchSize) AS batchStart (3)
CALL (moviesList, batchStart, batchSize) { (4)
WITH [movie IN moviesList[batchStart .. batchStart + batchSize] | movie.title || ': ' || movie.plot] AS batch (5)
CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $token }) YIELD index, vector
CALL db.create.setNodeVectorProperty(moviesList[batchStart + index], 'embedding', vector) (6)
} IN CONCURRENT TRANSACTIONS OF 1 ROW (7)
1 | 将所有返回的 Movie 节点收集到一个 LIST<NODE> 中。 |
2 | batchSize 定义了 moviesList 中一次性处理的节点数量。由于向量嵌入可能非常大,较大的批处理大小可能需要 Neo4j 服务器上更多的内存。过大的批处理大小也可能超过提供商的阈值。 |
3 | 以 batchSize 为增量处理 Movie 节点。结束范围 total-1 是因为 range 在两端都包含。 |
4 | 一个CALL 子查询为每个批次执行一个单独的事务。请注意,此 CALL 子查询使用变量作用域子句(在 Neo4j 5.23 中引入)来导入变量。如果您使用的是旧版 Neo4j,请改用导入 WITH 子句。 |
5 | batch 是一个字符串列表,每个字符串都是一部电影的 title 和 plot 的连接。 |
6 | 该过程将 vector 设置为 moviesList 中位于 batchStart + index 位置的节点的名为 embedding 的属性值。 |
7 | 将一次性处理的批次数量设置为 1 。事务中的并发性是在 Cypher 5.21 中引入的(请参阅CALL 子查询 → 并发事务)。 |
此示例可能无法扩展到更大的数据集,因为 collect(m) 要求将整个结果集加载到内存中。有关更适合处理大量数据的替代方法,请参阅GenAI 文档 - 嵌入和向量索引教程 → 使用云 AI 提供商创建嵌入。 |
GenAI 提供商
支持以下 GenAI 提供商用于生成向量嵌入。每个提供商都有自己的配置映射,可以传递给 genai.vector.encode
或 genai.vector.encodeBatch
。
Vertex AI
-
标识符(
provider
参数):"VertexAI"
键 | 类型 | 描述 | 默认值 |
---|---|---|---|
|
|
API 访问令牌。 |
必需 |
|
|
GCP 项目 ID。 |
必需 |
|
|
您要调用的模型的名称。
|
|
|
|
发送 API 请求的 GCP 区域。
|
|
|
|
预期的下游应用程序(请参阅提供商文档)。指定的 |
|
|
|
正在编码的文档的标题(请参阅提供商文档)。指定的 |
OpenAI
-
标识符(
provider
参数):"OpenAI"
键 | 类型 | 描述 | 默认值 |
---|---|---|---|
|
|
API 访问令牌。 |
必需 |
|
|
您要调用的模型的名称。 |
|
|
|
您希望将向量缩减到的维数。仅支持某些模型。 |
取决于模型。 |
Azure OpenAI
-
标识符(
provider
参数):"AzureOpenAI"
与其他提供商不同,模型是在 Azure 上创建部署时配置的,因此不属于配置映射的一部分。 |
键 | 类型 | 描述 | 默认值 |
---|---|---|---|
|
|
API 访问令牌。 |
必需 |
|
|
部署模型的资源的名称。 |
必需 |
|
|
模型部署的名称。 |
必需 |
|
|
您希望将向量缩减到的维数。仅支持某些模型。 |
取决于模型。 |
Amazon Bedrock
-
标识符(
provider
参数):"Bedrock"
键 | 类型 | 描述 | 默认值 |
---|---|---|---|
|
|
AWS 访问密钥 ID。 |
必需 |
|
|
AWS 密钥。 |
必需 |
|
|
您要调用的模型的名称。
|
|
|
|
发送 API 请求的 AWS 区域。
|
|