AI 엔진 구성

계층형 LLM 전략, 보안 작업 매핑, RAG (Retrieval-Augmented Generation), Advisor 체인, 스트리밍 파이프라인을 포함한 Contexa AI 엔진의 구성 속성입니다.

계층형 LLM 속성

contexa.llm.*spring.ai.security.*를 함께 사용해 런타임 선택과 계층별 모델 할당을 구성합니다. OSS 코어는 Ollama chat runtime을 직접 wiring하며, OpenAI/Anthropic은 Spring AI provider bean이 존재할 때 우선순위에 따라 선택됩니다.

관련 문서: LLM Orchestrator 참조, AI 전략 참조

속성기본값설명
contexa.llm.enabledtrueContexa LLM 기능 전체 활성화 플래그
contexa.llm.advisor-enabledtrueAdvisor 체인 등록 활성화
contexa.llm.selection.chat.modeDYNAMIC_PRIORITY채팅 제공자 선택 방식: DYNAMIC_PRIORITY는 우선순위 목록 순회, SPRING_PRIMARY는 Spring @Primary 빈 사용
contexa.llm.selection.chat.priority""쉼표 구분 채팅 제공자 우선순위 (예: ollama,anthropic,openai)
contexa.llm.selection.embedding.modeDYNAMIC_PRIORITY임베딩 제공자 선택 방식
contexa.llm.selection.embedding.priority""쉼표 구분 임베딩 제공자 우선순위 (예: ollama,openai)
contexa.llm.chat.ollama.base-url""내장 Ollama chat runtime 활성화 시 필요한 base URL
contexa.llm.chat.ollama.model""명시하지 않으면 자동 구성에서 qwen2.5:7b를 기본 chat model로 사용
contexa.llm.chat.ollama.keep-alive""Ollama chat keep-alive 힌트
contexa.llm.embedding.ollama.dedicated-runtime-enabledfalse전용 embedding Ollama runtime 사용 여부
contexa.llm.embedding.ollama.base-url""전용 embedding runtime 사용 시 필요한 base URL
contexa.llm.embedding.ollama.model""명시하지 않으면 mxbai-embed-large 기본값 사용
spring.ai.security.layer1.modelqwen2.5:7bLayer 1 모델
spring.ai.security.layer1.backup.modelLayer 1 백업 모델
spring.ai.security.layer2.modelgpt-4o-miniLayer 2 모델
spring.ai.security.layer2.backup.modelLayer 2 백업 모델
spring.ai.security.tiered.layer1.timeout-ms30000TieredLLMProperties가 사용하는 Layer 1 추론 타임아웃 기본값
spring.ai.security.tiered.layer2.timeout-ms60000TieredLLMProperties가 사용하는 Layer 2 추론 타임아웃 기본값
YAML
contexa:
  llm:
    selection:
      chat:
        mode: DYNAMIC_PRIORITY
        priority: ollama,anthropic,openai
      embedding:
        mode: DYNAMIC_PRIORITY
        priority: ollama,openai
    chat:
      ollama:
        base-url: http://localhost:11434
        model: qwen2.5:7b
    embedding:
      ollama:
        dedicated-runtime-enabled: true
        base-url: http://localhost:11435
        model: mxbai-embed-large
spring:
  ai:
    security:
      layer1:
        model: qwen2.5:7b
        backup:
          model: llama3.2:latest
      layer2:
        model: gpt-4o-mini
        backup:
          model: deepseek-r1:14b
      tiered:
        layer1:
          timeout-ms: 30000
        layer2:
          timeout-ms: 60000

OpenAI, Anthropic 자격 증명은 Spring AI의 spring.ai.openai.*, spring.ai.anthropic.*에서 구성하고, Contexa는 등록된 provider bean 중 우선순위에 따라 선택합니다.

권장 선택 구성 (OpenAI + Anthropic + Ollama 페일오버)

관리형 클라우드 제공자와 로컬 Ollama 런타임을 함께 묶으면, API 키가 없거나 클라우드 엔드포인트가 도달 불가능할 때 채팅 호출이 자연스럽게 다음 단계로 떨어집니다. 아래 예제는 OpenAI 를 1차 채팅 제공자, Anthropic 을 2차 페일오버, 로컬 Ollama 런타임을 오프라인 / 키 없음 상태의 최종 폴백으로 사용합니다. 임베딩은 항상 OpenAI 를 사용합니다.

