day4_practice/toolnode_parallel.py · trace.py

ToolNode 병렬 호출 플레이어

모델이 한 번의 응답에 tool_calls 두 건을 내면 ToolNode 가 둘을 함께 실행해 ToolMessage 두 개를 돌려줍니다. 도구가 예외를 던지면 handle_tool_errors 설정에 따라 메시지로 바뀌거나 그래프가 멈춥니다. 마지막으로 trace.py 가 이 모든 기록을 messages 에서 표로 읽어 냅니다. 모델이 만든 값은 (예시) 로 표시했고, 도구 결과와 에러 문구는 같은 도구로 ToolNode 를 직접 실행해 얻은 실제 값입니다.

한눈에 보는 구조

START agent 모델 호출 (bind_tools) tool_calls 있음 tools = ToolNode(tools, handle_tool_errors=True) 요청들을 executor.map 으로 함께 실행 · 예외는 status="error" 메시지로 get_temperature city='서울' · id A get_temperature city='부산' · id B ToolMessage '서울: 3도' · id A ToolMessage '부산: 8도' · id B add_edge("tools","agent") END tool_calls 없음 trace.py print_trace(result) 사용자 도구요청 도구결과 최종답변 State["messages"] · add_messages 로 뒤에 이어 붙음 (병렬 질문 기준) HumanMessage질문 AIMessagetool_calls 2건 ToolMessageid A ToolMessageid B AIMessage최종 답 (tool_calls 없음)

모델 호출은 agent 노드에서 두 번(요청, 최종 답) 일어납니다. 도구를 한 건씩 차례로 불렀다면 세 번이 필요했을 일입니다. 플레이어의 단계마다 해당하는 칸이 파랗게 표시됩니다.

이 단계에서 일어나는 일

handle_tool_errors 값에 따른 결과 (직접 실행)

같은 두 도구로 만든 ToolNode 에 손으로 만든 tool_calls 를 넣어 돌린 결과입니다. 설치된 langgraph-prebuilt 1.1.1 기준이며, 모델은 부르지 않았습니다.

설정divide(a=10, b=0) (본문 예외)divide(a='열', b=2) (인자 검증 실패)
적지 않음 (기본값)ZeroDivisionError 가 그대로 올라와 그래프 실행이 예외로 끝남메시지로 바뀜: Error invoking tool 'divide' with kwargs {'a': '열', 'b': 2} with error: a: Input should be a valid number, … Please fix the error and try again.
True (이 실습)Error: ZeroDivisionError('division by zero') + Please fix your mistakes., status="error"Error: ToolInvocationError("Error invoking tool 'divide' …") + Please fix your mistakes.
문자열 "도구 실행에 실패했습니다."내용이 그 문자열인 ToolMessage, status="error"(확인하지 않음)
FalseZeroDivisionError 가 그대로 올라옴(확인하지 않음)

원고의 표에 있는 것처럼 예외를 받아 문자열을 돌려주는 함수를 넘길 수도 있습니다(이 자료에서는 실행해 보지 않았습니다). 기본값의 동작은 버전에 따라 달라질 수 있으므로, 이 실습처럼 의도한 값을 코드에 적어 두는 편이 안전합니다.

함정과 주의

관련 파일