Agentic RAG

에이전트를 활용한 검색 증강 생성

문서 검색 도구와 웹 검색 도구를 활용하여 최신 정보를 검색하고 답변을 생성하는 Agentic RAG를 다룬다.

AI
RAG
LangChain
저자

Kwangmin Kim

공개

2025년 07월 20일

1 Agentic RAG

  • 상황에 따라 유동적으로 LLM을 동작 시키는 방법
  • Agent를 활용한 RAG으로 적절하게 RAG, Agent, Agentic RAG을 사용해야 함. 반드시 agent가 좋은 것은 아님.
    • Agentic RAG의 장점: LLMM 에 tools을 개발해주어 LLM이 알아서 판단해서 문제 해결을 함
    • Chaining RAG: 특정 문서에서 정보를 추출하여 답변할때 충분한 방법
  • LLM에게 파이썬 코드를 실행할 수 있는 tool을 구현해주고 파이썬 코드를 지시사항으로 주게되면 파이썬 코드를 만들어서 실행결과를 반환할 수 있다
  • 문서에서 검색을 하고 검색된 내용을 기반으로 파이썬 코드를 만들어 실행한 후 그 결과를 반환하는 것도 가능
  • 문서 검색을 통해 최신 정보에 접근하여 검색 결과를 가지고 답변을 생성하는 에이전트를 만들어 본다.
  • 질문에 따라 문서를 검색하여 답변하거나, 인터넷 검색 도구를 활용하여 답변하는 에이전트를 만들어 본다.

참고

  • RAG 를 수행하되, Agent 를 활용하여 RAG 를 수행한다면 이를 Agentic RAG 라고 부릅니다.

1.1 도구(Tools)

Agent 가 활용할 도구를 정의하여 Agent 가 추론(reasoning)을 수행할 때 활용하도록 만들 수 있다.

Tavily Search 는 그 중 대표적인 검색 도구 다. 검색을 통해 최신 정보에 접근하여 검색 결과를 가지고 답변을 생성할 수 있다. 도구는 이처럼 검색 도구 뿐만아니라 Python 코드를 실행할 수 있는 도구, 직접 정의한 함수를 실행하는 도구 등 다양한 종류와 방법론을 제공한다.

1.1.2 문서 기반 문서 검색 도구: Retriever

  • 데이터에 대해 조회를 수행할 retriever도 생성한다.
  • retriever는 자유롭게 커스텀 기능을 추가/삭제할 수 있지만 반드시 마지막 값은 retriever type이어야한다

실습에 활용한 문서

소프트웨어정책연구소(SPRi) - 2023년 12월호

  • 저자: 유재흥(AI정책연구실 책임연구원), 이지수(AI정책연구실 위촉연구원)
  • 링크: https://spri.kr/posts/view/23669
  • 파일명: SPRI_AI_Brief_2023년12월호_F.pdf

실습을 위해 다운로드 받은 파일을 data 폴더로 복사해 주기 바란다

이 코드는 웹 기반 문서 로더, 문서 분할기, 벡터 저장소, 그리고 OpenAI 임베딩을 사용하여 문서 검색 시스템을 구축한다.

여기서는 PDF 문서를 FAISS DB 에 저장하고 조회하는 retriever 를 생성한다.

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain.document_loaders import PyPDFLoader

# PDF 파일 로드. 파일의 경로 입력
loader = PyPDFLoader("data/SPRI_AI_Brief_2023년12월호_F.pdf")

# 텍스트 분할기를 사용하여 문서를 분할한다.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

# 문서를 로드하고 분할한다.
split_docs = loader.load_and_split(text_splitter)

# VectorStore를 생성한다.
vector = FAISS.from_documents(split_docs, OpenAIEmbeddings())

# Retriever를 생성한다. (반드시 마지막 값은 retriever type이어야한다)
retriever = vector.as_retriever()

이 함수는 retriever 객체의 invoke() 를 사용하여 사용자의 질문에 대한 가장 관련성 높은 문서 를 찾는 데 사용된다.