YAML
contexa:
  llm:
    selection:
      chat:
        mode: dynamic-priority
        priority: openai,anthropic,ollama
      embedding:
        mode: dynamic-priority
        priority: openai

키별 의미

  • mode: dynamic-priority — 오케스트레이터가 콤마로 구분된 priority 목록을 순서대로 평가하여, ChatModel / EmbeddingModel Bean 이 등록되고 호출 가능한 첫 제공자를 선택합니다. dynamic-priorityMode.DYNAMIC_PRIORITY enum 의 kebab-case 표기이며, 두 형태 모두 Spring 의 relaxed binding 으로 동일한 값에 바인딩됩니다.
  • priority: openai,anthropic,ollama — 채팅 호출은 먼저 OpenAI 를 시도하고, OpenAI 클라이언트의 키가 없거나 복구 불가 오류가 발생하면 오케스트레이터가 Anthropic 으로 페일오버합니다. Anthropic 도 사용 불가일 때는 로컬 Ollama 런타임으로 떨어집니다. 목록 순서가 곧 페일오버 순서이므로, 비용이 낮거나 더 안정적인 제공자를 앞에 둡니다.
  • priority: openai (임베딩) — Anthropic 은 Spring AI 에 임베딩 모델을 제공하지 않으며, 플랫폼의 pgvector 스키마는 임베딩 차원을 1536 으로 고정합니다. 이는 OpenAItext-embedding-3-small / text-embedding-ada-002 차원과 일치합니다. 임베딩 목록에 Ollama (보통 768 / 1024 차원) 를 섞으면 같은 컬럼에 폭이 다른 벡터가 기록되어 유사도 검색이 깨집니다. 임베딩은 1536 차원 단일 제공자 로 유지하십시오.

선택 블록과 Spring AI 제공자 속성 짝짓기

contexa.llm.selection.* 블록은 어느 제공자를 호출할지를 결정하지만, 실제 API 키와 모델 식별자는 표준 Spring AI 속성 트리에 둡니다.

YAML
spring:
  ai:
    retry:
      max-attempts: 1
    anthropic:
      api-key: ${ANTHROPIC_API_KEY:disabled}
      chat:
        options:
          model: claude-3-sonnet-20240229
    openai:
      api-key: ${OPENAI_API_KEY:disabled}
      base-url: https://api.openai.com
      chat:
        options:
          model: gpt-4o-mini
          temperature: 0.3
  • API 키 자리표시자 — 기본값 disabled 문자열은 운영자가 환경 변수를 주입하지 않은 상태에서 자동 구성이 실제 클라이언트를 등록하지 않도록 막습니다. ANTHROPIC_API_KEY / OPENAI_API_KEY 를 설정하면 해당 제공자가 활성화되고, disabled 그대로 두면 의도적으로 그 분기를 건너뛰어 우선순위의 다음 제공자가 처리합니다.
  • spring.ai.retry.max-attempts: 1dynamic-priority 로 두 제공자를 연쇄 구성한 환경에서는 Spring AI 내부에서 같은 실패 제공자를 재시도하는 것은 지연만 늘립니다. 1 로 각 호출을 단일 시도로 묶고, CONTEXA 의 페일오버 선택자가 다음 항목을 고르도록 합니다.
  • 모델 식별자gpt-4o-mini 는 Tier 1 (낮은 지연시간의 Layer 1 컨텍스트 결정) 에, claude-3-sonnet-20240229 는 Tier 2 (포렌식 Layer 2 추론) 에 권장합니다. 새 SKU 가 출시되면 그에 맞게 교체합니다.
  • OpenAI 측의 temperature: 0.3 은 의도적입니다. 보안 결정 프롬프트는 낮은 temperature 가 유리하며, 이 값을 높이면 BLOCK / ESCALATE 경계 판단의 편차가 커집니다.

계층형 전략 속성

spring.ai.security.tiered 아래의 속성으로, TieredStrategyProperties에 바인딩됩니다. 프롬프트 예산, 잘림, 벡터 캐시, 프록시 검증, RAG 임계값을 계층별로 제어합니다.

