본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 07. 14:49

무역 지식 그래프에서의 교차 언어 개체 해상도(Cross-Lingual Entity Resolution): 6,883개 노드에 39,534개의

요약

2asy.ai가 Graph RAG의 성능을 높이기 위해 다국어 개체 해상(Cross-Lingual Entity Resolution) 문제를 해결한 과정을 다룹니다. 동일한 개체가 서로 다른 언어로 언급될 때 발생하는 그래프 단절 문제를 별칭 테이블(Alias Tables) 확장을 통해 해결했습니다.

핵심 포인트

  • 다국어 언급이 개별 노드로 분리되어 그래프 인과 관계가 끊어지는 문제 식별
  • 기존 엔티티 레지스트리의 별칭 테이블(Alias Tables)을 활용한 해결 방식
  • 한국어, 일본어, 중국어 별칭 39,534개를 추가하여 6,883개 엔티티 연결
  • 교차 도메인 온톨로지와 교차 언어 해상의 차이점 강조

이전 포스트에서 저는 2asy.ai가 단순 벡터 검색(plain vector search)에서 문서 간 개체를 해상(resolve)하고 인과 관계 체인(causal chains)을 탐색하는 교차 도메인 온톨로지 그래프 RAG(Graph RAG)로 어떻게 전환했는지 설명했습니다. 그 포스트는 그래프가 희소하며(sparse), 앞으로 더 조밀해질(denser) 것이라는 솔직한 메모와 함께 끝났습니다. 이번 포스트는 그 밀도 문제의 한 가지 구체적인 차원에 관한 것이며, 제가 이번 주에 이를 어떻게 해결했는지에 대한 내용입니다.

문제는 단순히 그래프에 더 많은 문서가 필요하다는 것만이 아닙니다. 문제는 동일한 현실 세계의 개체(entity)가 여러 언어로 등장한다는 점입니다.

교차 언어 언급이 지식 그래프를 망가뜨리는 이유

2asy.ai는 영어로 발행된 아시아 무역 및 관세 뉴스를 읽지만, 그 기저에 있는 개체들, 즉 기업, 규제 기관, 부처, 정책 입안자들은 해당 기사 내에서 종종 현지 언어 형태로 언급됩니다. 무역 정책에 관한 한국어 기사는 한국은행을 언급합니다. 반도체에 관한 중국어 기사는 三星电子를 언급합니다. 자동차 관세에 관한 일본어 기사는 トヨタ自動車를 언급합니다. 그리고 동일한 사건을 다루는 통신 기사(wire story)는 Bank of Korea, Samsung Electronics, Toyota Motor Corporation이라고 작성합니다.

만약 개체 해상(entity resolution)이 영어 문자열만 처리한다면, 각 외국어 언급은 별개의 노드(node)가 됩니다. 이제 그래프에는 한국은행과 Bank of Korea가 두 개의 서로 다른 개체로 존재하게 됩니다. 언어의 경계를 넘나드는 모든 인과 경로(causal path)는 끊어집니다. 한국 규제 기관의 결정에서 시작하여 다국적 기업의 실적 발표(earnings call)로 끝나는 관세 체인은 결코 연결되지 않을 것입니다.

이것이 구체적인 실패 모드(failure mode)입니다: 그래프가 언어별로는 연결되어 보이지만, 언어 간에는 단절되어 보이는 현상입니다. 교차 도메인 온톨로지(Cross-domain ontology)는 문서별 장벽을 넘게 해줍니다. 교차 언어 해상(Cross-lingual resolution)은 언어별 장벽을 넘게 해줍니다. 이 둘은 별개의 문제입니다.

해결책: 코드를 다시 쓰는 대신 별칭 테이블(Alias Tables)로 레지스트리 채우기

2asy.ai의 중심에 있는 엔티티 레지스트리(Entity Registry)에는 이미 해당 메커니즘이 갖춰져 있었습니다. 추출 과정에서 새로운 언급(Mention)이 들어오면, 레지스트리는 각 정준 엔티티(Canonical Entity)에 대해 알려진 모든 표면형(Surface Form)과 대조하여 이를 해상(Resolve)합니다. 만약 언급이 어떤 별칭(Alias)과 일치하면, 해당 엔티티의 정준 ID(Canonical ID)로 매핑됩니다. 레지스트리는 이미 영어 변체(부분 이름, 약어, 대체 철자)에 대해 이 작업을 수행하고 있었습니다. 다만 비영어권 항목이 없었을 뿐입니다.

따라서 변경 사항은 해상 레이어(Resolution Layer)를 재설계하는 것이 아니라, 별칭 테이블(Alias Tables)을 채우는 것이었습니다.

레지스트리는 13,371개의 정준 엔티티를 보유하고 있습니다. 그중 6,883개는 해상할 가치가 있는 최소 하나 이상의 비영어 표면형을 가지고 있었기에, 해당 엔티티들에 대해 ko(한국어), ja(일본어), zh(중국어) 별칭 목록을 추가했습니다. 총 추가된 항목은 다음과 같습니다:

  • ko (한국어): 13,757개 별칭
  • ja (일본어): 12,615개 별칭
  • zh (중국어): 13,162개 별칭
  • 총계: 6,883개 엔티티에 걸쳐 39,534개 별칭 추가

