Post

AI Agent 개발 - 데이터 기초 공사

AI Agent 개발 - 데이터 기초 공사

첫번째로 비정형 데이터(매뉴얼, 지침서)와 정형 데이터(DB)로부터 Neo4j 지식 그래프(Knowledge Graph)를 자동 구축하는 방법을 기술한다.

Ollama, Neo4j 설치

  1. Ollama 설치 참조
  2. Neo4j 설치

구축 팁

  1. Ollama 윈도우 설치
    1. https://ollama.com/ 접속 후 다운로드: OllamaSetup.exe 파일
    2. 다운로드 받은 파일 클릭. 자동 설치됨. 설치디렉토리는 사용자/…
    3. 해당 C드라이브에 용량 부족…
    4. 설치 화면에 디렉토리 설정하는 것이 없고 자동으로 C드라이브로 설치 진행됨
    5. 해결방법:
      1
      
        .\OllamaSetup.exe /DIR=D:\ANYDIRECTORY
      

지식 그래프 구축 파이프라인

1. 전반적인 아키텍처

  1. Source: PDF(매뉴얼), Markdown(지침서), SQL(점검 로그/DB)
  2. Extraction: LLM (GPT-4o 등) + 가이드라인(Schema)
  3. Mapping: 추출된 엔티티와 관계를 Cypher 쿼리로 변환
  4. Loading: Neo4j에 적재

2. 단계별 상세 구축 방법

Step 1: 비정형 데이터 전처리 (PDF, 지침서)

매뉴얼은 구조가 복잡하므로 일반적인 텍스트 추출보다 구조화된 추출이 중요

  • 솔루션: LlamaParse를 추천.
  • 이유: 안전 지침서의 ‘점검 항목 표’‘계층적 목차’를 마크다운으로 완벽하게 보존해야 LLM이 관계를 정확히 파악할 수 있다.

Step 2: 스키마(Ontology) 정의

LLM에게 무작정 “관계를 뽑아줘”라고 하면 결과가 난잡해진다. 명확한 가이드를 줘야 좋은 결과가 나온다.

  • Nodes: Process(공정), Hazard(위험요인), PPE(보호구), Regulation(법령), Equipment(설비)
  • Edges: IS_REGULATED_BY, POTENTIAL_HAZARD, REQUIRES_PPE, USED_IN

Step 3: LLM 기반 지식 추출 (Knowledge Extraction)

LangChain의 LLMGraphTransformer를 사용하면 이 과정을 자동화할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_openai import ChatOpenAI

# 1. LLM 설정
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 2. 추출하고 싶은 노드와 관계 정의 (안전관리 특화)
allowed_nodes = ["공정", "위험요인", "보호구", "안전수칙", "설비"]
allowed_relationships = ["발생_가능_위험", "필수_착용", "관련_법령", "설비_포함"]

transformer = LLMGraphTransformer(
    llm=llm,
    allowed_nodes=allowed_nodes,
    allowed_relationships=allowed_relationships
)

# 3. 마크다운으로 변환된 지침서 텍스트 입력
graph_documents = transformer.convert_to_graph_documents(documents)

Step 4: 정형 데이터(DB) 통합

SQL DB에 있는 점검 로그나 사고 이력은 LLM을 쓸 필요 없이 직접 매핑

  • 방법: Python의 neo4j 드라이버를 사용하여 기존 RDB의 PK/FK 관계를 Graph의 Node/Edge로 변환한다.
  • 예: 사고이력 테이블의 설비_ID를 Neo4j의 Equipment 노드와 연결한다.

Step 5: Neo4j에 데이터 적재 (Loading)

추출된 graph_documents를 Neo4j 실인스턴스에 적재한다

1
2
3
4
from langchain_community.graphs import Neo4jGraph

graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password")
graph.add_graph_documents(graph_documents)

3. 구축 시 핵심 ‘치트키’ (Engineering Tips)

1. 엔티티 정규화 (Entity Resolution)

매뉴얼에는 “보호모”라고 되어 있고, 지침서에는 “안전모”라고 되어 있을 때, 이를 하나의 노드로 합쳐야 한다

  • 해결: 추출 시 LLM에게 “유사한 의미의 엔티티는 표준 용어로 통일하라”는 System Prompt를 제공하거나, 저장 전 Entity Resolution 단계를 거친다.

2. 하이브리드 인덱싱 (Vector + Graph)

Neo4j는 각 노드에 벡터 정보를 저장할 수 있다

  • 노드 자체에 Embedding을 수행하여, “추락 방지”라는 검색어로 검색했을 때 [추락] 관련 노드뿐만 아니라 유사한 의미를 가진 노드들도 한꺼번에 찾을 수 있게 구성한다.

3. 증분 업데이트 (Incremental Update)

지침서가 개정될 때마다 전체 Graph를 다시 만들 순 없으므로 아래와 같이 처리.

  • 각 노드에 source_file, last_updated 메타데이터를 태깅하여, 변경된 파일만 다시 파싱하여 노드를 업데이트하는 파이프라인을 구축해야 한다.
This post is licensed under CC BY 4.0 by the author.