티스토리 뷰

이번 연재글에서는 전통적인 방법론을 통해 온톨로지를 구축하고 지식그래프를 생성하는 것을 다룹니다.

그리고 지식그래프를 생성하는 과정에서 LLM 을 활용하는 방법에 대해서 다룹니다.

그리고 마지막으로 생성된 결과물에 대해 추론을 적용하여 활용도를 증가시키는 것에 대해 다룹니다.


 

관련 연재글:

#1. 기본 지식그래프 구축

#2. 키워드 구축

#3. LLM을 활용한 지식그래프 구축

#4. LLM을 활용한 용어 분류

#5. 추론


이번 글에서는 보다 풍부한 데이터를 확보하고 확장하기 위해 논문의 초록으로부터 정보를 추출하려고 합니다. 초록에는 논문의 저자가 핵심적으로 다루고 있는 정보가 포함되어 있으나 텍스트 형태로 존재하기 때문에 이를 파악하여 분석하는 과정은 오래 걸리고 복잡할 수 있습니다. 

이 부분에서 LLM을 사용하여 핵심 정보와 그 정보들 간의 관계를 추출할 수 있습니다. 추출한 정보는 개념적으로 무엇을 뜻하는지도 함께 추출이 가능합니다.

여기에서는 LangChainLLMGraphTransformer 을 활용하여 주어진 텍스트로부터 핵심정보와 핵심정보의 타입, 그리고 다른 정보와의 관계를 추출합니다. LLM은 Ollama를 활용하여 로컬환경에 구축한 것을 사용하였습니다.

 

LLMGraphTransformer 를 사용하여 텍스트 형태의 구조화되지 않은 정보를 구조화된 형식으로 변환하는 예제는 아래와 같습니다.

text = """
도심 교통 체증과 환경오염이 중요한 대도시 문제로 부각되는 가운데, 최근에는 Urban Air Mobility (UAM)가 
효율적인 대책으로 주목받고 있다. 본 연구에서는 부산 지역의 지형 및 인프라 등의 실제 데이터를 고려한 GIS 기반 
공간 분석과 군집 알고리즘을 수행하였으며 이를 통해 UAM 운영을 위한 버티포트 위치와 경로를 선정할 수 있었다. 
부산권 UAM 인프라 시스템의 중심으로 예상되는 김해국제공항을 기반으로, 목표 지역에서 세 개의 버티포트 위치가 
적합하다 판단하였으며, 이후 지상 위험 평가 (Ground Risk)를 고려한 A*(A-star) 알고리즘을 이용해 위험도와 
거리를 최소화하는 비행경로를 선정하였고, 이를 통해 최소 거리 경로 대비 80.168%의 위험 감소 효과를 확인하였다.
"""
documents = [Document(page_content=text)]
llm_transformer_filtered = LLMGraphTransformer(llm=llm)
graph_documents_filtered = llm_transformer_filtered.convert_to_graph_documents(
    documents
)
print(f"Nodes:{graph_documents_filtered[0].nodes}")
print(f"Relationships:{graph_documents_filtered[0].relationships}")
Relationships:[
Relationship(source=Node(id='Urban Air Mobility (UAM)', type='Technology'), target=Node(id='도심 교통 체증', type='Problem'), type='IS_SOLUTION_FOR'), 
Relationship(source=Node(id='Urban Air Mobility (UAM)', type='Technology'), target=Node(id='환경오염', type='Problem'), type='IS_SOLUTION_FOR'), 
Relationship(source=Node(id='GIS 기반 공간 분석', type='Method'), target=Node(id='UAM 운영을 위한 버티포트 위치와 경로 선정', type='Task'), type='USED_IN'), 
Relationship(source=Node(id='군집 알고리즘', type='Method'), target=Node(id='UAM 운영을 위한 버티포트 위치와 경로 선정', type='Task'), type='USED_IN'), 
Relationship(source=Node(id='김해국제공항', type='Location'), target=Node(id='부산권 UAM 인프라 시스템', type='System'), type='IS_CENTER_OF'), 
Relationship(source=Node(id='버티포트 위치', type='Infrastructure'), target=Node(id='UAM 운영', type='Activity'), type='SELECTED_FOR'), 
Relationship(source=Node(id='A*(A-star) 알고리즘', type='Method'), target=Node(id='비행경로 선정', type='Task'), type='USED_IN'), 
Relationship(source=Node(id='Ground Risk 평가', type='Assessment'), target=Node(id='비행경로 선정', type='Task'), type='CONSIDERED_IN')
]

 