거의 모든 항목이 반영되었습니다. 파이프라인은 레지스트리에 쓰기 전, 제외를 위해 두 가지 작은 카테고리를 식별했습니다:

  1. 충돌 (Collision): 3개의 별칭 후보가 이미 다른 정준 엔티티로 해상되어 있었습니다. 세 가지 모두 CENTCOM이라는 약어였으며, 미국 중앙사령부(United States Central Command)에 대한 한국어, 일본어, 중국어 별칭으로 생성되었으나, 이미 기존의 US Central Command 노드에 매핑되어 있었습니다. 이를 그대로 작성했다면 하나의 문자열이 두 개의 ID로 해상되었을 것이므로, 자동으로 건너뛰어졌습니다.
  2. 낮은 신뢰도 (Low confidence): 5개의 후보는 소스에서 검증된 현지 언어 형태를 확인할 수 없었기 때문에, 작성되지 않고 스테이징 영역(Staging Area)에 보류되었습니다. 예를 들어, LG Electronics는 확인된 한국어 형태(LG전자, 엘지전자)를 가지고 있지만, 검증된 공식 일본어 또는 간체 중국어 법인명을 찾을 수 없었습니다. 따라서 비한국어 항목들은 점수가 0점으로 처리되어 추측하는 대신 보류되었습니다.

수락된 39,534개에 비하면 제외된 세트는 매우 작지만, 중요한 부분은 바로 이 지점입니다. 충돌 확인(Collision check)과 신뢰도 게이트(Confidence gate)는 잘못된 별칭이 접촉하는 모든 언급을 소리 없이 오염시키는 것을 방지하기 위해 특별히 존재합니다.

승인된 별칭(aliases)을 작성한 후, 저의 로컬 ER 레지스트리(ER registry)는 다음과 같이 정확한 조회(exact lookup)를 통해 이를 해결합니다:

  • 한국은행 (그리고 일본어 韓国銀行, 중국어 韩国银行)은 정식 명칭인 Bank of Korea 엔티티(entity)로 해결됩니다.
  • 三星电子 (그리고 한국어 삼성전자 주식회사)는 Samsung Electronics로 해결됩니다.
  • 미국 상무부 (그리고 일본어 米国商務省, 중국어 美国商务部)는 United States Department of Commerce로 해결됩니다.

이러한 변경 사항이 적용되기 전에는, 각 외국어 형태는 일치하는 항목을 찾지 못해 그래프에 새로운 고립된 노드(orphaned node)로 기록되었을 것입니다.

이것이 2asy.ai의 인과 그래프(Causal Graph)에 의미하는 바

이 별칭 계층(alias layer)이 라이브 그래프(live graph)에 통합되면, 무역 뉴스에 등장하는 한국어, 일본어, 중국어 엔티티(entity) 언급이 영어 대응물과 동일한 정식 명칭 노드(canonical nodes)로 해결되는 효과를 얻게 됩니다. 한국의 규제 기관, 중국의 제조업체, 그리고 미국의 수입 관세가 동일한 인과 사슬(causal chain)에 나타날 때, 이 사슬은 각 언어의 경계에서 파편화되는 대신 세 언어 모두를 가로질러 연결될 수 있습니다.

이는 문서 간 사슬(cross-document chains)에서 가장 중요합니다. 개별 기사 단위의 그래프에서 공유 온톨로지(shared ontology)로 전환한 핵심 목적은 인과관계가 전체 코퍼스(corpus)에 걸쳐 확장되도록 하는 것이었습니다. 한 기사의 원인이 다른 기사의 결과와 연결되는 것입니다. 이 연결은 두 기사가 동일한 정식 엔티티(canonical entity)에 대해 작성하고 있을 때만 작동합니다. 교차 언어 해상도(cross-lingual resolution)가 없다면, 두 기사가 동일한 엔티티에 대해 서로 다른 언어 형태를 사용하는 순간 연결은 끊어집니다.

교차 언어 엔티티 해상도(Cross-lingual entity resolution)는 단순한 미적 기능이 아닙니다. 다국어 뉴스 코퍼스(multilingual news corpus)에서 이는 그래프가 일관성을 유지하기 위한 필수 전제 조건입니다.

그래프 RAG(Graph RAG)에서의 엔티티 해상도에 관한 더 어려운 교훈

2asy.ai를 운영하면서 우선순위가 무엇인지 명확해졌습니다.

추출(Extraction)은 인상적으로 보이는 부분입니다. 언어 모델(Language Model)에 문서를 던져주면 엔티티(Entities)와 관계(Relations)를 반환하고, 그래프가 성장합니다. 이를 지켜보는 것은 만족스러운 일입니다. 하지만 추출 품질은 그 뒤에 오는 단계인 해상도(Resolution)에 의해 결정되는 한계치를 가집니다. 만약 동일한 노드여야 하는 두 언급(Mentions)이 두 개의 노드로 남아 있다면, 추출 정확도는 의미가 없습니다. 결과적으로 체인이 끊어지기 때문입니다.

