AI Agent 개발 - 데이터 기초 공사
AI Agent 개발 - 데이터 기초 공사
첫번째로 비정형 데이터(매뉴얼, 지침서)와 정형 데이터(DB)로부터 Neo4j 지식 그래프(Knowledge Graph)를 자동 구축하는 방법을 기술한다.
Ollama, Neo4j 설치
구축 팁
- Ollama 윈도우 설치
- https://ollama.com/ 접속 후 다운로드: OllamaSetup.exe 파일
- 다운로드 받은 파일 클릭. 자동 설치됨. 설치디렉토리는 사용자/…
- 해당 C드라이브에 용량 부족…
- 설치 화면에 디렉토리 설정하는 것이 없고 자동으로 C드라이브로 설치 진행됨
- 해결방법:
1
.\OllamaSetup.exe /DIR=D:\ANYDIRECTORY
지식 그래프 구축 파이프라인
1. 전반적인 아키텍처
- Source: PDF(매뉴얼), Markdown(지침서), SQL(점검 로그/DB)
- Extraction: LLM (GPT-4o 등) + 가이드라인(Schema)
- Mapping: 추출된 엔티티와 관계를 Cypher 쿼리로 변환
- 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.