20. 에이전트 및 도구 사용

LLM 시대, LangChain(랭체인)으로 배우는 AI 소프트웨어 개발

by AI개발자
gaebalai-blog_ai-v3-1.jpg

이전에는 RAG(검색증강생성)를 LangChain(랭체인)으로 실현하는 방법을 배웠습니다. RAG(검색증강생성)은 LLM이 수행하는 작업과 관련된 지식을 프롬프트에 통합하여 LLM응답의 품질을 향상시킬 수 있습니다. 이번에는 에이전트는 LLM이 논리적 추론능력을 활용함으로써 복잡한 작업을 자율적으로 수행할 수 있습니다.


(1) 에이전트 개요

에이전트는 LLM과 도구를 결합하고 주어진 작업을 자율적으로 해결하는 기능을 가진 요소를 말합니다. 에이전트는 앞서 소개한 도구를 조합하여 사용하여 외부환경과의 상호작용을 통해 보다 복잡한 작업을 수행할 수 있습니다. 에이전트는 주어진 프롬프트에 대해 LLM의 논리적 추론능력을 사용하여 자동으로 일련의 도구 호출순서와 조건을 결정합니다. 에이전트 동작은 앞서 소개했던 ReAct를 기반으로 합니다. 에이전트는 LLM을 사용하여 논리적 추론(Reasoning)과 도구 호출(Action)을 자동으로 반복하여 프롬프트에서 주어진 작업을 수행합니다.


LangChain(랭체인)은 에이전트를 만드는 API로 에이전트를 만드는 클래스와 함수를 제공합니다. 아래 표는 LangChain에서 제공하는 주요 에이전트 관련 클래스와 함수를 보여줍니다. create_tool_calling_agent는 도구호출 에이전트를 만드는 함수입니다. 사용할 LLM, 도구 및 프롬프트 템플릿을 지정하여 에이전트를 만듭니다. AgentExecutor는 에이전트를 실행하는 클래스입니다. 다른 LangChain(랭체인)의 컴포넌트와 같이 AgentExecutor는 Runnable인터페이스를 구현하고 있어 invoke메소드를 가집니다.


LangChain(랭체인)에서 제공하는 주요 에이전트 관련 클래스 및 함수

llm-langchain77-24.png


(2) 에이전트 만들기

이전에 만든 조명각도를 조정하는 시나리오를 복잡하게 만들고 에이전트를 사용하여 조명각도를 조정하는 예시를 살펴봅시다. 에이전트에게 에게 지정된 각도만큼 조명을 회전시키는 도구를 제공했습니다. 그러나 이번에는 문제설정을 조금 어렵게 하고, 도구 호출시에는 각도를 지정할 수 없는 상황을 상정합니다. 대신 조명의 현재 각도를 얻는 도구도 에이전트에게 제공합니다. 이 시나리오에서는 에이전트가 환경에서 빛의 각도를 직접 가져오고 자율적으로 라이트를 회전시킵니다.

아래 코드는 라이트 각도를 조정하는 에이전트의 전체 프로그램을 보여줍니다.


조명각도를 자율적으로 조정하는 에이전트(src/langchain/agent.py)

llm-langchain77-25.png

우선 필요한 모듈을 가져옵니다.

llm-langchain77-26.png

tool은 도구를 정의하는 데코레이터이고 AgentExecutor와 create_tool_calling_agent는 에이전트를 만들고 실행하기 위한 클래스와 함수입니다. 그런 다음 @tool 데코레이터를 사용하여 두가지 도구를 정의합니다.

llm-langchain77-27.png

get_current_light_angle함수는 현재 라이트 각도를 반환하는 도구이며, light_control함수는 라이트를 지정된 방향으로 약간 회전시키는 도구입니다. light_control함수는 전역변수 angle을 사용하여 현재 각도를 관리합니다. 그런 다음 ChatPromptTemplate을 사용하여 에이전트에게 지침을 제공하는 프롬프트 템플릿을 만듭니다.