Layer 1 설정

속성기본값설명
spring.ai.security.tiered.layer1.rag.similarity-threshold0.5Layer 1 RAG 임계값
spring.ai.security.tiered.layer1.session.max-recent-actions100세션 문맥에 포함할 최대 최근 액션 수
spring.ai.security.tiered.layer1.cache.max-size1000Layer 1 결과 캐시 최대 수
spring.ai.security.tiered.layer1.cache.ttl-minutes30Layer 1 결과 캐시 TTL(분)
spring.ai.security.tiered.layer1.timeout.total-ms5000Layer 1 전체 파이프라인 타임아웃(ms)
spring.ai.security.tiered.layer1.timeout.llm-ms3200Layer 1 LLM 호출 타임아웃(ms)
spring.ai.security.tiered.layer1.timeout.rag-ms900Layer 1 RAG 단계 타임아웃(ms)
spring.ai.security.tiered.layer1.vector-search-limit3Layer 1 벡터 검색 상한
spring.ai.security.tiered.layer1.default-budget-profileCORTEX_L1_INTERACTIVE_STRICT기본 예산 프로파일

Layer 1 프롬프트 설정

속성기본값설명
spring.ai.security.tiered.layer1.prompt.max-similar-events2프롬프트에 포함할 유사 이벤트 수
spring.ai.security.tiered.layer1.prompt.max-rag-documents3프롬프트에 포함할 RAG 문서 수
spring.ai.security.tiered.layer1.prompt.include-event-idfalse이벤트 ID 포함 여부
spring.ai.security.tiered.layer1.prompt.include-raw-timestampfalse원시 타임스탬프 포함 여부
spring.ai.security.tiered.layer1.prompt.include-raw-session-idfalse원시 세션 ID 포함 여부
spring.ai.security.tiered.layer1.prompt.include-full-user-agentfalse전체 User-Agent 포함 여부

Layer 2 설정

속성기본값설명
spring.ai.security.tiered.layer2.rag.similarity-threshold0.5Layer 2 RAG 임계값
spring.ai.security.tiered.layer2.cache.max-size1000Layer 2 캐시 최대 수
spring.ai.security.tiered.layer2.cache.ttl-minutes30Layer 2 캐시 TTL(분)
spring.ai.security.tiered.layer2.timeout-ms7000Layer 2 전체 타임아웃(ms)
spring.ai.security.tiered.layer2.enable-soarfalseLayer 2 SOAR 실행 여부
spring.ai.security.tiered.layer2.rag-top-k5Layer 2 RAG top-k
spring.ai.security.tiered.layer2.default-budget-profileCORTEX_L2_EXPERT_STRICTLayer 2 기본 예산 프로파일

잘림 설정

속성기본값설명
spring.ai.security.tiered.truncation.layer1.user-agent150Layer 1 User-Agent 잘림 길이
spring.ai.security.tiered.truncation.layer1.payload200Layer 1 payload 잘림 길이
spring.ai.security.tiered.truncation.layer1.rag-document180Layer 1 RAG 문서 잘림 길이
spring.ai.security.tiered.truncation.layer2.user-agent150Layer 2 User-Agent 잘림 길이
spring.ai.security.tiered.truncation.layer2.payload1000Layer 2 payload 잘림 길이
spring.ai.security.tiered.truncation.layer2.rag-document500Layer 2 RAG 문서 잘림 길이
spring.ai.security.tiered.vector-cache.max-size10000벡터 캐시 최대 수
spring.ai.security.tiered.vector-cache.expire-minutes5벡터 캐시 TTL(분)
spring.ai.security.tiered.vector-cache.enabledtrue벡터 캐시 활성화
spring.ai.security.tiered.vector-cache.record-statstrue벡터 캐시 통계 기록
spring.ai.security.tiered.security.trusted-proxies[]신뢰 프록시 목록
spring.ai.security.tiered.security.trusted-proxy-validation-enabledtrue프록시 검증 활성화
spring.ai.security.tiered.prompt-compression.enabledtrue런타임 프롬프트 압축 활성화
spring.ai.security.tiered.prompt-runtime.native-structured-output-enabledtrue네이티브 구조화 출력 활성화
spring.ai.security.tiered.prompt-runtime.native-structured-output-disabled-profiles[]네이티브 구조화 출력을 비활성화할 프로파일 목록
spring.ai.security.tiered.prompt-runtime.telemetry-enabledtrue프롬프트 런타임 telemetry 활성화