# 문서에서 관련성 높은 문서를 가져옵니다.
retriever.invoke("삼성전자가 개발한 생성형 AI 관련 내용을 문서에서 찾아줘")
[Document(metadata={'source': 'data/SPRI_AI_Brief_2023년12월호_F.pdf', 'page': 12}, page_content='SPRi AI Brief |  \n2023-12 월호\n10삼성전자 , 자체 개발 생성 AI ‘삼성 가우스 ’ 공개\nn삼성전자가 온디바이스에서 작동 가능하며 언어, 코드, 이미지의 3개 모델로 구성된 자체 개발 생성 \nAI 모델 ‘삼성 가우스 ’를 공개\nn삼성전자는 삼성 가우스를 다양한 제품에 단계적으로 탑재할 계획으로 , 온디바이스 작동이 가능한 \n삼성 가우스는 외부로 사용자 정보가 유출될 위험이 없다는 장점을 보유KEY Contents\n£언어, 코드, 이미지의 3개 모델로 구성된 삼성 가우스 ,
(...중략...)
하는데 머문다면 , 에이전트는 사용자의 여행 \n패턴을 분석해 여행지를 제안하고 관심사에 따른 활동을 추천하며 선호하는 스타일의 레스토랑 예약도 가능  \n£AI 에이전트가 의료와 교육, 생산성 , 엔터테인먼트 ·쇼핑 영역의 서비스 대중화를 주도할 것\nn에이전트로 인해 주목할 만한 변화는 고비용 서비스의 대중화로 특히 △의료 △교육 △생산성 △\n엔터테인먼트 ·쇼핑의 4개 영역에서 대규모 변화 예상')]

이제 검색을 수행할 인덱스를 채웠으므로, 이를 에이전트가 제대로 사용할 수 있는 도구로 쉽게 변환할 수 있다.

create_retriever_tool 함수로 retriever 를 도구로 변환한다.

from langchain.tools.retriever import create_retriever_tool

retriever_tool = create_retriever_tool(
    retriever,
    name="pdf_search",  # 도구의 이름을 입력한다. 도구 인지가 잘 되도록 하는 역할을 함
    description="use this tool to search information from the PDF document",  # 도구에 대한 설명을 자세히 기입해야 한다!!
)

1.1.3 Agent 가 사용할 도구 목록 정의

이제 두 가지를 모두 만들었으므로, Agent 가 사용할 도구 목록을 만들 수 있다.

tools 리스트는 searchretriever_tool을 포함한다.

# tools 리스트에 search와 retriever_tool을 추가한다.
tools = [search, retriever_tool]

1.2 Agent 생성

이제 도구를 정의했으니 에이전트를 생성할 수 있다.

먼저, Agent 가 활용할 LLM을 정의하고, Agent 가 참고할 Prompt 를 정의한다.

참고 - 멀티턴 대화를 지원하지 않는다면 “chat_history” 를 제거해도 좋다.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# LLM 정의
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# Prompt 정의
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant. "
            "Make sure to use the `pdf_search` tool for searching information from the PDF document. "
            "If you can't find the information from the PDF document, use the `search` tool for searching information from the web.",
        ),
        ("placeholder", "{chat_history}"), # 추후에 추가될 multi-turn 기능을 위해 채팅 기록이 저장되어야함.
        ("human", "{input}"),
        ("placeholder", "{agent_scratchpad}"),
    ]
)

다음으로는 Tool Calling Agent 를 생성한다.

from langchain.agents import create_tool_calling_agent

# tool calling agent 생성
agent = create_tool_calling_agent(llm, tools, prompt)

마지막으로, 생성한 agent 를 실행하는 AgentExecutor 를 생성한다.

참고

  • verbose=False 로 설정하여 중간 단계 출력을 생략하였다.
from langchain.agents import AgentExecutor

# AgentExecutor 생성
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False) #  verbose=True: 중간단계 출력

1.3 에이전트 실행하기

이제 몇 가지 질의에 대해 에이전트를 실행할 수 있다!

