> EulerAgent > 튜토리얼 > 기본 > 09. 3-Tier LLM 전략: OpenAI × Ol...

09. 3-Tier LLM 전략: OpenAI × Ollama × Gemini로 비용 90% 절감하기


학습 목표

이 튜토리얼을 마치면 다음을 할 수 있습니다:


사전 준비

euleragent new market-analyst --template personal-assistant

Step 1: 왜 3-Tier LLM 전략이 필요한가?

에이전트 태스크의 비용 구조

에이전트가 "AI 시장 분석 보고서"를 작성한다고 해봅시다. 전체 과정에서 LLM 호출이 몇 번 발생할까요?

┌─────────────────────────────────────────────────────┐
│          에이전트 실행 흐름과 LLM 호출 횟수           │
├───────────────────┬──────────────┬──────────────────┤
│  계획 수립 (Plan) │ 중간 실행    │ 최종 다듬기       │
│  1회 호출         │ 5~10회 호출  │ 1~2회 호출       │
│  ■                │ ■■■■■■■■■■  │ ■■               │
│  "전체 구조 설계" │ "도구호출,   │ "최종 보고서      │
│                   │  초안 작성,  │  정리"            │
│                   │  수정 반복"  │                   │
└───────────────────┴──────────────┴──────────────────┘
                      ↑ 이 부분이 가장 많다!
단계 LLM 호출 수 역할 필요 품질
계획 수립 1회 전체 구조 설계, 단계 분해 높음 — 계획이 좋아야 결과가 좋다
중간 실행 5~10회 도구 호출, 초안 생성, 반복 수정 보통 — 구조만 따르면 충분
최종 결과물 1~2회 최종 보고서 정리, 문체 다듬기 높음 — 최종 품질 결정

핵심 통찰: 중간 실행이 전체 호출의 70~80%를 차지하지만, 여기에 고가 외부 LLM을 사용할 필요가 없습니다. 로컬 Ollama로 충분합니다.

3-Tier 전략의 비용 비교

전략 계획 (1회) 중간 (8회) 최종 (2회) 총 비용
전부 외부 LLM $0.03 $0.24 $0.06 $0.33
전부 로컬 Ollama $0 $0 $0 $0 (품질↓)
3-Tier 전략 $0.03 (OpenAI) $0 (Ollama) $0.02 (Gemini) $0.05

결론: 비용의 대부분을 차지하는 중간 실행만 로컬로 전환해도 85% 이상 비용 절감이 가능합니다. 계획과 최종 결과물의 품질은 그대로 유지됩니다.

euleragent의 스코프 모델

euleragent는 두 가지 스코프로 LLM 프로필을 라우팅합니다:

┌──────────────────────────────────────────┐
│             스코프 라우팅                  │
├──────────────────┬───────────────────────┤
│   plan 스코프    │    final 스코프        │
│  --llm-plan      │   --llm-final         │
│  mode=plan 실행  │   mode=execute 실행   │
│                  │                       │
│  "무엇을 할지    │   "실제로 수행하고     │
│   설계한다"      │    결과물을 만든다"    │
└──────────────────┴───────────────────────┘
         │                     │
    지정 안 하면          지정 안 하면
    default_llm_profile   default_llm_profile
    (로컬 Ollama)         (로컬 Ollama)

3-Tier 전략은 이 모델 위에서 3단계 실행으로 구현됩니다:

Phase 1: plan mode  + --llm-plan openai_main    → OpenAI (고품질 계획)
Phase 2: execute mode (프로필 미지정)            → Ollama (저비용 대량 실행)
Phase 3: execute mode + --llm-final gemini_flash → Gemini (고품질 최종본)

Step 2: workspace.yaml에 3개 프로필 설정

프로필 구성

# .euleragent/config/workspace.yaml

llm_profiles:
  # 1. 로컬 Ollama — 기본 프로필 (무료, 승인 불필요)
  ollama_local:
    provider: ollama
    base_url: http://localhost:11434
    model: qwen3:32b
    timeout_seconds: 120
    is_external: false

  # 2. OpenAI GPT-4o — 계획 수립 전용 (유료, 승인 필요)
  openai_planner:
    provider: openai
    base_url: https://api.openai.com/v1
    api_key: ${OPENAI_API_KEY}
    model: gpt-4o
    is_external: true

  # 3. Gemini Flash — 최종 결과물 전용 (유료, 승인 필요)
  gemini_final:
    provider: openai                  # OpenAI-compatible SDK 사용
    base_url: https://generativelanguage.googleapis.com/v1beta/openai/
    api_key: ${GEMINI_API_KEY}
    model: gemini-2.0-flash
    is_external: true