보안 작업 매핑 속성

spring.ai.security.mapping 아래의 속성으로, SecurityMappingProperties에 바인딩됩니다. 보안 작업(SecurityTaskType)을 LLM 계층(tier)과 분석 수준(QUICK/NORMAL/DEEP)에 매핑합니다.

속성타입기본값설명
spring.ai.security.mapping
.task-to-tierMap<String, Integer>{}작업 이름 → tier (1/2/3) 직접 매핑
.task-to-analysis-levelMap<String, String>{}작업 이름 → 분석 수준 (QUICK/NORMAL/DEEP) 매핑
.task-configsMap<String, TaskConfig>{}작업별 상세 구성 (tier, analysisLevel, toolExecutionEnabled, requireFastResponse, preferLocalModel/CloudModel, temperature, timeoutMs, preferredModel, metadata)
spring.ai.security.mapping.defaults
.tier1-tasksString[][THREAT_FILTERING, QUICK_DETECTION]tier 1로 분류할 기본 작업 목록
.tier2-tasksString[][CONTEXTUAL_ANALYSIS, BEHAVIOR_ANALYSIS, CORRELATION]tier 2로 분류할 기본 작업 목록
.tier3-tasksString[][EXPERT_INVESTIGATION, INCIDENT_RESPONSE, FORENSIC_ANALYSIS, SOAR_AUTOMATION, APPROVAL_WORKFLOW]tier 3로 분류할 기본 작업 목록
.default-tierInteger2매핑되지 않은 작업의 기본 tier
.default-analysis-levelStringNORMAL매핑되지 않은 작업의 기본 분석 수준

Advisor 속성

contexa.advisor 접두사 아래의 속성으로, ContexaAdvisorProperties에 바인딩됩니다. advisor chain profile, security advisor, SOAR approval advisor를 구성합니다.

속성기본값설명
contexa.advisor.chain-profileSTANDARDAdvisor chain profile 이름
contexa.advisor.security.enabledtrueSecurity advisor 활성화
contexa.advisor.security.order50Security advisor 실행 순서
contexa.advisor.security.require-authenticationfalseAI 분석 전 인증 필요 여부
contexa.advisor.soar.approval.enabledtrueSOAR approval advisor 활성화
contexa.advisor.soar.approval.order100SOAR approval advisor 실행 순서
contexa.advisor.soar.approval.timeout300승인 대기 시간(초)

RAG 속성

contexa.rag 접두사 아래의 속성으로, ContexaRagProperties에 바인딩됩니다. 기본 검색, 행동 검색, 위험 검색, AI Lab, ETL 동작을 구성합니다.

속성기본값설명
contexa.rag.defaults.similarity-threshold0.7기본 검색 유사도 임계값
contexa.rag.defaults.top-k10기본 top-k
contexa.rag.behavior.lookback-days30행동 검색 lookback 기간
contexa.rag.risk.similarity-threshold0.8위험 검색 유사도 임계값
contexa.rag.risk.top-k50위험 검색 top-k
contexa.rag.lab.batch-size50AI Lab 배치 크기
contexa.rag.lab.validation-enabledtrueAI Lab 검증 활성화
contexa.rag.lab.enrichment-enabledtrueAI Lab 메타데이터 보강 활성화
contexa.rag.lab.top-k100AI Lab top-k
contexa.rag.lab.similarity-threshold0.75AI Lab 유사도 임계값
contexa.rag.etl.batch-size100ETL 배치 크기
contexa.rag.etl.chunk-size500문서 chunk 크기
contexa.rag.etl.chunk-overlap50문서 chunk overlap
contexa.rag.etl.vector-table-namevector_storeETL 논리 테이블 이름
contexa.rag.etl.behavior.retention-days90행동 코퍼스 보관 기간

스트리밍 속성

contexa.streaming 접두사 아래의 속성으로, StreamingProperties에 바인딩됩니다. 스트리밍 마커, 타임아웃, 재시도 정책, 파서 버퍼를 구성합니다.

