EN

命名实体识别:完整实现指南

使用LLM和spaCy构建生产级NER系统

返回教程列表
进阶10 分钟

命名实体识别:完整实现指南

使用LLM和spaCy构建生产级NER系统

LLM 实体识别(NER)完整实现(2026):提示词定义实体即用,免训练数据。关键设计:精确子串规则+text.find() 验证一招同时杀幻觉实体和找回字符偏移、闭集类型表、mini 档模型+few-shot。含归一化/实体链接分层与按类型评估。

使用LLM实现命名实体识别:完整实现指南

NER——从文本中提取人物、组织、地点、日期、金额——过去意味着为每个实体模式训练一个spaCy/BERT模型。LLM改变了构建方式:在提示词中定义实体,立即获得结构化提取结果,无需训练数据。 本指南实现了生产级LLM-NER,涵盖了经典模型仍然胜出的场景,以及无论哪种方式你都需要进行的评估。

LLM-NER vs 经典NER:真正的权衡

LLM提示经典(spaCy/微调BERT)

设置几分钟(一个提示词)数天以上(训练数据、训练) 自定义实体类型简单——描述即可每种类型需要标注样本 标准类型准确率强强(且稳定) 小众领域类型("药物剂量"、"条款类型")胜出——零样本从描述出发需要数百个标注 大规模成本按token计费,累积训练后近乎零 延迟受限于API本地毫秒级 字符偏移不可靠原生且精确

经验法则:LLM适用于自定义模式、低/中等规模、快速迭代;经典模型适用于标准实体的大规模处理或需要精确字符跨度时(高亮、遮盖叠加)。下面的混合方案涵盖了其余情况。

生产实现

python
import json
from openai import OpenAI

client = OpenAI()

NER_PROMPT = '''从文本中提取实体。返回JSON: {"entities": [{"text": "<来自输入的精确子串>", "type": "PERSON" | "ORG" | "LOCATION" | "DATE" | "MONEY" | "PRODUCT", "context": "<周围5个词的片段>"}]} 规则:

  • "text"必须从输入中完全复制(相同大小写/空格)。
  • 仅限列出的类型。不要解释:直接提取"next Tuesday",不要解析它。
  • 如果没有,返回空列表。仅JSON。
  • 文本:{input}'''

    def extract_entities(text: str) -> list[dict]: resp = client.chat.completions.create( model='gpt-4o-mini', # NER是mini级别的工作 response_format={'type': 'json_object'}, messages=[{'role': 'user', 'content': NER_PROMPT.replace('{input}', text)}], ) ents = json.loads(resp.choices[0].message.content)['entities'] # 使LLM-NER值得信赖的验证步骤: verified = [] for e in ents: idx = text.find(e['text']) if idx >= 0: # 精确匹配定位 verified.append({**e, 'start': idx, 'end': idx + len(e['text'])}) return verified

    关键设计选择:

  • 精确子串规则 + text.find() 验证——这一招彻底消灭了幻觉实体类(任何不在输入中的内容都会被丢弃)*并且*恢复了字符偏移,一举解决了LLM-NER的两个经典弱点。(与合同分析OCR验证中相同的字符串定位技巧。)
  • 闭集类型列表——开放式的类型标注容易漂移("Company"、"ORG"、"organization");用枚举约束并验证(模式验证)。
  • Mini档模型 + 必要时few-shot:在提示词中加入3-5个你领域棘手案例的示例,比升级模型档次更能提升准确率。
  • 对长文档分块处理(边界处有重叠),之后按(文本,类型)去重——对于批量运行,使用批量API
  • 超越提取:链接与归一化

    真正的流水线很少止步于跨度:

  • 归一化("next Tuesday" → 日期,"$2.3M" → 2300000):作为对已验证实体的*第二遍*处理,此时模型可以进行解释——保持提取的字面性和归一化的分离使得错误可调试。
  • 实体链接("Apple" → 公司 vs 水果;"J. Smith" = "John Smith"?):候选的嵌入相似度 + 灰色地带的LLM裁决——与去重相同的漏斗方法。
  • 关系提取("PERSON works-for ORG")在实体质量得到验证后,可以使用相同的提示词形式——在此之前不要急于进行。
  • 评估(不可省略,2小时)

    标注100份代表性文档(你的真实数据,包括那些难处理的)。按实体类型计算精确率和召回率——而不是整体(聚合指标会掩盖"MONEY是99%,PRODUCT是60%")。每次修改提示词或模型后重新运行(评估规范)。典型发现:标准类型在验证步骤后精确率达到90%以上;自定义类型初始较低,通过few-shot示例得到改善。

    常见问题

    GLiNER风格的紧凑型零样本NER模型? 一个真正不错的中间选项:像LLM一样零样本自定义类型,像经典模型一样本地/低成本运行——当数据量增长但模式不断变化时,值得进行基准测试。

    多语言? LLM-NER可以在一个提示词中处理主要语言——用你的评估集验证精确子串规则在每个语言的标记化特性下是否仍然有效。

    PII脱敏用例? 本流水线 + 偏移量 = 脱敏;对于合规级别的PII,请与专用检测器(Presidio)配合使用——两个独立系统之间的不一致是有益的(隐私模式)。


    *最后更新:2026年6月。*

    相关工具

    spacypython