모델이 한 번의 응답에 tool_calls 두 건을 내면 ToolNode 가 둘을 함께 실행해 ToolMessage 두 개를 돌려줍니다.
도구가 예외를 던지면 handle_tool_errors 설정에 따라 메시지로 바뀌거나 그래프가 멈춥니다. 마지막으로 trace.py 가 이 모든 기록을 messages 에서 표로 읽어 냅니다.
모델이 만든 값은 (예시) 로 표시했고, 도구 결과와 에러 문구는 같은 도구로 ToolNode 를 직접 실행해 얻은 실제 값입니다.
같은 두 도구로 만든 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" | (확인하지 않음) |
False | ZeroDivisionError 가 그대로 올라옴 | (확인하지 않음) |
원고의 표에 있는 것처럼 예외를 받아 문자열을 돌려주는 함수를 넘길 수도 있습니다(이 자료에서는 실행해 보지 않았습니다). 기본값의 동작은 버전에 따라 달라질 수 있으므로, 이 실습처럼 의도한 값을 코드에 적어 두는 편이 안전합니다.
handle_tool_errors 를 적지 않으면 인자 검증 오류만 메시지가 되고, ZeroDivisionError 같은 예외는 그래프를 멈춥니다. 61줄의 True 가 빠지면 두 번째 질문은 답 대신 예외로 끝납니다.Please fix your mistakes. 앞에 예외가 붙으므로, 예외 메시지 자체를 모델이 읽을 글로 써 두면 좋습니다. get_temperature 에 "대전"을 넣으면 Error: ValueError("대전는 지원하지 않는 도시입니다. 지원: ['서울', '부산', '제주']") 가 되어 모델이 지원 도시를 알 수 있습니다.messages 와 trace.py 표에는 시스템 프롬프트가 보이지 않습니다.tool_calls 가 있는 AIMessage 에 모델이 쓴 글이 있어도 요청 줄만 찍고, 결과와 답변은 60자에서 자릅니다. 또 trace.py 는 from toolnode_parallel import graph 로 파일 이름만으로 모듈을 찾으므로 day4_practice 폴더에서 실행해야 합니다.day4_practice/toolnode_parallel.pyToolNode 로 ReAct 그래프를 조립하고 병렬 질문과 0 나누기 질문을 실행합니다. Bedrock 을 호출합니다.day4_practice/trace.py위 파일의 graph 를 import 해 순차 질문을 돌리고 messages 를 표로 출력합니다. Bedrock 을 호출합니다.day4_practice/failure_agent.py조금 줄인 형태의 print_trace 가 다시 나옵니다.day4_practice/tool_design_explained.html도구 하나가 모델에게 어떤 설명서로 전달되는지 다루는 같은 날의 플레이어입니다.