속성기본값설명
contexa.streaming.final-response-marker###FINAL_RESPONSE###최종 구조화 응답 앞에 붙는 마커
contexa.streaming.streaming-marker###STREAMING###스트리밍 청크 마커
contexa.streaming.json-start-marker===JSON_START===JSON 시작 마커
contexa.streaming.json-end-marker===JSON_END===JSON 종료 마커
contexa.streaming.timeoutPT5M전체 스트리밍 타임아웃
contexa.streaming.max-retries3스트림 재시도 횟수
contexa.streaming.retry-delayPT1S초기 재시도 지연
contexa.streaming.retry-multiplier1.5재시도 backoff 배율
contexa.streaming.marker-buffer-size100마커 감지 버퍼 크기
contexa.streaming.sentence-buffering-enabledtrue문장 단위 버퍼링 활성화

LLM 바인딩 속성

contexa.llm.bindings 아래의 속성으로, ContexaLlmBindingProperties에 바인딩됩니다. 사용자 정의 chat·embedding 모델 바인딩을 등록합니다 (Spring AI ChatModel/EmbeddingModel bean → Contexa runtime 카탈로그 매핑).

속성타입기본값설명
contexa.llm.bindings
.chatMap<String, Binding>{}채팅 모델 바인딩 맵 (key = 논리 이름)
.embeddingMap<String, Binding>{}임베딩 모델 바인딩 맵 (key = 논리 이름)
Binding 객체 필드
.bean-nameString""참조할 Spring AI bean 이름
.providerString""제공자 식별자 (ollama/openai/anthropic 등)
.model-idString""모델 식별자 (qwen2.5:7b 등)
.aliasesList<String>[]모델 별칭 목록
.enabledbooleantrue바인딩 활성화 여부
.primarybooleanfalse해당 종류의 primary binding 지정
YAML
contexa:
  llm:
    bindings:
      chat:
        primary-ollama:
          bean-name: contexaOllamaChatModel
          provider: ollama
          model-id: qwen2.5:7b
          aliases: [default, fast]
          enabled: true
          primary: true
      embedding:
        primary-ollama:
          bean-name: contexaSharedOllamaEmbeddingModel
          provider: ollama
          model-id: mxbai-embed-large
          enabled: true
          primary: true

PgVector 스토어 속성

spring.ai.vectorstore.pgvector 접두사 아래의 속성으로, PgVectorStoreProperties에 바인딩됩니다. Spring AI 의 CommonVectorStoreProperties를 상속하며, Contexa 코어가 직접 선언한 필드는 인덱스 타입, 거리 함수, 차원, batch/search/store 제한, HNSW/IVFFLAT 세부 설정, 문서 chunking 설정입니다.

속성타입기본값설명
spring.ai.vectorstore.pgvector
.index-typeIndexTypeHNSW인덱스 타입: HNSW 또는 IVFFLAT
.distance-typeDistanceTypeCOSINE_DISTANCE거리 함수: COSINE_DISTANCE / EUCLIDEAN_DISTANCE / NEGATIVE_INNER_PRODUCT
.dimensionsint1024임베딩 벡터 차원 (128–3072)
.batch-sizeint100저장 batch 크기 (1–1000)
.parallel-threadsint4병렬 처리 스레드 수 (1–32)
.top-kint100유사도 검색 top-k 상한 (1–1000)
.similarity-thresholddouble0.5유사도 임계값 (0.0–1.0)
.search-timeout-mslong10000검색 타임아웃(ms, 100–600000)
.store-timeout-mslong10000저장 타임아웃(ms, 100–600000)
spring.ai.vectorstore.pgvector.hnsw
.mint16HNSW M 파라미터 (4–64)
.ef-constructionint64HNSW efConstruction (10–500)
.ef-searchint100HNSW efSearch (10–500)
spring.ai.vectorstore.pgvector.ivfflat
.listsint100IVFFLAT lists 수 (1–10000)
.probesint10IVFFLAT probes 수 (1–1000)
spring.ai.vectorstore.pgvector.document
.chunk-sizeint1000문서 chunk 크기 (100–10000)
.chunk-overlapint200문서 chunk overlap (0–1000)
.enrich-metadatabooleantrue메타데이터 자동 보강
.extract-keywordsbooleantrue키워드 자동 추출
.generate-summarybooleanfalse요약 자동 생성
YAML
spring:
  ai:
    vectorstore:
      pgvector:
        index-type: HNSW
        distance-type: COSINE_DISTANCE
        dimensions: 1024
        batch-size: 100
        parallel-threads: 4
        top-k: 100
        similarity-threshold: 0.5
        search-timeout-ms: 10000
        store-timeout-ms: 10000
        hnsw:
          m: 16
          ef-construction: 64
          ef-search: 100
        document:
          chunk-size: 1000
          chunk-overlap: 200
          enrich-metadata: true
          extract-keywords: true
          generate-summary: false

