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

Spacy实体链接器结合Transformer Listener遇维度未设置错误

问题:使用Transformer嵌入的Spacy实体链接器维度错误

问题背景

我有一个由Transformer和NER组件构成的预训练管道,尝试创建一个使用Transformer生成的嵌入而非CNN的实体链接器,添加链接器的代码如下:

entity_linker = nlp.add_pipe("entity_linker",config = {
    "labels_discard": [],
    "n_sents": 0,
    "incl_prior": True,
    "incl_context": True,
    "model": {
    "@architectures": "spacy.EntityLinker.v2",
    "tok2vec": {
    "@architectures" : "spacy-transformers.TransformerListener.v1",
    "pooling" : {"@layers":"reduce_mean.v1"},
    "upstream" : "*"
    },
    "nO": 768
    },
    "entity_vector_length": 768,
    "get_candidates": {'@misc': 'spacy.CandidateGenerator.v1'},
    "threshold": None,
})

运行时触发维度未设置错误:

File "/home/blanco/wiki_kb/.venv/lib/python3.9/site-packages/spacy_transformers/layers/listener.py", line 64, in forward
width = model.get_dim("nO")
File "/home/blanco/wiki_kb/.venv/lib/python3.9/site-packages/thinc/model.py", line 175, in get_dim
raise ValueError(err)ValueError: Cannot get dimension 'nO' for model 'transformer-listener': value unset

查资料得知这个错误通常在微调管道后期组件且冻结Transformer时出现,但我还没到这个阶段。我的最终目标是让链接器用Transformer嵌入处理实体和上下文(可学习线性层降维或不训练),对比同一预训练管道生成的知识库嵌入。

当前环境:

  • Python 3.9.13
  • spacy 3.4.4
  • spacy-alignments 0.9.0
  • spacy-legacy 3.0.12
  • spacy-loggers 1.0.4

解决方案

这个错误是因为TransformerListener无法自动获取Transformer输出的维度,需要显式指定nO参数,同时要确保Listener和上游Transformer的维度匹配。修改后的配置如下:

entity_linker = nlp.add_pipe("entity_linker", config={
    "labels_discard": [],
    "n_sents": 0,
    "incl_prior": True,
    "incl_context": True,
    "model": {
        "@architectures": "spacy.EntityLinker.v2",
        "tok2vec": {
            "@architectures": "spacy-transformers.TransformerListener.v1",
            "pooling": {"@layers": "reduce_mean.v1"},
            "upstream": "*",
            "nO": 768  # 显式设置与Transformer输出一致的维度
        },
        "nO": 768
    },
    "entity_vector_length": 768,
    "get_candidates": {'@misc': 'spacy.CandidateGenerator.v1'},
    "threshold": None,
})

额外注意事项:

  • 如果使用的是其他Transformer模型(比如roberta-large输出维度为1024),需要对应修改nO的数值,确保和模型输出维度一致
  • 确保Transformer组件已正确添加到管道中,且运行顺序在实体链接器之前
  • 初始化管道时调用nlp.initialize(),可让Spacy自动完成维度推断,避免潜在的维度不匹配问题

内容的提问来源于stack exchange,提问作者gblanco10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:37:24