현재 이러한 모든 질의는 상태(Stateless) 가 없는 질의다(이전 상호작용을 기억하지 않는다).

agent_executor 객체의 invoke 메소드는 딕셔너리 형태의 인자를 받아 처리한다. 이 예제에서는 input 키에 hi! 값을 할당한 딕셔너리를 인자로 전달하고 있다. 이는 일반적으로 AI 에이전트, 함수 실행기, 또는 명령 처리기 등의 객체에서 입력을 처리하기 위해 사용된다.

from langchain_teddynote.messages import AgentStreamParser

# 각 단계별 출력을 위한 파서 생성
agent_stream_parser = AgentStreamParser()
# 질의에 대한 답변을 스트리밍으로 출력 요청
result = agent_executor.stream(
    {"input": "2024년 프로야구 플레이오프 진출한 5개 팀을 검색하여 알려주세요."}
)

for step in result:
    # 중간 단계를 parser 를 사용하여 단계별로 출력
    agent_stream_parser.process_agent_steps(step)
[도구 호출]
Tool: tavily_search_results_json
query: 2024년 프로야구 플레이오프 진출 팀
Log: 
Invoking: `tavily_search_results_json` with `{'query': '2024년 프로야구 플레이오프 진출 팀'}`



[관찰 내용]
Observation: [{'url': 'https://www.yna.co.kr/view/GYH20241003000600044', 'content': '4 days ago · ... 팀의 뒤집기 마법을 선사하고 준플레이오프(준PO·5전 3승제)에 진출했다. kt는 3일 서울 잠실구장에서 열린 2024 신한 SOL뱅크 KBO 포스트시즌 와일드\xa0...'},
(...중략...)
{'url': 'https://namu.wiki/w/KBO%20%ED%94%8C%EB%A0%88%EC%9D%B4%EC%98%A4%ED%94%84/2024%EB%85%84', 'content': '2024 신한 SOL Bank KBO 리그 페넌트레이스 2위 삼성 라이온즈와 준플레이오프 승리팀이 맞붙는 시리즈.'}]

[도구 호출]
Tool: tavily_search_results_json
query: 2024 KBO 포스트시즌 진출 팀
Log: 
Invoking: `tavily_search_results_json` with `{'query': '2024 KBO 포스트시즌 진출 팀'}`

[관찰 내용]
Observation: [{'url': 'https://www.yna.co.kr/view/GYH20241003000600044', 'content': '4 days ago · ... 팀의 뒤집기 마법을 선사하고 준플레이오프(준PO·5전 3승제)에 진출했다. kt는 3일 서울 잠실구장에서 열린 2024 신한 SOL뱅크 KBO 포스트시즌 와일드\xa0...'}, 
(...중략...)
{'url': 'http://m.monthly.chosun.com/client/Mdaily/daily_view.asp?Idx=20426&Newsnumb=20241020426', 'content': '5 days ago · 진출팀은 ▲KIA 타이거즈 ▲삼성 라이온즈 ▲LG 트윈스 ▲두산 베어스 ▲kt wiz다. 2일 두산과 KT는 서울 잠실구장에서 와일드카드 결정전을 치른다.'}]

[최종 답변]
2024년 KBO 프로야구 포스트시즌에 진출한 팀들은 다음과 같습니다:

1. KIA 타이거즈
2. 삼성 라이온즈
3. LG 트윈스
4. 두산 베어스
5. KT 위즈

이 팀들은 포스트시즌에서 경쟁하게 됩니다.

agent_executor 객체의 invoke 메소드를 사용하여, 질문을 입력으로 제공한다.

# 질의에 대한 답변을 스트리밍으로 출력 요청
result = agent_executor.stream(
    {"input": "삼성전자가 자체 개발한 생성형 AI 관련된 정보를 문서에서 찾아주세요."}
)

for step in result:
    # 중간 단계를 parser 를 사용하여 단계별로 출력
    agent_stream_parser.process_agent_steps(step)
