[1단계] 경량 NER의 실제 작동 방식
A. 규칙 기반 / 통계 기반 모델 (가장 경량)
- spaCy
en_core_web_sm같은 소형 모델 - 품사 태깅(POS, Part-Of-Speech) + 의존 구문 분석(dependency parsing) 조합
PERSON,ORG,GPE,DATE등 CoNLL 표준 레이블로 분류- 속도 빠름, 도메인 일반성 낮음
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("OpenAI released GPT-4 in March 2023.")
for ent in doc.ents:
print(ent.text, ent.label_)
# OpenAI ORG
# GPT-4 PRODUCT
# March 2023 DATEB. 소형 BERT 계열 (균형형)
bert-base-NER,ko-electra-base+ NER fine-tuning(특정 태스크용 추가 학습)- 토큰 분류(Token Classification) 태스크: 각 토큰에
B-PER,I-PER,O같은 BIO 태그 부여 - spaCy보다 문맥 이해 높음, LLM보다 속도 매우 빠름
"삼성전자 이재용 회장이 발표했다"
B-ORG I-ORG B-PER I-PER O O O
C. LLM 기반 (Microsoft GraphRAG 기본값)
- 경량 LLM (GPT-3.5-turbo, Haiku 등)에 구조화 프롬프트 주입
- 출력을 JSON으로 강제해서 파싱 비용 최소화
청크 텍스트: "..."
다음 타입의 엔티티를 JSON으로 추출하라: [PERSON, ORG, LOCATION, CONCEPT]
형식: [{"name": ..., "type": ..., "description": ...}]
BERT가 spaCy NER보다 낫나
fine-tuning 여부로 갈린다. 일반 BERT를 그냥 쓰면 부동산 용어(“LTV”, “분양가상한제”) 같은 건 못 잡는다.
| spaCy (규칙/통계) | BERT 계열 | |
|---|---|---|
| 일반 도메인 | 나쁘지 않음 | 더 좋음 |
| 특화 도메인 (부동산, 의료 등) | 많이 틀림 | fine-tuning 하면 훨씬 좋음 |
| 속도 | 매우 빠름 | 느림 |
| 비용 | 거의 0 | GPU 필요 |
즉 도메인이 좁고 특수할수록 BERT + fine-tuning이 유리하고, 범용 기사 처리 같은 건 spaCy로 충분한 경우가 많다.
Cypher Query가 검색을 하는 건가?
맞다. 역할 분담을 명확히 하면 이렇다 (DB 저장 시).
NER / BIO 태그 → 그래프 구축 (인덱싱)
Cypher Query → 그래프 검색 (쿼리)
NER은 “누가 누구랑 연결돼있다”는 관계 데이터를 만드는 것이고, Cypher는 그 그래프를 탐색하는 SQL 같은 언어다. 두 단계는 서로 포함 관계가 아니라 “저장 단계 → 검색 단계”로 이어지는 파이프라인이다.
전체 흐름
[원문 문서]
↓
청크로 쪼갬 (예: 500토큰씩)
↓
NER → 엔티티 추출 ("삼성전자=ORG", "이재용=PER")
↓
관계 추출 → 엣지 생성 ("이재용 -CEO_OF→ 삼성전자")
↓
Neo4j에 노드/엣지로 저장 ← 이게 인덱싱
↓
(선택) 각 노드에 임베딩 벡터도 같이 저장 (하이브리드용)
엣지 생성은 어떻게 하나?
NER이 엔티티를 추출했다고 엣지가 자동으로 생기진 않는다. 별도 단계가 있다. 크게 세 가지 방법.
방법 1: 공기(Co-occurrence) 기반, 가장 단순
같은 문장/청크에 두 엔티티가 같이 나오면 그냥 연결.
"삼성전자 이재용 회장이 갤럭시를 발표했다"
→ (이재용) - (삼성전자) 연결
→ (이재용) - (갤럭시) 연결
→ (삼성전자) - (갤럭시) 연결
관계 레이블 없이 “같이 나왔다”는 엣지만 생긴다. 정밀도가 낮다.
방법 2: 관계 분류 모델
엔티티 쌍을 모델에 넣어 관계 레이블을 분류한다.
입력: ("이재용", "삼성전자", "이재용 회장이 삼성전자를 이끌고 있다")
출력: CEO_OF
BERT 계열 모델을 관계 분류용으로 fine-tuning해서 쓴다. NER이랑 별개 모델이다.
방법 3: LLM 프롬프트로 한 번에
엔티티 추출 + 관계 추출을 동시에 시킨다.
"다음 텍스트에서 엔티티와 관계를 JSON으로 추출해라"
→ {"entity1": "이재용", "relation": "CEO_OF", "entity2": "삼성전자"}
Microsoft GraphRAG가 이 방식을 쓴다. LLM 호출 비용이 높지만 관계 품질은 제일 좋다.
한마디 요약
NER 방식은 spaCy(빠름/일반) → BERT(균형) → LLM(품질 최상)으로 단계가 올라가고, 엣지 생성도 공기 기반 → 관계 분류 → LLM 원샷 순으로 정밀도가 올라간다. 선택은 도메인 특수성과 비용 간 트레이드오프다.