LangChain과 Tavily를 활용한 ReAct 기반 챗봇 Agent 구현하기

woody.ahn·2024년 8월 9일
0

이전 포스팅들에서는 기본적인 chatbot과 RAG(Retrieval-Augmented Generation) 기반의 chatbot을 구현했고, 이번에는 ReAct(Reasoning and Acting) 기반의 chat을 구현해 보려고 합니다.

이전 포스트들

ReAct란 무엇인가요?

ReAct는 Reasoning and Acting의 약자로, 챗봇이 추론(Reasoning)행동(Acting)을 체계적으로 결합하여 문제를 해결하고 정보를 제공하는 프레임워크입니다. ReAct 모델의 핵심은 두 가지 주요 기능을 포함합니다.

  1. 추론 (Reasoning): 모델이 문제 해결을 위해 필요한 계획을 유도하고 추적하며 업데이트할 수 있도록 합니다. 이를 통해 예외 상황도 처리할 수 있습니다.
  2. 행동 (Acting): 외부 환경(예: 데이터베이스, API)과 상호작용하여 필요한 정보를 수집하고, 이를 바탕으로 작업을 수행합니다. 이는 모델이 동적인 환경에서도 효과적으로 대응할 수 있게 합니다.

ReAct Prompting 프로세스

  1. 사용자 입력 받기
  2. 추론: 필요한 행동 계획
  3. 행동: 외부 도구 사용 (예: 검색, 데이터베이스, API)
  4. 관찰: 행동 결과 분석
  5. 최종 응답 생성 또는 추가 추론/행동 반복

관찰 단계에서 얻은 정보가 충분하지 않거나 추가 작업이 필요할 경우, 다시 LLM으로 돌아가서 새로운 행동 계획을 세우고 이를 반복합니다. 이 루프는 최종적으로 만족스러운 답변을 얻을 때까지 계속됩니다.

프로세스 과정

다음은 Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President?” 라는 질문의 답변을 생성하는 과정입니다.

Thought 1 & Action 1
Thought: LLM이 "David Chanoff와 U.S. Navy admiral, 그리고 United Kingdom 대사를 찾아야 한다"고 추론합니다.
Action: "David Chanoff" 검색을 실행합니다.

Thought 2 & Action 2

Thought: 첫 번째 검색 결과를 바탕으로, LLM이 "David Chanoff가 U.S. Navy admiral과 협업했다"고 추론하고, 해당 admiral을 찾아야 한다고 판단합니다.
Action: "U.S. Navy admiral" 검색을 실행합니다.

Thought 3 & Action 3

Thought: 이전 검색 결과를 통해 LLM이 "Admiral William J. Crowe를 검색하고 United Kingdom 대사를 찾아야 한다"고 추론합니다.
Action: "Admiral William J. Crowe" 검색을 실행합니다.

Thought 4 & Final Answer

Thought: 마지막 검색 결과를 바탕으로, LLM이 "Admiral William J. Crowe가 Bill Clinton 대통령 시절 United Kingdom 대사였다"고 추론합니다.
Final Answer: LLM이 최종 답변으로 "Bill Clinton"을 제시합니다.

ReAct Chatbot 구현

의존성 설치

코드 실행에 필요한 의존성을 설치합니다.

pip3 install langchain langchain_openai langchain_community langchainhub

외부 검색 도구 설정

Tavily 검색 API를 사용하여 외부 정보 검색 기능을 구현합니다.

from langchain_community.tools.tavily_search.tool import TavilySearchResults

# Tavily API key
os.environ["TAVILY_API_KEY"] = "your-api-key"

tools = [TavilySearchResults(max_results=5)]

프롬프트 설정

LangChain Hub에서 사전 정의된 ReAct 채팅 프롬프트 hwchase17/react-chat 를 사용합니다.

from langchain import hub
from langchain.tools.render import render_text_description

prompt = hub.pull("hwchase17/react-chat")
prompt = prompt.partial(
	tools=render_text_description(tools),
	tool_names=", ".join([t.name for t in tools]),
)

해당 프롬프트를 보시면 다음과 같이 {tools}, {tool_names} 로 정의된 부분이 있습니다. prompt.partial()로 우리가 사용할 tool 정보도 넣어줍니다.

