3

설계: Agent 아키텍처 가이드

Day 5: 설비 조회 Agent 프로젝트

학습 목표
  • 프로젝트의 전체 아키텍처를 설계한다
  • 파일 구조와 모듈 분리를 계획한다
  • 데이터 흐름을 시각화한다

권장 아키텍처

equipment_agent/
├── main.py              # 진입점, Agent 실행
├── tools/
│   ├── __init__.py
│   ├── equipment.py     # 설비 상태 조회 Tool
│   ├── manual.py        # 매뉴얼 검색 Tool
│   ├── inventory.py     # 재고 확인 Tool
│   └── production.py    # 생산 실적 Tool
├── data/
│   ├── equipment_db.py  # 설비 시뮬레이션 데이터
│   ├── manual_db.py     # 매뉴얼 데이터
│   ├── inventory_db.py  # 재고 데이터
│   └── production_db.py # 생산 데이터
├── core/
│   ├── agent.py         # ReAct Agent 로직
│   ├── cache.py         # 캐싱 시스템
│   └── monitor.py       # 모니터링
├── prompts/
│   └── system.py        # 시스템 프롬프트
└── tests/
    └── test_scenarios.py # 테스트 시나리오

: 처음에는 main.py 하나로 시작하고, 동작이 확인되면 파일을 분리하자.


데이터 흐름

사용자 질문
    │
    ▼
┌──────────────────────────────┐
│      ReAct Agent             │
│                              │
│  Thought: 무엇을 조회할까?   │
│      │                       │
│      ▼                       │
│  Tool 선택 & 실행            │
│      │                       │
│  ┌───┼───┬───┬───────┐      │
│  │   │   │   │       │      │
│  ▼   ▼   ▼   ▼       ▼      │
│ 설비 매뉴얼 재고 생산 기타   │
│  │   │   │   │       │      │
│  └───┼───┴───┴───────┘      │
│      │                       │
│      ▼                       │
│  Observation: 결과 분석      │
│      │                       │
│      ▼                       │
│  충분? ──No──> (반복)        │
│      │                       │
│      Yes                     │
│      │                       │
│      ▼                       │
│  최종 응답 생성              │
└──────────────────────────────┘
    │
    ▼
사용자에게 전달

핵심 설계 결정

1. 데이터 소스

소스구현 방식이유
MES시뮬레이션 dict실제 MES 없이도 동작
매뉴얼시뮬레이션 dict이번 주는 도구 설계에 집중하려고 조회를 단순화
ERP시뮬레이션 dict실제 ERP 없이도 동작

매뉴얼 조회는 지금 5건짜리 dict 검색이다. RAG는 Week 2·3에서 이미 만들었다. 그때 만든 검색기를 그대로 도구 하나로 감싸면 이 자리를 대체할 수 있다.

@tool
def search_manual(query: str) -> str:
    """알람 코드나 키워드로 장비 매뉴얼을 검색합니다."""
    docs = retriever.invoke(query)          # Week 2·3에서 만든 검색기
    if not docs:
        return f"'{query}'에 대한 매뉴얼을 찾을 수 없습니다."
    return "\n---\n".join(d.page_content for d in docs[:3])

바뀌는 것은 함수 속뿐이고 스키마도 Agent 코드도 그대로다. 도구 뒤를 갈아 끼울 수 있다는 것이 도구로 감싸 두는 이유이고, Week 8의 'RAG + Agent'가 전제하는 것이 바로 이 조합이다. 여유가 있으면 필수 기능을 마친 뒤 이 교체를 해 보라.

2. Agent의 상태는 어디에 있나

지금 설계에서 값을 들고 있는 자리는 넷이다.

자리사는 범위무엇을 들고 있나
messages질문 하나가 끝나면 사라짐시스템 프롬프트, 질문, 도구 호출과 결과
conversation_history세션 전체지난 질문과 답변
call_log세션 전체어떤 도구를 언제 불렀나
cache프로세스 전체도구가 돌려준 문자열