논문의 모든 초록을 대상으로 LLMGraphTransformer를 통해 그래프 구조의 데이터를 추출하게 되면 다른 논문들에서 추출되는 핵심정보들과 통합이 되고, 다른 논문에서 추출된 관계 정보가 다시 연결이 됨으로서 기존의 구축한 지식그래프와는 또 다른 별개의 그래프가 생성됩니다. 여기에 더하여  추출된 핵심정보의 개념적인 타입정보도 함께 제공이 되기 때문에 이를 활용하여 "동일한 개념을 가지는 정보들"과 같은 새로운 데이터를 확보할 수 있습니다.

여기서는 핵심정보를 EntityNode 클래스로 생성하였고 핵심정보의 개념 타입을 EntityType이라고 생성하였습니다. 

Relationship 별로 존재하는 source와 target의 Node id는 EntityNode 클래스의 인스턴스로 생성하고, 

Node type은 EntityType 클래스의 인스턴스로 생성하였습니다.

그리고 Node id와 Node type 간의 관계는 ont:entityType 이라는 Property로 연결하였으며,

Relationship의 type은 source의 Node id와 target의 Node id를 연결하는 Property로 연결하였습니다.

 

지난 글에서 파이썬을 활용해 그래프를 생성한 것과 마찬가지로 초록에서 추출한 정보를 그래프로 생성한 결과파일을 RDFox에 업로드를 하면 됩니다.

이 역시 별도의 named graph를 지정하여 결과 파일을 업로드하게 되면 원래 그래프 데이터는 그대로 보존하면서 새롭게 생성한 데이터를 별도로 활용하거나 통합하여 활용이 가능합니다.

 

 

 

논문의 초록에서 추출한 정보를 그래프로 생성하고 그래프 스토어에 적용을 했다면, 기존의 데이터로는 알수 없었던 정보를 SPARQL을 통해서 찾아보도록 하겠습니다.

첫번째 글과 두번째 글에서는 논문 초록의 내용이 구조화되어 생성이 되지 않았기 때문에 초록의 내용을 토대로 찾고자 하는 정보를 획득할 수 없었습니다. 그러나 이번 작업을 통해 LLM을 활용하여 논문 초록에서 구조화를 시켰기 때문에 이에 대한 질의를 할 수 있습니다.

실제로 확장된 정보를 통해 찾을 수 있는 질문의 유형은 아래와 같습니다.

1. "Method"에 해당하는 내용을 언급하고 있는 논문들과 그 논문들의 발표연도 

2. "Method"가 "Task"를 "USED_IN" (사용) 하는 것에 대해 언급하는 논문

3. "Assessment"들에 대해 언급하는 논문들의 발행연도별 개수

등과 같은 질문들에 대해 해결이 가능합니다.

 

위의 1번 항목에 대한 질의는 다음과 같이 작성을 할 수가 있습니다.

SELECT *
FROM  <http://joyhong.graph.uam/extracted>
FROM  <http://joyhong.graph.uam/basic>
FROM  <http://joyhong.graph.uam/model>
WHERE {
    ?article a schema:ScholarlyArticle;
        rdfs:label ?articleName;
        schema:datePublished ?date.
    ?entityNode ont:mentionedBy ?article ;
        ont:entityType ?entityType .
    ?entityNode rdfs:label ?entityName.
    ?entityType rdfs:label "Method".
}

 

FROM 절을 통해 질의를 수행하기 위한 named graph를 지정하였습니다. 논문의 초록에서 추출한 정보는 extracted 라는 그래프에 저장을 하였고, 논문의 기본 정보는 basic 이라는 그래프에 저장하였기에 두개의 그래프를 사용하도록 지정을 했습니다.

이 SPARQL에 대한 결과는 아래와 같이 나타납니다.

 


이상으로 이번 글에서는 LLM을 활용하여 지식그래프를 확장하기 위해

텍스트로부터 정보를 추출하고 , 추출한 정보를 지식그래프로 생성하였으며, 생성한 데이터를 스토어에 논리적으로 분할된 공간에 적재하여 SPARQL로 질의하는 과정을 보였습니다.

LLM을 통해 지식그래프를 구축하는 것은 편리함도 있지만, 모든 것이 올바르게 구축된다는 보장이 되는 것이 아니기 때문에

사용을 할 때 신중한 고려가 필요할 것입니다. 

그리고 RDF 그래프스토어에서 제공하는 named graph를 활용하는 장점은 분할된 그래프를 구성할 수 있다는 것이고, 

분할이 되었더라고 사용할 때는 통합하여 사용하거나 분할된 상태로 각각 사용이 가능하다는 장점이 있습니다.

 

다음 글에서는 다시 LLM을 사용하여 EntityType을 일반적인 개념으로 분류하는 과정에 대해서 이야기할 예정입니다.

-끝-

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
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 31
글 보관함