LLM & 모델
UnifiedLLMOrchestrator는 Contexa 플랫폼의 중앙 LLM 클라이언트입니다. 동기 호출, Streaming, 구조화된 엔티티 추출, Tool 호출을 위한 단일 진입점을 제공하며, 계층형 모델 선택·Advisor 통합·자동 재시도 로직을 포함합니다.
개요
오케스트레이터는 LLMOperations(컨텍스트 기반 API)와 ToolCapableLLMClient(프롬프트 기반 API)를 모두 구현하여, 플랫폼 전역에서 LLM 모델에 유연하게 접근할 수 있도록 합니다.
직접 사용이 적절한 경우
대부분의 경우 오케스트레이터를 직접 호출할 필요가 없습니다. Pipeline의 LLM_EXECUTION 단계가 자동으로 호출합니다. 다음 상황에서는 직접 사용이 적절합니다:
| 시나리오 | 권장 접근 방식 |
|---|---|
| 구조화된 입출력을 가진 완전한 AI 기능 | Strategy/Lab/Pipeline 아키텍처를 사용하세요. 파이프라인이 오케스트레이터를 대신 호출합니다. |
| 단순 채팅 또는 텍스트 생성 | ExecutionContext로 오케스트레이터를 직접 사용합니다. |
| Tool 호출 / 에이전트 워크플로우 | 오케스트레이터의 callTools() 또는 callToolCallbacks() 메서드를 직접 호출합니다. |
| 커스텀 모델 선택 또는 Temperature | 명시적 tier·모델·temperature를 지정하여 ExecutionContext.builder()를 사용합니다. |
계층형 모델 아키텍처
오케스트레이터는 티어 인식 모델 선택을 사용합니다. 현재 OSS 런타임의 TieredLLMProperties는 구성된 두 계층(layer1, layer2)을 노출합니다. AnalysisLevel이나 SecurityTaskType의 높은 시맨틱 티어는, 명시적 모델이 요청되지 않는 한 구성된 layer-2 런타임으로 정규화됩니다.
| 티어 | 특성 | 일반적 용도 |
|---|---|---|
| Tier 1 | 빠르고 낮은 temperature(예: 0.3) | 빠른 탐지·위협 필터링·지연 시간에 민감한 판단을 위한 구성된 런타임 layer 1 |
| Tier 2 | 균형 잡힌 중간 temperature(예: 0.7) | 컨텍스트 분석·행동 분석·상관 관계 분석을 위한 구성된 런타임 layer 2 |
| Tier 3 | DEEP·EXPERT_INVESTIGATION 같은 enum이 사용하는 "심층" 시맨틱 티어 |
명시적 모델 오버라이드가 없는 한 구성된 layer-2 런타임으로 정규화됩니다 |
티어 선택 동작 방식
유효 모델은 다음 순서로 해석됩니다:
preferredModel또는requestedModelId,preferredModel,runtimeModelId,modelId와 같은 실행 메타데이터 — 명시적 모델 ID는 티어 매핑을 완전히 우회합니다analysisLevel— QUICK→1, NORMAL→2, DEEP→3 (런타임에서 구성된 layer 2로 정규화됨)securityTaskType—analysisLevel이 없을 때 보안 작업이 기본 시맨틱 티어로 매핑됩니다tier— 더 높은 우선순위 선택자가 없을 때의 명시적 숫자 티어. 1을 초과하는 값은 layer 2로 정규화됩니다- 구성된 모델을 해석할 수 없을 때의 최종 폴백으로서의 기본
ChatModel빈
AnalysisLevel Enum
| 값 | 기본 티어 | 기본 타임아웃 |
|---|---|---|
QUICK | 1 | 50ms |
NORMAL | 2 | 300ms |
DEEP | 3 | 5000ms |
ExecutionContext
LLM 요청을 구성하는 주요 방법입니다. @Builder 패턴으로 생성됩니다:
ExecutionContext context = ExecutionContext.builder()
.prompt(new Prompt("Analyze this for threats"))
.analysisLevel(ExecutionContext.AnalysisLevel.NORMAL)
.userId("user-123")
.requestId(UUID.randomUUID().toString())
.build();
// Execute
Mono<String> result = orchestrator.execute(context);
// Or stream
Flux<String> chunks = orchestrator.stream(context);
주요 속성
| 속성 | 타입 | 설명 |
|---|---|---|
prompt | Prompt | LLM에 전송할 Spring AI 프롬프트. |
requestId | String | 추적용 고유 요청 ID. |
userId | String | 보안 컨텍스트를 위한 인증된 사용자 ID. |
sessionId | String | 요청에 함께 전달되는 세션 식별자. |
preferredModel | String | 명시적 모델 이름. 모든 티어 기반 선택을 우회합니다. |
securityTaskType | SecurityTaskType | 보안 작업 분류. analysisLevel이 없을 때 기본 티어를 해석하는 데 사용됩니다. |
tier | Integer | 명시적 시맨틱 티어. 현재 런타임은 1 또는 2를 구성된 계층으로 수용하며, 더 높은 값은 layer 2로 정규화합니다. |
analysisLevel | AnalysisLevel | 분석 깊이: QUICK, NORMAL, DEEP. 기본 티어를 결정합니다. |
timeoutMs | Integer | 명시적 타임아웃 오버라이드(밀리초). null이면 tier/analysisLevel 기본값이 사용됩니다. |
temperature | Double | 샘플링 temperature 오버라이드. |
topP | Double | Top-p(핵 샘플링) 오버라이드. |
seed | Integer | 결정론적 샘플링 시드. 재현 가능한 분석 결과에 유용합니다. |
maxTokens | Integer | 최대 출력 토큰 오버라이드. |
chatOptions | ChatOptions | 모델에 직접 전달할 Spring AI ChatOptions. 개별 temperature/maxTokens 설정을 대체합니다. |
streamingMode | Boolean | Streaming 실행 사용 여부. |
toolCallbacks | List<ToolCallback> | Tool 호출 실행을 위한 Tool 콜백. |
toolProviders | List<Object> | Tool 호출 실행을 위한 Tool 프로바이더 객체. |
toolExecutionEnabled | Boolean | Tool 실행의 마스터 플래그. addToolCallback(...) 호출 시 자동으로 설정됩니다. |
advisors | List<Advisor> | 글로벌 AdvisorRegistry에 추가로 적용되는 요청 범위 어드바이저. |
advisorEnabled | Boolean | 이 호출에 글로벌/요청 어드바이저를 적용할지 여부. 팩토리 메서드에서 기본값은 true입니다. |
metadata | Map<String, Object> | 임의 메타데이터 맵. 소비자(예: UnifiedLLMOrchestrator)는 requestedModelId, runtimeModelId, selectedModelId와 같은 커스텀 키를 읽을 수 있습니다. 실제로 읽는 키는 UnifiedLLMOrchestrator 소스를 참조하세요. |
AnalysisLevel 기본 모델 이름
각 AnalysisLevel 값은 getDefaultModelName()을 통해 기본 모델 이름도 노출합니다. 티어 해석이 구성된 layer 모델 없이 폴백될 때 오케스트레이터가 이 기본값을 사용합니다:
| 값 | 기본 모델 이름 |
|---|---|
QUICK | tinyllama:latest |
NORMAL | llama3.1:8b |
DEEP | llama3.1:8b |
팩토리 & 헬퍼 메서드
| 메서드 | 반환 | 설명 |
|---|---|---|
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 (전체 목록)
기본 티어가 3인 작업도 preferredModel이나 메타데이터가 다른 모델을 명시적으로 선택하지 않는 한 구성된 layer-2 모델을 통해 처리됩니다.
| 값 | 기본 티어 | 설명 |
|---|---|---|
THREAT_FILTERING | 1 | 실시간 요청을 위한 빠른 위협 필터링. |
QUICK_DETECTION | 1 | 최소 지연 시간의 빠른 이상 탐지. |
CONTEXTUAL_ANALYSIS | 2 | 컨텍스트 인식 보안 분석. |
BEHAVIOR_ANALYSIS | 2 | 사용자 행동 패턴 분석. |
CORRELATION | 2 | 교차 이벤트 상관 관계 분석. |
EXPERT_INVESTIGATION | 3 | 심층 전문가 수준 조사. |
SOAR_AUTOMATION | 3 | SOAR 오케스트레이션 및 자동화된 인시던트 대응(Enterprise). |
INCIDENT_RESPONSE | 3 | 자동화된 인시던트 대응 계획. |
FORENSIC_ANALYSIS | 3 | 보안 이벤트 포렌식 분석. |
APPROVAL_WORKFLOW | 3 | Human-in-the-loop 승인 워크플로우. |
Tool 호출
오케스트레이터는 에이전트 워크플로우를 위한 Spring AI Tool 호출을 지원합니다. 두 가지 접근 방식이 있습니다:
Tool 프로바이더(어노테이션 메서드)
// Tool provider objects - Spring AI discovers @Tool methods
Prompt prompt = new Prompt("Block suspicious IP 192.168.1.100");
Mono<String> result = orchestrator.callTools(
prompt, List.of(ipBlockTool, auditTool));
ToolCallback 배열(명시적)
// Explicit ToolCallback array
ToolCallback[] callbacks = new ToolCallback[] {
myToolCallback1, myToolCallback2
};
Mono<String> result = orchestrator.callToolCallbacks(
prompt, callbacks);
두 접근 방식 모두 Streaming도 지원합니다: streamTools()와 streamToolCallbacks().
Advisor 시스템
오케스트레이터는 AdvisorRegistry에서 활성화된 어드바이저를 가져와 ExecutionContext에 연결된 요청 범위 어드바이저와 결합합니다. 이 어드바이저들은 오케스트레이터가 선택된 모델에 대한 채팅 호출을 구성할 때 적용됩니다.
커스텀 Advisor 구현
LLM 요청과 응답을 가로채는 어드바이저를 만들려면 BaseAdvisor를 확장합니다:
@Component
public class RequestLoggingAdvisor extends BaseAdvisor {
public RequestLoggingAdvisor() {
super("myapp", "request-logging", 100);
// domain, name, order (lower = runs first)
}
@Override
public ChatClientRequest beforeCall(
ChatClientRequest request) {
// Inspect or modify the request before LLM call
// e.g., log the prompt, add metadata
return request;
}
@Override
public ChatClientResponse afterCall(
ChatClientResponse response,
ChatClientRequest request) {
// Inspect or modify the response after LLM call
// e.g., validate response, log metrics
return response;
}
}
Advisor는 Spring 빈으로 자동 등록됩니다. AdvisorRegistry는 활성화/비활성화 상태를 관리하고 오케스트레이터에 정렬된 어드바이저 스냅샷을 제공합니다.
설정
| 속성 | 설명 | 기본값 |
|---|---|---|
spring.ai.security.layer1.model | layer 1 요청에 선택되는 기본 모델 | qwen2.5:7b |
spring.ai.security.layer2.model | layer 2 요청에 선택되는 기본 모델 | gpt-4o-mini |
spring.ai.security.tiered.layer1.timeout-ms | layer 1 모델 호출의 실행 타임아웃 예산 | 30000 |
contexa.llm.chat.ollama.base-url | 전용 Contexa Ollama 경로가 활성화될 때의 Ollama 채팅 런타임 base URL | empty |
contexa.llm.chat.ollama.model | Contexa 관리 런타임의 기본 Ollama 채팅 모델 | empty |
모든 모델·티어·어드바이저·재시도 속성은 AI 설정을 참조하세요.
API 레퍼런스
LLMOperations 인터페이스
public interface LLMOperations
LLMClient 인터페이스
public interface LLMClient
ToolCapableLLMClient 인터페이스
public interface ToolCapableLLMClient extends LLMClient
ChatResponse를 반환합니다.callToolsResponse와 동일하지만 명시적 ToolCallback 배열을 받습니다.UnifiedLLMOrchestrator
public class UnifiedLLMOrchestrator implements LLMOperations, ToolCapableLLMClient
생성자 의존성
| 의존성 | 설명 |
|---|---|
ModelSelectionStrategy | 실행 컨텍스트에 기반해 ChatModel을 선택합니다. |
StreamingHandler | Streaming 응답 처리를 담당합니다. |
TieredLLMProperties | 모델 티어 계층 구조의 설정. |
AdvisorRegistry | 각 요청에 적용되는 Spring AI Advisor 레지스트리. |
주요 동작
- Advisor 통합 —
AdvisorRegistry의 모든 활성화된 어드바이저를 자동 적용합니다. - 모델 선택 — 티어·선호 모델·분석 수준·보안 작업 유형을 고려하는
ModelSelectionStrategy.selectModel()에 위임합니다. - 재시도 로직 —
IOException에 대해 지수 백오프 재시도(최대 2회)를 적용합니다. - Ollama 최적화 —
OllamaChatModel을 감지하여 모델 이름·temperature·topP·numPredict가 포함된OllamaOptions를 적용합니다.