inflearn logo
강의

Course

Instructor

AI Agent Development Using LangGraph (feat. MCP)

3.6 human-in-the-loop: How humans communicate with Agents

3.6 human_in_the_loop 3rd case

Resolved

81

hellonewworld

10 asked

0

강의를 들으면서 문득 든 궁금증인데, ai메세지가 도구를 잘못 선택했을 때(3번케이스)를 구현할 때, 왜 tool message를 수정하셨나요? tool 노드 호출전에 interrupt 해서 ai_message의 tool_calls에서 툴네임을 변경해도 되지 않을까해서요

case2번 : 도구는 잘 선택했을 때 쿼리가 잘못된 경우에서는 ai_message의 쿼리를 변경했듯이 3번의 케이스에선 ai_message의 툴네임을 변경해도 되지 않을까 의문이 들었습니다.

프롬프트엔지니어링 llm ai-agent langgraph mcp

Answer 1

0

jasonkang

안녕하세요! 좋은 질문 감사합니다.

TL;DR

핵심부터 말씀드리면, case 3(update_tool)은 "도구 자체를 바꾸는 것"이 아니라 "도구 호출을 건너뛰고, 사람이 직접 도구 결과를 제공하는 것"입니다.

코드를 다시 보시면:

if review_action == 'update_tool':
    updated_tool_message = {
        'tool_call_id': tool_call['id'],
        'name': tool_call['name'],
        'role': 'tool',
        'content': review_data  # 사람이 직접 제공하는 "결과값"
    }
    return Command(goto='agent', update={'messages': [updated_tool_message]})

여기서 두 가지를 확인할 수 있는데요

  1. goto='agent'

    1. tools 노드가 아니라 바로 agent로 갑니다.

    2. 즉, 실제로 도구를 실행하지 않습니다.

  2. role: 'tool'인 메시지를 직접 만들어서 삽입을 하게 되는데, 마치 도구가 실행된 것처럼 LLM에게 결과를 전달하는 가짜 ToolMessage입니다.

이 패턴의 의도는 이렇습니다: AI가 잘못된 도구를 선택했을 때, 사람이 "이 도구 말고 웹에서 검색해줘"라고 자연어로 피드백을 주면, 그 피드백 자체가 ToolMessage의 content로 들어가서 agent가 다시 판단할 수 있게 되는 것입니다.

실제 예시에서도 확인할 수 있습니다:

Command(resume={"action": "update_tool", "data": "arxiv말고 web에서 검색해주세요"})

여기서 arxiv말고 web에서 검색해주세요 라는 문자열이 ToolMessage의 content가 되어 agent에게 전달되고, agent는 이를 보고 다음에 duckduckgo_search를 호출하게 됩니다.

 

그러면 질문하신 것처럼 ai_message의 tool_calls에서 tool name을 직접 바꾸면 안 되는 것인지 의문이 들 수 있는데요,

기술적으로 가능은 하지만, 실용적으로 문제가 있습니다:

  • tool_name을 바꾸면 args도 함께 바꿔야 합니다. 각 도구마다 파라미터 스키마가 다르기 때문입니다. 강의에서 진행한 케이스의 경우 arxiv 도구와 duckduckgo_search 도구의 인자 형식이 동일한데요(모두 query를 사용함), 만약 스키마가 다른 경우에는 에러가 발생합니다.

    • 사람이 도구 이름과 정확한 인자까지 알아서 지정해야 하므로 human-in-the-loop의 편의성이 크게 떨어집니다.

  • 반면 case 3 방식은 사람이 자연어로 피드백만 주면, agent(LLM)가 알아서 적절한 도구와 인자를 다시 선택하므로 훨씬 유연합니다.

1

hellonewworld

자세하고 간결한 설명 감사합니다

마크다운을 텍스트 파일로 변환하기

0

10

1

max token을 제한하는게 왜 성능을 개선하게 되는걸까요?

0

41

2

pyzerox 유니코드 에러

0

75

2

영상 메타데이터 생성 관련 LLM 활용 질문

0

72

1

종합부동산세 부분 tool 사용 질문 드립니다.

0

74

2

uv sync 파이썬 버전문제 onnxruntime

-1

106

2

MCP를 활용해서 간단한 에이전트를 만들어보세요

0

97

1

PDF 형식

0

66

1

5.3 langchain-mcp-adpater를 활용한 MCP 도구 사용 tool_list 지연 사유

0

91

2

summary 를. 시스템메세지에 추가하는 부분에 관하여

0

70

3

병렬 처리 중 retrieve 관련 궁금한 사항

0

76

1

query 에 대한 answer 결과값이 나오지 않습니다.

0

95

2

사람과 관련된 표현이 없는데 rewrite 로 이동하지 않는경우

0

77

1

retriever 관련 질문

0

65

1

인터룹 관련 질문

0

49

2

2.4 Self-RAG 결과가 달라요!

0

78

2

md vs txt 차이..

0

140

2

OpenAI API 호출 때문에 발생하는 Error code: 429 문제

0

115

2

단순 도구 사용과 도구를 가진 에이전트를 사용하는 것의 차이가 궁금합니다.

0

88

1

LangChain과 LangGraph v1

0

137

1

2.4 강의 관련 질문(답변을 검증하는 self rag)

0

75

2

후속강의 문의

0

74

2

3.6 강의 관련 질문(interrupt 관련)

0

51

1

그래프 구현 조언 부탁드립니다!

0

77

2