# 기본값은 항상 로컬 Ollama
default_llm_profile: ollama_local

설정 필드 설명

필드 설명
(dict 키) 프로필 고유 이름 — CLI에서 --llm-plan openai_planner처럼 참조
provider ollama 또는 openai (OpenAI SDK로 모든 OpenAI-compatible 엔드포인트 지원)
base_url LLM API endpoint (Gemini, Perplexity도 base_url만 다름)
api_key ${환경변수} 보간 권장 — workspace.yaml에 직접 입력 금지
model 프로바이더별 모델명
is_external true: 외부 서비스, HITL 승인 필요 / false: 로컬, 승인 불필요

provider: openai의 의미: "OpenAI만 됨"이 아닙니다. OpenAI Python SDK를 사용하여 OpenAI-compatible API를 호출한다는 뜻입니다. base_url만 바꾸면 Gemini, Perplexity, Azure OpenAI, vLLM 등 무엇이든 연결됩니다.

환경변수 설정

# OpenAI API 키
export OPENAI_API_KEY="sk-proj-YOUR_KEY_HERE"

# Gemini API 키
export GEMINI_API_KEY="AIza-YOUR_KEY_HERE"

보안: workspace.yaml에 API 키를 직접 입력하지 마세요. ${OPENAI_API_KEY} 구문으로 런타임에 환경변수에서 읽습니다.


Step 3: 외부 프로필 승인 — 사전 준비

is_external: true인 프로필은 반드시 HITL 승인이 필요합니다. 먼저 승인 없이 실행해서 폴백 동작을 확인한 후, 승인 절차를 진행합니다.

3.1 — 승인 없이 실행 (폴백 확인)

euleragent run market-analyst \
  --task "AI 시장 분석 보고서 작성" \
  --mode plan \
  --llm-plan openai_planner
[run] Starting plan mode for market-analyst
[run] LLM plan scope: profile 'openai_planner' (is_external=true)
[run] ⚠ External profile 'openai_planner' requires approval. Falling back to local default.
[approval] Created: kind=llm_profile_enable, tool=llm.external_call, profile=openai_planner
[llm] Generating plan with default provider (ollama_local)...
[run] Plan generated: plan.md (523 tokens)
[run] Run finalized: a1b2c3d4

핵심 동작: 1. openai_planneris_external: true → 승인 필요 2. 승인 없음 → 로컬 Ollama로 폴백 (런은 계속 진행!) 3. kind: llm_profile_enable 승인 레코드 자동 생성

폴백-never-abort 원칙: euleragent는 외부 LLM 미승인이라고 해서 절대 실행을 중단하지 않습니다. 로컬 기본 프로필로 폴백하여 결과를 생성하고, 승인을 기다립니다.

3.2 — 대기 중인 승인 확인

euleragent approve show
Pending Approvals:
  ID        KIND                  TOOL                PROFILE            RISK    STATUS
  ap_001    llm_profile_enable    llm.external_call   openai_planner     high    pending

3.3 — 승인 레코드 상세 확인

euleragent approve show ap_001
{
  "id": "ap_001",
  "kind": "llm_profile_enable",
  "tool_name": "llm.external_call",
  "tool_params": {
    "scope": "plan",
    "profile": "openai_planner",
    "provider": "openai",
    "model": "gpt-4o"
  },
  "risk_level": "high",
  "side_effects": ["External LLM call"],
  "status": "pending"
}

이 승인이 필요한 이유: - 데이터 유출: 태스크 설명과 에이전트 컨텍스트가 외부 서비스(api.openai.com)로 전송됨 - 비용 발생: 외부 API 호출에 과금 - 감사 추적: 어떤 데이터가 외부로 나갔는지 기록 필수

3.4 — 두 외부 프로필 일괄 승인

Gemini 프로필도 한 번 실행하여 승인 레코드를 생성합니다:

euleragent run market-analyst \
  --task "테스트" \
  --mode execute \
  --llm-final gemini_final
