매직코드
article thumbnail

선행지식: LangChain에 대한 전반적인 흐름, 구조 (prompt, llm model, agents, tools etc...)

논문을 선정한 이유

요즘 랭체인을 공부하고 있는데 그 구성요소 중 하나인 Agent Types에서 가장 기본적으로 사용하는 ZERO_SHOT_REACT_DESCRIPTION에 대해서 확실하게 이해하고 싶었다. 내가 아는 react라고는 프론트엔드에서 사용하는 라이브러리뿐이다....ㅋㅋㅋ

 

 

논문읽기

Abstract

저자는 현재의 언어모델이 좋은 성능을 보였지만 "추론"과 "의사결정" 작업의 경우 좀 더 발전할 필요성이 있는것으로 본다. 논문에서는 추론과 의사결정을 잘 작업할 수 있도록 reasoning trace와 task specific actions를 잘 배치하는 방식을 연구했다.

reasoning trace는 action plane을 유도하고, 추적하고, 업데이트 하고, 예외처리를 하는데 도움이 될것이고, action은 기반지식이나 환경같은 외부요소에 접촉하여 정보를 수집할 수 있다. 이를 Reasoning과 Acting이 반복적으로 상호작용하는 것으로 보고 ReAct라고 표현한다.

 

ReAct Prompt

Prompting Method에는 4가지 방법이 존재한다.

  • Standard(IO; Input Output)
  • Reason-only(CoT; Chain of Thought)
  • Act-only
  • ReAct

질의응답(QA), 사실추출 및 검증(FEVER; Fact Extraction and Verification), 가상의 인공지능 시뮬레이션환경(ALFWorld), 가상의 웹쇼핑(Webshop)이라는 4개의 task 모두 ReAct 기능이 좋은 성능을 보였다. QA와 ALFWorld에서 ReAct 방법을 사용할 때 어떻게 성능이 달라지는지 기술했다.

HotpotQA Example

질의응답의 경우, 모델 내부에 학습되어 있는 지식에 의존해야 하기 때문에 Reason only(CoT) 방식으로 답변을 하게되면 중간에 잘못된 Thought로 인해 알맞은 대답이 나오기 어렵다. Act only 방식으로 답변을 하는 경우에도 수행하고 있는 Act가 올바른 방향인지 판단할 수 없기 때문에 알맞은 대답이 나오기 어렵다. ReAct 방식으로 질의응답을 진행했을 때 Thought에 대한 반응으로 Act가 따라오고, 해당 Act가 알맞은지, 그다음은 어떤것을 수행해야하는지 다시 Thought를 하고 Act를 하는 등 Thought-Act 상호작용의 반복으로 알맞은 답변을 출력하는 예제를 논문에서 볼 수 있다.

 

ALFWorld Example

이번 예시는 ReAct방식이 실패한 예시이다. 의사결정 작업의 경우 인간의 생각을 따라오기에는 아직 부족한점이 많지만 ReAct를 통해 AI가 인간의 추론방식에 어떻게 접근하는지 확인하고 수정할 수 있음을 장점으로 내세웠다.

ReAct Finetuning: Initial Results

마지막으로 ReAct는 모델의 크기에 상관없이 학습성능이 좋은 편이고, 때때로 ReAct Finetuning한 소형모델이 다른 방법으로 finetuning한 대형모델보다 좋은 성능을 가질때도 있다고 자랑한다.

 

논문리뷰

저자가 뭘 해내고 싶어했는가?

추론과 의사결정에 도움이 되는 AI 행동양식을 업그레이드 하고자 했다.

 

이 연구의 접근에서 중요한 요소는 무엇인가?

Resoning과 Acting이 계속해서 상호작용 하면서 알맞은 답을 찾아갈 수 있도록 한다.

 

 

논문을 보고 느낀점?

질의응답에 대해 단순한 input, output이 아니라 이 문제를 해결하기 위해 AI가 고민하고 생각하게 하는 과정을 반복적으로 수행하는 방법이라 사람의 사고방식과 비슷하게 진행될 수 있다는 것을 확인했다. 하지만 여전히 Thought의 유연성이 많이 떨어지고, 외부 정보를 가져온다고 했지만 온라인에 연결하거나 데이터를 직접적으로 넣어주는 등 추가적인 조치가 없으면 외부요소에 접촉하는 것도 한계가 있어보인다.

 

