如何用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
相关产品推荐
相关产品推荐