llm-langchain77-28.png

이 템플릿은 에이전트에게 "반드시 CoT추론을 하고 나서 도구 호출을 실시해 주세요. 추론 과정도 반드시 보여주세요." 이것은 Zero-Shot CoT를 촉구하는 지침입니다. 또한 빛의 각도를 자주 확인하도록 지시합니다. 여기서 주의할 것은 agent_scratchpad라는 자리표시자가 추가되었다는 것입니다. 이는 에이전트 추론 과정을 기록하는 자리표시자입니다. 여기서 자리표시자의 이름 agent_scratchpad로 결정됩니다. LangChain(랭체인)은 내부 agent_scratchpad를 사용하여 도구 호출의 결과를 LLM에 전달하므로 이 이름을 사용해야 합니다. 한편, 다른 변수인 chat_history와 input는 임의의 이름이어도 상관없습니다. 이러한 변수인 chat_history와 input는 임의의 이름이어도 상관없습니다. 이러한 변수는 사용자가 명시적으로 이름을 지정하여 값을 할당합니다. 이 때문에 사용자가 자유롭게 명명할 수 있습니다. 마지막으로 create_tool_calling_agent함수를 사용하여 에이전트를 만들고 AgentExecutor를 사용하여 에이전트를 실행합니다.

llm-langchain77-29.png

create_tool_calling_agent함수에 사용할 LLM, 도구 및 프롬프트 템플릿을 지정합니다. AgentExecutor의 생성자는 에이전트와 도구를 지정합니다. verbose=True를 지정하면 에이전트의 사고과정이 표시됩니다. 에이전트는 "하루, 포드의 라이트를 20도 왼쪽으로 돌려줘"라는 태스크를 주고 있습니다. 에이전트는 이 작업에 대해 다음과 같은 추론과 도구호출을 자동으로 수행합니다.


현재 조명(라이트)의 각도를 확인하려면 get_current_light_angle함수를 호출합니다.

현재 각도에서 왼쪽으로 20도 회전하려면 light_control함수를 여러번 호출합니다.

목표 각도에 도달했는지 확인하기 위해 get_current_light_angle함수를 다시 호출합니다.


마지막으로 에이전트의 출력을 answer변수에 저장하고 'output'키의 값을 가져와서 표시합니다. 아래 코드는 에이전트 실행결과의 예를 보여줍니다. 이 실행결과에서 에이전트가 다음과 같은 추론과 도구 호출을 수행하고 있음을 알 수 있습니다.


먼저 get_current_light_angle함수를 호출하여 현재 조명의 각도를 얻습니다. 현재 각도는 50도였습니다. 다음으로 목표 각도인 30도에 도달하기 위해 light_control함수를 사용하여 라이트를 왼쪽으로 회전합니다. 한번의 조작으로 10도 라이트가 회전하는 것을 알았기 때문에 2회 조작이 필요하다고 판단하고 있습니다. 첫번째 작업 후, get_current_light_angle함수를 다시 호출하여 각도를 확인합니다. 각도는 40도가 되었습니다. 또 한번 더 light_control함수를 호출해 라이트를 왼쪽으로 회전시키고 있습니다. 마지막으로 get_current_light_angle함수를 호출하여 각도를 확인하고 목표의 30도로 정확헤 설정할 수 있다고 보고했습니다.


에이전트 실행결과

llm-langchain77-3-.png

에이전트의 동작은 안정되지 않을 수 있습니다. 정상적인 실행결과를 얻을 수 없는 경우 프로그램을 다시 실행해 보십시오. 최종적으로 각도가 30도가 되는 것을 확인할 수 있으면 정상입니다.



©2024-2025 GAEBAL AI, Hand-crafted & made with Damon Jaewoo Kim.

GAEBAL AI 개발사: https://gaebalai.com

AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5


keyword
이전 20화19. RAG(검색증강생성) 지원