LLM Orchestrator
UnifiedLLMOrchestrator는 전체 Contexa 플랫폼의 중앙 LLM 클라이언트입니다. LLMOperations와 ToolCapableLLMClient를 모두 구현하여 동기 호출, Streaming, 구조화된 엔티티 추출, 모든 설정된 모델 프로바이더를 통한 Tool 호출을 위한 단일 진입점을 제공합니다.
개요
오케스트레이터는 ModelSelectionStrategy를 사용하여 각 요청에 적합한 모델을 선택하고, AdvisorRegistry를 통해 등록된 Spring AI Advisor를 자동으로 적용하며, SecurityTaskType, AnalysisLevel, 또는 명시적 티어 번호에 따른 계층형 모델 라우팅을 지원합니다. 또한 일시적인 I/O 장애에 대해 지수 백오프 재시도 로직을 처리합니다.
LLMClient
모든 LLM 상호작용을 위한 기본 인터페이스입니다. 가장 단순한 호출, 엔티티 추출, Streaming 메서드를 제공합니다.
public interface LLMClient
ToolCapableLLMClient
에이전트 워크플로우를 위한 Tool/함수 호출 기능으로 LLMClient를 확장합니다.
public interface ToolCapableLLMClient extends LLMClient
ToolCallback 배열로 LLM을 호출합니다.callTools()와 유사하지만 메타데이터와 Tool 호출 세부 정보를 포함한 전체 ChatResponse를 반환합니다.callToolCallbacks()와 유사하지만 전체 ChatResponse를 반환합니다.ToolCallback 배열로 응답을 스트리밍합니다.LLMOperations
원시 Prompt 객체 대신 ExecutionContext를 받는 상위 수준 인터페이스입니다. 내부 플랫폼 코드에서 선호되는 인터페이스입니다.
public interface LLMOperations
ExecutionContext
LLM 실행 요청의 모든 파라미터를 담는 Lombok @Builder 데이터 클래스입니다. 모델 선택, Tool 호출, 런타임 옵션을 구성하는 주요 방법입니다.
@Data @Builder
public class ExecutionContext
| 속성 | 타입 | 설명 |
|---|---|---|
prompt | Prompt | LLM에 전송할 Spring AI 프롬프트. |
requestId | String | 추적 및 로깅을 위한 고유 요청 식별자. |
userId | String | 보안 컨텍스트 전파를 위한 인증된 사용자 ID. |
sessionId | String | 상태 유지 상호작용을 위한 세션 ID. |
preferredModel | String | 티어 기반 선택을 우회하는 명시적 모델 이름. |
securityTaskType | SecurityTaskType | 기본 티어를 결정하는 보안 작업 분류. |
tier | Integer | 모델 선택을 위한 명시적 티어 번호 (1, 2, 또는 3). |
analysisLevel | AnalysisLevel | 기본 티어에 매핑되는 분석 깊이. |
temperature | Double | 샘플링 Temperature 오버라이드. |
topP | Double | Top-p (핵 샘플링) 오버라이드. |
maxTokens | Integer | 최대 출력 토큰 오버라이드. |
toolCallbacks | List<ToolCallback> | 이 실행에 활성화할 Tool 콜백. |
toolProviders | List<Object> | 이 실행에 활성화할 Tool 프로바이더 객체. |
streamingMode | Boolean | Streaming 실행 모드 사용 여부. |
toolExecutionEnabled | Boolean | 이 요청에 대해 Tool 호출 활성화 여부. |
seed | Integer | 결정론적 샘플링 시드. 재현 가능한 분석 결과에 유용합니다. |
chatOptions | ChatOptions | Spring AI ChatOptions를 모델에 직접 전달합니다. 개별 temperature/maxTokens 설정을 대체합니다. |
advisors | List<Advisor> | 글로벌 AdvisorRegistry 외에 요청 범위에서 적용되는 어드바이저. |
metadata | Map<String, Object> | 임의 메타데이터. 인식되는 키: disableRetries (재시도 건너뛰기), disableOllamaThinking (Ollama ThinkOption 억제). |
팩토리 및 헬퍼 메서드
| 메서드 | 반환 | 설명 |
|---|---|---|
ExecutionContext.from(Prompt) | ExecutionContext | Spring AI Prompt로부터 최소 컨텍스트를 생성합니다. |
ExecutionContext.forTier(int, Prompt) | ExecutionContext | 특정 티어에 고정된 컨텍스트를 생성합니다. |
addMetadata(String, Object) | ExecutionContext | 단일 메타데이터 항목을 추가하는 플루언트 세터. |
addAdvisor(Advisor) | ExecutionContext | 요청 범위 어드바이저를 추가하는 플루언트 세터. |
addToolCallback(ToolCallback) | ExecutionContext | Tool 콜백을 추가하는 플루언트 세터. |
getEffectiveTier() | int | 명시적 tier, analysisLevel, 또는 securityTaskType에서 실제 티어를 해석합니다. |
SecurityTaskType Enum
보안 작업을 분류하며, 모델 선택을 위한 기본 LLM 티어를 결정합니다.
| 값 | 기본 티어 | 설명 |
|---|---|---|
THREAT_FILTERING | 1 | 실시간 요청을 위한 빠른 위협 필터링. |
QUICK_DETECTION | 1 | 최소 지연 시간의 빠른 이상 탐지. |
CONTEXTUAL_ANALYSIS | 2 | 컨텍스트 인식 보안 분석. |
BEHAVIOR_ANALYSIS | 2 | 사용자 행동 패턴 분석. |
CORRELATION | 2 | 교차 이벤트 상관관계 분석. |
EXPERT_INVESTIGATION | 3 | 심층 전문가 수준 조사. |
INCIDENT_RESPONSE | 3 | 자동화된 인시던트 대응 계획. |
FORENSIC_ANALYSIS | 3 | 보안 이벤트 포렌식 분석. |
APPROVAL_WORKFLOW | 3 | Human-in-the-loop 승인 워크플로우. |
AnalysisLevel Enum
| 값 | 기본 티어 | 기본 타임아웃 |
|---|---|---|
QUICK | 1 | 50ms |
NORMAL | 2 | 300ms |
DEEP | 3 | 5000ms |
UnifiedLLMOrchestrator
모든 것을 연결하는 구체적인 구현체입니다. LLMOperations와 ToolCapableLLMClient를 모두 구현합니다.
public class UnifiedLLMOrchestrator implements LLMOperations, ToolCapableLLMClient
생성자 의존성
| 의존성 | 설명 |
|---|---|
ModelSelectionStrategy | 실행 컨텍스트에 따라 적절한 ChatModel을 선택합니다. |
StreamingHandler | Streaming 응답 처리 및 청크 전달을 담당합니다. |
TieredLLMProperties | 3티어 모델 계층 구조의 설정. |
AdvisorRegistry | 각 요청에 적용할 활성화된 Spring AI Advisor 레지스트리. |
주요 동작
- Advisor 통합 —
AdvisorRegistry의 모든 활성화된 Advisor를 생성되는 모든ChatClient인스턴스에 자동 적용합니다. Advisor 스냅샷은 캐시되며 활성화 집합이 변경되면 재구축됩니다. - 모델 선택 — 티어, 선호 모델, 분석 수준, 보안 작업 유형을 고려하는
ModelSelectionStrategy.selectModel()에 위임합니다. - 재시도 로직 — 실행 중
IOException에 대해 지수 백오프 재시도 (최대 2회)를 적용합니다. - Ollama 최적화 —
OllamaChatModel인스턴스를 감지하고 모델 이름, temperature, topP, numPredict 설정이 포함된OllamaOptions를 적용합니다.
코드 예제
티어 선택을 통한 기본 LLM 호출
ExecutionContext context = ExecutionContext.builder()
.prompt(new Prompt("Analyze this request for threats"))
.securityTaskType(SecurityTaskType.THREAT_FILTERING)
.userId("user-123")
.requestId(UUID.randomUUID().toString())
.build();
String result = orchestrator.execute(context).block();
Tool 호출 실행
Prompt prompt = new Prompt(
"Investigate and block suspicious IP 192.168.1.100");
String result = orchestrator.callTools(
prompt, List.of(ipBlockTool, auditTool)).block();
ExecutionContext를 사용한 Streaming
ExecutionContext context = ExecutionContext.builder()
.prompt(new Prompt("Perform deep forensic analysis"))
.securityTaskType(SecurityTaskType.FORENSIC_ANALYSIS)
.streamingMode(true)
.build();
orchestrator.stream(context)
.subscribe(chunk -> sendToClient(chunk));
관련 문서
LLM 프로바이더 및 모델 설정 속성은 AI 설정을 참조하세요 —
TieredStrategyProperties (모델 티어, 타임아웃, 재시도), SecurityMappingProperties (작업-티어 매핑), ContexaAdvisorProperties를 다룹니다.