[run] ⚠ External profile 'gemini_final' requires approval. Falling back to local default.
[approval] Created: kind=llm_profile_enable, tool=llm.external_call, profile=gemini_final

이제 두 외부 프로필에 대한 승인을 한 번에 처리합니다:

euleragent approve accept-all --tool llm.external_call --actor "user:you"
Batch accepted: 2 approval(s)
  ap_001: llm_profile_enable (openai_planner)
  ap_002: llm_profile_enable (gemini_final)

accept-all --tool: llm.external_call 도구에 대한 승인만 일괄 수락합니다. file.write, web.search 등 다른 도구의 승인은 영향받지 않습니다.


Step 4: Phase 1 — OpenAI로 고품질 계획 수립

이제 승인이 완료되었으니, 3-Tier 전략을 실행합니다.

실행

euleragent run market-analyst \
  --task "2026년 AI 에이전트 시장 분석 보고서를 작성하라. 시장 규모, 주요 플레이어, 기술 트렌드, 리스크 요인을 포함하고, 최종적으로 투자 시사점을 도출하라." \
  --mode plan \
  --llm-plan openai_planner

예상 출력

[run] Starting plan mode for market-analyst
[run] LLM plan scope: profile 'openai_planner' (is_external=true)
[run] ✓ Using approved profile 'openai_planner' for plan scope
[llm] Generating plan with openai_planner (gpt-4o)...
[run] Plan generated: 1 file(s)
  └─ plan.md (1847 tokens)
[run] Run finalized: p1_abc123

──────────────────────────────────────
Phase 1 완료
  Profile:  openai_planner (gpt-4o)
  LLM 호출: 1회
  비용:     ~$0.03 (입력 1.2K + 출력 1.8K tokens)
──────────────────────────────────────

생성된 계획 확인

cat .euleragent/runs/p1_abc123/artifacts/plan.md
# AI 에이전트 시장 분석 보고서 — 실행 계획

## 1. 시장 규모 조사
- 글로벌 AI 에이전트 시장 규모 (2024-2030 전망)
- 세그먼트별 분석 (엔터프라이즈, 소비자, 개발자 도구)

## 2. 주요 플레이어 분석
- 빅테크 (OpenAI, Google, Anthropic, Microsoft)
- 스타트업 (Cognition, Adept, Imbue, ...)
- 오픈소스 진영 (LangChain, CrewAI, AutoGen)

## 3. 기술 트렌드
- 에이전트 프레임워크 진화 (ReAct → Plan-and-Execute → Multi-Agent)
- 도구 사용(Tool Use) 표준화
- 장기 메모리와 상태 관리

## 4. 리스크 요인
- 규제 불확실성 (EU AI Act, 미국 행정명령)
- 환각(Hallucination) 문제와 신뢰성
- 비용 구조와 수익 모델

## 5. 투자 시사점
- 유망 투자 영역
- 리스크 대비 전략

포인트: GPT-4o가 만든 계획은 구조가 체계적이고 세부 항목이 구체적입니다. 이 계획이 이후 Ollama 실행의 "네비게이션"이 됩니다.


Step 5: Phase 2 — Ollama로 대량 실행 (비용 $0)

계획이 수립되었으니, 실제 집필은 로컬 Ollama가 담당합니다. 프로필 플래그를 지정하지 않으면 default_llm_profile: ollama_local이 사용됩니다.

실행

euleragent run market-analyst \
  --task "위 계획에 따라 AI 에이전트 시장 분석 보고서 초안을 작성하라. 각 섹션을 3문단 이상으로 상세히 서술하라." \
  --mode execute \
  --max-loops 5

예상 출력

[run] Starting execute mode for market-analyst
[run] No scoped profile → using default provider (ollama_local)
[llm] Loop 1: Generating initial draft with ollama_local (qwen3:32b)...
[tool] file.write → draft_report.md (waiting approval)
[approval] Created: tool_call, file.write
...
[llm] Loop 2: Revising section 1 with ollama_local...
[llm] Loop 3: Adding section 2 data with ollama_local...
[llm] Loop 4: Completing sections 3-4 with ollama_local...
[llm] Loop 5: Finalizing section 5 with ollama_local...
[run] Artifacts: draft_report.md (4200 tokens)
[run] Run finalized: p2_def456

