transformers의 Agent 기능 소개
에이전트(Agent) 는 LLM(Large Language Model, 대규모 언어 모델)을 엔진으로 사용하여 여러 기능을 수행하는 시스템입니다. LLM은 논리, 계산, 검색 등의 작업에서 약점을 가지고 있지만, 이를 보완하기 위해 다양한 도구(Tool) 를 사용할 수 있습니다. 에이전트는 이러한 도구를 통해 LLM의 약점을 극복하고, 더 복잡한 작업을 수행할 수 있게 합니다.
Hugging Face가 도입한 에이전트 시스템은 이와 같은 맥락에서, LLM을 더욱 강력하게 활용할 수 있도록 하는 새로운 접근 방식입니다. 에이전트는 단순히 명령어를 이해하는 것을 넘어, 계산, 검색, 코드 실행 등 다양한 툴을 활용해 복잡한 문제를 해결할 수 있도록 지원합니다. 이러한 시스템을 통해 사용자는 더 복잡한 작업을 자동화하고 처리할 수 있어, 효율성을 크게 높일 수 있습니다.
에이전트는 LLM을 기반으로 하여 다양한 작업을 자동으로 계획하고 실행할 수 있는 시스템입니다. 기존의 LLM은 단순한 텍스트 생성 작업에는 매우 강력하지만, 계산이나 논리적 추론, 외부 데이터 검색과 같은 작업에서는 종종 한계를 드러냅니다. 이러한 문제를 해결하기 위해, Hugging Face는 에이전트가 외부 툴을 활용할 수 있도록 설계했습니다. 에이전트는 특정 작업에 맞는 툴을 선택하고 이를 사용해 문제를 해결합니다.
에이전트 시스템은 Hugging Face의 다양한 모델들과 결합하여 사용될 수 있습니다. LLM을 기반으로 한 에이전트는 Hugging Face Hub에서 제공하는 다양한 사전 학습된 모델을 활용할 수 있으며, 사용자가 직접 커스텀 툴을 만들어 에이전트에 추가할 수도 있습니다. 이로 인해 에이전트 시스템은 매우 유연하며, 다양한 사용 사례에 맞게 조정할 수 있습니다. 에이전트는 동작 방식에 따라 1) 모든 작업을 한 번에 수행하는 방식(CodeAgent)과, 2) 단계별로 결과를 확인하며 진행하는 방식(ReacAgent)으로 구분됩니다:
Code Agent
CodeAgent는 멀티모달 작업에 적합하며, 작업을 계획한 후 Python 코드를 생성해 한 번에 모든 작업을 실행합니다. 이 에이전트는 입력과 출력 타입을 다룰 수 있어 멀티모달 작업에 추천됩니다.
React Agent
Yao 등이 공개한 논문에서 제안한 ReAct 프레임워크를 기반으로 한 ReactAgent는 추론 작업에 적합합니다. Hugging Face는 두 가지 React 에이전트를 제공합니다:
- ReactJsonAgent: 도구 호출을 JSON 형식으로 생성합니다.
- ReactCodeAgent: Python 코드 조각으로 도구 호출을 생성하며, 코딩 성능이 우수한 LLM에 적합합니다.
React Agent는 단계별로 작업을 수행하며, 매 단계에서 결과를 관찰하고 다음 작업을 결정합니다. React Agent에 대해서 더 알아보시려면 다음의 글을 참고하세요:
에이전트 구축 방법
에이전트를 구축하기 위해서는 다음 요소들이 필요합니다:
- LLM 엔진 (에이전트의 핵심)
- 작업 맥락을 제공하는 시스템 프롬프트
- 작업 수행에 필요한 도구 모음
- LLM 출력에서 어떤 도구를 사용할지 해석하는 파서
기본 설정
Hugging Face Inference API를 사용해 LLM 엔진을 만들 수 있습니다. 다음은 Python으로 설정하는 예시입니다:
from huggingface_hub import login, InferenceClient
login("<YOUR_HUGGINGFACEHUB_API_TOKEN>")
client = InferenceClient(model="meta-llama/Meta-Llama-3-70B-Instruct")
def llm_engine(messages, stop_sequences=["Task"]) -> str:
response = client.chat_completion(messages, stop=stop_sequences, max_tokens=1000)
return response.choices.message.content
실행을 위해 필요한 transformers[agents]
를 설치해야 합니다:
pip install transformers[agents]
에이전트의 코드 실행
에이전트에 내장된 Python 인터프리터는 코드를 실행할 수 있습니다. 그러나 에이전트가 사용할 수 있는 도구와 print 함수만 사용 가능하며, 외부 모듈은 기본적으로 제한됩니다. 필요하다면 추가 모듈을 허용할 수 있습니다:
from transformers import ReactCodeAgent
agent = ReactCodeAgent(tools=[], additional_authorized_imports=['requests', 'bs4'])
시스템 프롬프트 맞춤화
시스템 프롬프트는 에이전트의 동작 방식을 정의합니다. 도구 설명과 출력 형식을 조정해 작업에 맞는 프롬프트를 맞춤화할 수 있습니다. 예를 들어, 작업을 해결하는 단계를 세분화하고 출력 형식을 명시할 수 있습니다:
agent = ReactJsonAgent(tools=[PythonInterpreterTool()], system_prompt="{your_custom_prompt}")
에이전트 실행 결과 점검
에이전트 실행 후, 로그를 통해 각 단계에서 발생한 작업을 점검할 수 있습니다:
agent.logs
는 에이전트의 세부 로그를 저장합니다.agent.write_inner_memory_from_logs()
는 로그의 주요 내용을 요약하여 저장합니다.
도구(Tool)
도구는 에이전트가 사용할 수 있는 원자적 기능입니다. 각 도구는 이름, 설명, 입력과 출력 타입 등의 속성을 가지며, 이러한 속성들은 에이전트의 시스템 프롬프트에 자동으로 포함됩니다.
기본 도구 모음
Hugging Face transformers
라이브러리는 기본 제공 도구 모음을 제공합니다. add_base_tools=True
로 설정하면, 다음과 같은 도구들을 에이전트에 추가할 수 있습니다:
- 문서 질문 답변: 이미지 형식의 문서(예: PDF)가 주어지면 이 문서(도넛에 대한 질문에 답변합니다.)
- 이미지 질문 답변: 이미지가 주어지면 이 이미지에 대한 질문에 답변 (VILT)
음성 텍스트 변환: 사람이 말하는 오디오 녹음이 주어지면, 그 음성을 텍스트로 변환합니다(Whisper). - 텍스트 음성 변환: 텍스트를 음성으로 변환(SpeechT5)
번역: 주어진 문장을 소스 언어에서 대상 언어로 번역합니다. - 덕덕고 검색*: 덕덕고 브라우저를 사용하여 웹 검색을 수행합니다.
Python 코드 인터프리터: 안전한 환경에서 LLM으로 생성된 Python 코드를 실행합니다. 이 도구는 코드 기반 에이전트가 이미 파이썬 코드를 기본적으로 실행할 수 있으므로add_base_tools=True
로 초기화한 경우에만 ReactJsonAgent에 추가됩니다.
이러한 기본 도구들은 load_tool() 함수를 사용하여 도구를 호출할 수 있습니다.
from transformers import load_tool
tool = load_tool("text-to-speech") # load_tool() 로 기본 도구 불러오기
audio = tool("This is a text to speech tool") # tool 설정
새로운 도구 생성
@tool
데코레이터를 사용해 간단히 새 도구를 만들 수 있습니다. 다음은 가장 많이 다운로드된 모델을 검색하는 도구 예시입니다:
from transformers import tool
@tool
def model_download_counter(task: str) -> str:
model = next(iter(list_models(filter="text-classification", sort="downloads", direction=-1)))
return model.id
에이전트의 도구 모음 관리
기존 에이전트의 도구 모음에 도구를 동적으로 추가하거나 교체할 수 있습니다. 아래 예시 코드를 참고하세요:
agent.toolbox.add_tool(model_download_tool)
도구 모음 사용
도구 모음(tool collection)을 사용할 수도 있습니다:
from transformers import ToolCollection, ReactCodeAgent
image_tool_collection = ToolCollection(collection_slug="huggingface-tools/diffusion-tools-6630bb19a942c2306a2cdb6f")
agent = ReactCodeAgent(tools=[*image_tool_collection.tools], add_base_tools=True)
결론
Hugging Face 에이전트는 LLM의 약점을 보완하고 특정 작업에 특화된 도구들을 통합해 LLM의 성능과 유연성을 크게 향상시킵니다. 멀티모달 작업이나 복잡한 추론 문제를 해결할 때, 에이전트를 활용하면 보다 효율적인 AI 응용 프로그램을 만들 수 있습니다.
더 읽어보기
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다.
파이토치 한국 사용자 모임이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래쪽에 좋아요를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~