Model Provider
모델 프로바이더 시스템은 여러 백엔드에 걸쳐 LLM 모델을 관리합니다. DynamicModelRegistry는 Spring AI ChatModel 빈과 커스텀 ModelProvider 구현체를 자동 탐색하며, DynamicModelSelectionStrategy는 명시적 모델 힌트, 계층 매핑, 가용성, 구성된 폴백을 바탕으로 각 요청의 런타임 모델을 선택합니다.
개요
Contexa는 여러 LLM 프로바이더를 동시에 지원합니다. 시작 시 DynamicModelRegistry는 세 가지 메커니즘을 통해 사용 가능한 모든 모델을 탐색합니다:
- ModelProvider 빈 — Spring 컨텍스트에 등록된 커스텀 프로바이더 구현체.
- Spring AI ChatModel 빈 —
contexa.llm.chat.ollama.*,spring.ai.anthropic.*, 또는spring.ai.openai.*설정에서 생성된ChatModel빈을 자동 감지합니다. - TieredLLMProperties — 구성된 layer-1 / layer-2 계층에서 선언된 모델 ID.
레지스트리는 모델 클래스 이름에서 프로바이더를 자동 추론하고 (Ollama, Anthropic, OpenAI, Gemini, Mistral, Azure, Bedrock, HuggingFace) 초기화 시 헬스 체크를 수행합니다.
ModelProvider
커스텀 모델 프로바이더 구현을 위한 인터페이스입니다. Spring AI 자동 설정으로 다루지 않는 프로바이더를 지원하려면 이를 구현하세요.
public interface ModelProvider
ChatModel 인스턴스를 생성합니다. config 맵은 런타임 오버라이드를 제공합니다.ModelDescriptor
모델의 ID, 기능, 기본 옵션, 현재 상태를 설명합니다.
@Data @Builder
public class ModelDescriptor
| 속성 | 타입 | 설명 |
|---|---|---|
modelId | String | 고유 모델 식별자 (예: "llama3.1:8b", "claude-3-opus"). |
displayName | String | 사람이 읽을 수 있는 모델 이름. |
provider | String | 프로바이더 이름 (ollama, anthropic, openai). |
tier | Integer | 이 모델에 할당된 런타임 계층입니다 (1 또는 2). 미할당 시 null입니다. |
version | String | 모델 버전 문자열. |
capabilities | ModelCapabilities | 모델이 지원하는 기능 (Streaming, Tool 호출, 멀티모달, 컨텍스트 윈도우, 출력 예산). |
options | ModelOptions | 기본 샘플링 옵션 (temperature, topP, topK, repetitionPenalty). |
status | ModelStatus | AVAILABLE 또는 UNAVAILABLE. |
ModelCapabilities
| 필드 | 타입 | 기본값 |
|---|---|---|
streaming | boolean | true |
toolCalling | boolean | false |
functionCalling | boolean | false |
multiModal | boolean | false |
maxTokens | int | 4096 |
contextWindow | int | 4096 |
maxOutputTokens | int | 4096 |
ModelOptions
| 필드 | 타입 | 기본값 |
|---|---|---|
temperature | Double | 0.7 |
topP | Double | 0.9 |
topK | Integer | null |
repetitionPenalty | Double | 1.0 |
DynamicModelRegistry
모든 LLM 모델을 탐색, 관리, 접근하는 중앙 레지스트리입니다. 애플리케이션 시작 시 자동 초기화됩니다.
public class DynamicModelRegistry
ChatModel을 반환합니다. 아직 로드되지 않은 경우 인스턴스를 생성하고 캐시합니다. 찾지 못하면 ModelSelectionException을 던집니다.ChatModel 인스턴스를 만들지 않고, 모델 ID에 대한 등록된 디스크립터를 반환합니다.AVAILABLE 모델 디스크립터를 반환합니다.shutdown()을 호출합니다.ModelSelectionStrategy
모델 선택 로직을 위한 인터페이스입니다. DynamicModelSelectionStrategy가 기본 구현체입니다.
public interface ModelSelectionStrategy
DynamicModelSelectionStrategy
기본 선택 전략은 명시적 모델 우선 폴백 체인을 사용합니다:
public class DynamicModelSelectionStrategy implements ModelSelectionStrategy
- 명시적 모델 요청 —
ExecutionContext.preferredModel또는 메타데이터의requestedModelId,preferredModel,runtimeModelId,modelId키를 먼저 확인합니다. - 티어 해석 — 명시적 모델이 없으면
analysisLevel,securityTaskType,ExecutionContext.tier순서로 의미적 티어를 해석합니다. 1보다 큰 값은 구성된 layer 2로 정규화됩니다. - 주/백업 모델 조회 — 해석된 티어에 대해
TieredLLMProperties의 주 모델을 먼저 시도하고, 필요하면 백업 모델로 폴백합니다. - 기본 ChatModel 폴백 — 티어 기반 선택까지 실패하면 자동 구성된 기본
ChatModel빈을 마지막 폴백으로 사용합니다.
설정
계층형 모델 구조
contexa:
llm:
layer1:
model: tinyllama:latest
backup:
model: qwen2.5:0.5b
layer2:
model: llama3.1:8b
backup:
model: exaone3.5:7.8b
모델 선택 우선순위: 선택은 먼저 ExecutionContext.preferredModel과 메타데이터의 명시적 모델 키를 확인하고, 그 다음 analysisLevel → securityTaskType → ExecutionContext.tier 순으로 티어를 해석합니다. 이후 TieredLLMProperties의 주/백업 모델을 시도하고, 마지막으로 기본 ChatModel 빈으로 폴백합니다.