day1_practice/tool_decision.pyday1_practice/tool_playground.py

도구 호출 루프 플레이어

모델은 도구를 실행하지 않습니다. 도구 설명서를 읽고 '이 도구를 이 인자로 불러 달라'는 주문서(tool_calls)를 돌려줄 뿐이고, 실행해서 결과를 돌려주는 것은 우리 코드입니다. 질문 하나("박도윤 이메일 알려주고, 부산 날씨도 알려줘.")를 넣었을 때 messages 리스트가 턴마다 어떻게 자라는지 따라갑니다. 모델의 결정과 외부 API 결과는 실행마다 달라서 보라색 자리 표시와 예시로 보여 줍니다.

한눈에 보는 구조

bind_tools AIMessage 예 아니오 기록에 붙이고 다시 tool_decision.py 는 주문서를 찍기만 하고 아래 실행 단계로 가지 않습니다 @tool 함수들 이름·docstring·타입 → 설명서 messages [HumanMessage(질문)] 모델 호출 llm_with_tools.invoke(messages) 메시지 전체 + 도구 설명서 tool_calls 비었나? 최종 답변 response.text 우리 코드가 실행 TOOLS_BY_NAME[…].invoke(args) ToolMessage tool_call_id=call["id"] for turn in 1..max_turns 모델 호출은 최대 5번

모델 → 판단 → 실행 → ToolMessage → 다시 모델로 도는 고리가 도구 호출 루프입니다. 모델이 주문서를 내지 않으면 고리를 빠져나와 최종 답변으로 갑니다. 고리는 max_turns 번까지만 돕니다. 3일차에 같은 고리를 ReAct 루프라는 이름으로 그래프에 옮깁니다.

그 시점의 데이터

이 시점의 messages 와 주고받는 값

터미널 출력

보라색 칸은 실행마다 달라지는 자리

이 단계에서 일어나는 일

함정과 주의

관련 파일