튜닝 시나리오

실제 코드 기준으로 바로 적용할 수 있는 대표 조정 예시입니다.

응답이 느린 경우

YAML
contexa:
  llm:
    chat:
      ollama:
        model: qwen2.5:7b
spring:
  ai:
    security:
      layer1:
        model: qwen2.5:7b
      tiered:
        layer1:
          timeout:
            total-ms: 5400000
            llm-ms: 3600000
            rag-ms: 1200000

RAG 결과가 부정확한 경우

YAML
contexa:
  rag:
    defaults:
      similarity-threshold: 0.85
      top-k: 3
spring:
  ai:
    security:
      tiered:
        layer1:
          rag:
            similarity-threshold: 0.7
          vector-search-limit: 6

토큰 사용량을 줄이고 싶은 경우

YAML
spring:
  ai:
    security:
      tiered:
        layer1:
          prompt:
            max-rag-documents: 2
            max-similar-events: 1
          vector-search-limit: 3
        truncation:
          layer1:
            payload: 100
            rag-document: 150

운영 배포 권장 예시

YAML
contexa:
  llm:
    selection:
      chat:
        mode: DYNAMIC_PRIORITY
        priority: ollama,anthropic,openai
      embedding:
        mode: DYNAMIC_PRIORITY
        priority: ollama,openai
    embedding:
      ollama:
        dedicated-runtime-enabled: true
        base-url: http://localhost:11435
  advisor:
    security:
      enabled: true
      require-authentication: true
spring:
  ai:
    security:
      layer1:
        model: qwen2.5:7b
      layer2:
        model: gpt-4o-mini
      tiered:
        vector-cache:
          max-size: 50000
          expire-minutes: 10
          enabled: true
          record-stats: true
        security:
          trusted-proxy-validation-enabled: true

상세 속성 참조

TieredStrategyProperties — Layer 1
속성기본값설명
.rag.similarity-threshold0.5Layer 1 RAG 임계값
.session.max-recent-actions100최근 액션 포함 수
.cache.max-size1000Layer 1 캐시 크기
.cache.ttl-minutes30Layer 1 캐시 TTL
.timeout.total-ms5000Layer 1 전체 예산(ms)
.timeout.llm-ms3200Layer 1 LLM 예산(ms)
.timeout.rag-ms900Layer 1 RAG 예산(ms)
.vector-search-limit3벡터 검색 상한
.default-budget-profileCORTEX_L1_INTERACTIVE_STRICT기본 예산 프로파일
.prompt.max-similar-events2유사 이벤트 포함 수
.prompt.max-rag-documents3RAG 문서 포함 수
TieredStrategyProperties — Layer 2 및 공통
속성기본값설명
.layer2.rag.similarity-threshold0.5Layer 2 RAG 임계값
.layer2.cache.max-size1000Layer 2 캐시 크기
.layer2.cache.ttl-minutes30Layer 2 캐시 TTL
.layer2.timeout-ms7000Layer 2 타임아웃(ms)
.layer2.enable-soarfalseSOAR 활성화
.layer2.rag-top-k5Layer 2 RAG top-k
.vector-cache.max-size10000벡터 캐시 크기
.vector-cache.expire-minutes5벡터 캐시 TTL
.security.trusted-proxies[]신뢰 프록시 목록
.security.trusted-proxy-validation-enabledtrue프록시 검증 활성화
.prompt-compression.enabledtrue프롬프트 압축 활성화