[도구 호출]
Tool: pdf_search
query: 삼성전자 생성형 AI
Log: 
Invoking: `pdf_search` with `{'query': '삼성전자 생성형 AI'}`

[관찰 내용]
Observation: SPRi AI Brief |  
2023-12 월호
10삼성전자 , 자체 개발 생성 AI ‘삼성 가우스 ’ 공개
n삼성전자가 온디바이스에서 작동 가능하며 언어, 코드, 이미지의 3개 모델로 구성된 자체 개발 생성 
AI 모델 ‘삼성 가우스 ’를 공개
(...중략...)
n판결문은 또한 생성 AI 모델 훈련에 사용된 모든 이미지에 저작권이 있다거나 , 생성 AI로 만든 
이미지가 저작물을 이용해 훈련되었으므로 저작물의 파생 이미지라는 주장은 개연성이  부족하다고  
지적

[최종 답변]
삼성전자가 자체 개발한 생성형 AI 모델 '삼성 가우스'에 대한 정보는 다음과 같습니다:

1. **모델 구성**: 삼성 가우스는 언어, 코드, 이미지의 3개 모델로 구성되어 있습니다. 
   - **언어 모델**: 메일 작성, 문서 요약, 번역 업무 등을 지원합니다.
   - **코드 모델**: AI 코딩 어시스턴트 '코드아이(code.i)'를 통해 대화형 인터페이스로 서비스를 제공하며, 사내 소프트웨어 개발에 최적화되어 있습니다.
   - **이미지 모델**: 창의적인 이미지를 생성하고 기존 이미지를 수정할 수 있으며, 저해상도 이미지를 고해상도로 변환하는 기능도 지원합니다.

2. **온디바이스 작동**: 삼성 가우스는 온디바이스에서 작동하도록 설계되어 있어, 사용자 정보가 외부로 유출될 위험이 없습니다. 이는 개인정보 보호 측면에서 큰 장점으로 작용합니다.

3. **출시 및 계획**: 삼성전자는 2023년 11월 8일 '삼성 AI 포럼 2023'에서 삼성 가우스를 최초 공개하였으며, 다양한 제품에 단계적으로 탑재할 계획입니다.

4. **기술 트렌드**: IT 전문지 테크리퍼블릭에 따르면, 온디바이스 AI가 주요 기술 트렌드로 부상하고 있으며, 2024년부터 삼성 가우스를 탑재한 스마트폰이 메타의 라마(Llama)2를 탑재한 퀄컴 기기 및 구글 어시스턴트를 적용한 구글 픽셀과 경쟁할 것으로 예상됩니다.

이 정보는 삼성전자가 AI 기술을 통해 사용자 경험을 향상시키고, 개인정보 보호를 강화하려는 노력을 보여줍니다.

1.4 이전 대화내용 기억하는 Agent

이전의 대화내용을 기억하기 위해서는 RunnableWithMessageHistory 를 사용하여 AgentExecutor 를 감싼다.

RunnableWithMessageHistory 에 대한 자세한 내용은 아래 링크를 참고한다.

참고 - RunnableWithMessageHistory

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# session_id 를 저장할 딕셔너리 생성
store = {}


# session_id 를 기반으로 세션 기록을 가져오는 함수
def get_session_history(session_ids):
    if session_ids not in store:  # session_id 가 store에 없는 경우
        # 새로운 ChatMessageHistory 객체를 생성하여 store에 저장
        store[session_ids] = ChatMessageHistory()
    return store[session_ids]  # 해당 세션 ID에 대한 세션 기록 반환


# 채팅 메시지 기록이 추가된 에이전트를 생성한다.
agent_with_chat_history = RunnableWithMessageHistory(
    agent_executor,
    # 대화 session_id
    get_session_history,
    # 프롬프트의 질문이 입력되는 key: "input"
    input_messages_key="input",
    # 프롬프트의 메시지가 입력되는 key: "chat_history"
    history_messages_key="chat_history",
)
# 질의에 대한 답변을 스트리밍으로 출력 요청
response = agent_with_chat_history.stream(
    {"input": "삼성전자가 개발한 생성형 AI 관련된 정보를 문서에서 찾아주세요."},
    # session_id 설정
    config={"configurable": {"session_id": "abc123"}},
)