어떤 프로젝트에 적용할 수 있는가?

적용보다는 agent에 ZERO_SHOT_REACT_DESCRIPTION가 기본값으로 있으니 다른 agent type은 어떤 것들이 있는지, 어떤 상황에서 사용할 수 있는지 비교분석해볼 수 있을 것 같다.

 

추가적으로 공부해야할 것 또는 참고하고 싶은 다른 레퍼런스에는 어떤 것이 있는가?

agent type을 react로 결정했다고 하더라도 다른 기능들을 더 사용하여 넓게 ReAct 할 수 있도록 tools를 연결해주는것이 해결방안이 될 수 있다고 생각한다. 여러가지 tools 또는 custom tools를 사용하는 방법을 공부하면 좋을 것 같다.

 

코드 실습

기본적으로 LangChain을 사용하려면 openai에서 제공하는 api키가 필요하다.

너무 많이 실습하면 과금될 수 있으니 적당히 돌려보는걸로...!

 

titanic.csv
0.06MB

기본적인 질의응답을 위한 LangChain 코드는 많이 있기 때문에 데이터를 주고 그 데이터 안에서 대답할 수 있도록 해봤다.

내가 사용한 데이터는 기본적인 titanic데이터에서 전처리를 조금 진행했다.

필요하다면 이 데이터를 다운로드 받아서 사용해도 되고, 본인이 가지고 있는 간단한 데이터를 이용해도 된다.

 

import os
import pandas as pd
from langchain.agents import load_tools
from langchain import PromptTemplate
from langchain.agents import initialize_agent
from langchain.agents import create_pandas_dataframe_agent
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI

# openai 설정
OPENAI_API_KEY = "본인 OpenAI계정 API키"
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

# df
df = pd.read_csv('./titanic.csv')
# 모델
chat_model = ChatOpenAI(temperature=0)

# agent
agent = create_pandas_dataframe_agent(llm=chat_model,
                                      df=df,
                                      agent=AgentType.OPENAI_FUNCTIONS,
                                      verbose=True)

# 기준 템플릿
prompt_template = PromptTemplate.from_template("how many women survived?")

# 질문
formatted = prompt_template.format()
agent(formatted)

create_pandas_dataframe_agent()의 파라미터중에 llm, df는 필수 파라미터이고 agent_type는 AgentType.ZERO_SHOT_REACT_DESCRIPTION가 default로 설정되어있다.

 

 

ZERO_SHOT_REACT_DESCRIPTION은 일반적으로 사용하는 agent type이기 때문에 별도의 설정 없이 사용해도 되고, Chat model을 사용하는 경우에는 대부분의 기능이 비슷하지만 프롬프트의 유연성이 좀 더 넓은 CHAT_ZERO_SHOT_REACT_DESCRIPTION으로 설정하여 사용하기도 한다. 나는 리소스를 아끼기 위해서 ChatOpenAI모델을 사용했기 때문에 agent type도 CHAT_ZERO_SHOT_REACT_DESCRIPTION로 설정하여 실습을 진행했다.

 

 

랭체인이 생각하는 과정을 볼 수 있도록 verbose=True 설정을 했다.

처음에 Thought를 통해 문제 해결을 생각하고, 다음으로 Action을 취한다. 그런데 해당 액션이 제대로 이루어지지 않자 Action에 대한 문제점을 찾기 시작한다. Thought에서는 python 언어를 사용하여 df를 설정해야 한다고 해결책을 생각하고 Action에서 해당 코드를 실행하여 답을 찾아낸다.

일반적인 Model I/O 이었다면 에러가 발생하자마자 실행을 중단하고 에러메세지를 사용자에게 보냈겠지만, ReAct 방법론을 통해 에러의 원인을 알아내고 해결방법을 찾아 문제를 해결하는 과정이 추가되었다.

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!