대화 기록 관리

챗봇이니 이전 대화 유지를 위해서 memory도 설정합니다.

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(memory_key="chat_history")

모델 설정

모델을 설정합니다. 요즘은 무료 모델들도 많으니 이미 쓰고 계신 모델이 있다면 그걸로 대체하시면 됩니다.

from langchain_openai import ChatOpenAI

# OpenAI API Key
os.environ["OPENAI_API_KEY"] = "your-api-key"

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
llm_with_stop = llm.bind(stop=["\nObservation"])

Agent Chain 구성

LLM, 프롬프트, 도구, 메모리를 결합하여 Agent Executor를 생성합니다.

from langchain.agents import AgentExecutor
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents.output_parsers import ReActSingleInputOutputParser

agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_log_to_str(x["intermediate_steps"]),
        "chat_history": lambda x: x["chat_history"],
    }
    | prompt
    | llm_with_stop
    | ReActSingleInputOutputParser()
)

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

챗봇 실행

response = agent_executor.invoke({"input": user_input})
print("Assistant: " + response["output"])

마치며

LangChain을 사용하면 간단하게 ReAct 기반의 챗봇을 만들 수 있습니다. 위의 코드를 실행하고 질문하면 LLM이 Tavily를 통해서 답변을 생성해 가는 것을 볼 수 있습니다.

예를 들어서
"대한민국의 스타벅스 매장 수를 찾고, 2024년 미국 스타벅스 매장 수와 비교해봐"

이 질문에 대해 ReAct 기반 챗봇은 다음과 같은 과정을 거칩니다

  1. 한국의 스타벅스 매장 수 검색
  2. 미국의 스타벅스 매장 수 검색
  3. 두 정보를 비교 분석
  4. 최종 응답 생성
You: 대한민국의 스타벅스 매장 수를 찾고, 2024년 미국 스타벅스 매장 수와 비교해봐

> Entering new AgentExecutor chain...
Thought: Do I need to use a tool? Yes  
Action: tavily_search_results_json  
Action Input: "대한민국 스타벅스 매장 수 2023"  [{'url': 'https://www.mk.co.kr/news/business/10941096', 'content': '한국이 스타벅스 매장 수에서 미국, 중국, 일본에 이은 세계 4위를 기록했다. 지난 12일 스타벅스 글로벌 웹사이트 자료에 따르면 2023년 말 기준으로 국내 스타벅스 매장 수는 1893개로 2022년보다 116개 늘어났다. 이는 3위인 일본(1901개)보다 8개 적은 수치다. 일본 인구가 한국 인구의 2.5배에 달하는 것을 ...'}, {'url': 'https://www.joongang.co.kr/article/25228101', 'content': '한국이 스타벅스 매장 수 세계 4위인 것으로 나타났다. ... 2022년 17개에 이어 2023년엔 8개로 좁혀졌다. 이런 추세라면 매장 수는 이르면 2년 안에 일본을 넘어설 가능성이 있다. 일본은 스타벅스가 북미 이외 지역 최초로 진출한 나라다. 일본 1호 매장은 1996년 도쿄 ...'}, {'url': 'https://caffemocha.tistory.com/entry/한국-스타벅스-매장', 'content': '한국과 일본의 스타벅스 매장 수 차이는 2013년 400개, 2019년 153개, 2020년 121개, 2021년 67개, 2022년 17개로 꾸준히 감소하여 2023년에는 8개에 불과했다. 현재의 추세라면 1 ~ 2년 안에 한국의 스타벅스 매장 수가 일본을 추월할 가능성이 높다.'}, {'url': 'https://news.koreadaily.com/2024/02/11/economy/business/20240211172434492.html', 'content': '한국의 스타벅스 매장 수가 미국·중국·일본에 이어 전 세계에서 네번째 많은 것으로 나타났다. 12일 스타벅스 글로벌 웹사이트에 따르면 지난해 말 기준 ... 났다. 이후 그 격차는 2019년 153개로 줄었고 2020년 121개, 2021년 67개, 2022년 17개에 이어 2023년엔 8개로 좁혀 ...'}, {'url': 'https://namu.wiki/w/스타벅스/대한민국', 'content': '2022년 기준 국내 매장 수는 약 1,700여 개이다. 2023년 기준 국내 매장 수는 1841개로 같은 시기의 일본 스타벅스 전체 매점 수(1846개)를 따라잡았다. # 미국과 중국에 이어 매장 기준으로 3위 국가이다.'}]Do I need to use a tool? Yes  
Action: tavily_search_results_json  
Action Input: "2024 미국 스타벅스 매장 수"  [{'url': 'https://www.hankookilbo.com/News/Read/A2024021213580001753', 'content': '한국 스타벅스의 매장 수가 미국, 중국, 일본에 이어 세계 4위인 것으로 나타났다. ... 2024.02.12 16:00. ... 한국 스타벅스 매장 수 세계 4위…3위 일본도 ...'}, {'url': 'https://www.chosun.com/economy/market_trend/2024/02/13/K2K66OPJNFF5PEXGZQOPWBTMKY/', 'content': '송혜진 기자. 업데이트 2024.03.29. 16:27. 0. 우리나라 스타벅스 매장 수가 미국·중국·일본에 이어 전 세계에서 넷째로 많은 것으로 나타났다. 한국이 스타벅스 매장 수에서 미국, 중국, 일본에 이은 세계 4위로 일본을 거의 따라잡은 것으로 나타났다. 12일 스타벅스 ...'}, {'url': 'https://m.blog.naver.com/archer1123/223339429225', 'content': '2024년 1월 30일, 스타벅스 ( 증권 시세 표시기, Financial )은 2024년 1분기 재무 실적을 상세히 담 은 8-K 보고서를 발표했다. 80개국 이상에 38,000개 이상의 매장을 보유한 커피 리테일 분야의 글로벌 리더인 이 회사는 연결 순수익이 8% 증가하여 사상 최대인 94억 달러를 ...'}, {'url': 'https://biz.chosun.com/distribution/food/2024/02/12/3POHM6W6S5ETPPENYBJPNGOSKU/', 'content': '입력 2024.02.12. 14:02 업데이트 2024.02.12. 14:06 한국이 스타벅스 매장 수가 미국, 중국, 일본에 이어 세계에서 네번째로 많은 국가로 나타났다.'}, {'url': 'https://aliceinsaltyland.tistory.com/entry/스타벅스SBUX-2024-1분기-실적발표', 'content': '스타벅스(sbux) 2024 1분기 실적발표를 자세히 살펴보겠습니다. *이미지 및 내용은 공식홈페이지의 ir자료를 활용해 편집했습니다. 1. 실적 요약하기 매출, 영업이익, 순이익, 주당순이익, 매장 개수의 변화를 먼저 확인해보겠습니다. 2024 1분기 전년 동기 대비 변화 매출 94억 달러 +8% 영업이익 14.9억 달러 ...'}]Do I need to use a tool? No  
Final Answer: 2023년 대한민국의 스타벅스 매장 수는 1,893개로, 이는 일본(1,901개)보다 8개 적은 수치입니다. 2024년 미국의 스타벅스 매장 수에 대한 구체적인 정보는 확인되지 않았지만, 스타벅스는 전 세계적으로 38,000개 이상의 매장을 운영하고 있습니다. 미국은 스타벅스의 본국으로, 매장 수는 가장 많을 것으로 예상됩니다.

> Finished chain.
Assistant: 2023년 대한민국의 스타벅스 매장 수는 1,893개로, 이는 일본(1,901개)보다 8개 적은 수치입니다. 2024년 미국의 스타벅스 매장 수에 대한 구체적인 정보는 확인되지 않았지만, 스타벅스는 전 세계적으로 38,000개 이상의 매장을 운영하고 있습니다. 미국은 스타벅스의 본국으로, 매장 수는 가장 많을 것으로 예상됩니다.

전체 코드는 GitHub 레포지토리에서 확인할 수 있습니다. 링크

profile
developer

1개의 댓글

comment-user-thumbnail
2025년 9월 5일

우디님 블로그 글 업데이트 부탁드립니다 ~^^~

답글 달기