LLM 시대, LangChain(랭체인)으로 배우는 AI 소프트웨어 개발
ReAct(Reasoning + Acting)(Yao et al, 2023)은 LLM에 추론과 행동을 촉구하는 프롬프트를 제공하여 작업 달성 능력을 향상시키는 접근법입니다. ReAct의 기본 아이디어는 작업을 수행하는데 필요한 행동을 LLM에 추론하는 것입니다. 아래 그림은 ReAct의 개요를 보여줍니다.
LLM이 수행하는 행동에는 도구의 사용이 포함되며 LLM은 두고를 사용하여 필요한 추가 정보를 환경에서 가져오거나 환경에 적용할 수 있습니다. 예를 들어, LLM은 웹검색엔진을 이용하여 정보를 검색하거나 외부 프로그램을 호출하여 계산을 수행할 수 있습니다.
ReAct는 에이전트 실현 방법으로도 생각할 수 있습니다. 에이전트는 외부 세계와의 상호작용을 통해 작업을 달성하는 프로그램입니다. 도구 호출이 외부 세계와 상호작용할 수 있기 때문에 ReAct는 LLM기반 에이전트 구현에 적합니다.
도구는 프로그래밍언어의 함수로 생각할 수 있습니다. 따라서, ReAct는 LLM이 함수호출을 할 수 있도록 하는 기법이라고도 할 수 있습니다. 그러나, 실제로 LLM이 함수를 호출하는 것은 아닙니다. LLM은 함수호출 요청을 응답으로 생성합니다. 그러므로 에이전트는 LLM 대신 함수를 호출해야 합니다. 함수의 호출 결과는 관측 결과로서 LLM에 피드백되고 다음 추론에 이용됩니다.
ReAct에서는 추론과 행동을 번걸아 가면서 각각 시너지 방식으로 작동합니다. 추론을 통해 LLM은 행동계획을 세우거나 행동결과를 해석할 수 있습니다. 한편, 행동에 따라 LLM은 추론에 필요한 정보를 수집하거나 환경을 변화시킵니다. 이 상호작용을 통해 LLM은 작업에 대한 보다 깊은 이해를 얻어 복잡한 문제를 해결할 수 있습니다.
ReAct는 다음 구성 프롬프트를 사용합니다.
작업 설명
사용가능한 도구 설명
추론 및 행동, 관측(Thought-Action-Observation)의 포멧
사용가능한 도구 설명은 함수의 서명과 그 사양을 제공합니다. 추론 및 행동, 관측의 형식에서는 LLM의 출력(추론, 행동)과 LLM에의 입력(관측)의 형식을 지정합니다. 형식 지정은 Few-Shot 프롬프트에서 설명하여 수행됩니다. 다만, 도구 이용에 대응하고 있는 LLM의 경우, 예시를 생략할 수도 있습니다.
ReAct 절차는 다음과 같습니다.
1. 프롬프트 만들기: LLM에 작업설명 및 목표가 포함된 프롬프트를 제공합니다.
2. 목표를 달성할 때까지 다음 단계를 반복합니다.
① 추론(Thought): LLM은 프롬프트에 근거하여 추론을 수행하고 다음 행동을 결정합니다. 추론 내용에는 작업분석, 필요한 정보 식별, 행동 계획등이 포함됩니다.
② 행동(Action): 에이전트는 추론의 결과에 근거하여 행동을 수행합니다. 행동에는 도구 사용(예: 웹검색, 계산 실행 등)과 최종 답변 생성등이 있습니다.
③ 관측(Observation): 상담원은 행동의 결과를 관측하고 LLM에 피드백합니다. 도구를 사용했을 경우는 도구로부터의 출력이 관측이 됩니다. 최종 답변이 생성되면 작업실행이 종료됩니다.
④ 다음 추론을 위한 프롬프트 업데이트: 현재까지의 추론, 행동, 관측 기록을 다음 프롬프트에 추가하고 LLM에 다음 추론ㅇ를 촉구합니다. 이에 따라 LLM은 과거의 결과를 바탕으로 다음 행동을 결정합니다.
3. 최종 답변 생성: LLM이 최종 답변을 생성할 때까지 2단계를 반복합니다. 최종 답변이 생성되면 작업 실행을 종료합니다.
LLM은 추론단계에서 작업을 분석하고 필요한 정보를 파악하여 행동을 계획합니다. 행동 단계에서 에이전트는 도구를 사용하여 정보를 수집하거나 환경에 참여합니다. 관측된 결과는 다음 추론을 위해 프롬프트에 추가됩니다. 이 일련의 프로세스를 통해 LLM은 작업에 필요한 지식을 점차 축적하여 문제 해결에 도움을 줄 것입니다. 결국, 충분한 정보가 얻어지면 최종 답변을 생성하여 작업을 완료합니다.
이번에는 에이전트 프레임워크 중 하나인 CrewAI에서 ReAct 구현을 참조하여 실제 프레임워크에서 ReAct의 동작을 설명합니다. 또한, 예를 들어, 에이전트에 대한 작업으로 2024년 최근 AI조사를 요청한다고 가정합니다. CrewAI에서는 내부 프롬프트가 영어로 작성됩니다. 생성되는 프롬프트 중 한국어와 영어가 혼재되는 것을 피하기 위해 이 예제에서는 프롬프트도 영어로 기술하고 있습니다.
1. 프롬프트 생성
CrewAI는 에이전트 역할, 목표, 작업설명, 예상출력, 사용가능한 도구, 추론, 행동 및 관측 형식을 포함하는 프롬프트를 생성합니다. 에이전트 역할과 같은 정보는 사전에 에이전트 작성 API에 지정됩니다. 에이전트 역할 등을 지정하는 효과는 나중에 설명합니다.
①의 '에이전트의 역할과 목표' 부분은 에이전트의 역할고 목표를 지정하고 있습니다. 여기에서는 수석 조사원으로서의 역할과 목표를 주고 있습니다.
②의 '사용가능한 도구의 설명' 부분은 사용가능한 도구의 설명입니다. 이 섹션에서는 Search라는 도구를 사용하여 웹검색을 수행할 수 있는 방법을 설명합니다.
③의 '추론 및 행동, 관측의 포멧' 부분에서는 추론(Throught), 행동(Action), 행동의 입력(Action Input), 관측(Observation)의 포멧을 지정하고 있습니다. 여기에서는 추론, 행동, 행동입력, 관측이 무엇을 의미하는지 설명합니다. 행동은 함수, 행동의 입력은 함수의 인수라고 생각해도 문제가 없습니다. 이러한 구현 방법 외에 구체예를 사용한느 방법도 있습니다.
④의 '태스크의 설명' 부분은 태스크의 설명입니다. 여기에서는 2024년 최근 AI를 조사하도록 작업을 설정합니다.
⑤의 정형문 부분은 정형문으로 도구를 이용해 최상의 최종 출력을 얻을 수 있도록 촉구하고 있습니다. 또한 Thought의 계속을 답하도록 촉구하고 있습니다.
① 에이전트의 역할과 목표
② 사용가능한 도구설명
③ 추론, 행동, 관측 형식
④ 작업 설명
⑤ 정형문
2. (a) 추론(Thought)
LLM은 주어진 프롬프트를 기반으로 추론을 시작합니다. 이 예제에서 LLM은 다음과 같은 추론을 반환합니다.
추론에서는 웹검색이 필요하다는 것을 안내합니다. 또한, 'Action:'와 'ActionInput:'의 뒤에는 각각 도구와 도구에 입력이 출력됩니다.
2. (b) 행동(Action)
에이전트는 2(a)로 얻은 LLM의 출력을 해석해, 호출할 도구와 그 입력을 취득합니다. 앞의 예제에서는 도구로 검색하고 입력으로 "Latest development in AI2024"가 지정되었습니다. 이 때문에 에이전트는 웹검색을 수행합니다.
2. (c) 관측(Observation)
에이전트는 검색결과를 관찰합니다. 여기서는 다음과 같은 JSON형식으로 검색결과를 얻을 수 있다고 가정합니다.
2. (d) 다음 추론을 위한 프롬프트 업데이트
에이전트는 LLM의 출력과 2(c) 결과를 처음 만든 프롬프트에 추가하여 LLM에 대해 입력을 만듭니다.
이 프롬프트는 원래 프롬프트에 LLM출력과 도구 실행 결과를 더한 것ㅅ입니다. 이후 다시 2(a)로 돌아가 LLM에 의한 추론을 반복합니다. 추론의 결과, 도구를 다시 호출해야 하는 경우, Action에 도구 호출이 지정됩니다. 반면에 최종 답변을 받으면 루프를 종료하고 최종 답변을 생성합니다.
3. 최종 답변 생성
LLM이 최종 답변에 도달하면 다음과 같은 출력을 생성합니다.
'Final Answer;'로 시작하는 부분은 프롬프트형식으로 지정한 형식입니다. 여기에서 LLM이 관측결과를 기반으로 최종 결과를 생성하는지 확인할 수 있습니다. 이번에는 CrewAI 구현을 기반으로 ReAct프롬프트를 설명했지만, LangChain과 같은 다른 프레임워크에서도 거의 유사한 프롬프트가 사용됩니다.
©2024-2025 GAEBAL AI, Hand-crafted & made with Damon Jaewoo Kim.
GAEBAL AI 개발사: https://gaebalai.com
AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5