LLM 앱 프레임워크 5축 — 전체 10 도식 (확장판)

코어 6 + 추가 4 · 각 도식 확장 + 섹션별 설계 노트 · 2026-09-25

📑 목차
  1. 큰 그림 mindmap
  2. 전략 맵 quadrantChart
  3. 데이터 흐름 flowchart
  4. 시간 순서 sequenceDiagram
  5. 내부 구조 flowchart subgraph
  6. 상태 전이 stateDiagram-v2
  7. 데이터 모델 classDiagram
  8. DB 스키마 erDiagram
  9. 사용자 여정 journey
  10. 구현 로드맵 gantt

1큰 그림 — 5축 멘탈 모델

🧭 reference5축 + 1(관측)

LLM 앱 프레임워크가 풀어야 할 문제를 6개 축으로 보여줘. 멘탈 모델을 먼저 잡고, 나머지 도식이 어디에 위치하는지 기준점을 만들어. 관측·평가 축은 최근 1년 사이에 모든 프레임워크에서 빠지지 않는 필수 항목이 됨.

왜 필요한가: 큰 그림 없이 세부 도식을 보면 길을 잃음.
mindmap root((LLM 앱
프레임워크)) RAG Pipeline 인덱싱 문서 로드 청크 분할 임베딩 메타 추출 검색·생성 벡터 검색 리랭킹 컨텍스트 주입 인용 추적 에이전트
오케스트레이션 ReAct 루프 Tool 호출 State 관리 Human-in-loop 멀티에이전트 프롬프트 최적화 시그니처 모듈 조립 컴파일러 평가 메트릭 타입 안정성 Pydantic Schema DI 모킹 시스템 통합 스트리밍·UX 토큰 스트리밍 SSE / WebSocket 취소·타임아웃 관측·평가 트레이스 토큰·비용 품질 평가 회귀 테스트
📐 설계 노트

2전략 맵 — 프레임워크 위치

🎯 positioning9 프레임워크

각 프레임워크를 "단순↔복잡" × "오프라인/데이터↔온라인/추론" 2차원에 배치. 점수가 높을수록 더 복잡하거나 추론 중심.

왜 필요한가: "내 상황에 어느 프레임워크?" 질문의 답을 시각화.
quadrantChart title LLM 프레임워크 전략 맵 x-axis "단순한 사용성 --> 복잡한 워크플로우" y-axis "오프라인/데이터 --> 온라인/추론" quadrant-1 "복잡 에이전트 (오케스트레이션)" quadrant-2 "프롬프트·타입 (경량 추론)" quadrant-3 "데이터 중심 (RAG/ETL)" quadrant-4 "고급 데이터 파이프라인" LlamaIndex: [0.55, 0.50] Haystack: [0.65, 0.40] LangGraph: [0.85, 0.90] AutoGen: [0.75, 0.85] CrewAI: [0.65, 0.85] DSPy: [0.70, 0.75] Pydantic AI: [0.45, 0.80] Semantic Kernel: [0.80, 0.75] Instructor: [0.35, 0.70]
📐 설계 노트

3데이터 흐름 — RAG Pipeline

🔌 pipeline오프라인·온라인 + 캐시 + 재시도

RAG Pipeline의 end-to-end 데이터 흐름. 인덱싱이 벡터 DB를 채우고, 검색·생성이 그걸 읽어 LLM으로 보냄. 응답 캐시·재시도·에러 분기 추가.

왜 필요한가: "데이터가 어디서 어디로 가는지" 한 장으로 보여줘야 구현할 때 헤매지 않음.
flowchart LR subgraph OFF["📥 인덱싱 (오프라인·배치)"] D[문서]:::off L[로더]:::off C[청크]:::off E[임베딩]:::off M[메타 추출]:::off D --> L --> C --> M M --> E end VDB[("🗄️ 벡터 DB")]:::store META[("🗃️ 메타 DB")]:::store CACHE[("⚡ 응답 캐시")]:::store subgraph ON["🔍 검색·생성 (온라인·추론)"] Q[질의]:::on EMB[질의 임베딩]:::on R[검색·리랭킹]:::on G[컨텍스트 주입]:::on Q --> EMB --> R end LLM{{"🧠 LLM"}}:::llm A["📨 응답"]:::resp ERR["❌ 에러/재시도"]:::err E ==>|"bulk upsert"| VDB M -->|"tag"| META VDB ==>|"top-k retrieve"| R R --> G G -->|"cache hit?"| CACHE CACHE -->|"hit"| A CACHE -->|"miss"| LLM LLM -->|"ok"| A LLM -->|"timeout/5xx"| ERR ERR -.재시도.-> LLM ERR -->|"3회 실패"| A classDef off fill:#fef3c7,stroke:#f59e0b,color:#000 classDef on fill:#dbeafe,stroke:#3b82f6,color:#000 classDef store fill:#e5e7eb,stroke:#6b7280,color:#000 classDef llm fill:#f3e8ff,stroke:#a855f7,color:#000 classDef resp fill:#dcfce7,stroke:#10b981,color:#000 classDef err fill:#fee2e2,stroke:#ef4444,color:#000
📐 설계 노트

4시간 순서 — 런타임 호출

⏱ sequence스트리밍 + 에러 경로

사용자 질문이 들어와서 응답이 나가는 런타임 호출 시퀀스. 스트리밍 응답·타임아웃·부분 실패 경로 포함.

왜 필요한가: "이 함수가 언제 실행돼?" 디버깅의 기준점.
sequenceDiagram actor User as 👤 사용자 participant API as 🖥️ API participant Cache as ⚡ Cache participant R as 🔍 Retriever participant VDB as 🗄️ Vector DB participant L as 🧠 LLM participant Obs as 📊 Observability User->>API: 질문 입력 activate API API->>Obs: trace 시작 (trace_id) API->>Cache: 캐시 조회 alt cache hit Cache-->>API: cached answer API-->>User: 즉시 응답 (스트리밍) else cache miss API->>R: 검색 요청 (질의) activate R R->>R: 질의 임베딩 R->>VDB: top-k 검색 (ANN) activate VDB VDB-->>R: 관련 chunk들 deactivate VDB R-->>R: 리랭킹 (cross-encoder) R-->>API: top-k chunks deactivate R API->>L: 컨텍스트 + 질문 (스트림) activate L loop token 스트리밍 L-->>API: token delta API-->>User: SSE event end alt 정상 완료 L-->>API: done + usage deactivate L API->>Cache: 캐시 저장 API->>Obs: trace 끝 (usage, latency) else 타임아웃/에러 L--xAPI: timeout (30s) API->>Obs: trace 끝 (error) API-->>User: 504 + 재시도 안내 end end deactivate API
📐 설계 노트

5내부 구조 — 레이어드 아키텍처

🏛 architecture8개 레이어 + 횡단 관심사

시스템을 8개 레이어로 분리. 캐시·큐·평가·설정 레이어 추가, 횡단 관심사는 점선으로 표시.

왜 필요한가: "내 코드는 어디 폴더에 둬야 하지?" 구성 질문의 답.
flowchart TB subgraph CL["🖥️ 클라이언트 레이어"] U[👤 사용자] UI[Web/Mobile UI] end subgraph AL["🌐 API 레이어"] A[FastAPI 서버] AUTH[인증·인가] end subgraph QL["📬 큐 레이어"] QJ[작업 큐
Celery/RQ] end subgraph RL["📦 RAG 레이어"] RP[RAG Pipeline] RT[Retriever] RD[Indexer] RERANK[Re-ranker] end subgraph LL["🧠 LLM 레이어"] LP[LLM Provider
OpenAI/Anthropic] EMB[Embedding API] end subgraph SL["💾 스토리지 레이어"] VDB[(Vector DB)] MDB[(Metadata DB)] CACHE[(응답 캐시)] OBJ[(문서 원본
S3/MinIO)] end subgraph EL["📊 평가 레이어"] EVAL[오프라인 평가
Ragas/Deepeval] OBS[관측
Langfuse] end subgraph XL["🔁 횡단 관심사"] AG[🤖 Agent] PO[✨ Prompt Opt] TS[🛡️ Type Safety
Pydantic] CFG[⚙️ Config
Hydra/pydantic-settings] end U <--> UI UI <--> A A --> AUTH A --> RP A --> QJ QJ --> RD RP --> RD RP --> RT RP --> RERANK RD --> OBJ RD --> VDB RD --> MDB RT --> VDB RT --> CACHE RT --> A A --> LP A --> EMB LP --> A RD --> EMB AG -.도구.-> LP PO -.최적화.-> LP TS -.검증.-> A TS -.검증.-> RP CFG -.설정.-> A CFG -.설정.-> RP OBS -.트레이스.-> A OBS -.트레이스.-> LP EVAL -.품질.-> RP
📐 설계 노트

6상태 전이 — 문서·질의 라이프사이클

🔄 lifecycle성공·실패·재시도 분기 포함

문서 인덱싱(상)과 질의 처리(하)를 두 흐름으로 분리. 각 흐름에 실패/재시도 분기를 추가해 운영 시나리오까지 포함.

왜 필요한가: "이 데이터는 지금 어떤 단계지?" 추적 질문 + "실패 시 어디로 가?" 운영 질문의 답.
stateDiagram-v2 direction LR state "📥 인덱싱 (오프라인)" as DocFlow { [*] --> D1 D1: 📄 원본 문서 D2: 📦 로드 완료 D3: ✂️ 청크 분할 D4: 🔢 임베딩 D5: 💾 벡터 DB 저장 D6: ⚠️ 실패 (격리 큐) D1 --> D2: Loader D2 --> D3: Splitter D3 --> D4: Embedder D4 --> D5: Indexer D5 --> [*] D2 --> D6: 파싱 실패 D3 --> D6: 청크 0 D4 --> D6: API 오류 D6 --> D1: 재처리 (사람 검토) } state "🔍 검색·생성 (온라인)" as QueryFlow { [*] --> Q1 Q1: ❓ 사용자 질문 Q2: 🔢 질의 임베딩 Q3: 🔍 top-k 검색 Q4: 🧩 컨텍스트 구성 Q5: 💬 LLM 응답 Q6: ⚠️ 실패 (에러 응답) Q1 --> Q2: Embedder Q2 --> Q3: Retriever Q3 --> Q4: Composer Q4 --> Q5: LLM Q5 --> [*] Q2 --> Q6: 임베딩 실패 Q3 --> Q6: 검색 결과 0 Q5 --> Q6: 타임아웃/환각 Q6 --> [*] } D5 --> Q3: 저장된 벡터로 검색 classDef doc fill:#fef3c7,stroke:#f59e0b,color:#1f2937,stroke-width:2px classDef query fill:#dbeafe,stroke:#3b82f6,color:#1f2937,stroke-width:2px classDef err fill:#fee2e2,stroke:#ef4444,color:#1f2937,stroke-width:2px class D1,D2,D3,D4,D5 doc class Q1,Q2,Q3,Q4,Q5 query class D6,Q6 err
📐 설계 노트

7데이터 모델 — 클래스 관계 추가

🧬 domain model13 클래스 · 3 enum

시스템을 흐르는 핵심 객체들의 구조와 관계. 인덱스 알고리즘·거리 메트릭·프롬프트 변수·평가 점수까지 포함.

왜 필요한가: "데이터 모델이 뭐야?" "이 객체는 어디서 만들어져?" 구조 설계의 기준.
classDiagram class Document { +String id +String title +String source +DateTime createdAt +Metadata metadata +Int version } class Chunk { +String id +String docId +String text +Int position +Int tokenCount +Float[] embedding } class Embedding { +String chunkId +String model +Float[] vector +Int dimensions } class VectorIndex { +String id +String name +Int dimensions +DistanceMetric metric +IndexAlgorithm algorithm +upsert(Embedding) +query(Float[]) Chunk[] +delete(String) } class Query { +String id +String userId +String text +Float[] embedding +Int topK +Float minScore } class RetrievedChunk { +String chunkId +Float score +String text +Int rank } class Prompt { +String templateId +String systemMsg +String userMsg +Chunk[] context +Map~String,String~ vars } class Response { +String id +String answer +RetrievedChunk[] sources +Int inputTokens +Int outputTokens +Float latencyMs +DateTime generatedAt } class PromptTemplate { +String id +String name +String body +String model +Float temperature +Int version } class EvalResult { +String responseId +Float faithfulness +Float relevancy +Float contextPrecision +String graderModel } class Trace { +String traceId +String sessionId +Span[] spans +DateTime startedAt } class Span { +String spanId +String parentId +String name +Float durationMs +Map attrs } Document "1" --> "*" Chunk : splits into Chunk "1" --> "1" Embedding : has Embedding "*" --> "1" VectorIndex : stored in Query --> VectorIndex : searches VectorIndex --> RetrievedChunk : returns RetrievedChunk --> Prompt : context for PromptTemplate "1" --> "*" Prompt : instantiates Prompt --> Response : input to Response --> EvalResult : scored by Response "1" --> "*" Trace : observed in Trace "1" --> "*" Span : contains
📐 설계 노트

