티스토리 뷰
이번 연재글에서는 전통적인 방법론을 통해 온톨로지를 구축하고 지식그래프를 생성하는 것을 다룹니다.
그리고 지식그래프를 생성하는 과정에서 LLM 을 활용하는 방법에 대해서 다룹니다.
그리고 마지막으로 생성된 결과물에 대해 추론을 적용하여 활용도를 증가시키는 것에 대해 다룹니다.
관련 연재글:
지난 글의 마지막 부분에서는 그래프스토어에 저장된 정보를 활용하기 위해 SPARQL이라는 언어를 통해 조회를 하는 것을 보였습니다.
SPARQL에 대한 설명은 여기에서 참고하실 수 있습니다.
RDF 지식그래프로 구성된 정보를 활용하기 위해서는 필수적으로 활용이 필요합니다. 그러나 복잡한 쿼리를 생성하거나 처음 접하는 사람에게는 어려울 수 있습니다.
이를 조금이나마 해소할 수 있는 것이 추론 규칙을 통해 미리 규칙을 생성하고 이 규칙을 추론함으로 복잡한 SPARQL 질의 패턴을 간결하게 줄일 수 있습니다.
또한 어떤 특별한 지식이나 도메인 지식을 추론 규칙을 통해 정의함으로 이를 데이터 레벨에서 활용할 수 있게 해줍니다.
추론이라고 해서 뭔가 어렵거나 거창한 것을 생각하기 보다는
우리가 흔히들 알고 있는 논리 규칙 (A가 B이고 B가 C이면, A는 C이다) 와 유사하다고 생각하면 접근이 쉽게 됩니다.
RDFox에서는 Datalog 라는 규칙 언어를 지원합니다. 이외에도 SWRL 이라는 규칙언어도 지원합니다. SWRL을 사용하게 되면 내부적으로 Dtalog 언어로 바뀌어 처리를 한다고 합니다.
이 글에서는 Datalog 를 사용하여 SPARQL의 복잡성을 줄여보고자 합니다.
참고로 SPARQL을 통해 지난 글에서와 같이 쿼리타임에 원하는 정보를 재생성하여 활용할 수도 있지만, 이번 글에서와 같이 로딩타임에 원하는 정보를 생성하여 활용하는 방안도 존재합니다.
그럼 지금부터 생성할 추론 규칙과 지난 글에서의 쿼리를 비교하기 위해 그림으로 비교를 해보도록 하겠습니다.
위와 같은 관계의 정보를 찾기 위해 아래와 같이 SPARQL을 작성해야 했습니다.
SELECT ?a ?articleName (GROUP_CONCAT (distinct ?keyword; SEPARATOR=" | ") as ?kwd)
(GROUP_CONCAT (distinct str(?concept) ; SEPARATOR=" | ") as ?cc)
(GROUP_CONCAT (distinct ?label; SEPARATOR=" | ") as ?conceptLabel)
FROM <http://joyhong.graph.uam/extracted>
FROM <http://joyhong.graph.uam/entity>
FROM <http://joyhong.graph.uam/basic>
FROM <http://joyhong.graph.uam/keyword>
WHERE {
{
SELECT distinct ?a ?y ?articleName ?keyword
WHERE {
?s ont:entityType ?y.
?s ont:mentionedBy ?a.
?a rdfs:label ?articleName .
?s rdfs:label ?keyword.
}
}
?y dcterms:subject ?ent.
?ent skos:broader+ ?concept.
skon:collection_Depth3 skos:member ?concept .
?concept skos:prefLabel ?label.
}
GROUP BY ?a ?articleName
그럼 이를 Datalog 규칙으로 바꾸어 보도록 하겠습니다.
Datalog는 :- 기호를 통해 왼편과 오른편을 구분합니다.
A :- B, C .
위와 같이 있을 경우 B,C가 참이면 A는 항상 참이 된다는 의미입니다.
전체적인 Datalog 규칙은 아래와 같습니다.
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX ont: <http://joyhong.tistory.com/ontology/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfox: <https://rdfox.com/vocabulary#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rs: <http://joyhong.tistory.com/resource/>
PREFIX schema: <http://schema.org/>
PREFIX sh: <http://www.w3.org/ns/shacl#>
PREFIX skon: <http://joyhong.tistory.com/skos/>
PREFIX : <http://joyhong.graph.uam/>
[?a, skos:mainEntity, ?concept] :inferred :- [?s, ont:entityType, ?y] :extracted,
[?s, ont:mentionedBy, ?a] :extracted,
[?y, dcterms:subject, ?ent] :entity,
[?ent, skos:broader, ?concept] :entity,
[skon:collection_Depth3, skos:member, ?concept] :entity,
[?concept, skos:prefLabel, ?label] :entity .
[?a, skos:mainEntity, ?concept] :inferred :- [?s, ont:entityType, ?y] :extracted,
[?s, ont:mentionedBy, ?a] :extracted,
[?y, dcterms:subject, ?ent] :entity,
[skon:collection_Depth3, skos:member, ?ent] :entity,
[?concept, skos:prefLabel, ?label] :entity .
PREFIX 부분을 제외하면 몇줄 되지는 않습니다. PREFIX를 제외하고 첫번째 라인의 내용을 살펴보면
[?a, skos:mainEntity, ?concept] :inferred :- [?s, ont:entityType, ?y] :extracted,
[?a, skos:mainEntity, ?concept] 은 결과입니다. 여기서
[?a, skos:mainEntity, ?concept] :inferred 가 있는데 :inferred 는 named graph를 뜻합니다.
:- 기준으로 오른쪽에 있는 조건에 해당하게 되면 추론된 결과를 <http://joyhong.graph.uam/inferred> 라는 named graph에 넣으라는 뜻입니다.
이러한 규칙을 [파일명.dlog] 로 생성하여 그래프스토어에 로딩을 하게 되면 규칙이 적용이 됩니다.
규칙이 적용됨과 동시에 내부적으로는 해당 규칙을 실행하면서 조건에 맞는 트리플들을 inferred 라는 그래프에 적재를 하게 됩니다.
그럼 결과를 확인하기 위해 SPARQL을 생성해야 하는데 이전에 사용한 것과 비교해보면 엄청나게 간단히 생성할 수 있게 됩니다. 위 그림에서는 빨간색 부분이 추론이 되어 생성된 결과를 나타냅니다.
select *
from <http://joyhong.graph.uam/inferred>
where {
?s skos:mainEntity ?c.
}
결과는 아래와 같이 나오게 됩니다.
여기서 중요한 사실 중 하나는 RDF 지식그래프는 데이터 모델, 실제 데이터, 추론규칙이 모두 개별 데이터로 취급이 되고
그 중엣도 실제 데이터와 추론으로 생성된 데이터가 분리 또는 통합되어 활용이 가능하다는 것입니다.
다른 말로든 모델에 대한 레이어, 데이터에 대한 레이어, 서비스에 대한 레이어를 각각 구성하여 운영이 가능하고
필요에 따라 추론 규칙을 활용하여 실시간으로 증분 추론이 되는 결과를 활용할 수 있다는 것입니다.
데이터를 활용함에 있어 구조화되고 정확한 데이터의 가치가 점점 중요해지고 있습니다.
그 중에서 그래프 형태로 구성된 데이터를 활용하는 것에도 점차적으로 늘어나고 있습니다.
얼마전 마이크로소프트에서 발표한 GraphRAG도 LLM을 통해 그래프 구조의 데이터를 추출하고
개념적인 내용을 통해 커뮤니티를 구성하여 RAG를 실행하는 방안을 사용하고 있습니다.
RDF 지식그래프는 데이터의 통합과 구조화 그리고 지식을 표현하는데 탁월한 도구라고 생각합니다.
더욱이 추론이라는 기능을 통해 새로운 정보를 생성하고, 그동안의 언어장벽을 조금이나마 해소할 수 있도록 제공합니다.
'KnowledgeGraph' 카테고리의 다른 글
두통 온톨로지 구축과 RDFox Datalog를 이용한 추론 (2) | 2024.10.10 |
---|---|
지식그래프, LLM 그리고 Reasoning #4 - LLM을 활용한 용어 분류 (0) | 2024.08.02 |
지식그래프, LLM 그리고 Reasoning #3 - LLM을 활용한 지식그래프 구축 (0) | 2024.07.31 |
지식그래프, LLM 그리고 Reasoning #2 - 키워드 구축 (0) | 2024.07.31 |
지식그래프, LLM 그리고 Reasoning #1 - 기본 지식그래프 구축 (0) | 2024.07.31 |
- Total
- Today
- Yesterday
- 장고
- django
- 트리플 변환
- 그래프 데이터베이스
- 지식그래프
- 온톨로지
- Neo4j
- Knowledge Graph
- sparql
- cypher
- pyvis
- stardog
- 사이퍼
- 트리플
- neosemantics
- networkx
- Ontology
- TopBraid Composer
- 타임리프
- 스프링부트
- Linked Data
- LOD
- Thymeleaf
- RDF 변환
- 지식 그래프
- RDF
- rdfox
- TDB
- TBC
- property graph
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |