contexa-core

LLM Orchestrator

UnifiedLLMOrchestrator는 전체 Contexa 플랫폼의 중앙 LLM 클라이언트입니다. LLMOperationsToolCapableLLMClient를 모두 구현하여 동기 호출, Streaming, 구조화된 엔티티 추출, 모든 설정된 모델 프로바이더를 통한 Tool 호출을 위한 단일 진입점을 제공합니다.

개요

오케스트레이터는 ModelSelectionStrategy를 사용하여 각 요청에 적합한 모델을 선택하고, AdvisorRegistry를 통해 등록된 Spring AI Advisor를 자동으로 적용하며, SecurityTaskType, AnalysisLevel, 또는 명시적 티어 번호에 따른 계층형 모델 라우팅을 지원합니다. 또한 일시적인 I/O 장애에 대해 지수 백오프 재시도 로직을 처리합니다.

LLMClient

모든 LLM 상호작용을 위한 기본 인터페이스입니다. 가장 단순한 호출, 엔티티 추출, Streaming 메서드를 제공합니다.

public interface LLMClient
call(Prompt prompt) Mono<String>
프롬프트를 LLM에 전송하고 텍스트 응답을 반환합니다.
entity(Prompt prompt, Class<T> targetType) Mono<T>
프롬프트를 전송하고 Spring AI의 구조화된 출력 지원을 사용하여 응답을 지정된 타입으로 역직렬화합니다.
stream(Prompt prompt) Flux<String>
응답을 일련의 문자열 청크로 스트리밍합니다.

ToolCapableLLMClient

에이전트 워크플로우를 위한 Tool/함수 호출 기능으로 LLMClient를 확장합니다.

public interface ToolCapableLLMClient extends LLMClient
callTools(Prompt prompt, List<Object> toolProviders) Mono<String>
Spring AI Tool 프로바이더 객체와 함께 LLM을 호출합니다. LLM이 Tool을 호출하고 최종 텍스트를 반환할 수 있습니다.
callToolCallbacks(Prompt prompt, ToolCallback[] toolCallbacks) Mono<String>
프로바이더 객체 대신 명시적 ToolCallback 배열로 LLM을 호출합니다.
callToolsResponse(Prompt prompt, List<Object> toolProviders) Mono<ChatResponse>
callTools()와 유사하지만 메타데이터와 Tool 호출 세부 정보를 포함한 전체 ChatResponse를 반환합니다.
callToolCallbacksResponse(Prompt prompt, ToolCallback[] toolCallbacks) Mono<ChatResponse>
callToolCallbacks()와 유사하지만 전체 ChatResponse를 반환합니다.
streamTools(Prompt prompt, List<Object> toolProviders) Flux<String>
에이전트 Streaming 워크플로우를 위해 Tool 호출을 활성화하면서 응답을 스트리밍합니다.
streamToolCallbacks(Prompt prompt, ToolCallback[] toolCallbacks) Flux<String>
Tool 활성화 Streaming을 위해 명시적 ToolCallback 배열로 응답을 스트리밍합니다.

LLMOperations

원시 Prompt 객체 대신 ExecutionContext를 받는 상위 수준 인터페이스입니다. 내부 플랫폼 코드에서 선호되는 인터페이스입니다.

public interface LLMOperations
execute(ExecutionContext context) Mono<String>
티어, 보안 작업 유형, 모델 설정, Tool 구성을 포함한 전체 컨텍스트로 LLM 호출을 실행합니다.
stream(ExecutionContext context) Flux<String>
선택된 모델로 Streaming 핸들러를 사용하여 LLM 응답을 스트리밍합니다.
executeEntity(ExecutionContext context, Class<T> targetType) Mono<T>
LLM 응답을 실행하고 타입이 지정된 엔티티로 역직렬화합니다.

ExecutionContext

LLM 실행 요청의 모든 파라미터를 담는 Lombok @Builder 데이터 클래스입니다. 모델 선택, Tool 호출, 런타임 옵션을 구성하는 주요 방법입니다.

@Data @Builder
public class ExecutionContext
속성타입설명
promptPromptLLM에 전송할 Spring AI 프롬프트.
requestIdString추적 및 로깅을 위한 고유 요청 식별자.
userIdString보안 컨텍스트 전파를 위한 인증된 사용자 ID.
sessionIdString상태 유지 상호작용을 위한 세션 ID.
preferredModelString티어 기반 선택을 우회하는 명시적 모델 이름.
securityTaskTypeSecurityTaskType기본 티어를 결정하는 보안 작업 분류.
tierInteger모델 선택을 위한 명시적 티어 번호 (1, 2, 또는 3).
analysisLevelAnalysisLevel기본 티어에 매핑되는 분석 깊이.
temperatureDouble샘플링 Temperature 오버라이드.
topPDoubleTop-p (핵 샘플링) 오버라이드.
maxTokensInteger최대 출력 토큰 오버라이드.
toolCallbacksList<ToolCallback>이 실행에 활성화할 Tool 콜백.
toolProvidersList<Object>이 실행에 활성화할 Tool 프로바이더 객체.
streamingModeBooleanStreaming 실행 모드 사용 여부.
toolExecutionEnabledBoolean이 요청에 대해 Tool 호출 활성화 여부.
seedInteger결정론적 샘플링 시드. 재현 가능한 분석 결과에 유용합니다.
chatOptionsChatOptionsSpring AI ChatOptions를 모델에 직접 전달합니다. 개별 temperature/maxTokens 설정을 대체합니다.
advisorsList<Advisor>글로벌 AdvisorRegistry 외에 요청 범위에서 적용되는 어드바이저.
metadataMap<String, Object>임의 메타데이터. 인식되는 키: disableRetries (재시도 건너뛰기), disableOllamaThinking (Ollama ThinkOption 억제).

팩토리 및 헬퍼 메서드

메서드반환설명
ExecutionContext.from(Prompt)ExecutionContextSpring AI Prompt로부터 최소 컨텍스트를 생성합니다.
ExecutionContext.forTier(int, Prompt)ExecutionContext특정 티어에 고정된 컨텍스트를 생성합니다.
addMetadata(String, Object)ExecutionContext단일 메타데이터 항목을 추가하는 플루언트 세터.
addAdvisor(Advisor)ExecutionContext요청 범위 어드바이저를 추가하는 플루언트 세터.
addToolCallback(ToolCallback)ExecutionContextTool 콜백을 추가하는 플루언트 세터.
getEffectiveTier()int명시적 tier, analysisLevel, 또는 securityTaskType에서 실제 티어를 해석합니다.

SecurityTaskType Enum

보안 작업을 분류하며, 모델 선택을 위한 기본 LLM 티어를 결정합니다.

기본 티어설명
THREAT_FILTERING1실시간 요청을 위한 빠른 위협 필터링.
QUICK_DETECTION1최소 지연 시간의 빠른 이상 탐지.
CONTEXTUAL_ANALYSIS2컨텍스트 인식 보안 분석.
BEHAVIOR_ANALYSIS2사용자 행동 패턴 분석.
CORRELATION2교차 이벤트 상관관계 분석.
EXPERT_INVESTIGATION3심층 전문가 수준 조사.
INCIDENT_RESPONSE3자동화된 인시던트 대응 계획.
FORENSIC_ANALYSIS3보안 이벤트 포렌식 분석.
APPROVAL_WORKFLOW3Human-in-the-loop 승인 워크플로우.

AnalysisLevel Enum

기본 티어기본 타임아웃
QUICK150ms
NORMAL2300ms
DEEP35000ms

UnifiedLLMOrchestrator

모든 것을 연결하는 구체적인 구현체입니다. LLMOperationsToolCapableLLMClient를 모두 구현합니다.

public class UnifiedLLMOrchestrator implements LLMOperations, ToolCapableLLMClient

생성자 의존성

의존성설명
ModelSelectionStrategy실행 컨텍스트에 따라 적절한 ChatModel을 선택합니다.
StreamingHandlerStreaming 응답 처리 및 청크 전달을 담당합니다.
TieredLLMProperties3티어 모델 계층 구조의 설정.
AdvisorRegistry각 요청에 적용할 활성화된 Spring AI Advisor 레지스트리.

주요 동작

  • Advisor 통합AdvisorRegistry의 모든 활성화된 Advisor를 생성되는 모든 ChatClient 인스턴스에 자동 적용합니다. Advisor 스냅샷은 캐시되며 활성화 집합이 변경되면 재구축됩니다.
  • 모델 선택 — 티어, 선호 모델, 분석 수준, 보안 작업 유형을 고려하는 ModelSelectionStrategy.selectModel()에 위임합니다.
  • 재시도 로직 — 실행 중 IOException에 대해 지수 백오프 재시도 (최대 2회)를 적용합니다.
  • Ollama 최적화OllamaChatModel 인스턴스를 감지하고 모델 이름, temperature, topP, numPredict 설정이 포함된 OllamaOptions를 적용합니다.

코드 예제

티어 선택을 통한 기본 LLM 호출

Java
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 호출 실행

Java
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

Java
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를 다룹니다.