학 습 목 표
- 자연어→SPARQL 체인의 4단계를 구현한다.
- altLabel·스키마가 번역 품질을 받치는 지점을 확인한다.
- 범위 밖 질문의 거절이 접지의 일부임을 설명한다.
체인의 구조 — 네 단계
6-6의 결론은 "구조 질문은 그래프가 이긴다"였지만, 그래프의 언어(SPARQL)를 아는 사용자는 드물다. 다리가 필요하다. 체인은 네 단계다. ① 용어 연결 — 질문 속 표현을 온톨로지의 IRI에 잇는다. prefLabel과 altLabel 전부로 사전을 만들므로, 5-6에 적어 둔 별칭들이 여기서 상환된다. ② 유형 분류 — 질문이 어느 질의 틀(측정 과제? 구성 요소? 정의?)에 해당하는지 고른다. ③ 틀 채우기 — 고른 틀의 빈칸에 IRI를 넣는다. ④ 실행 — 질의를 돌리고 결과를 라벨로 바꿔 돌려준다. 이번 구현에서 ②는 정규식 규칙으로 축소했다 — 실전 체인에서 LLM이 맡는 자리가 정확히 이 한 칸이다. ①③④는 실전과 동일하다.
# nl2sparql.py 핵심부 LEX = {라벨·altLabel → IRI} # ① 용어 연결 사전 TEMPLATES = { "측정과제": ("측정하는 과제", "SELECT ?x WHERE {{ ... :measures ... owl:someValuesFrom <{iri}> ... }}"), "구성요소": ("구성 요소", "... :component_of ..."), "하위유형": ("하위 유형|종류", "?x rdfs:subClassOf+ <{iri}>"), "정의": ("정의|무엇인가|뭐야", "<{iri}> skos:definition ?x"), } # ②·③ 유형 → 틀 def answer(question): term, iri = link(question) # ① if iri is None: return "거절: 용어가 온톨로지에 없다" kind, tpl = classify(question) # ② — 실전은 LLM if kind is None: return "거절: 질문 유형이 틀 밖" return run(tpl.format(iri=iri)) # ③④
체인의 뼈대. 거절 분기 둘이 설계의 절반이다 — 연결 실패(모르는 용어)와 분류 실패(틀 밖 질문)를 구분해 다르게 알린다.
시험 — 다섯 질문의 실제 출력
$ python3 nl2sparql.py Q: 작업기억을 측정하는 과제는? A: [측정과제·작업기억] ['N백 과제', '숫자폭 과제'] Q: 작동기억의 구성 요소를 알려줘 A: [구성요소·작동기억] ['시공간 잡기장', '음운 루프', '중앙 집행기'] Q: 서술기억의 하위 유형은? A: [하위유형·서술기억] ['의미기억', '일화기억'] Q: 응고화가 뭐야? A: [정의·응고화] ['불안정한 기억 흔적이 안정된 장기 표상으로 변환되는 과정.'] Q: 작업기억 용량을 늘리는 훈련법은? A: 거절: '작업기억'은 알지만 질문 유형이 질의 틀 밖이다
실제 실행 출력. 둘째 질문에 주목 — 사용자는 '작동기억'이라 물었고, altLabel 사전이 조용히 작업기억으로 연결했다(CQ9가 실전에서 상환되는 순간). 다섯째는 설계된 거절이다.
LLM이 ②를 맡을 때 — 스키마가 프롬프트가 된다
정규식 분류기는 틀의 수만큼만 안다. 실전에서는 ②를 LLM에 맡겨 표현의 다양성을 흡수한다 — 이때 프롬프트의 핵심 재료가 바로 온톨로지 자신이다. 클래스 목록, 관계 목록(정의역·치역 포함), 질의 틀의 예시를 프롬프트에 넣고 "이 스키마로 표현 가능한 질의만 생성하라, 불가능하면 거절하라"고 지시한다. 연구들이 공통으로 보고하는 핵심 변수도 이것이다 — 번역 정확도는 모형 크기만큼이나 스키마 제시의 질에 달려 있다. 2부에서 공들인 관계 명세(5-4)와 주석(5-6)이 그대로 프롬프트 품질이 된다. 그리고 생성된 질의는 실행 전에 검사할 수 있다 — 쓰인 클래스·관계가 스키마에 실재하는지 확인하는 한 줄이, 환각 질의(있지도 않은 관계를 참조)를 실행 전에 걸러 낸다. 문장 환각과 달리 질의 환각은 기계적으로 검출된다 — 형식 언어로 번역시키는 것 자체가 환각 방어다.
판별 연습
문 1다섯째 질문(훈련법)의 거절은 아쉬운 한계인가, 올바른 행동인가.
답 확인
올바른 행동이다. psymap에는 훈련·중재에 관한 지식이 없다(범위 결정, 4-6). 거절 없이 LLM 단독에 넘겼다면 작업기억 훈련의 효과라는, 심리학에서 실제로 논쟁적인 주제에 대해 근거 없는 답이 나갔을 것이다. 거절 메시지가 '무엇은 알고 무엇은 모르는지'를 명시하므로, 사용자는 시스템의 경계를 학습한다 — 행동의 경계(1-1)가 사용자 신뢰로 번역되는 지점이다. 물론 자주 묻는 질문이라면 다음 반복에서 범위 확장을 검토한다 — 그것은 거절 로그가 알려 준다.
문 2LLM 분류기가 "작업기억은 어떻게 측정하나요?"를 '정의' 유형으로 잘못 분류했다. 체인의 어디에서 어떻게 잡히는가.
답 확인
질의는 형식적으로 유효하므로(정의 조회) 스키마 검사로는 안 잡힌다 — 답이 그럴듯하게 틀리는 경우다. 방어선은 두 겹이다. 실행 결과를 질문과 함께 LLM에 되돌려 "이 결과가 질문에 답하는가"를 확인시키는 자기 검증 단계, 그리고 대표 질문-정답 쌍의 회귀 테스트(3-2의 CQ 테스트를 번역 체인에 확장한 것). 골드스탠더드의 사고방식이 여기서도 반복된다.
적용: 산출물과 파일
실행 스크립트 전문은 nl2sparql.py에서 열어 볼 수 있다. 자신의 도메인으로 실습 중인 독자는 자기 CQ 10문(5-1)을 질의 틀로 바꾸는 것부터 시작하라 — CQ가 틀의 목록이 되고, CQ의 골드스탠더드가 체인의 회귀 테스트가 된다. 다음 차시는 마지막 조각이다: 이 체인을 포함한 조회 능력 전부를 도구로 묶어 에이전트의 손에 쥐여 준다.
용어 정리
| 용어 | 원어 | 뜻 |
|---|---|---|
| 용어 연결 | entity linking | 자연어 표현을 온톨로지 개체(IRI)에 잇는 단계 |
| 질의 틀 | query template | 빈칸만 채우면 되는 SPARQL 골격. CQ의 산물 |
| 질의 환각 | query hallucination | 존재하지 않는 클래스·관계를 참조하는 생성 질의. 스키마 검사로 기계적 검출 가능 |
| 자기 검증 | self-verification | 실행 결과가 질문에 답하는지 LLM이 재확인하는 단계 |
실습 파일: nl2sparql.py(본 사이트 수록 — 출력은 전부 실제 실행 결과). · Kosten, C. et al. (2023). Spider4SPARQL: A Complex Benchmark for Evaluating Knowledge Graph Question Answering Systems. arXiv:2309.16248. · Emonet, V. et al. (2024). LLM-based SPARQL Query Generation from Natural Language over Federated Knowledge Graphs. arXiv.