brunch

You can make anything
by writing

C.S.Lewis

by 최재철 Apr 15. 2024

에이전트(Agent)란 무엇입니까?

생성형AI 에서의 Agent 란?

사진=영화 '아이언맨' 스틸컷출처 : 데일리한국(https://daily.hankooki.com)

에이전트를 영화 아이언맨의 자비스에 빗대어 설명하자면, 

영화 주인공인 토니 스타크는 인공지능 컴퓨터인 "자비스" 에게 낼 아침까지 설계를 검토하라고 지시합니다. 

이에 자비스는 스스로 알아서 설계를 검토하고 다음날 최종결과물을 토니 스타크에게 제공합니다. 

이처럼, 사용자가 명령을 주면 알아서 검토하고 최종 결과물을 제공하는 게 에이전트(Agent)입니다. 

이와 비슷하게, LangChain의 에이전트는 사용자와의 대화를 통해 정보를 제공하고 작업을 수행하기 위해 설계되었습니다.

LangChain의 Agent는 복잡하고 정교한 사고 작업을 실행할 수 있도록 설계된 역할입니다. Agent는 주어진 작업에 대해 상세한 계획을 세우고 실행하는 역할을 합니다.


에이전트 구성

먼저, LangChain 에이전트의 두뇌는 LLM입니다. 사용자가 요청한 내용을 이해하기 알맞게 수행하기 위해서 두뇌 곧, LLM 이 필요합니다.  요청을 잘 이해해야 잘 수행할 수 있기 때문입니다. 

예를 들어, Google 캘린더 이벤트를 업데이트하거나 데이터베이스에 대해 쿼리를 실행해서 정보를 가져오는 등. 일련의 작업수행과정을 Agent 에 정의할 수 있습니다. 


그다음이, 몸에 해당하는 것으로, LangChain의 도구 모음을 툴킷(Toolkit) 입니다. 이는 다시 구체적으로 에이전트에 사용할 수 있는 도구의 배열입니다. 그래서 전체 LangChain에서의 에이전트를 도식화하면 다음과 같습니다.


LangChain 의 Agent 구조

Agent 구조는  

두뇌 역할을 하고 추론 능력을 부여하는 LLM

목표를 달성할 수 있는 외부 도구들


에이전트 구축

이러한 개념을 위해 간단한 에이전트를 구축해 보겠습니다.

몇 가지 간단한 수학 연산을 수행할 수 있는 수학 에이전트를 만들어 보겠습니다.


환경설정

$ pip install langchain=="0.1.14" langchain-openai=="0.1.1"


도구정의

수학 에이전트용 도구를 정의합니다. 

우리가 전달한 질문에 대해 해당 작업을 수행할 수 있도록 "더하기" 도구를 만들겠습니다. 

이렇게 함으로써 Agent 작동 방식을 이해하도록 하겠습니다. 


@tool 데코레이터를 사용하여 LangChain에서 "추가" 도구를 정의하는 방법은 다음과 같습니다.


from langchain.tools import tool

@tool
def add(a: int, b: int) -> int:
      """Add two numbers."""       
      return a + b

@tool
def minus(a: int, b: int) -> int:
     """Minus two numbers."""      
     return a - b

참고할 사항:  

메소드 이름이 도구 이름이 됩니다.

메소드 매개변수는 도구의 입력 매개변수를 정의합니다.

주석은 도구설명으로 반환됩니다. 


이제 도구를 툴킷에 결합할 차례입니다.


툴킷(ToolKit)

툴킷은 도구 목록 일 뿐입니다. 우리는 툴킷을 다음과 같은 도구의 배열로 정의할 수 있습니다.


toolkit = [add, minus]


이게 전부입니다. 정말 간단합니다. 


참고사항으로, LangChain 문서의 툴킷 페이지에는 커뮤니티에서 개발한 유용한 다양한 툴킷 목록이 있습니다. 예를들어, 위의 링크에 있는 office365 툴킷의 경우 자동으로 이메일과 달력에 연결하는 과정을 수행합니다. 


LLM

위에서 언급했듯이 LLM은 Agent의 두뇌입니다. 전달된 질문을 기반으로 호출할 도구를 결정하고, 도구 설명을 기반으로 취해야 할 최선의 다음 단계는 무엇인지 결정합니다. 또한 최종 답변에 도달한 시기를 결정하고 이를 사용자에게 반환할 준비가 되어 있습니다.

여기서 LLM을 설정해 보겠습니다.


from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)