Graph RAG에서의 엔티티 해상도(Entity Resolution)는 대부분의 글에서 인정하는 것보다 더 어렵습니다. 영어 전용(English-only) 사례만 하더라도 약어(Abbreviations), 부분적인 이름(Partial names), 이름을 변경한 인수 기업(Acquired companies), 모기업과 이름을 공유하는 자회사(Subsidiaries) 등 결코 사소하지 않은 문제입니다. 여기에 교차 언어적 표면형(Cross-lingual surface forms)까지 더해지면 문제의 범위는 현저히 확장됩니다.

제가 2asy.ai에서 사용하는 '별칭을 포함한 레지스트리(Registry-with-aliases)' 방식은 확률적 추출(Probabilistic extraction) 위에 구축된 결정론적 계층(Deterministic layer)입니다. 추출은 텍스트에 무엇이 있는지 추측합니다. 레지스트리는 그 대상이 무엇으로 해상도될지를 결정합니다. 이 두 가지 책임을 분리해 두면 시스템을 디버깅하고 수정하기가 더 쉬워집니다. 만약 특정 언급이 잘못 해상되고 있다면, 추출 모델이 아니라 레지스트리를 수정하면 됩니다.

39,534개의 별칭은 매우 많은 항목입니다. 하지만 이는 관리 가능한 데이터 문제입니다. 진짜 어려운 부분은 충돌 탐지(Collision detection)와 신뢰도 게이팅(Confidence gating)입니다. 잘못된 별칭 하나가 그것과 연결된 모든 언급을 조용히 오염시키기 때문입니다. 이번 패스에서는 단 8개의 후보만이 제외되었습니다. 3개의 충돌(Collisions)과 5개의 보류(Held)가 있었지만, 이는 게이트가 정확히 제 역할을 수행한 결과였습니다. 즉, 이미 다른 엔티티에 속해 있는 약어, 그리고 검증 가능한 현지 언어 이름이 없는 엔티티들이었습니다. 코퍼스(Corpus)가 커짐에 따라 이 제외된 집합도 함께 커질 것이며, 바로 이 집합이 가장 세심한 주의를 필요로 합니다.

여전히 부족한 점

교차 언어적 해상도는 하나의 계층일 뿐입니다. 여전히 해결되지 않은 문제들이 남아 있습니다.

보류된(held) 5개의 후보군은 검토가 필요하며, 코퍼스(corpus)가 성장함에 따라 더 많은 저신뢰(low-confidence) 사례들이 나타날 것입니다. 보류된 항목 중 일부는 보류 상태를 유지해야 하는 실제 사례이며, 일부는 아마도 정답일 가능성이 높지만 소스에 충분한 문맥(context)이 없어 신중하게 점수가 매겨진 경우입니다. 이 세트가 커짐에 따라 이를 처리해 나가는 과정은 커버리지(coverage)를 더욱 확장할 것입니다.

충돌(collision) 후보군 3개는 수동 분류(manual triage)가 필요합니다. 충돌은 두 개의 정준 엔티티(canonical entities)가 동일한 표면형(surface form)을 공유함을 의미하며, 이는 실제 세계의 모호성(유사한 이름을 가진 두 회사, 이름이 변경된 부처 등)이거나 레지스트리 오류(병합되어야 할 두 개의 정준 항목)입니다. CENTCOM 사례가 첫 번째 예시로, 이는 조정(reconcile)되어야 할 중복된 정준 항목일 가능성이 높음을 나타냅니다.

또한, 레지스트리는 아직 아랍어, 러시아어 또는 동남아시아 언어 형태에 대한 커버리지를 갖추고 있지 않습니다. 이들은 현재 코퍼스에서 차지하는 비중은 작지만, 0은 아닙니다.

이번 주의 별칭(alias) 채우기 단계는 첫 번째 패스(first pass)였습니다. 이는 가장 흔한 교차 언어적 격차를 메우기에 충분합니다. 나머지는 파이프라인(pipeline)이 계속 실행됨에 따라 따라올 것입니다.

이 별칭 레이어(alias layer)는 저의 로컬 ER 인스턴스에서 검증되었습니다. 보류 및 충돌 사례가 분류되면, 이를 라이브 2asy.ai 그래프에 통합하는 것이 다음 단계입니다. 공개 그래프는 https://www.2asy.ai/에서 확인할 수 있습니다.

만약 교차 언어적 개체 해상도(cross-lingual entity resolution)나 그래프 RAG(Graph RAG) 파이프라인을 작업 중이라면, 개체 해상도 서비스는 https://api.hannune.ai/entity-resolution/v1에 있습니다. 해당 공개 엔드포인트(endpoint)는 핵심 리졸버(resolver)를 제공하며, 여기서 설명한 다국어 별칭 레이어는 로컬에서 검증되었으며 아직 해당 서비스에 로드되지 않았습니다.

원문 게시글: From Vector Search to a Cross-Domain Ontology Graph

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0