# 출력 확인
for step in response:
    agent_stream_parser.process_agent_steps(step)
[도구 호출]
Tool: pdf_search
query: 삼성전자 생성형 AI
Log: 
Invoking: `pdf_search` with `{'query': '삼성전자 생성형 AI'}`

[관찰 내용]
Observation: SPRi AI Brief |  
2023-12 월호
10삼성전자 , 자체 개발 생성 AI ‘삼성 가우스 ’ 공개
n삼성전자가 온디바이스에서 작동 가능하며 언어, 코드, 이미지의 3개 모델로 구성된 자체 개발 생성 
AI 모델 ‘삼성 가우스 ’를 공개
(...중략...)
∙판결문은 소송을 제기한 캘리 맥커넌과 칼라 오르티즈가 미국 저작권청에 예술 작품에 대한 저작권을 
제출하지 않았다는 점을 지적했으며 , 사라 앤더슨은 고소장에 인용된 수백 개의 작품 중 16개 작품에 
대해서만 저작권을 보유
n판결문은 또한 생성 AI 모델 훈련에 사용된 모든 이미지에 저작권이 있다거나 , 생성 AI로 만든 
이미지가 저작물을 이용해 훈련되었으므로 저작물의 파생 이미지라는 주장은 개연성이  부족하다고  
지적

[최종 답변]
삼성전자가 개발한 생성형 AI에 대한 정보는 다음과 같습니다:

1. **삼성 가우스**: 삼성전자는 2023년 11월 8일 '삼성 AI 포럼 2023'에서 자체 개발한 생성형 AI 모델인 '삼성 가우스'를 공개했습니다. 이 모델은 언어, 코드, 이미지의 3개 모델로 구성되어 있으며, 온디바이스에서 작동할 수 있도록 설계되었습니다. 이는 사용자 정보가 외부로 유출될 위험이 없다는 장점을 가지고 있습니다.

2. **모델 구성**:
   - **언어 모델**: 클라우드와 온디바이스에서 다양한 모델로 구성되어 있으며, 메일 작성, 문서 요약, 번역 등의 작업을 지원합니다.
   - **코드 모델**: AI 코딩 어시스턴트인 '코드아이 (code.i)'를 통해 대화형 인터페이스로 서비스를 제공하며, 사내 소프트웨어 개발에 최적화되어 있습니다.
   - **이미지 모델**: 창의적인 이미지를 생성하고 기존 이미지를 수정할 수 있으며, 저해상도 이미지를 고해상도로 변환하는 기능도 지원합니다.

3. **향후 계획**: 삼성전자는 삼성 가우스를 다양한 제품에 단계적으로 탑재할 계획이며, 온디바이스 AI 기술을 활용한 여러 기능을 소개하고 있습니다. 이 기술은 2024년부터 삼성 스마트폰에 탑재될 예정이며, 메타의 라마(Llama)2를 탑재한 퀄컴 기기 및 구글 어시스턴트를 적용한 구글 픽셀(Pixel)과 경쟁할 것으로 예상됩니다.

이 정보는 삼성전자가 AI 기술을 통해 사용자 경험을 향상시키고, 데이터 보안을 강화하려는 노력을 보여줍니다.
response = agent_with_chat_history.stream(
    {"input": "이전의 답변을 영어로 번역한다."},
    # session_id 설정
    config={"configurable": {"session_id": "abc123"}},
)

# 출력 확인
for step in response:
    agent_stream_parser.process_agent_steps(step)

# 이경우 도구 호출이 필요없기 때문에 도구 호출 하지 않음
[최종 답변]
Here is the translation of the previous response into English:

1. **Samsung Gauss**: On November 8, 2023, Samsung Electronics unveiled its generative AI model called 'Samsung Gauss' at the 'Samsung AI Forum 2023'. This model consists of three components: language, code, and image models, and is designed to operate on-device. This has the advantage of ensuring that user information is not at risk of being leaked externally.

