223 lines
6.2 KiB
Markdown
223 lines
6.2 KiB
Markdown
|
|
# Phase 3 Option B: OntoCast GraphUpdate 검증 (Hybrid 접근법)
|
||
|
|
|
||
|
|
**완료일**: 2026-05-14
|
||
|
|
**상태**: ✅ Acceptance Gate 3 Option B 검수 준비 완료
|
||
|
|
|
||
|
|
## 개요
|
||
|
|
|
||
|
|
Phase 3 Option B는 **점진적 OntoCast 통합** (Hybrid approach)입니다.
|
||
|
|
|
||
|
|
### 핵심 전략
|
||
|
|
- **Phase 0-2 유지**: 현재 경량 구조 그대로
|
||
|
|
- **GraphUpdate 검증 추가**: OntoCast의 SPARQL 쿼리 검증
|
||
|
|
- **Critic loop 준비**: Phase 4+에서 추가 가능하도록 설계
|
||
|
|
|
||
|
|
```
|
||
|
|
시간 축
|
||
|
|
────────────────────────────────────────
|
||
|
|
Phase 0-2: 경량 추출 (완료)
|
||
|
|
Phase 3 MVP (A): 엔티티 검증 (완료)
|
||
|
|
Phase 3 Option B: SPARQL 검증 (지금 이것) ← 지금 여기
|
||
|
|
Phase 4+: Critic loop + Fuseki (향후)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 구현 내용
|
||
|
|
|
||
|
|
### 1. SPARQL 검증기 (`SPARQLValidator`)
|
||
|
|
|
||
|
|
**SPARQL 쿼리 기본 검증**:
|
||
|
|
```python
|
||
|
|
✓ 문법 검사: 괄호/중괄호 균형, 키워드 확인
|
||
|
|
✓ SQL 인젝션 패턴 감지
|
||
|
|
✓ 프리픽스 선언 확인
|
||
|
|
✓ 쿼리 크기 경고 (너무 큰 쿼리 감지)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. OntoCastValidator (Phase 3 Option B)
|
||
|
|
|
||
|
|
**GraphUpdate 검증**:
|
||
|
|
```python
|
||
|
|
단계 1: SPARQL 문법 검증
|
||
|
|
- 빈 쿼리 감지
|
||
|
|
- 괄호 불균형 감지
|
||
|
|
- 위험한 패턴 감지 (SQL injection 등)
|
||
|
|
|
||
|
|
단계 2: 작업 순서 검증
|
||
|
|
- 안전한 순서: INSERT → UPDATE → DELETE
|
||
|
|
- 불안전한 순서 감지 (DELETE 후 INSERT 등)
|
||
|
|
|
||
|
|
단계 3: 프리픽스 검증
|
||
|
|
- 선언되지 않은 프리픽스 감지
|
||
|
|
- 표준 RDF 프리픽스 자동 인식
|
||
|
|
|
||
|
|
단계 4: 작업 수량 체크
|
||
|
|
- 빈 작업 목록 경고
|
||
|
|
- 과도하게 큰 작업 경고 (100개 초과)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. 테스트 결과 (모두 통과 ✅)
|
||
|
|
|
||
|
|
| 테스트 | 설명 | 결과 |
|
||
|
|
|-------|------|------|
|
||
|
|
| Valid SPARQL | 올바른 INSERT 작업 | ✅ 통과 |
|
||
|
|
| Invalid syntax | 괄호 불균형 | ✅ 감지 |
|
||
|
|
| Safe order | INSERT → UPDATE → DELETE | ✅ 통과 |
|
||
|
|
| Unsafe order | DELETE 후 INSERT | ✅ 감지 |
|
||
|
|
| Undeclared prefix | 선언되지 않은 프리픽스 | ✅ 경고 |
|
||
|
|
| Utility functions | SPARQLValidator 직접 사용 | ✅ 통과 |
|
||
|
|
|
||
|
|
## 아키텍처: Phase 0-2와의 호환성
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────┐
|
||
|
|
│ OntologyGuard (통합 인터페이스) │
|
||
|
|
└──────────┬──────────────────────────┘
|
||
|
|
│
|
||
|
|
┌─────┴──────────┐
|
||
|
|
│ │
|
||
|
|
경량 검증 OntoCast 검증
|
||
|
|
(Phase 3 MVP) (Phase 3 Option B)
|
||
|
|
↓ ↓
|
||
|
|
엔티티/관계 SPARQL 쿼리
|
||
|
|
검증 검증
|
||
|
|
```
|
||
|
|
|
||
|
|
두 검증을 **동시에 사용 가능**:
|
||
|
|
```python
|
||
|
|
# 둘 다 활성화
|
||
|
|
guard_entity = OntologyGuard(validator_type="lightweight")
|
||
|
|
guard_sparql = OntologyGuard(validator_type="ontocast")
|
||
|
|
|
||
|
|
# 또는 런타임에 선택
|
||
|
|
validator_type = "ontocast" if use_ontocast else "lightweight"
|
||
|
|
guard = OntologyGuard(validator_type=validator_type)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 파일 구조
|
||
|
|
|
||
|
|
```
|
||
|
|
신규 생성:
|
||
|
|
✨ ont_platform/core/validation/ontocast_validator.py
|
||
|
|
├── SPARQLValidator: 기본 SPARQL 검증
|
||
|
|
├── OntoCastValidator: GraphUpdate 검증
|
||
|
|
└── GraphUpdate: 검증 결과 모델
|
||
|
|
|
||
|
|
수정:
|
||
|
|
✏️ ont_platform/core/validation/validators.py
|
||
|
|
(ValidatorFactory에 OntoCast 지원 추가)
|
||
|
|
✏️ ont_platform/core/validation/__init__.py
|
||
|
|
(OntoCastValidator export)
|
||
|
|
|
||
|
|
테스트:
|
||
|
|
✨ test_phase3_option_b.py (6개 테스트, 모두 통과)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Acceptance Gate 3 Option B 상태
|
||
|
|
|
||
|
|
### ✅ 완료된 항목
|
||
|
|
|
||
|
|
- [x] SPARQL 문법 검증
|
||
|
|
- 괄호/중괄호 균형 ✓
|
||
|
|
- 키워드 확인 ✓
|
||
|
|
- SQL 인젝션 패턴 감지 ✓
|
||
|
|
|
||
|
|
- [x] 안전한 작업 순서 검증 (INSERT → UPDATE → DELETE)
|
||
|
|
- 불안전한 순서 감지 ✓
|
||
|
|
- 순서 강제 가능 ✓
|
||
|
|
|
||
|
|
- [x] 프리픽스 선언 검증
|
||
|
|
- 미선언 프리픽스 감지 ✓
|
||
|
|
- 표준 RDF 프리픽스 자동 인식 ✓
|
||
|
|
|
||
|
|
- [x] Phase 0-2 회귀 없음
|
||
|
|
- 경량 검증 여전히 작동 ✓
|
||
|
|
- API 호환성 유지 ✓
|
||
|
|
|
||
|
|
### ⏳ 향후 추가 예정 (Phase 4+)
|
||
|
|
|
||
|
|
#### Critic Loop 통합
|
||
|
|
```python
|
||
|
|
# Phase 4에서 구현될 것
|
||
|
|
if validation_errors:
|
||
|
|
suggestions = generate_critic_suggestions(errors)
|
||
|
|
retry_result = await llm.retry(original_query, suggestions)
|
||
|
|
```
|
||
|
|
|
||
|
|
#### RDF 일관성 검증
|
||
|
|
```python
|
||
|
|
# Fuseki 사용 가능 시
|
||
|
|
if fuseki_available:
|
||
|
|
# 1. 쿼리 실행 시뮬레이션
|
||
|
|
# 2. 결과 그래프 검증
|
||
|
|
# 3. 일관성 확인
|
||
|
|
validate_rdf_consistency(update)
|
||
|
|
```
|
||
|
|
|
||
|
|
#### GraphUpdate 추적
|
||
|
|
```python
|
||
|
|
# 감사 로그
|
||
|
|
graph_update_history.append({
|
||
|
|
"timestamp": now,
|
||
|
|
"operation_count": len(operations),
|
||
|
|
"validation_status": "passed",
|
||
|
|
"execution_time": elapsed_ms,
|
||
|
|
})
|
||
|
|
```
|
||
|
|
|
||
|
|
## 향후 옵션
|
||
|
|
|
||
|
|
### Phase 3 Option A (경량 MVP) vs Option B (Hybrid) 비교
|
||
|
|
|
||
|
|
| 항목 | Option A (MVP) | Option B (Hybrid) |
|
||
|
|
|------|---|---|
|
||
|
|
| 엔티티 검증 | ✅ | ✅ |
|
||
|
|
| SPARQL 검증 | ❌ | ✅ |
|
||
|
|
| OntoCast 의존성 | ❌ | 부분적 |
|
||
|
|
| Critic loop | ❌ (Phase 4+) | 준비됨 (Phase 4+) |
|
||
|
|
| 구현 복잡도 | 낮음 | 중간 |
|
||
|
|
| Phase 0-2 호환성 | ✅ | ✅ |
|
||
|
|
|
||
|
|
## 설계의 확장성
|
||
|
|
|
||
|
|
### ValidatorFactory 플러그인 구조
|
||
|
|
|
||
|
|
현재:
|
||
|
|
```python
|
||
|
|
ValidatorFactory.create("lightweight") # Option A
|
||
|
|
ValidatorFactory.create("ontocast") # Option B (지금)
|
||
|
|
```
|
||
|
|
|
||
|
|
향후 추가 가능:
|
||
|
|
```python
|
||
|
|
ValidatorFactory.create("guardrails") # Phase 3+ (제3 선택지)
|
||
|
|
ValidatorFactory.create("full_ontocast") # Phase 4+ (완전통합)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Phase 3 완료 상태 요약
|
||
|
|
|
||
|
|
| 선택지 | 상태 | 특징 |
|
||
|
|
|-------|------|------|
|
||
|
|
| **A: 경량 MVP** | ✅ 완료 | 엔티티/관계 검증만 |
|
||
|
|
| **B: Hybrid** | ✅ 완료 | + SPARQL 검증 |
|
||
|
|
| **C: Guardrails** | ⏳ 준비 | + Reask 루프 |
|
||
|
|
|
||
|
|
**현재**: 옵션 A + B 모두 선택 가능한 상태
|
||
|
|
|
||
|
|
## 다음 단계
|
||
|
|
|
||
|
|
### Phase 4: Neo4j GraphRAG (권장)
|
||
|
|
- RDF ↔ Property Graph 프로젝션
|
||
|
|
- Vector 검색 + Entity Resolver
|
||
|
|
- GraphUpdate 실행 시뮬레이션
|
||
|
|
|
||
|
|
### 또는: Phase 3+ (향후)
|
||
|
|
- Guardrails 통합 (더 정교한 reask)
|
||
|
|
- Full OntoCast (Critic loop 본격화)
|
||
|
|
- Fuseki 연동 (RDF 저장소)
|
||
|
|
|
||
|
|
## 참고 문헌
|
||
|
|
|
||
|
|
- 설계서 §5 Phase 3 (p. 222-224)
|
||
|
|
- OntoCast sparql_models.py (GraphUpdate 모델)
|
||
|
|
- SPARQL 1.1 명세 (검증 규칙)
|