事情本身不复杂,线索都在日志里。Neo4j 5.18 上用 CREATE VECTOR INDEX chunk_vec FOR (n:Chunk) ON n.embedding OPTIONS {indexConfig: {`vector.dimensions`: 1536, `vector.similarity_function`: 'cosine'}} 建索引,写入 1024 维向量时报 Wrong dimension, expected 1536 but got 1024,查询还会遇到索引 OFFLINE。

第一反应是「写入的向量是列表不是 float 数组,被当成无效属性」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。换 embedding 模型后维度从 1536 变成 1024,索引定义没改。还有一种是索引刚建完还在 POPULATING,查询直接被拒。

另外,旧索引名没删,新建时命中同名冲突。

动手时先看索引状态和填充进度

cypher-shell -u neo4j -p pass 'SHOW INDEXES YIELD name, state, populationPercent, type'

再往下确认现有向量维度是否统一

cypher-shell -u neo4j -p pass 'MATCH (n:Chunk) RETURN size(n.embedding) AS d, count(*) ORDER BY d'

然后删掉旧索引并按新维度重建

cypher-shell -u neo4j -p pass 'DROP INDEX chunk_vec IF EXISTS; CREATE VECTOR INDEX chunk_vec FOR (n:Chunk) ON n.embedding OPTIONS {indexConfig: {`vector.dimensions`: 1024, `vector.similarity_function`: `cosine`}}'

等前面都确认过,再等索引在线后再跑一次相似度查询

cypher-shell -u neo4j -p pass 'CALL db.awaitIndexes(300); MATCH (n:Chunk) WITH n ORDER BY vector.similarity.cosine(n.embedding, $q) DESC LIMIT 5 RETURN n.id'

改完先别撤,确认这几项。SHOW INDEXES 里状态为 ONLINE、populationPercent 为 100,同样的向量写入不再报维度错误,KNN 查询返回五条且分数递减。

维度写在索引定义里,改模型就必须删索引重建,Neo4j 不会自动迁移;重建前把旧向量备份一份,回滚时不用重新跑 embedding。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189