Agentic RAG

김지우·2025년 1월 16일
0

목차
1. 정리 배경
2. 웹 검색 도구의 탑재
3. retriever의 도구화
4. agent 만들기
5. agent 실행하기
6. 결과 및 결론


1. 정리 배경

에이전트의 기본 구성 및 그 것들의 문법을 익혔다면, 서비스의 확장성을 위해 RAG와 함께 사용할 필요가 있다. 따라서 Agentic RAG에 대해 학습하고, 내가 이해하기 좋도록 정리하는 것이 목적이다.

당연히 내가 이해하기 좋은 것이 주요 골자이기 때문에, 자세한 설명이나 코드를 원한다면 테디노트님의 유료 강의를 구매하여 들으시면 됩니다.

그럼 Agentic RAG는 왜 필요할까? 쉽게 설명하자면 LLM을 더 효과적으로 사용하기 위함이다.
LLM이 LLM 자체로만 사용되면, 수많은 사람들이 알고 있듯이 할루시네이션이 발생하여 적절한 답을 반환하지 못하는 결과를 얻을 수 있다. 이 상황에서 적절한 답을 반환하게 하도록 하기 위해서는 파인튜닝이나 컨티뉴어스 러닝처럼 추가적인 학습을 진행하거나, RAG를 사용하여, 결과를 반환하기 전에 필요한 정보를 참조시켜 결과를 반환해야 한다.

사실 RAG처럼 retreiver를 만들어서 사용하는 경우는 기업의 경우 개발하는 쪽에서 필요한 데이터를 모두 가지고 있기 때문에 가능한 것이다. 다만 현실 세계의 데이터를 특정 기업이 오차없이 모두 가지고 있지 못할 수 도 있고, 적절히 답하지 못했을 때나, 웹 검색을 통해 외부의 데이터를 참조할 수 있을 때, Agent를 사용한다면 더 유연하고 효율적인 토큰 사용을 통해, 반환된 정보의 신뢰성을 높일 수 있다.

2. 웹 검색 도구의 탑재

from langchain_community.tools.tavily_search import TavilySearchResults

# 검색 결과는 6개까지
search = TavilySearchResults(k=6)
result = search.invoke("그룹 IVE의 멤버로는 누가 있나요?")

print(result)

=======아래는 결과 =========
[{'url': 'https://deokkku.tistory.com/1053', 'content': 'IVE는 대한민국의 걸 그룹으로, 소속사는 Starship 엔터테인먼트입니다 그들은 2021년에 데뷔하였으며, 현재까지 두 장의 앨범을 발매하였습니다 IVE의 멤버들은 총 5명으로 이루어져 있습니다 각 멤버들의 이름과 역할은 다음과 같습니다: 1 
Lee Jihan (리지한) - 리더, 메인 보컬 2 Minseo (민서) - 메인 래퍼'}, {'url': 'https://blog.naver.com/PostView.nhn?blogId=beautiful_life_&logNo=223327700626', 'content': "IVE의 멤버이자 리더인 안유진은 2018년 Mnet의 서바이벌 프로그램 '프로듀스 48'을 통해 대중에게 처음 알려졌고, 최종 
선발되어 IZ*ONE의 멤버로 활동했습니다. ... 그룹 내에서 귀여운 외모와 어린 나이 덕분에 팬들 사이에서 '막내'라는 애칭으로 불리는 이서는"}, {'url': 'https://namu.wiki/w/IVE', 'content': '2021년 12월 1일에 데뷔한 스타쉽엔터테인먼트 소속의 6인조 다국적 걸그룹 [2]이다. 그룹명인 ive는 \'i have\'의 축약형인 \'i\'ve\'에서 유래되었으며, "우리가 가진 것들을 모두 당당히 보여 드리겠다."는 포부를 담고 있다.'}, {'url': 'https://ko.wikipedia.org/wiki/IVE', 'content': 'ive(아이브)는 대한민국의 6인조 다국적 걸그룹이다. 스타쉽 엔터테인먼트 소속으로, 2021121일 데뷔했다.  
역대 스타쉽엔터테인먼트 걸그룹 중 대중성과 팬덤 동원력을 모두 잡은 케이스이자, 명실상부 4세대 대표 걸그룹중 한팀으로 꼽힌다.'}, {'url': 'https://k-culture.lifeinplanet.com/entry/아이브-IVE-멤버프로필-나이--본명-생일-혈액형-MBTI-인스타-스타쉽엔터', 'content': "아이브 IVE는 202112월에 스타쉽엔터테인먼트 소속으로 데뷔한 6인조 다국적 K-POP 걸그룹입니다. 그룹 아이브의 음악, 데뷔 앨범, 각 멤버의 자세한 프로필 등에 대해서 알아보도록 하겠습니다'아이브'라는 그룹 이름은 'I Have'의 약자인 I've에서 유래되어, '우리가 가진 것을 모두 당당히 보여드리겠다"}]

여기서는 Tavily라는 웹 검색도구를 사용했고, 다음 웹검색 결과는 검색한 결과의 갯수만큼 리스트 안에 딕셔너리를 담아서 가져온다.

3. retriever의 도구화

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

# PDF 파일 로드. 파일의 경로 입력
loader = PyPDFLoader("data.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",  # 도구에 대한 설명을 자세히 기입해야 합니다!!
)

해당 과정에서 핵심적인 단계는 크게 두부분으로 리트리버를 만드는 부분과 만든 리트리버를 도구화 시키는 부분이다.

우선 리트리버를 만들 때, 문서를 준비하고, 텍스트 분할기, 벡터스토어를 생성하고, 이를 기반으로 리트리버를 만든다. 물론 성능이나 목적에 따라 텍스트 분할기나 벡터스토어는 자유롭게 선택할 수 있다.

그리고 꼭 리트리버를 도구화 시켜야 한다. create_retriever_tool을 임포트 하여, 도구처럼 쓸 수 있도록 만들어야 한다.

여기서 세가지 중요한 부분을 넣어줘야 하는데, 리트리버와 name, description이다. name과 description은 Agent가 잘 알아먹을 수 있도록 해야하고 description은 가능한 한 영어로 작성하는 것이 좋다.

4. agent 만들기

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent
from langchain.agents import AgentExecutor


tools = [search, retriever_tool]


llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

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}"),
    ]
)