2. **Model Composition**:
   - **Language Model**: Composed of various models for cloud and on-device use, it supports tasks such as email writing, document summarization, and translation.
   - **Code Model**: Through the AI coding assistant 'code.i', it provides services via an interactive interface, optimized for in-house software development.
   - **Image Model**: Capable of generating creative images and modifying existing ones, it also supports converting low-resolution images to high-resolution.

3. **Future Plans**: Samsung Electronics plans to gradually integrate Samsung Gauss into various products and introduce multiple features utilizing on-device AI technology. This technology is expected to be incorporated into Samsung smartphones starting in 2024 and is anticipated to compete with Qualcomm devices equipped with Meta's Llama 2 and Google Pixel devices using Google Assistant.

This information demonstrates Samsung's efforts to enhance user experience and strengthen data security through AI technology.

1.5 Agent 템플릿

다음은 전체 템플릿 코드이다.

# 필요한 모듈 import
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_community.vectorstores import FAISS
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.document_loaders import PyMuPDFLoader
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_teddynote.messages import AgentStreamParser

########## 1. 도구를 정의합니다 ##########

### 1-1. Search 도구 ###
# TavilySearchResults 클래스의 인스턴스를 생성합니다
# k=6은 검색 결과를 6개까지 가져오겠다는 의미입니다
search = TavilySearchResults(k=6)

### 1-2. PDF 문서 검색 도구 (Retriever) ###
# PDF 파일 로드. 파일의 경로 입력
loader = PyMuPDFLoader("data/SPRI_AI_Brief_2023년12월호_F.pdf")

# 텍스트 분할기를 사용하여 문서를 분할합니다.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

# 문서를 로드하고 분할합니다.
split_docs = loader.load_and_split(text_splitter)

# VectorStore를 생성합니다.
vector = FAISS.from_documents(split_docs, OpenAIEmbeddings())

# Retriever를 생성합니다.
retriever = vector.as_retriever()

retriever_tool = create_retriever_tool(
    retriever,
    name="pdf_search",  # 도구의 이름을 입력합니다.
    description="use this tool to search information from the PDF document",  # 도구에 대한 설명을 자세히 기입해야 합니다!!
)

### 1-3. tools 리스트에 도구 목록을 추가합니다 ###
# tools 리스트에 search와 retriever_tool을 추가합니다.
tools = [search, retriever_tool]

########## 2. LLM 을 정의합니다 ##########
# LLM 모델을 생성합니다.
llm = ChatOpenAI(model="gpt-4o", temperature=0)

########## 3. Prompt 를 정의합니다 ##########

# Prompt 를 정의합니다 - 이 부분을 수정할 수 있습니다!
# Prompt 정의
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant. "
            "Make sure to use the `pdf_search` tool for searching information from the PDF document. "
            "If you can't find the information from the PDF document, use the `search` tool for searching information from the web.",
        ),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
        ("placeholder", "{agent_scratchpad}"),
    ]
)

########## 4. Agent 를 정의합니다 ##########

# 에이전트를 생성합니다.
# llm, tools, prompt를 인자로 사용합니다.
agent = create_tool_calling_agent(llm, tools, prompt)

########## 5. AgentExecutor 를 정의합니다 ##########

# AgentExecutor 클래스를 사용하여 agent와 tools를 설정하고, 상세한 로그를 출력하도록 verbose를 True로 설정합니다.
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)

########## 6. 채팅 기록을 수행하는 메모리를 추가합니다. ##########

# session_id 를 저장할 딕셔너리 생성
store = {}


# session_id 를 기반으로 세션 기록을 가져오는 함수
def get_session_history(session_ids):
    if session_ids not in store:  # session_id 가 store에 없는 경우
        # 새로운 ChatMessageHistory 객체를 생성하여 store에 저장
        store[session_ids] = ChatMessageHistory()
    return store[session_ids]  # 해당 세션 ID에 대한 세션 기록 반환


