개체명 인식(NER)이 "Paris"를 찾았습니다. 엔티티 연결(Entity Linking)은 이것이 프랑스의 파리(Paris, France)인지, 패리스 힐튼(Paris Hilton)인지, 미국 텍사스의 패리스(Paris, Texas)인지, 트로이의 왕자 파리스(Paris)인지를 결정합니다. 연결이 없으면 지식 그래프(knowledge graph)는 모호한 상태로 남게 됩니다.
유형: Build
언어: Python
선수 강의: Phase 5 · 06 (NER), Phase 5 · 24 (Coreference Resolution)
예상 시간: 약 60분
학습 목표
엔티티 연결(Entity Linking; EL)이 멘션(mention)을 지식 베이스(Knowledge Base; KB)의 고유 항목으로 연결하는 과제임을 설명합니다.
후보 생성(candidate generation)과 중의성 해소(disambiguation)를 분리해 이해합니다.
사전 확률+문맥(prior + context), 임베딩 기반(embedding-based), 생성형(generative) 엔티티 연결의 차이를 비교합니다.
다음과 같은 문장이 있다고 합시다. "Jordan beat the press." 개체명 인식(NER)은 "Jordan"을 PERSON으로 태깅했습니다. 좋습니다. 하지만 어떤 조던(Jordan)일까요?
마이클 조던(Michael Jordan, 농구 선수)?
마이클 B. 조던(Michael B. Jordan, 배우)?
마이클 I. 조던(Michael I. Jordan, UC 버클리의 머신러닝 교수 — 머신러닝 논문에서 실제로 자주 일어나는 혼동입니다)?
요르단(Jordan, 국가)?
조던(Jordan, 히브리 이름)?
엔티티 연결(EL)은 각 멘션을 지식 베이스의 고유 항목으로 해소(resolve)하는 작업입니다. 지식 베이스로는 위키데이터(Wikidata), 위키피디아(Wikipedia), DBpedia, 또는 도메인 특화 KB를 사용할 수 있습니다. 하위 과제는 두 가지입니다.
후보 생성(Candidate generation). "Jordan"이 주어졌을 때, 어떤 KB 항목이 가능성 있는 후보일까요?
중의성 해소(Disambiguation). 문맥이 주어졌을 때, 어떤 후보가 올바른 답일까요?
두 단계 모두 학습 가능하며, 둘 다 벤치마크가 잘 정립되어 있습니다. 결합된 파이프라인은 지난 10년 동안 안정적으로 유지되어 왔습니다. 시간에 따라 바뀌는 것은 중의성 해소기(disambiguator)의 품질입니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.개체명 인식(NER)만으로는 해결할 수 없지만 엔티티 연결(Entity Linking)이 해결하는 문제는 무엇인가요?
2.엔티티 연결이 후보 생성(candidate generation)과 중의성 해소(disambiguation)라는 두 개의 별도 단계로 나뉘는 이유는 무엇인가요?
0/2 답변 완료
개념
후보 생성(Candidate generation). 멘션의 표면형(surface form, 예: "Jordan")이 주어지면, 별칭 색인(alias index)에서 후보를 조회합니다. 위키피디아의 별칭 사전은 대부분의 명명된 엔티티(named entity)를 포괄합니다. 예를 들어 "JFK"는 존 F. 케네디(John F. Kennedy), 재클린 케네디(Jacqueline Kennedy), JFK 공항, 영화 〈JFK〉 등을 반환할 수 있습니다. 일반적인 색인은 멘션당 10~30개의 후보를 반환합니다.
중의성 해소: 세 가지 접근법.
사전 확률 + 문맥(Prior + context, Milne & Witten, 2008).P(엔티티 | 멘션) × 문맥 유사도(엔티티, 텍스트) 점수를 사용합니다. 잘 동작하고, 빠르며, 별도 학습이 필요 없습니다.
임베딩 기반(Embedding-based, ESS / REL / BLINK). 멘션과 문맥을 인코딩하고, 각 후보의 설명도 인코딩한 뒤, 최대 코사인 유사도(cosine similarity)를 선택합니다. 2020~2024년의 기본 접근법이었습니다.
생성형(Generative, GENRE 2021; LLM 기반 2023+). 엔티티의 정규화된 이름(canonical name)을 토큰 단위로 디코딩합니다. 유효한 엔티티 이름의 트라이(trie)로 제약하므로 출력이 유효한 KB id임이 보장됩니다.
종단 간(end-to-end) vs 파이프라인. 최신 모델(ELQ, BLINK, ExtEnD, GENRE)은 NER + 후보 생성 + 중의성 해소를 한 번에 처리합니다. 그래도 운영 환경에서는 구성 요소를 교체할 수 있는 파이프라인 시스템이 여전히 지배적입니다.
두 가지 측정 지표
멘션 재현율(Mention recall, 후보 생성 단계). 정답 KB 항목이 후보 리스트에 들어 있는 골드 멘션의 비율입니다. 전체 파이프라인의 성능 하한(floor)을 결정합니다.
중의성 해소 정확도/F1(Disambiguation accuracy / F1). 올바른 후보가 주어졌을 때, top-1이 얼마나 자주 맞는지를 나타냅니다.
항상 두 지표를 함께 보고합니다. 후보 재현율이 80%인 시스템은 중의성 해소가 99%여도 결국 파이프라인 전체 성능은 80%입니다.
색인 시점에는 모든 KB 엔티티를 한 번 임베딩해 둡니다. 질의 시점에는 멘션과 문맥을 한 번 임베딩한 뒤, 후보 풀(candidate pool)에 대해 내적(dot product)을 계산하고 최댓값을 선택합니다.
Step 4: 생성형 엔티티 연결(개념)
GENRE는 엔티티의 위키피디아 제목(title)을 문자 단위로 디코딩합니다. 제약 디코딩(constrained decoding, lesson 20 참고)을 통해 유효한 제목만 출력될 수 있도록 제한합니다. KB에 기반한 트라이와 긴밀히 결합되어 있습니다. 이 흐름을 잇는 최신 후속작은 REL-GEN과 구조화된 출력(structured output)을 사용하는 LLM 프롬프트 기반 엔티티 연결입니다.
prompt = f"""Text: {text}
Mention: {mention}
List the best Wikipedia title for this mention.
Respond with JSON: {{"title": "..."}}"""
화이트리스트(예: Outlines choice)와 결합하면, 2026년에 출시(ship)하기 가장 단순한 엔티티 연결 파이프라인이 됩니다.
Step 5: AIDA-CoNLL에서 평가하기
AIDA-CoNLL은 표준 엔티티 연결 벤치마크입니다. 로이터(Reuters) 기사 1,393개와 멘션 약 34,000개, 위키피디아 엔티티가 포함되어 있습니다. KB 내 정확도(in-KB accuracy, P@1)와 KB 외 NIL 탐지율(out-of-KB NIL-detection rate)을 보고합니다.
자주 만나는 함정(Pitfalls)
NIL 처리. 일부 멘션은 KB에 존재하지 않습니다. 새로 등장한 엔티티(emerging entity)나 잘 알려지지 않은 인물이 그렇습니다. 시스템은 잘못된 엔티티를 추측하는 대신 NIL을 예측해야 합니다. NIL 성능은 별도로 측정합니다.
멘션 경계 오류(Mention boundary errors). 상위 단계의 NER가 부분 스팬(partial span)을 놓치는 경우입니다. 예를 들어 "Bank of America"를 "Bank"만 태깅하면 엔티티 연결 재현율이 떨어집니다.
인기도 편향(Popularity bias). 학습된 시스템은 자주 등장하는 엔티티를 과도하게 예측하는 경향이 있습니다. 머신러닝 논문에서 "Michael I. Jordan" 멘션이 농구 선수 조던으로 연결되는 일이 잦습니다.
교차 언어 엔티티 연결(Cross-lingual EL). 중국어 텍스트의 멘션을 영어 위키피디아 엔티티로 매핑하는 작업입니다. 다국어 인코더(multilingual encoder) 또는 번역 단계가 필요합니다.
KB 노후화(KB staleness). 새로 생긴 회사, 사건, 인물은 작년 위키피디아 덤프에 없습니다. 운영 파이프라인에는 갱신 루프(refresh loop)가 필요합니다.
사용하기
2026년 기준 스택은 다음과 같습니다.
상황
선택
범용 영어 + 위키피디아
BLINK 또는 REL
교차 언어, KB = 위키피디아
mGENRE
LLM 친화적, 하루 멘션 수가 적은 경우
후보 리스트 + 제약된 JSON으로 Claude/GPT-4 프롬프트
도메인 특화 KB(의료, 법률)
KB 인지 검색(KB-aware retrieval)이 있는 커스텀 BERT + 도메인 AIDA 형식 데이터셋으로 파인튜닝
매우 낮은 지연 시간이 필요한 경우
정확 일치 사전 확률만 사용(Milne-Witten 베이스라인)
연구용 최첨단(SOTA)
GENRE / ExtEnD / 생성형 LLM 기반 EL
2026년에 운영 환경에 배포되는 패턴은 다음과 같습니다. NER → 상호참조 해결(coref) → 각 멘션에 대한 엔티티 연결 → 클러스터를 클러스터당 하나의 정규 엔티티로 병합. 출력은 문서 내 엔티티마다 하나의 KB id이며, 멘션마다 하나가 아닙니다.
산출물 만들기
outputs/skill-entity-linker.md로 저장합니다.
---
name: entity-linker
description: Design an entity linking pipeline — KB, candidate generator, disambiguator, evaluation.
version: 1.0.0
phase: 5
lesson: 25
tags: [nlp, entity-linking, knowledge-graph]
---
Given a use case (domain KB, language, volume, latency budget), output:
Guide the student in Korean.
1. Knowledge base. Wikidata / Wikipedia / custom KB. Version date. Refresh cadence.
2. Candidate generator. Alias-index, embedding, or hybrid. Target mention recall @ K.
3. Disambiguator. Prior + context, embedding-based, generative, or LLM-prompted.
4. NIL strategy. Threshold on top score, classifier, or explicit NIL candidate.
5. Evaluation. Mention recall @ 30, top-1 accuracy, NIL-detection F1 on held-out set.
Refuse any EL pipeline without a mention-recall baseline (you cannot evaluate a disambiguator without knowing candidate gen surfaced the right entity). Refuse any pipeline using LLM-prompted EL without constrained output to valid KB ids. Flag systems where popularity bias affects minority entities (e.g. name-clashes) without domain fine-tuning.
이 스킬은 도메인 KB, 언어, 처리량, 지연 시간 예산을 입력으로 받아 지식 베이스, 후보 생성기, 중의성 해소기, NIL 전략, 평가 방식을 설계하도록 합니다. 멘션 재현율 베이스라인이 없는 엔티티 연결 파이프라인은 거부하고, 유효한 KB id로 출력을 제약하지 않는 LLM 프롬프트 기반 EL도 거부하며, 인기도 편향이 소수 엔티티(예: 이름 충돌)에 영향을 주는데 도메인 파인튜닝이 없는 시스템에는 경고를 표시(flag)하도록 안내합니다.
연습문제
쉬움.code/main.py의 사전 확률+문맥 중의성 해소기를 모호한 멘션 10개(Paris, Jordan, Apple 등)에 적용합니다. 올바른 엔티티를 직접 라벨링하고 정확도를 측정합니다.
중간. 문장 트랜스포머(sentence transformer)로 모호한 멘션 50개를 인코딩합니다. 각 후보 설명도 임베딩합니다. 임베딩 기반 중의성 해소와 자카드 문맥 중첩을 비교합니다.
어려움. 1,000 엔티티 규모의 도메인 KB를 만듭니다(예: 회사의 직원과 제품). NER + EL을 종단 간(end-to-end)으로 구현합니다. 따로 떼어둔 문장 100개에서 정밀도(precision)와 재현율(recall)을 측정합니다.