프롬프트

마지막으로 Agent 에 전달할 프롬프트가 필요합니다. 그래야 어떤 종류의 작업을 해야 하는지에 대한 일반적인 아이디어를 얻을 수 있습니다.


에이전트가 작동하려면 ChatPromptTemplate이 필요합니다. 

아래 프롬프트에는 답변만 반환하는 방법이 적용되어 있습니다. (영어로 하는 게 실행이 잘된다. )


prompt = ChatPromptTemplate.from_messages(

    [

        ("system", """

          You are a mathematical assistant. Use your tools to answer questions.

          If you do not have a tool to answer the question, say so.         

          Return only the answers. e.g

          Human: What is 1 + 1?

          AI: 2

          """),

        MessagesPlaceholder("chat_history", optional=True),

        ("human", "{input}"),

        MessagesPlaceholder("agent_scratchpad"),

    ]

)


에이전트

LangChain에는 다양한 추론 능력과 능력을 갖춘 다양한 에이전트 유형이 생성될 수 있습니다. 우리는 현재 사용 가능한 가장 간단하고 강력한 에이전트인 OpenAI Tools 에이전트를 사용할 것입니다. 

최신 OpenAI 도구 에이전트의 문서에 따르면,


최신 OpenAI 모델은 하나 이상의 함수가 호출되어야 하는 시기를 감지하도록 미세 조정되었습니다. API 호출에서 함수를 설명하는 주석에 따라 함수를 호출하는 지능적인 방법이 적용되어 있습니다. 
OpenAI 도구 API의 목표는 일반 텍스트 완성 또는 채팅 API를 사용하여 수행할 수 있는 것보다 유용한 함수 호출을 더 안정적으로 반환하는 것입니다. 

즉, 이 에이전트는 작업을 위해서 필요하면, 둘 이상의 함수(도구)가 필요한지도 이해하는 수준입니다. 


OpenAI 도구 에이전트를 생성하는 팩토리 메서드는 create_openai_tools_agent() 입니다 . 그리고 위에서 설정한 llm, 도구 및 프롬프트를 전달해야 합니다. 이제 에이전트를 초기화해 보겠습니다.


agent = create_openai_tools_agent(llm, toolkit, prompt)


마지막으로 LangChain에서 에이전트를 실행하기 위해 에이전트에 대해 "run" 유형의 메소드를 직접 호출할 수는 없습니다. AgentExecutor를 통해 실행해야 합니다.


우리가 도입한 AgentExecutor는 LangChain에서 에이전트의 런타임 역할을 하며 사용자에게 최종 응답을 반환할 준비가 될 때까지 에이전트가 계속 실행되도록 합니다. 

요청을 처리하는 동안 에이전트가 무엇을 하고 있는지 알 수 있도록 verbose를 True로 설정합니다.


agent_executor = AgentExecutor(agent=agent, tools=toolkit, verbose=True)


result = agent_executor.invoke({"input": "what is 1 + 1"})



(Tip) 에이전트를 조금 사용한 결과 다음과 같은 사실을 발견했습니다. 약간의 문제점에 해당. 

때로는 도구를 호출하지 않고도 LLM의 순수한 기능을 사용하여 질문에 답할 수 있습니다. add, minus 는 LLM 기본기능으로 내장되어 있는 거 같음. 너무 쉬운 함수라 굳이 Agent 를 실행안하는 거 같음.


미래

자비스처럼 스스로 추론할 수 있는 에이전트 프로그램은 

프로그래밍 세계의 새로운 패러다임이자 혁신입니다. 아직 부족한 게 많지만, 앞으로 좀 더 좋아질거라 예상되며, 좋은 것들이 많이 구축되다 보면 언젠가는 주류가 될 거라고 생각합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari