- Tool은 하나의 기능을 처리하는 함수이다.
- Tool Calling은 LLM이 외부 도구나 API를 활용하여 작업을 수행할 수 있게 하는 기능이다.
절차
- LLM이 사용할 수 있는 도구들을 binding한다.
- 사용자로부터 질의가 들어오면, LLM은 어떤 tool을 어떻게 호출할지 응답한다. (그 질의를 처리하기 위해 tool을 호출하는 것이 필요한지 판단하고, 필요하다고 판단했다면)
- 사용자가 tool을 호출하고 그 처리 결과를 취합해 질의와 함께 LLM에 요청한다.
- Tool Calling은 LLM이 도구를 사용할지, 사용한다면 어떤 도구를 쓸지 의사결정하는 역할까지만 수행한다. 도구 실행은 개발자(사용자)가 실제로 수행한다.
- LLM이 도구 호출까지 해주면 좋겠는데요 => Agent
전체 흐름:
User 질의
→ LLM: 이 도구를 써야겠다 판단 + tool_call 응답
→ 사용자 코드: 해당 도구 호출 및 실행
→ 도구 결과를 LLM에게 다시 전달
→ LLM이 결과 바탕으로 최종 응답 생성
| 항목 | Tool Calling | Agent |
|---|
| 도구 선택 | ✅ LLM이 어떤 툴을 쓸지 판단 | ✅ LLM이 판단 |
| 도구 실행 | ❌ 개발자가 직접 수행 | ✅ Agent가 자동 실행 |
| 결과 종합 | ❌ 사용자가 도구 결과를 LLM에 전달 | ✅ Agent가 내부적으로 종합 |
| 최종 응답 생성 | ⭕ LLM에게 한 번 더 호출하면 응답 생성 가능 (Tool Calling 자체는 직접 생성 안 함) | ✅ Agent가 도구 실행부터 응답 생성까지 전 과정 처리 |
| 호출 방식 예시 | tool_model.invoke() → tool_calls 판단만 | RunnableAgent.invoke() → 실행 + 응답까지 자동 처리 |
✅ 3. 단계별 메시지 객체
| 단계 | 설명 | 메시지 객체 | 주체 |
|---|
| ① 사용자 입력 | 사용자의 질문 입력 | str 또는 HumanMessage | 사용자 |
| ② LLM 판단 | Tool 필요 여부 판단 및 tool_calls 생성 | AIMessage (tool_calls 필드 포함) | LLM |
| ③ 도구 실행 | tool_calls 정보를 바탕으로 실제 툴 실행 | - (직접 실행) | 사용자 코드 |
| ④ 도구 결과 전달 | 도구 결과를 메시지로 포맷 | ToolMessage | 사용자 코드 |
| ⑤ 최종 응답 생성 | AIMessage + ToolMessage 바탕으로 LLM이 응답 생성 | AIMessage (최종 응답) | LLM |
- 도구 호출은 자동 실행되지 않음 → 반드시 tool_calls를 바탕으로 개발자가 실행해야 함
- ToolMessage의 tool_call_id는 반드시 tool_calls의 ID와 일치해야 함 → 연결 실패 시 응답 오류
- 최종 응답 생성 시, ToolMessage는 리스트로 넘겨야 함 → [AIMessage, ToolMessage, ToolMessage, ...] 형식