You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Neo4j Apoc.ml.vertexai.embedding处理超3k Token文本嵌入?

处理Neo4j大文本拆分嵌入的实现方案

核心思路

当文本Token数超过3k时,先将文本拆分为多个符合Token限制的语义片段,分别生成嵌入值,再通过两种方式存储:要么将嵌入值数组直接设为节点属性,要么创建关联的嵌入子节点单独管理。

方案一:拆分后将嵌入值数组存为节点属性

1. 文本拆分逻辑

借助APOC工具按语义单元(段落、句子)拆分长文本,确保每个片段Token数≤3k;若没有合适语义边界,也可按Token计数精准拆分。

2. 完整Cypher示例

// 匹配目标节点
MATCH (doc:Document {id: 1})
// 按段落拆分长文本(可根据实际调整拆分规则)
WITH doc, apoc.text.split(doc.long_content, '\n\n') AS textFragments
// 过滤空片段并校验Token数
WITH doc, [frag IN textFragments WHERE size(frag) > 0 AND apoc.text.tokenCount(frag) <= 3000] AS validFragments
// 为每个片段生成嵌入值(示例用OpenAI模型,替换为你使用的嵌入工具)
WITH doc, [frag IN validFragments | apoc.nlp.embedding.openai([frag], {apiKey: 'your-api-key'})[0].embedding] AS embeddingList
// 将嵌入值数组设为节点属性
SET doc.embeddings = embeddingList
RETURN doc

方案二:创建嵌入子节点关联主节点

若嵌入值数组过大,或需要单独追踪每个片段的嵌入信息,可采用子节点方案:

1. Cypher示例

MATCH (doc:Document {id: 1})
WITH doc, apoc.text.split(doc.long_content, '\n\n') AS textFragments
WITH doc, [frag IN textFragments WHERE size(frag) > 0 AND apoc.text.tokenCount(frag) <= 3000] AS validFragments
UNWIND validFragments AS fragment
// 生成当前片段的嵌入值
WITH doc, fragment, apoc.nlp.embedding.openai([fragment], {apiKey: 'your-api-key'})[0].embedding AS embedding
// 创建嵌入子节点并建立关联
MERGE (emb:EmbeddingFragment {text: fragment, embedding: embedding})
MERGE (doc)-[:HAS_EMBEDDING]->(emb)
RETURN doc, emb

关键注意事项

  • Token精准计数:必须用对应嵌入模型的Token计算工具(如apoc.text.tokenCount)校验片段长度,避免再次触发限制。
  • 语义优先拆分:优先按段落、句子拆分,避免破坏文本语义,保证嵌入结果的有效性。
  • 工具适配:示例用OpenAI嵌入,替换为Neo4j自带嵌入或Hugging Face模型时,需调整对应的Cypher函数参数。

内容的提问来源于stack exchange,提问作者nanda kumar gowda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:02:09