넷을 묶어 부르는 이름이 **에이전트의 상태(state)**다. 지금은 클래스 속성으로 흩어져 있어 "이 실행이 무엇을 알고 있는가"를 한눈에 볼 수 없다. Week 5의 LangGraph는 이 상태를 타입을 붙인 한 덩어리로 선언하고 노드들이 그것을 주고받게 만든다.

지금 단계에서는 각 자리가 언제 비워지는지만 정확히 알아 두면 된다. 특히 conversation_history에 무엇을 넣을지가 뒤에서 문제가 된다(아래 구현 실습의 힌트를 보라).


3. Agent 프레임워크

방식장점단점
OpenAI 직접완전 제어코드 많음
LangChain코드 적음, 편리추상화 (디버깅 어려움)
권장: 둘 다직접 구현 이해 + LangChain 활용

4. 프롬프트 전략

SYSTEM_PROMPT = """당신은 제조 공장의 설비 관리 AI Agent입니다.

## 역할
공장 엔지니어의 질문에 정확하고 유용한 답변을 제공합니다.

## 사용 가능한 Tool
- get_equipment_status: 설비 상태 조회
- search_manual: 매뉴얼 검색 (알람 코드, SOP)
- check_inventory: 부품 재고 확인
- get_production_data: 생산 실적 조회

## 행동 규칙
1. 항상 실제 데이터를 조회한 후 답변하세요.
2. 추측하지 마세요. 데이터가 없으면 "확인할 수 없습니다"라고 하세요.
3. 문제 설비에 집중하세요. 정상 설비는 건너뛰세요.
4. 알람 발생 시: 설비 상태 -> 매뉴얼 검색 -> 재고 확인 순서로 진행하세요.
5. 응답은 한국어로, 구체적인 조치 방안과 함께 제공하세요.

## 응답 형식
- 현황 요약 (표 형식 권장)
- 문제점 분석
- 구체적 조치 방안 (우선순위 포함)
- 필요 부품/재고 상태 (해당 시)
"""

이 프롬프트를 기반으로 시작하고, 테스트 결과에 따라 반복 개선하세요.


5. 생각해 볼 것: 하나를 셋으로 쪼갠다면

지금은 도구 다섯을 한 Agent가 다 들고 있다. 이것을 설비 / 품질 / 재고 셋으로 나눈다면 무엇이 갈리고 무엇이 남는지 표에 적어 보라. 코드로 만들 필요는 없고 15분이면 된다.

물음적어 볼 것
무엇이 나뉘나도구 목록, 시스템 프롬프트, 담당 질문 유형
무엇이 공유되나원 질문, 이미 조회한 결과, 최종 답을 쓰는 책임
누가 순서를 정하나"알람 -> 매뉴얼 -> 재고"를 지금은 프롬프트가 정한다. 셋으로 나뉘면 누가 정하나
언제 끝나나셋 중 하나가 답을 못 찾으면 전체는 끝난 것인가

여기서 답이 막히는 지점이 Week 5의 Supervisor 패턴이 푸는 문제다. 미리 답을 알 필요는 없고, 무엇이 문제인지 손에 쥐고 다음 주로 넘어가면 된다.

AI로 학습하기 — 꿀팁
Agent 아키텍처 파일 구조 템플릿 생성AI 학습 팁

제조 현장 Agent 프로젝트의 표준 파일 구조와 모듈 분리 기준을 코드 템플릿으로 생성해두면 실습 시간이 단축됩니다.

제조 설비 트러블슈팅 Agent 프로젝트의 Python 파일 구조를 설계해줘. tools/(MES·ERP·CMMS 각 Tool 파일), agents/(ReAct Agent 메인 루프), prompts/(시스템 프롬프트), utils/(로깅·에러 처리), tests/(Tool 단위 테스트) 폴더로 구성하고, 각 파일의 역할과 주요 함수 시그니처를 포함한 스켈레톤 코드를 작성해줘.
이 팁이 도움이 됐나요?
용어