──────────────────────────────────────
Phase 2 완료
  Profile:  ollama_local (qwen3:32b)
  LLM 호출: 5회 (도구 호출 포함 총 8회 상호작용)
  비용:     $0.00 (로컬 LLM — 완전 무료)
──────────────────────────────────────

핵심 관찰

Phase 2에서 발생한 LLM 호출:

  Loop 1: 초안 구조 생성         ← Ollama ($0)
  Loop 2: 섹션 1 수정/보강       ← Ollama ($0)
  Loop 3: 섹션 2 데이터 추가     ← Ollama ($0)
  Loop 4: 섹션 3-4 완성          ← Ollama ($0)
  Loop 5: 섹션 5 마무리          ← Ollama ($0)
  ─────────────────────────────
  합계: 5회 호출 × $0 = $0.00

  만약 전부 GPT-4o였다면:
  합계: 5회 × ~$0.03 = $0.15

이 단계가 전체 비용의 70~80%를 차지합니다. 로컬 Ollama를 사용하면 이 비용이 0입니다.

로컬 Ollama의 장점: - 비용 $0 — 몇 번이든 무료 - 빠른 반복 — 네트워크 지연 없음 (로컬에서 3~8초/응답) - 데이터 보안 — 민감한 내용이 외부로 나가지 않음 - 오프라인 가능 — 네트워크 없이도 실행


Step 6: Phase 3 — Gemini로 최종 다듬기

초안이 완성되었으니, 최종 다듬기는 Gemini Flash가 담당합니다.

실행

euleragent run market-analyst \
  --task "기존 초안(draft_report.md)을 전문 투자 리서치 보고서 수준으로 다듬어라. 문장을 간결하게 하고, 데이터 기반 근거를 보강하며, 투자 시사점 섹션을 강화하라." \
  --mode execute \
  --llm-final gemini_final

예상 출력

[run] Starting execute mode for market-analyst
[run] LLM final scope: profile 'gemini_final' (is_external=true)
[run] ✓ Using approved profile 'gemini_final' for final scope
[llm] Generating final deliverable with gemini_final (gemini-2.0-flash)...
[tool] file.write → final_report.md (waiting approval)
...
[run] Artifacts: final_report.md (5100 tokens)
[run] Run finalized: p3_ghi789

──────────────────────────────────────
Phase 3 완료
  Profile:  gemini_final (gemini-2.0-flash)
  LLM 호출: 2회
  비용:     ~$0.02 (입력 4.2K + 출력 5.1K tokens)
──────────────────────────────────────

최종 결과 확인

# Phase 2 초안 vs Phase 3 최종본 비교
wc -w .euleragent/runs/p2_def456/artifacts/draft_report.md
# → 약 2500단어

wc -w .euleragent/runs/p3_ghi789/artifacts/final_report.md
# → 약 3200단어 (보강된 내용 포함)

Gemini Flash를 선택한 이유: - GPT-4o 대비 50~70% 저렴하면서 품질은 유사 - 긴 문서 처리에 강함 (100만 토큰 컨텍스트) - OpenAI-compatible API로 설정이 간단 (base_url만 변경)


Step 7: 비용 분석 — 실제 비용 절감 확인

감사 로그로 비용 추적

각 Phase의 input.json에서 프로필 정보를 확인합니다:

# Phase 1 — OpenAI 사용 확인
python -m json.tool .euleragent/runs/p1_abc123/input.json
{
  "agent": "market-analyst",
  "task": "2026년 AI 에이전트 시장 분석 보고서...",
  "mode": "plan",
  "llm_plan_profile": "openai_planner"
}
# Phase 2 — Ollama 사용 확인 (프로필 미지정 = 기본값)
python -m json.tool .euleragent/runs/p2_def456/input.json
{
  "agent": "market-analyst",
  "task": "위 계획에 따라...",
  "mode": "execute"
}

llm_plan_profile/llm_final_profile 필드가 없으면 기본 프로필(Ollama)이 사용된 것입니다.

# Phase 3 — Gemini 사용 확인
python -m json.tool .euleragent/runs/p3_ghi789/input.json
{
  "agent": "market-analyst",
  "task": "기존 초안을 다듬어라...",
  "mode": "execute",
  "llm_final_profile": "gemini_final"
}

비용 종합

