LLM 설정
Doggy는 그래픽 기반의 LLM 설정 관리 시스템을 제공하며, 다중 업체, 다중 모델, 다중 역할의 유연한 설정과 런타임 동적 전환을 지원하여 AI 기능에 통일된 모델 지원을 제공합니다.
개요
LLM 설정 시스템은 src/Service/Platform/Llm/에 있으며 Symfony AI Bundle의 Platform 설계 개념을 참고했습니다:
- 다중 업체 지원: OpenAI, Azure, Anthropic, Ollama, 커스텀 OpenAI 호환 게이트웨이
- 그래픽 관리: YAML 설정이 아닌 백엔드 인터페이스에서 동적 관리
- 역할 분리: 설정과 용도가 분리되고 역할이 모델에 바인딩
- 키 암호화: API Key를 암호화 저장, 프론트엔드에서 접근 불가
데이터 모델
LlmProvider (업체 설정)
| 필드 | 타입 | 설명 |
|---|---|---|
| name | string | 표시 이름, 예: "GPT-4o" |
| provider | string | 업체 식별자: openai / anthropic / azure / ollama / custom |
| model | string | 모델 이름: gpt-4o / claude-3-5-sonnet / ... |
| apiKey | encrypted | API Key(암호화 저장) |
| apiEndpoint | string | 인터페이스 주소(선택 사항) |
| options | JSON | 추가 파라미터: temperature, max_tokens, top_p 등 |
| isEnabled | boolean | 활성화 여부 |
| sortOrder | int | 정렬 순서 |
LlmRole (역할/용도)
| 필드 | 타입 | 설명 |
|---|---|---|
| code | string | 역할 코드: view_editor / entity_generation / workflow_analysis / query_assistant / chat / coding |
| label | string | 표시 이름 |
| providerId | UUID | 바인딩된 모델 설정 |
| systemPrompt | text | 해당 역할의 시스템 프롬프트 |
| options | JSON | 역할 수준 파라미터 오버라이드 |
| isEnabled | boolean | 활성화 여부 |
역할 용도 계획
| 역할 code | 용도 | 추천 모델 |
|---|---|---|
| view_editor | 뷰 디자이너 AI 어시스턴트 | gpt-4o / claude-3.5-sonnet |
| entity_generation | AI 보조 엔티티 생성 | gpt-4o-mini |
| workflow_analysis | 워크플로 분석 및 제안 | gpt-4o |
| query_assistant | 자연어 → 데이터 쿼리 | gpt-4o-mini |
| chat | 범용 AI 대화 어시스턴트 | gpt-4o-mini |
| coding | 코드 생성(Twig/JS/PHP) | gpt-4o / claude-3.5-sonnet |
호출 체인
LlmRouter::chatByRole(roleCode, messages, opts)
├─ LlmRole(code) 조회 → 바인딩된 LlmProvider 가져오기
├─ LlmGatewayFactory::create(provider) → 어댑터 인스턴스화
├─ API Key 복호화 (LlmEncryptor)
└─ LLM API 호출 (도구 호출, 스트리밍 응답 지원)LlmGatewayFactory
LlmProvider.provider 필드에 따라 어댑터를 자동 라우팅합니다:
| provider | 어댑터 | 설명 |
|---|---|---|
| openai | OpenAiGateway | OpenAI 호환 인터페이스 |
| anthropic | AnthropicGateway | Anthropic Claude API |
| azure | AzureGateway | Azure OpenAI |
| ollama | OllamaGateway | 로컬 Ollama |
| custom | CustomGateway | 커스텀 OpenAI 호환 게이트웨이 |
장애 조치
LlmRouter는 chatByRoleWithFallback을 지원하며 메인 업체가 실패하면 자동으로 예비 모델로 다운그레이드합니다.
관리 인터페이스
진입점: 시스템 설정 → LLM 설정(/admin/platform/llm-config)
목록 페이지
- 업체 카드 형태 표시, 하나의 업체가 여러 모델 변형에 대응 가능
- 해당 모델이 바인딩된 역할/용도를 직접 표시
- 토글 스위치로 활성화/비활성화
- 드래그 앤 드롭 정렬
편집 폼
- 이름, 업체, 모델, API Key(암호화 저장), 인터페이스 주소
- 역할 관리(LlmRoleType): 역할 코드, 시스템 프롬프트, 모델 바인딩
키 암호화
LlmEncryptor는 플랫폼 암호화 키로 API Key를 암호화/복호화하며, 키는 서버에만 저장되고 프론트엔드는 원본 Key에 접근할 수 없습니다:
php
// 저장 시
$encrypted = $llmEncryptor->encrypt($apiKey);
// 호출 시
$apiKey = $llmEncryptor->decrypt($provider->getApiKey());AI 어시스턴트와 통합
AI 어시스턴트(AI 어시스턴트 참조)는 LlmRole/LlmProvider 체계를 재사용합니다:
프론트엔드 → POST /api/admin/ai/chat
→ LlmRouter.chatByRole(roleCode, messages)
→ LlmRole 조회 → LlmGatewayFactory → LLM API- API Key는 서버에만 저장(데이터베이스 암호화 저장)
- 모델 전환은 관리 인터페이스에서 완료, 코드 수정 불필요
- 다중 업체는 LlmGatewayFactory가 자동 라우팅
관련 파일
| 파일 | 역할 |
|---|---|
src/Service/Platform/Llm/LlmGatewayInterface.php | 게이트웨이 인터페이스 |
src/Service/Platform/Llm/LlmGatewayFactory.php | 어댑터 팩토리 |
src/Service/Platform/Llm/LlmRouter.php | 역할 라우팅 + 장애 조치 |
src/Service/Platform/Llm/ModelRegistry.php | 모델 레지스트리 |
src/Service/Platform/LlmEncryptor.php | API Key 암호화/복호화 |
src/Entity/Platform/LlmProvider.php | 업체 설정 엔티티 |
src/Entity/Platform/LlmRole.php | 역할 설정 엔티티 |
src/Controller/Admin/Platform/LlmConfigController.php | 관리 인터페이스 컨트롤러 |