agent = create_tool_calling_agent(llm, tools, prompt)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)

에이전트 만드는 부분은 반복해서 학습할 수 있게 되었듯이

tool 정의 -> llm과 prompt 정의 -> agent 생성 -> AgentExecutor 생성의 순서로 진행하면 된다.

5. agent 실행하기

# AgentExecutor 실행
result = agent_executor.invoke({"input": "IVE 안유진의 나이를 알려줘"})

print("Agent 실행 결과:")
print(result["output"])

==== 결과 ======
Agent 실행 결과:
IVE의 안유진은 200391일에 태어났습니다. 따라서 2023년 기준으로 그녀의 나이는 21세입니다.

리트리버에는 AI 산업에 관련된 내용이 담겨 있다. 해당 내용에서 찾을 수 없을 것 같은 질문을 했을 때 다음과 같은 답을 확인 할 수 있다.

# AgentExecutor 실행
result = agent_executor.invoke({"input": "삼성전자가 자체 개발한 생성형 AI 관련된 정보를 문서에서 찾아주세요."})

print("Agent 실행 결과:")
print(result["output"])

======결과=========
Agent 실행 결과:
삼성전자가 자체 개발한 생성형 AI 모델 '삼성 가우스'에 대한 정보는 다음과 같습니다:

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

- **온디바이스 작동**: 삼성 가우스는 온디바이스에서 작동하도록 설계되어 있어, 사용자 정보가 외부로 유출될 위험이 없습니다. 이는 안전한 데이터 학습을 통해 이루어집니다.

- **출시 계획**: 삼성전자는 삼성 가우스를 다양한 제품에 단계적으로 탑재할 계획을 가지고 있으며, 2023118'삼성 AI 포럼 2023'에서 최초로 공개되었습니다.

- **경쟁 전망**: IT 전문지에 따르면, 2024년부터 삼성 가우스를 탑재한 스마트폰이 메타의 라마(Llama)2를 탑재한 퀄컴 기기 및 구글 어시스턴트를 적용한 구글 픽셀과 경쟁할 것으로 예상됩니다.

이 정보는 202312월호 SPRi AI Brief에서 발췌한 내용입니다.

한편 AI와 관련된 질문, 문서에 담겨 있는 내용들을 질문 하는 결과 다음과 같이 답을 잘 반환할 수 있다.

6. 결과 및 결론

정리하는 부분에서 쓰는 것이 웃기지만 Agentic RAG는 간단히 설명하자면 Agent를 사용한 RAG인 것이다. 이 Agentic RAG의 장점은 내가 생각했을 때는 크게 2가지라고 생각한다.

  1. 결과를 반환할 때 더 정확한 답을 반환할 수 있다.
  2. 어떤 도구를 사용해야 더 정확한 답안을 반환할 수 있을 지 자율적으로 판단해 불필요한 과정을 없앤다.

나는 특히 2번에 집중하고 싶은데, 사실 RAG를 할 떄 Agent를 사용하지 않고, langchain의 chain에만 집중해서 결과를 도출하면 모든 도구를 다 사용해야 하는 불필요한 과정을 거칠 수 있다. Agent의 자율성을 통해, 참조할 데이터의 양을 최적화하고, 결과도출을 위해 사용할 토큰 수를 최적화 한 것이라고 생각한다.

profile
프로그래밍 기록 + 공부 기록

0개의 댓글