┌──────────────────────────────────────────────────────────────┐
│              3-Tier 전략 비용 분석                             │
├─────────┬───────────────┬──────────┬──────────┬──────────────┤
│  Phase  │ 프로필        │ LLM 호출 │ 비용     │ 비고          │
├─────────┼───────────────┼──────────┼──────────┼──────────────┤
│  1.계획 │ openai_planner│   1회    │  $0.03   │ 고품질 계획   │
│  2.실행 │ ollama_local  │   5회    │  $0.00   │ 저비용 핵심!  │
│  3.마무리│ gemini_final  │   2회    │  $0.02   │ 고품질 최종본 │
├─────────┼───────────────┼──────────┼──────────┼──────────────┤
│  합계   │               │   8회    │  $0.05   │              │
└─────────┴───────────────┴──────────┴──────────┴──────────────┘

비교: 전부 GPT-4o였다면  → 8회 × $0.03 = $0.24
비교: 전부 Ollama였다면  → 8회 × $0.00 = $0.00 (품질↓)

3-Tier 절감율: ($0.24 - $0.05) / $0.24 = 79% 절감

규모가 커지면 차이는 극대화됩니다. 100개 태스크를 돌린다면: - 전부 외부 LLM: 800회 × $0.03 = $24.00 - 3-Tier 전략: 계획 100회($3) + 실행 500회($0) + 마무리 200회($4) = $7.00 (71% 절감) - 실행 비율이 높은 복잡한 태스크일수록 절감율이 90% 이상까지 올라갑니다.


Step 8: 승인 워크플로우 상세

8.1 — --edit-params로 승인 시 프로필 변경

관리자가 비용을 고려하여, 요청된 프로필을 더 저렴한 프로필로 변경해서 승인할 수 있습니다.

# 팀원이 GPT-4o를 요청했지만...
euleragent run market-analyst \
  --task "경쟁사 분석" --mode plan --llm-plan openai_planner
# → ap_010 승인 대기 (openai_planner 요청)

# 관리자가 Gemini Flash로 변경하여 승인 (더 저렴)
euleragent approve accept ap_010 \
  --actor "user:you" \
  --edit-params '{"profile": "gemini_final"}'
Accepted (with edits): ap_010
  Original Profile: openai_planner (gpt-4o)
  Applied Profile:  gemini_final (gemini-2.0-flash)

재실행 시 변경된 프로필이 적용됩니다:

euleragent run market-analyst \
  --task "경쟁사 분석" --mode plan --llm-plan openai_planner
[run] ✓ Using approved profile 'gemini_final' for plan scope (edited from 'openai_planner')

감사 추적: 승인 레코드에 원래 요청(tool_params.profile)과 변경 후(final_params.profile)가 모두 기록됩니다.

8.2 — 승인 거부 시 동작

euleragent approve deny ap_011

거부된 프로필은 사용되지 않으며, 새 실행 시 다시 새로운 승인 레코드가 생성됩니다. 런은 절대 중단되지 않습니다 — 항상 로컬로 폴백합니다.


Step 9: Dynamic 모드로 자동화 (2-Tier 변형)

3번의 별도 실행 대신 Dynamic 모드를 사용하면, OpenAI가 계획을 세우고 Ollama가 자동으로 실행합니다.

Dynamic 모드의 실행 흐름

--dynamic --llm-plan openai_planner
        │
        ▼
1. system.plan_workflow 호출 ← openai_planner (GPT-4o)
   "워크플로우를 3단계로 설계"
        │
        ▼
2. Phase 0: 시장 조사     ← ollama_local (기본 프로필)
        │
        ▼
3. Phase 1: 초안 작성     ← ollama_local (기본 프로필)
        │
        ▼
4. Phase 2: 리뷰/수정     ← ollama_local (기본 프로필)

실행

euleragent run market-analyst \
  --task "2026년 AI 에이전트 시장 분석 보고서 작성" \
  --mode plan \
  --dynamic \
  --llm-plan openai_planner \
  --max-loops 10

예상 출력

[run] Starting dynamic workflow for market-analyst
[run] LLM plan scope: openai_planner → system.plan_workflow에만 적용

# 워크플로우 설계 — OpenAI
[llm:plan] Generating workflow with openai_planner (gpt-4o)...
[workflow] 3 phases planned:
  Phase 0: Market Research  (plan mode)
  Phase 1: Draft Report     (execute mode)
  Phase 2: Quality Review   (plan mode)

# 각 phase — 기본 Ollama
[phase:0] Running 'Market Research' with default provider (ollama_local)
[phase:1] Running 'Draft Report' with default provider (ollama_local)
[phase:2] Running 'Quality Review' with default provider (ollama_local)

[run] Dynamic workflow completed: dyn_jkl012

Dynamic 모드 비용

단계 프로필 호출 수 비용
system.plan_workflow openai_planner (GPT-4o) 1회 $0.03
Phase 0~2 ollama_local 6~8회 $0.00
합계 7~9회 $0.03

2-Tier vs 3-Tier: Dynamic 모드는 Gemini 최종 다듬기 단계가 없어 비용은 더 낮지만, 최종 품질은 3-Tier보다 떨어질 수 있습니다. 용도에 따라 선택하세요.


Step 10: agent.yaml 프로필 오버라이드와 우선순위

에이전트별로 기본 LLM 프로필을 다르게 설정할 수 있습니다.

agent.yaml 설정

# .euleragent/agents/market-analyst/agent.yaml
name: market-analyst
template: personal-assistant
llm:
  profile: ollama_local       # 이 에이전트의 기본 프로필
# .euleragent/agents/premium-writer/agent.yaml
name: premium-writer
template: marketing-expert
llm:
  profile: openai_planner     # 이 에이전트는 항상 OpenAI 사용

우선순위

1. CLI 옵션: --llm-plan / --llm-final     (최우선)
       ▼
2. agent.yaml: llm.profile                (에이전트별 기본값)
       ▼
3. workspace.yaml: default_llm_profile    (워크스페이스 기본값)
# agent.yaml에 openai_planner가 설정되어 있지만, CLI에서 ollama_local을 지정
euleragent run premium-writer --mode plan --llm-plan ollama_local --task "..."
# → ollama_local 사용 (CLI 우선)

# CLI 옵션 없이 실행
euleragent run premium-writer --mode plan --task "..."
# → openai_planner 사용 (agent.yaml 설정)

# agent.yaml에 llm.profile이 없는 에이전트
euleragent run market-analyst --mode plan --task "..."
# → ollama_local 사용 (workspace default)

Step 11: 감사 로그에서 LLM 라우팅 추적

euleragent logs로 확인

euleragent logs p1_abc123
Run: p1_abc123
Agent: market-analyst
Mode: plan
Task: 2026년 AI 에이전트 시장 분석 보고서...
LLM Plan: openai_planner (gpt-4o)
LLM Final: (default)

--- Approvals ---
ap_001: llm_profile_enable (llm.external_call) → accepted

--- Artifacts ---
plan.md (1847 tokens)

external_transmission.jsonl 감사 로그

외부 LLM 호출은 external_transmission.jsonl에 기록됩니다:

cat .euleragent/runs/p1_abc123/artifacts/external_transmission.jsonl
{
  "type": "llm_call",
  "provider": "openai",
  "model": "gpt-4o",
  "profile": "openai_planner",
  "scope": "plan",
  "endpoint": "https://api.openai.com/v1/chat/completions",
  "tokens_sent": 1200,
  "tokens_received": 1847,
  "timestamp": "2026-02-24T15:32:05Z"
}
cat .euleragent/runs/p3_ghi789/artifacts/external_transmission.jsonl
{
  "type": "llm_call",
  "provider": "openai",
  "model": "gemini-2.0-flash",
  "profile": "gemini_final",
  "scope": "final",
  "endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
  "tokens_sent": 4200,
  "tokens_received": 5100,
  "timestamp": "2026-02-24T15:45:20Z"
}

Phase 2 (Ollama) 실행에는 external_transmission.jsonl이 없습니다. 로컬 LLM 호출은 외부 전송이 아니므로 이 로그에 기록되지 않습니다. 이것이 보안과 비용 측면에서 로컬 LLM의 이점입니다.

이벤트 스트림

Runner는 LLM 프로필 라우팅 시 이벤트를 발생시킵니다:

이벤트 발생 시점 Phase 1 Phase 2 Phase 3
llm.profile.applied 승인된 외부 프로필 적용 발생 - 발생
llm.profile.fallback 미승인 외부 프로필 → 로컬 폴백 (최초 실행 시) - -