8DB 스키마 — ER 다이어그램 추가

🗄 schema9 테이블 · 인덱스 포함

PostgreSQL(pgvector) 기준. 사용자·피드백·평가·버전 테이블 추가. 인덱스 힌트 포함.

왜 필요한가: "DB 스키마는 어떻게 짜?" "메타데이터는 어디 저장하지?" 설계 단계의 답.
erDiagram DOCUMENT ||--o{ CHUNK : contains DOCUMENT ||--o{ DOCUMENT_VERSION : has CHUNK ||--|| EMBEDDING : has EMBEDDING }o--|| VECTOR_INDEX : stored_in USER ||--o{ QUERY : submits USER ||--o{ FEEDBACK : provides QUERY ||--|| RESPONSE : produces RESPONSE }o--o{ CHUNK : cites RESPONSE ||--o{ EVAL_RESULT : scored_by RESPONSE ||--o{ FEEDBACK : receives DOCUMENT { string id PK string title string source_uri datetime created_at jsonb metadata string owner_id FK } DOCUMENT_VERSION { string id PK string document_id FK int version text content_hash datetime created_at } CHUNK { string id PK string doc_id FK int position text content int token_count index idx_doc_position (doc_id, position) } EMBEDDING { string chunk_id PK,FK string model int dimensions vector vector index idx_vector_hnsw (vector HNSW) } VECTOR_INDEX { string name PK string embedding_model int dimensions string distance_metric string algorithm } USER { string id PK string email datetime created_at } QUERY { string id PK string user_id FK text question datetime created_at index idx_user_created (user_id, created_at) } RESPONSE { string id PK string query_id FK text answer jsonb metadata int input_tokens int output_tokens float latency_ms datetime generated_at } FEEDBACK { string id PK string response_id FK string user_id FK int rating text comment datetime created_at } EVAL_RESULT { string id PK string response_id FK float faithfulness float relevancy string grader_model datetime evaluated_at }
📐 설계 노트

9사용자 여정 — UX 흐름 추가

🧑‍💻 journey12단계 · 만족도 1~5

RAG 시스템에서 사용자가 어떤 경험을 하는지 단계별로. 만족도가 낮은 구간이 마찰 지점 — 그 구간을 우선 개선.

왜 필요한가: "내 사용자는 어디서 막히지?" UX 관점에서 시스템 평가.
journey title RAG 시스템 사용자 여정 section 진입 서비스 접속: 5: User 첫 화면 로드: 4: User section 의도 파악 질문 입력: 5: User 예시 클릭: 4: User section 검색·생성 벡터 검색 실행: 4: System 관련 문서 추출: 4: System 컨텍스트 구성: 3: System LLM 스트리밍 시작: 5: System, User section 검증·반복 답변 확인: 4: User 출처 인용 클릭: 5: User 후속 질문: 3: User section 종료·피드백 👍/👎 피드백: 4: User 만족/이탈: 4: User
📐 설계 노트

10구현 로드맵 — Gantt 추가

📅 roadmap12 작업 · 마일스톤 4개

LLM 앱을 처음부터 만들어갈 때의 단계별 일정. 각 섹션 끝에 마일스톤 표시.

왜 필요한가: "뭘 먼저 만들지?" "각 단계에 얼마나 걸려?" 일정 계획의 기준.
gantt title LLM 앱 프레임워크 학습·구현 로드맵 (예시) dateFormat YYYY-MM-DD axisFormat %m/%d section 기초 이해 LLM API 이해 :a1, 2026-09-21, 7d 프롬프트 작성 :a2, after a1, 5d 기초 마일스톤 :milestone, m1, after a2, 0d section RAG Pipeline 인덱싱 파이프라인 :b1, after a2, 7d 검색·생성 파이프라인 :b2, after b1, 7d 평가 메트릭 설계 :b3, after b2, 5d RAG 마일스톤 :milestone, m2, after b3, 0d section 에이전트 LangGraph 기초 :c1, after b3, 7d 멀티에이전트 :c2, after c1, 7d Tool·MCP 통합 :c3, after c2, 5d 에이전트 마일스톤 :milestone, m3, after c3, 0d section 프로덕션화 타입 안정성 적용 :d1, after c3, 5d 관측·로깅 구축 :d2, after d1, 5d 회귀 평가 자동화 :d3, after d2, 7d 프로덕션 마일스톤 :milestone, m4, after d3, 0d
📐 설계 노트