GeoGuard AI – 지형 위험 평가를 자동화하는 멀티 에이전트 지질 지능 시스템
요약
GeoGuard AI는 지질학적 위험 분석(산사태, 사면 불안정성)을 자동화하는 멀티 에이전트 시스템입니다. 이 시스템은 Hazard Agent와 Climate Agent라는 두 개의 특화된 전문가 에이전트를 활용하여 각각 지질 구조 및 기후 트렌드를 독립적으로 분석합니다. 이후 Orchestrator Agent가 이 두 결과를 결합하여, 단순한 위험 수준을 넘어선 복합적이고 설명 가능한 '복합 위험(compounding effects)'을 식별해냅니다.
핵심 포인트
- 지질학적 위험 평가를 위해 Hazard Agent와 Climate Agent의 병렬 분석 구조를 채택했습니다.
- Orchestrator Agent가 두 에이전트의 개별 결과를 종합하여 복합적인 환경 변화에 따른 최종 위험도를 산출합니다.
- 시스템은 Google ADK 기반의 감독형 계층적 멀티 에이전트 패턴을 구현하여 높은 모듈성과 설명 가능성을 확보했습니다.
- Hazard Agent는 `landslide_tool`과 같은 결정론적 도구를 사용하여 사면 안정성 계산을 수행하고, Climate Agent는 고도 증폭(HEA) 등의 기후 분석 도구를 사용합니다.
이 포스트는 DEV Education Track: Build Multi-Agent Systems with ADK에 제출하는 저의 작업물입니다. 제가 만든 것은 GeoGuard AI – 지형 위험 평가를 자동화하는 멀티 에이전트 지질 지능 시스템입니다. 문제점: 지질학적 위험 분석(산사태, 사면 불안정성)은 대개 여러 분야의 전문가(지질학자, 기후학자)와 수동적인 종합 과정이 필요합니다. GeoGuard AI는 이러한 협업 워크플로우를 재현하기 위해 세 가지 특화된 에이전트, 즉 Hazard Agent, Climate Agent, 그리고 Orchestrator Agent를 사용합니다. 특정 위치(예: Nanga Parbat – Higher Himalayan Syntaxis)가 주어지면, 시스템은 사면 안정성(slope stability)과 기후 트렌드를 독립적으로 분석한 다음, 이 두 가지를 결합하여 복합적인 위험을 식별합니다. 예를 들어, 기온 상승과 rain-on-snow(눈 위 강우) 현상이 어떻게 '보통' 수준의 사면을 고위험 구역으로 불안정하게 만들 수 있는지와 같은 방식입니다. 그 결과물은 실제 세계의 에이전트 협업(agentic collaboration)을 보여주는 빠르고, 설명 가능하며, 모듈화된 AI 시스템입니다. Cloud Run Embed ⚠️ 실행 환경에 관한 참고 사항: 에이전트들은 개발 과정에서 성공적으로 실행되었습니다. 이후, 프로젝트 권한 및 결제 제한으로 인해 원래의 클라우드 실행 환경이 제한되었습니다. 아키텍처, 코드 및 멀티 에이전트 로직은 완전히 검증된 상태로 유지됩니다. 여러분의 에이전트들: GeoGuard AI는 Google ADK로 구축된 감독형 계층적 멀티 에이전트 패턴(supervised, hierarchical multi-agent pattern)을 사용합니다. 에이전트 역할 전문화: OrchestratorAgent - 관리자: 사용자 요청을 수신하고, 작업을 위임하며, 최종 보고서를 종합합니다. 자체적으로 분석을 수행하지는 않습니다. HazardAgent - 지질학자: 사면 경사(slope gradients), 암상(lithology), 구조적 불연속성(structural discontinuities)을 평가합니다. 결정론적 위험 계산을 위해 landslide_tool을 사용합니다. ClimateAgent - 기후학자: 기온 이상 현상(High-Elevation Amplification), 강수 트렌드 및 몬순 침투를 분석합니다. 작동 방식: 사용자가 대상 위치를 제출하면 → OrchestratorAgent가 컨텍스트를 초기화합니다. ClimateAgent와 HazardAgent가 병렬로 실행됩니다(상위 에이전트에 의해 오케스트레이션됨). 각 에이전트는 구조화된 출력(위험 수준 + 설명)을 반환합니다.
OrchestratorAgent는 두 출력을 결합하여 복합적인 효과(compounding effects)를 식별합니다. 예: “높은 기후 위험 + 중간 수준의 위험 = 변동성이 큰 환경.”
코드 스니펫 – 도구를 사용하는 Hazard Agent:
from google.adk.agent import Agent
hazard_agent = Agent (
name = " HazardAgent ",
description = " 산사태 및 지형 불안정성과 같은 지질학적 위험을 평가합니다. ",
ROLE : 지질 위험 전문가 .
RULES : 기후 요인을 분석하지 마십시오 .
OUTPUT FORMAT : 위험 수준 ( Low / Moderate / High ) + 설명 + 주요 요인
"""
)
@hazard_agent.tool
def landslide_tool(slope: float, rainfall: float):
if slope > 30 and rainfall > 100:
return " High Landslide Risk "
return " Moderate Risk "
코드 스니펫 – 도구를 사용하는 Climate Agent:
from google.adk.agent import Agent
climate_agent = Agent(
name="ClimateAgent",
description="지질학적 위험에 영향을 미치는 기후 조건을 분석합니다.",
model="gemini-1.5-pro",
instructions="""
ROLE: 기후 분석 전문가.
RESPONSIBILITIES:
- 강수량 추세 평가
- 온도 이상 현상(temperature anomalies) 평가
- 기후 증폭 효과(climate amplification effects) 결정
RULES:
- 지질학적 해석을 피하십시오.
- 기후 영향에만 집중하십시오.
OUTPUT FORMAT:
Climate Risk Level:
Explanation:
"""
)
도구 1: 고도 증폭(High-Elevation Amplification, HEA) 계산
@climate_agent.tool
def high_elevation_amplification_tool(
current_temp: float,
historic_temp: float,
elevation: float
) -> str:
"""
고도에 의해 증폭된 온도 이상 현상을 기반으로 기후 위험 수준을 반환합니다.
"""
"""
anomaly = current_temp - historic_temp
amplification = anomaly * (1 + elevation / 5000) # 단순화된 모델
if amplification > 2.5:
return "High Climate Risk: Extreme temperature anomaly"
elif amplification > 1.0:
return "Moderate Climate Risk: Notable warming trend"
else:
return "Low Climate Risk: Stable thermal regime"
"""
도구 2: 강우 유발 위험 평가 (몬순 / Rain-on-snow)
@climate_agent.tool
def rainfall_risk_tool(annual_rainfall: float, rain_on_snow_events: int) -> str:
"""
강수량 변화에 따른 위험을 평가합니다.
"""
if annual_rainfall > 1200 and rain_on_snow_events > 3:
return "High Climate Risk (Rain-on-snow hazard)"
elif annual_rainfall > 800 or rain_on_snow_events > 1:
return "Moderate Climate Risk"
return "Low Climate Risk"
코드 스니펫 – 도구를 사용하는 오케스트레이터 (Orchestrator) 에이전트:
from google.adk.agent import Agent
orchestrator = Agent(
name="OrchestratorAgent",
description="모든 전문 에이전트 간의 통신을 조정합니다.",
model="gemini-1.5-pro",
instructions="""
역할: 에이전트 간의 워크플로 (Workflow) 관리.
책임:
- 사용자 요청 수신
- 작업 위임
- 결과 결합
규칙:
- 직접 분석을 수행하지 마십시오.
- 에이전트들을 협력적으로 사용하십시오.
- 세션 컨텍스트 (Session context)를 유지하십시오.
"""
)
도구 1: HazardAgent에게 위임
@orchestrator.tool
def call_hazard_agent(location: str, slope_angle: float, lithology: str) -> str:
"""
HazardAgent 호출을 시뮬레이션합니다 – 실제 환경에서는 에이전트를 호출합니다.
위험 수준과 주요 요인을 반환합니다.
"""
# 이는 운영 환경에서 실제 에이전트 호출이 될 것입니다.
if slope_angle > 30:
return f"{location}에 대한 위험 평가: High Risk ({lithology} 지질의 급경사 {slope_angle}°)"
else:
return f"{location}에 대한 위험 평가: Moderate Risk (경사 {slope_angle}°, {lithology})"
도구 2: ClimateAgent에게 위임
@orchestrator.tool
def call_climate_agent(location: str, temp_anomaly: float) -> str:
"""
ClimateAgent 호출을 시뮬레이션합니다.
"""
""" if temp_anomaly > 1.5: return f"{location}에 대한 기후 평가: 높은 위험 (편차 +{temp_anomaly}°C)" else: return f"{location}에 대한 기후 평가: 중간 위험 (편차 +{temp_anomaly}°C)" """
도구 3: 두 보고서를 합성하고 복합적인 효과(compounding effects) 식별
@orchestrator.tool
def synthesize_risk(hazard_output: str, climate_output: str) -> str:
"""
에이전트의 출력값을 결합하여 최종 권고 사항을 생성합니다.
"""
risk_level = "CRITICAL" if ("High" in hazard_output and "High" in climate_output) else "ELEVATED" if ("Moderate" in hazard_output and "High" in climate_output) else "MANAGEABLE"
return f"""
최종 합성 결과:
지형 위험 (Hazard): {hazard_output}
기후 (Climate): {climate_output}
복합 위험 수준 (Compounding Risk Level): {risk_level}
권고 사항 (Recommendation): {'눈 위 강우(rain-on-snow) 현상 및 사면 간극수압(slope pore-water pressure)에 대한 즉각적인 모니터링' if risk_level == 'CRITICAL' else '정기적인 관찰'}
"""
도구 4: 세션 컨텍스트 검증 (표류(drift) 방지)
@orchestrator.tool
def check_context_integrity(user_target: str, expected_target: str) -> bool:
"""
대화의 대상이 예기치 않게 변경되지 않았는지 확인합니다.
"""
return user_target.strip().lower() == expected_target.strip().lower()
주요 학습 내용 (Key Learnings)
관심사의 분리 (Separation of concerns)가 환각 (hallucination)을 방지함
Climate Agent에게는 지질학적 해석을 피하도록 하고, Hazard Agent에게는 기후 요인을 무시하도록 지시함으로써 각 에이전트가 자신의 역할에만 집중하게 만들었습니다. 이는 출력 품질을 극적으로 향상시켰습니다.
오케스트레이터 패턴 (orchestrator pattern)은 강력하지만 미묘함
Orchestrator Agent는 복잡한 모델이 필요하지 않습니다. 위임(delegate)하고 결합(combine)하기 위한 명확한 지침만 있으면 됩니다. 적절한 프롬프트 경계(prompt boundaries)를 설정하면 추론 체인의 "무결성(integrity)"(표류 없음)을 유지하는 것이 놀라울 정도로 쉬웠습니다.
도구 사용 (Tool use)이 추측을 대체함
Gemini에게 "산사태 위험을 추정해줘"라고 요청하는 대신, Hazard Agent에게 결정론적 로직(deterministic logic)을 가진 간단한 landslide_tool을 제공했습니다. 이는 모든 수치 기반 또는 규칙 기반 계산에 있어 매우 훌륭한 패턴입니다.
실제 환경의 제약 사항은 실재합니다. 개발 단계에서는 모든 것이 완벽하게 작동했지만, 이후 클라우드 실행 단계에서 결제 및 권한 제한으로 인해 차단되었습니다. 에이전트 상태(Agent health) 모니터링이 중요합니다. 테스트 과정에서 Climate Agent가 높은 온도 이상 샘플링(temperature anomaly sampling)으로 인해 토큰 병목 현상(4초 이상의 대기열)을 유발했습니다. 이는 잘 설계된 에이전트라 할지라도 정확도뿐만 아니라 성능 모니터링이 필요함을 보여주었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기