# 채팅 메시지 기록이 추가된 에이전트를 생성한다.
agent_with_chat_history = RunnableWithMessageHistory(
    agent_executor,
    # 대화 session_id
    get_session_history,
    # 프롬프트의 질문이 입력되는 key: "input"
    input_messages_key="input",
    # 프롬프트의 메시지가 입력되는 key: "chat_history"
    history_messages_key="chat_history",
)

########## 7. Agent 파서를 정의합니다. ##########
agent_stream_parser = AgentStreamParser()
########## 8. 에이전트를 실행하고 결과를 확인합니다. ##########

# 질의에 대한 답변을 출력합니다.
response = agent_with_chat_history.stream(
    {"input": "구글이 앤스로픽에 투자한 금액을 문서에서 찾아줘"},
    # 세션 ID를 설정합니다.
    # 여기서는 간단한 메모리 내 ChatMessageHistory를 사용하기 때문에 실제로 사용되지 않습니다
    config={"configurable": {"session_id": "abc123"}},
)

for step in response:
    agent_stream_parser.process_agent_steps(step)
[도구 호출]
Tool: pdf_search
query: 구글 앤스로픽 투자 금액
Log: 
Invoking: `pdf_search` with `{'query': '구글 앤스로픽 투자 금액'}`

[관찰 내용]
Observation: 1. 정책/법제  
2. 기업/산업 
3. 기술/연구 
 4. 인력/교육
구글, 앤스로픽에 20억 달러 투자로 생성 AI 협력 강화 
n 구글이 앤스로픽에 최대 20억 달러 투자에 합의하고 5억 달러를 우선 투자했으며, 앤스로픽은 
구글과 클라우드 서비스 사용 계약도 체결
(...중략...) 
Ⅱ. 주요 행사
   ▹CES 2024 ····························································································································· 19

[최종 답변]
구글은 앤스로픽에 최대 20억 달러를 투자하기로 합의했으며, 이 중 5억 달러를 우선 투자했습니다. 향후 15억 달러를 추가로 투자할 계획입니다.
########## 8. 에이전트를 실행하고 결과를 확인합니다. ##########

# 질의에 대한 답변을 출력합니다.
response = agent_with_chat_history.stream(
    {"input": "이전의 답변을 영어로 번역해 주세요"},
    # 세션 ID를 설정합니다.
    # 여기서는 간단한 메모리 내 ChatMessageHistory를 사용하기 때문에 실제로 사용되지 않습니다
    config={"configurable": {"session_id": "abc123"}},
)

for step in response:
    agent_stream_parser.process_agent_steps(step)
[최종 답변]
Google has agreed to invest up to $2 billion in Anthropic, with an initial investment of $500 million. They plan to invest an additional $1.5 billion in the future.
########## 8. 에이전트를 실행하고 결과를 확인합니다. ##########

# 질의에 대한 답변을 출력합니다.
response = agent_with_chat_history.stream(
    {
        "input": "2024년 프로야구 플레이오프 진출 5개팀을 검색해서 알려주세요. 한글로 답변하세요"
    },
    # 세션 ID를 설정합니다.
    # 여기서는 간단한 메모리 내 ChatMessageHistory를 사용하기 때문에 실제로 사용되지 않습니다
    config={"configurable": {"session_id": "abc456"}},
)

for step in response:
    agent_stream_parser.process_agent_steps(step)
[도구 호출]
Tool: tavily_search_results_json
query: 2024 KBO 리그 플레이오프 진출팀
Log: 
Invoking: `tavily_search_results_json` with `{'query': '2024 KBO 리그 플레이오프 진출팀'}`

