한국어
Week 4: 프로덕션
캡스톤 프로젝트

캡스톤 프로젝트: 엔터프라이즈 지식 에이전트

최종 프로젝트에 도달한 것을 축하합니다! 이 캡스톤은 4주간 배운 모든 것을 결합합니다.

프로젝트 개요

다음을 수행할 수 있는 엔터프라이즈 지식 베이스 에이전트를 구축합니다:

  1. 회사 문서에서 질문에 답변 (RAG)
  2. 여러 전문 서브 에이전트 사용
  3. 안전한 응답을 위한 가드레일 적용
  4. REST API로 서비스
  5. 자체 성능 평가

아키텍처 구성요소

1. 쿼리 라우터 (Week 3)

쿼리를 전문 에이전트로 라우팅:

ROUTING_PROMPT = """
이 쿼리를 다음 중 하나로 분류하세요: FAQ, TECHNICAL, POLICY
 
쿼리: {query}
 
분류:
"""
 
def route_query(query: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": ROUTING_PROMPT.format(query=query)}
        ]
    )
    return response.choices[0].message.content.strip()

2. 전문 에이전트 (Week 3)

각 에이전트는 도메인별 지식을 보유:

AGENTS = {
    "FAQ": {
        "system_prompt": "회사에 대한 자주 묻는 질문에 답변합니다.",
        "knowledge_base": "faq_docs/"
    },
    "TECHNICAL": {
        "system_prompt": "제품에 대한 기술 지원을 제공합니다.",
        "knowledge_base": "tech_docs/"
    },
    "POLICY": {
        "system_prompt": "회사 정책을 설명합니다. 절대 약속하지 마세요.",
        "knowledge_base": "policy_docs/"
    }
}

3. RAG 파이프라인 (Week 4)

관련 문서 검색:

from chromadb import Client
 
def retrieve_context(query: str, collection_name: str, k: int = 3) -> str:
    collection = chroma_client.get_collection(collection_name)
    results = collection.query(query_texts=[query], n_results=k)
    return "\n".join(results["documents"][0])

4. 가드레일 (Week 4)

응답 검증:

def apply_guardrails(response: str, agent_type: str) -> tuple[bool, str]:
    # 정책 에이전트는 특정 결과를 약속해서는 안 됨
    if agent_type == "POLICY":
        forbidden = ["보장", "약속", "반드시", "100%"]
        for word in forbidden:
            if word.lower() in response.lower():
                return False, f"정책 위반: '{word}'"
 
    # PII 검사
    if contains_pii(response):
        return False, "응답에 PII 포함"
 
    return True, "OK"

5. LLM-as-Judge 평가 (Week 4)

응답 점수 매기기:

class EvalResult(BaseModel):
    relevance: int = Field(ge=1, le=5)
    accuracy: int = Field(ge=1, le=5)
    safety: int = Field(ge=1, le=5)
    reasoning: str
 
def evaluate_response(query: str, response: str, context: str) -> EvalResult:
    completion = client.beta.chat.completions.parse(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": EVAL_PROMPT},
            {"role": "user", "content": f"쿼리: {query}\n컨텍스트: {context}\n응답: {response}"}
        ],
        response_format=EvalResult
    )
    return completion.choices[0].message.parsed

6. FastAPI 엔드포인트 (Week 4)

완전한 시스템 서빙:

@app.post("/v1/knowledge/query")
async def knowledge_query(request: QueryRequest):
    # 1. 라우팅
    agent_type = route_query(request.query)
 
    # 2. 검색
    context = retrieve_context(request.query, AGENTS[agent_type]["knowledge_base"])
 
    # 3. 생성
    response = generate_response(request.query, context, agent_type)
 
    # 4. 가드레일
    is_safe, reason = apply_guardrails(response, agent_type)
    if not is_safe:
        return {"response": FALLBACK_RESPONSES[agent_type], "blocked": True}
 
    # 5. 평가 (비동기, 로깅용)
    asyncio.create_task(log_evaluation(request.query, response, context))
 
    return {"response": response, "agent": agent_type, "blocked": False}

구현 체크리스트

프로젝트 구조 설정

capstone/
├── agents/
│   ├── router.py
│   ├── faq_agent.py
│   ├── tech_agent.py
│   └── policy_agent.py
├── rag/
│   ├── indexer.py
│   └── retriever.py
├── safety/
│   ├── guardrails.py
│   └── evaluator.py
├── api/
│   ├── main.py
│   └── models.py
├── data/
│   ├── faq_docs/
│   ├── tech_docs/
│   └── policy_docs/
├── tests/
│   └── test_agents.py
├── Dockerfile
└── docker-compose.yml

지식 베이스 인덱싱

ChromaDB를 사용하여 문서 임베딩 및 저장

라우터 구현

쿼리 라우팅을 위한 분류 시스템 생성

전문 에이전트 구축

각 에이전트의 시스템 프롬프트와 지식 접근 권한

가드레일 추가

입력 검증, 출력 필터링, PII 감지

평가 구현

품질 모니터링을 위한 LLM-as-Judge

API 생성

적절한 에러 처리가 있는 FastAPI 엔드포인트

모든 것 Docker화

쉬운 배포를 위한 Docker Compose

테스트 작성

각 컴포넌트에 대한 유닛 테스트

평가 기준

컴포넌트비중기준
라우팅15%올바른 분류 정확도
RAG 품질20%관련 컨텍스트 검색
에이전트 응답25%정확하고 유용한 답변
가드레일15%안전하고 정책 준수하는 출력
API 설계15%깔끔하고 문서화된 엔드포인트
코드 품질10%잘 정리되고 테스트된 코드

보너스 챌린지

동적 모델 라우팅

간단한 쿼리는 gpt-4o-mini로, 복잡한 것은 gpt-4o로 라우팅:

def select_model(query: str, complexity_score: float) -> str:
    if complexity_score > 0.7:
        return "gpt-4o"
    return "gpt-4o-mini"

적용된 스킬

이 프로젝트는 다음 숙달을 보여줍니다:

주차스킬
Week 1ReAct 패턴, Tool calling, Structured output
Week 2RAG, 메모리 시스템, 고급 추론
Week 3멀티 에이전트 시스템, MCP, CrewAI 개념
Week 4평가, 가드레일, 프로덕션 배포

배운 것들

축하합니다! LLM Agent Cookbook을 완료했습니다!

이제 다음을 수행할 수 있는 스킬을 갖추었습니다:

  • ReAct 패턴을 사용하여 처음부터 에이전트 구축
  • 구조화된 출력으로 도구 호출 구현
  • 지식 검색을 위한 RAG 파이프라인 생성
  • 적절한 오케스트레이션으로 멀티 에이전트 시스템 설계
  • 안전한 AI 애플리케이션을 위한 가드레일 적용
  • 에이전트 성능을 체계적으로 평가
  • 프로덕션 준비된 AI 서비스 배포

참고 자료 & 추가 학습

계속 학습하기

학술 논문

프로젝트 공유하기

멋진 것을 만들었나요? 공유하세요!

  • GitHub: #llm-agent-cookbook 태그
  • Twitter/X: @SOTAAZ 멘션
  • LinkedIn: 커뮤니티와 연결

LLM Agent Cookbook과 함께 학습해주셔서 감사합니다! 🎓