3-Tier 전략 요약 — 전체 흐름

┌─────────────────────────────────────────────────────────────┐
│                   3-Tier LLM 전략                            │
│                                                              │
│  Step 1: workspace.yaml에 3개 프로필 설정                     │
│    ollama_local (로컬, 무료)                                  │
│    openai_planner (외부, 고품질 계획)                          │
│    gemini_final (외부, 고품질 최종본)                          │
│                          │                                   │
│                          ▼                                   │
│  Step 2: 외부 프로필 승인                                     │
│    approve accept-all --tool llm.external_call               │
│                          │                                   │
│                          ▼                                   │
│  Step 3: 3-Phase 실행                                        │
│                                                              │
│    Phase 1 ─── plan mode + --llm-plan openai_planner ───┐   │
│    [OpenAI]    1회 호출, $0.03                            │   │
│    "고품질 계획 수립"                                      │   │
│                          │                                │   │
│                          ▼                                │   │
│    Phase 2 ─── execute mode (프로필 미지정) ──────────────┤   │
│    [Ollama]    5~10회 호출, $0.00                          │   │
│    "대량 실행 — 여기서 비용의 대부분 절감!"                 │   │
│                          │                                │   │
│                          ▼                                │   │
│    Phase 3 ─── execute mode + --llm-final gemini_final ──┘   │
│    [Gemini]    1~2회 호출, $0.02                              │
│    "최종 다듬기"                                              │
│                          │                                   │
│                          ▼                                   │
│  총 비용: $0.05 (전부 외부 시 $0.24 → 79~90% 절감)           │
└─────────────────────────────────────────────────────────────┘

자주 묻는 질문

Q: provider: openai를 Gemini에 사용하는 이유는?

euleragent는 OpenAI Python SDK를 사용하여 모든 OpenAI-compatible 엔드포인트를 호출합니다. Google Gemini는 OpenAI-compatible API를 제공하므로, base_url만 Gemini 엔드포인트로 설정하면 동일한 SDK로 호출됩니다. Perplexity, Azure OpenAI, vLLM 등도 마찬가지입니다.


Q: 로컬 프로필(is_external: false)도 승인이 필요한가요?

아니요. is_external: false인 프로필은 승인 없이 즉시 사용됩니다. HITL 승인은 외부 서비스로 데이터가 전송될 때만 필요합니다.


Q: 승인은 영구적인가요? 매번 다시 승인해야 하나요?

한 번 승인(accept)하면 이후 동일한 프로필+스코프 조합에 대해 재승인 없이 사용할 수 있습니다. Runner는 ApprovalQueue에서 매칭되는 기존 승인을 찾아 재사용합니다.


Q: Phase 2에서 Ollama 대신 다른 프로필을 사용하고 싶으면?

--llm-final 옵션을 지정하면 execute 모드의 모든 LLM 호출에 해당 프로필이 사용됩니다. Phase 2를 Gemini로 하고 싶다면:

euleragent run market-analyst --mode execute --llm-final gemini_final --task "..."

이 경우 Phase 2와 Phase 3가 합쳐져 2-Phase 전략이 됩니다.


Q: llm_profiles를 설정하지 않으면 어떻게 되나요?

llm_profiles를 설정하지 않으면 기본 생성된 workspace.yamlllm_profiles + default_llm_profile 설정이 그대로 사용됩니다. 레거시 형식(default_provider + ollama: + openai: 블록)도 하위 호환성을 위해 여전히 지원되지만, 새로 생성되는 워크스페이스에서는 더 이상 사용되지 않습니다.


Q: Perplexity도 추가할 수 있나요?

네. provider: openai와 Perplexity의 base_url을 사용하면 됩니다:

llm_profiles:
  perplexity_sonar:
    provider: openai
    base_url: https://api.perplexity.ai
    api_key: ${PPLX_API_KEY}
    model: sonar
    is_external: true

llm_providers.md에서 전체 프로바이더 지원 매트릭스를 확인하세요.


다음 단계: 이것으로 euleragent 기초 튜토리얼 시리즈가 완료됩니다. 다음은 고급 패턴 튜토리얼이나 커스텀 패턴 작성 가이드를 참고하세요.

← 이전 목록으로