[관찰 내용]
Observation: [{'url': 'https://www.gosusports.com/news/baseball/kbo-news-2024-kbo-season-preview/196180/', 'content': "[고수스포츠] 2024 kbo 리그 시즌 프리뷰 ... 플레이오프 진출을 이뤄냈다. nc의 선전에는 '특급 외인' 페디의 활약이 주효했다. 페디는 평균자책점(era 2.00)다승(20승), 탈삼진(209개) 등 3가지 부문에서 모두 1위를 차지하며 kbo리그를 평정했다."},
(...중략...)
kia 타이거즈, 삼성 라이온즈, lg 트윈스, 두산 베어스, kt 위즈다.. kia 타이거즈; 2022년 이후 2년만에 포스트시즌 진출에 성공했다. 9월 6일 포스트시즌 진출 확정 이후 9월 17일 정규시즌 우승도 함께 기록하면서 한국시리즈 직행에 성공했다.'}]

[최종 답변]
2024년 KBO 리그 플레이오프에 진출한 5개 팀은 다음과 같습니다:

1. KIA 타이거즈
2. 삼성 라이온즈
3. LG 트윈스
4. 두산 베어스
5. KT 위즈

이 팀들은 2024년 KBO 포스트시즌에 진출하여 경기를 치르게 됩니다.
########## 8. 에이전트를 실행하고 결과를 확인합니다. ##########

# 질의에 대한 답변을 출력합니다.
response = agent_with_chat_history.stream(
    {"input": "이전의 답변을 SNS 게시글 형태로 100자 내외로 작성하세요."},
    # 세션 ID를 설정합니다.
    # 여기서는 간단한 메모리 내 ChatMessageHistory를 사용하기 때문에 실제로 사용되지 않습니다
    config={"configurable": {"session_id": "abc456"}},
)

for step in response:
    agent_stream_parser.process_agent_steps(step)
[최종 답변]
2024 KBO 리그 플레이오프 진출팀: KIA 타이거즈, 삼성 라이온즈, LG 트윈스, 두산 베어스, KT 위즈! 치열한 경기가 기대됩니다! #KBO #플레이오프
########## 8. 에이전트를 실행하고 결과를 확인합니다. ##########

# 질의에 대한 답변을 출력합니다.
response = agent_with_chat_history.stream(
    {"input": "이전의 답변에 한국 시리즈 일정을 추가하세요."},
    # 세션 ID를 설정합니다.
    # 여기서는 간단한 메모리 내 ChatMessageHistory를 사용하기 때문에 실제로 사용되지 않습니다
    config={"configurable": {"session_id": "abc456"}},
)

for step in response:
    agent_stream_parser.process_agent_steps(step)
[도구 호출]
Tool: tavily_search_results_json
query: 2024 KBO 한국 시리즈 일정
Log: 
Invoking: `tavily_search_results_json` with `{'query': '2024 KBO 한국 시리즈 일정'}`

[관찰 내용]
Observation: [{'url': 'https://ko.wikipedia.org/wiki/2024년_한국시리즈', 'content': '2024 신한 SOL Bank KBO 한국시리즈는 2024년 10월 21일부터 10월 29일까지 펼쳐질 예정인 2024년 KBO 리그의 챔피언 결정전이다. 대진은 2024년 KBO 리그 정규 시즌 1위 팀으로 2017년 한국시리즈 이후 7년만에 한국시리즈 직행에 성공하며 통합 우승에 도전하는 KIA 타이거즈 와 ...'}, 
(...중략...)
출할 수 있다. 반면, 5위 팀은 두 경기를 모두 이겨야만 준플레이오프에 올라갈 수 있다. 만약 경기가 무승부로 끝나면, 해당 경기는 시리즈별 최종전이 끝난 후 무승부가 발생한 구장에서 이동일 없이 연전으로 진행된다. WIKITREE WIKITREE NOW"}]

[최종 답변]
2024 KBO 리그 플레이오프 진출팀: KIA 타이거즈, 삼성 라이온즈, LG 트윈스, 두산 베어스, KT 위즈! 경기는 10월 2일부터 시작되며, 한국 시리즈는 10월 21일부터 10월 29일까지 진행됩니다. 치열한 경기가 기대됩니다! #KBO #플레이오프 #한국시리즈

Subscribe

Enjoy this blog? Get notified of new posts by email: