research

Tool Call 루프가 필요한 이유

Tool Call 루프가 필요한 이유

핵심 요약

모델이 tool을 더 쓰고 싶어도, 클라이언트가 루프를 돌려주지 않으면 두 번째 tool_call부터는 그냥 무시된다.

문제 상황

현재 1회성 코드의 흐름:

사용자 질문 → 모델 → tool_call(검색1) → 결과 반환 → 모델 → 최종 답변

모델이 첫 번째 결과를 보고 "이걸론 부족하다"고 판단하면:

사용자 질문 → 모델 → tool_call(검색1) → 결과 반환
            → 모델 → tool_call(검색2) → 결과 반환   ← 현재 코드는 여기서 멈춤
            → 모델 → 최종 답변                       ← 여기까지 못 감

두 번째 tool_call을 처리할 루프가 없으니, 모델이 "한 번 더 검색하겠다"고 신호를 보내도 코드가 듣지 않고 None을 반환하며 끝난다. 모델 입장에선 말을 했는데 아무도 안 들어준 셈.

왜 루프인가

모델이 언제 tool을 그만 쓸지는 모델이 결정한다. 코드가 "2번만 허용"처럼 미리 제어할 수 없다. 모델이 finish_reason: "stop"을 낼 때가 "이제 tool 안 써도 되겠다"는 신호이므로, 그때까지 루프를 돌려야 한다.

while True:
    response = 모델에게 요청(messages)
    
    if finish_reason == "stop":
        return response  # 모델이 충분하다고 판단 → 끝
    
    elif finish_reason == "tool_calls":
        result = tool 실행()
        messages에 결과 추가
        # 다시 while 위로 → 모델에게 재요청

정리

| 상황 | 현재 코드 | 루프 있는 코드 | |------|-----------|----------------| | tool 1번으로 충분할 때 | ✅ 정상 | ✅ 정상 | | 모델이 tool을 2번 이상 쓰고 싶을 때 | ❌ None 반환 | ✅ 계속 실행 | | 모델이 stop을 낼 때 | ✅ 종료 | ✅ 종료 |

관련