▶️24

[영상] LangChain Agent 업무자동화 적용

Day 4: 설비 조회 Agent

학습 목표
  • LangChain Agent에서 @tool 데코레이터로 설비 조회 Tool을 정의하고 에이전트에 연결할 수 있다
  • AgentExecutor의 verbose=True 모드로 도구 선택 과정을 추적한다
  • LangGraph의 create_react_agent가 세 줄로 감싸 주는 것이 무엇인지 직접 구현한 루프와 대조한다
  • Tool 호출이 실패했을 때 대체 응답을 생성하도록 프롬프트와 코드로 지시한다

영상 핵심 정리 — LangChain Agent로 설비 조회 자동화

이 영상은 @tool 데코레이터로 설비 조회 Tool을 정의하고, LangGraph ReAct 에이전트에 연결해 실제 MES 연동 구조를 단계별로 구현하는 실습이다.


1. @tool 데코레이터로 Tool 정의

from langchain_core.tools import tool
from typing import Literal

@tool
def get_equipment_status(
    equipment_id: str,
    metric: Literal['temperature', 'vibration', 'rpm', 'alarm', 'all'] = 'all'
) -> dict:
    """
    제조 설비의 실시간 상태를 MES에서 조회합니다.
    설비 번호(예: CNC-A320, PRESS-B102)와 조회 지표를 지정하세요.
    """
    mock_data = {
        'CNC-A320': {
            'temperature': 68.5, 'vibration': 2.1,
            'rpm': 8500, 'alarm': 'E-1042'
        }
    }
    data = mock_data.get(equipment_id, {'error': '설비를 찾을 수 없습니다'})
    return data if metric == 'all' else {metric: data.get(metric)}

2. LangGraph 에이전트 연결

from langgraph.prebuilt import create_react_agent
from langchain_google_genai import ChatGoogleGenerativeAI

llm = ChatGoogleGenerativeAI(model='gemini-2.0-flash', temperature=0)
tools = [get_equipment_status, list_active_alarms]
agent = create_react_agent(model=llm, tools=tools)

이 세 줄이 감싸 주는 것은 Day 3에서 손으로 짠 루프다. 모델을 부르고, tool_calls가 있으면 실행하고, 결과를 다시 넣고, 없으면 끝낸다. 함수 이름에 ReAct가 들어 있지만 사고 과정을 텍스트로 남기지는 않는다. 같은 이름의 함수가 LangChain(구 버전)에도 있고 뜻이 달라 헷갈리기 쉬우니, Day 3 LangChain으로 만들기 실습의 비교표를 함께 보라.

여러 설비를 한 번에 물으면 모델이 tool_calls를 여러 개 낼 수 있다. 그 호출들을 동시에 실행할지는 프레임워크와 우리 코드가 정하는 문제이고, 이 주차의 코드는 모두 순차 실행이다.

3. 개발 단계 Mock → 프로덕션 MES 전환

단계Tool 구현목적
1 (Mock)하드코딩 딕셔너리 반환에이전트 로직 검증
2 (Stub)랜덤 값 반환엣지 케이스 테스트
3 (Staging)테스트 MES API실제 연동 검증
4 (Production)실제 MES API실 운영

함정 주의: @tool 함수의 반환 타입이 문자열이 아니면 LangChain이 자동으로 str() 변환을 한다. 복잡한 딕셔너리는 json.dumps(result, ensure_ascii=False)로 명시적 직렬화해야 한국어가 깨지지 않는다.


다음 task와의 연결

다음 '프로덕션 수준 설비 조회 Tool' 실습에서는 MES를 흉내 내는 SimulatedMesApi를 상대로 재시도·타임아웃·캐싱을 붙인다. 실제 DB 연결은 이 주차 범위 밖이고, 위 MesDbClient처럼 드라이버만 갈아 끼우면 되는 자리를 만들어 두는 것이 목표다.

AI로 학습하기 — 꿀팁
@tool docstring 초안 생성 요청AI 학습 팁

LangChain @tool 데코레이터의 docstring을 AI 에이전트에게 작성하게 하고, 에이전트가 설비 5대를 동시 조회하는 병렬 ToolNode 시나리오에서 각 도구가 올바로 선택되는지 확인하세요.

LangChain @tool 데코레이터를 사용해 제조 현장 설비 5대(CNC·프레스·컨베이어·용접기·검사기)의 상태를 조회하는 도구 5개를 설계해줘. 각 도구의 docstring이 LLM이 올바른 도구를 선택하기에 충분히 구체적이고 명확하도록 작성하고, LangGraph ToolNode로 병렬 호출할 때의 코드 구조도 보여줘.
이 팁이 도움이 됐나요?
핵심 포인트
  • @tool 데코레이터의 docstring이 LLM이 도구를 선택하는 근거가 된다 — 정확하고 구체적인 docstring 작성이 에이전트 성능의 핵심이다
  • LangGraph의 create_react_agent는 이름과 달리 논문의 ReAct(사고 과정을 텍스트로 파싱)가 아니라 모델의 네이티브 tool_calls 루프다. Day 3 실습의 비교표를 함께 보라
  • Tool이 에러를 문자열로 돌려주면 모델이 그것을 읽고 다른 경로를 시도할 수 있다. 다만 자동으로 그렇게 되는 것은 아니고, 프롬프트가 그렇게 지시했을 때 그런 경향을 보인다
  • Mock 함수로 에이전트 로직을 먼저 검증하면 실제 MES 없이도 도구 선택과 루프를 점검할 수 있다
용어