다단계 에이전트는 어떻게 동작할까요?

다단계 에이전트는 어떻게 동작할까요?

ReAct 프레임워크(Yao et al., 2022)가 현재 에이전트를 만드는 주된 접근 방식이에요.

그 이름은 "Reason(추론)"과 "Act(행동)" 두 단어를 붙인 데서 왔어요. 이 구조를 따르는 에이전트는 필요한 만큼 여러 단계로 나누어 작업을 해결하죠. 각 단계는 추론(Reasoning) 단계와, 그다음 작업을 해결에 한 걸음 더 가깝게 만들어줄 도구 호출을 만드는 행동(Action) 단계로 이루어져요.

smolagents의 모든 에이전트는 ReAct 프레임워크를 추상화한 단일 MultiStepAgent 클래스를 기반으로 해요.

기본적으로 이 클래스는 아래처럼 기존 변수와 지식을 에이전트 로그에 녹여내면서 다음 단계의 순환을 수행해요:

초기화: 시스템 프롬프트는 SystemPromptStep에 저장되고, 사용자 질의는 TaskStep에 로그로 남아요.

While 루프 (ReAct 루프):

  • agent.write_memory_to_messages()로 에이전트 로그를 LLM이 읽을 수 있는 채팅 메시지 목록으로 작성해요.
  • 이 메시지들을 Model 객체에 보내 완성(completion)을 받아요. 완성을 파싱해 행동을 얻어내는데, ToolCallingAgent는 JSON 블롭, CodeAgent는 코드 스니펫이에요.
  • 행동을 실행하고 결과를 메모리(ActionStep)에 로그로 남겨요.
  • 각 단계가 끝나면 agent.step_callbacks에 정의된 모든 콜백 함수를 실행해요.

선택적으로, 플래닝이 활성화되면 계획이 주기적으로 개정되어 PlanningStep에 저장돼요. 여기에는 작업에 대한 사실들을 메모리에 주입하는 일도 포함돼요.

CodeAgent의 경우 아래 그림처럼 동작해요.

<img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/smolagents/codeagent_docs.png"
/>

작동 방식을 보여주는 영상이에요:

<img
    class="block dark:hidden"
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/Agent_ManimCE.gif"
/>
<img
    class="hidden dark:block"
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/Agent_ManimCE.gif"
/>

우리는 두 가지 버전의 에이전트를 제공해요:

  • CodeAgent는 도구 호출을 파이썬 코드 스니펫으로 생성해요.
  • ToolCallingAgent는 많은 프레임워크에서 흔하듯 도구 호출을 JSON으로 작성해요. 필요에 따라 어느 쪽이든 쓸 수 있어요. 예를 들어 웹 브라우징은 각 페이지 상호작용 후 대기가 필요한 경우가 많아서, JSON 도구 호출이 잘 맞을 수 있어요.

[!TIP] 다단계 에이전트에 대해 더 알고 싶다면 오픈소스 LLM을 LangChain 에이전트로 블로그 포스트를 읽어보세요.