Agentic RAG : prompt

Ruah·2024년 11월 4일

요즘 인공지능 분야에서 에이전틱 RAG(Agentic Retrieval-Augmented Generation)가 핫해. 기존의 RAG 방식에 에이전트 개념을 넣어서, 더 유연하고 정확한 정보 검색과 응답 생성이 가능하다. 이번 블로그에서는 에이전틱 RAG가 뭔지부터 어떻게 구현하는지 이론을 써보았다.

Agentic RAG란?

에이전틱 RAG는 대형 언어 모델(LLM)과 다양한 도구(Tools)를 결합해서 사용자의 질문에 최적의 답변을 생성하는 방법. 기존 RAG는 주로 문서 검색에 의존했지만, 에이전틱 RAG는 필요에 따라 인터넷 검색, 코드 실행, 커스텀 도구 등을 활용해서 더 풍부한 응답을 제공한다.

단계설명
질문사용자가 “삼성전자가 새로 개발한 AI의 이름이 뭐야?“와 같은 질문
RunnablePassthrough()입력된 질문을 Retrieve와 Question 두 경로로 전달
Retrieve- DB에 접근하여 질문과 관련된 정보를 검색  - 검색된 결과를 “Chunk”
검색 결과- 검색된 정보(Chunk)를 사용하여 응답을 구성
응답 생성- 주어진 정보를 바탕으로 두 가지 응답 방식 제공 
- 문서(Context): 문서에 기반한 응답 
- 질문(Question): 질문을 직접적으로 포함한 응답 포함한 응답 포함한 응답

Agentic Prompt System

에이전틱 RAG에서는 프롬프트(prompt)가 정말 중요.
프롬프트를 통해 에이전트가 어떤 도구를 언제 사용해야 하는지, 각 단계에서 어떤 작업을 해야 하는지를 명시해준다.

1. LLM과 도구들의 결합: LLM은 웹 검색, 문서 검색, 코드 실행 등 다양한 도구와 함께 작동.
2. 생각 - 행동 - 관찰 루프:

  • 생각(Thought): “어떤 도구를 써야 할까?” 고민하는 단계.
  • 행동(Action): 선택한 도구를 실행.
  • 관찰(Observation): 도구 실행 결과를 살핌.
  • 반복(Loop): 원하는 결과가 나올 때까지 이 과정을 반복.

3. 로그 기록: 각 단계별 결과를 기록해서 나중에 참고 가능.
4. 최종 응답 생성: 반복 과정을 통해 최종 답변을 만든다.

함수 호출(Function Calling)과 도구 활용

에이전틱 RAG에서는 함수 호출을 통해 도구들을 효율적으로 활용한다. 함수의 스키마(schema)를 LLM에 전달해서, 코드 자체를 노출하지 않고도 입출력을 관리가 가능하다.

from langchain.tools.retriever import create_retriever_tool

retriever_tool = create_retriever_tool(
    retriever,
    name="문서 검색 도구",
    description="PDF 문서에서 정보를 검색합니다." # 상세한 function의 설명
)

함수 호출 스키마(Schema)와 도구(Tools) 메시지 구조

에이전틱 RAG에서는 함수 호출 스키마를 활용해서 도구들과의 상호작용을 정의한다. 진행 방식은 다음과 같다.

  1. 도구 호출 메시지 생성: 어떤 도구를 쓸지 메시지를 생성.
  2. 도구 호출: 도구를 실행.
  3. 도구 메시지 전달: 도구 실행 결과를 메시지로 전달.
단계설명
Content메시지의 실제 내용이 저장되는 부분
additional_kwargs추가 매개변수들이 포함된 섹션
- tool_calls와 같은 구체적인 호출 정보들이 포함
tool-calls특정 도구(tool)를 호출한 기록이 들어가는 부분
response_metadata응답에 대한 메타데이터 정보
  • tool-calls
    - tool_calls 내에서는 여러 호출을 배열 형식으로 기록하며, 각각의 호출은 다음과 같은 정보를 포함한다.
    - index [0]: 첫 번째 도구 호출의 예시
    - “id”: 호출된 도구 또는 함수의 고유 식별자. 예를 들어, call_kO4yy81rfM3OX와 같이 식별 가능하다.
    - “function”: 호출된 함수 또는 도구의 상세 정보가 저장
    - “arguments”: 함수에 전달된 인자들이 기록. 예시에서는 query가 “티디노트 랭체인 노트”로 지정되어 있으며, 이는 검색 쿼리를 나타낸다..
    - “name”: 호출된 도구의 이름이 저장. 예를 들어, tavily_web_search라는 도구 이름이 기록.
    - “type”: 호출 유형을 나타내며, 이 예시에서는 “function”으로 지정되어 도구 실행임을 나타낸다.

효과적인 에이전틱 RAG 프롬프트 작성 방법

에이전틱 RAG에서 프롬프트는 에이전트의 행동을 결정짓는 중요한 요소이다.

프롬프트 작성 시 주의사항:

1.	단계별 프로세스 명시: 에이전트가 따라야 할 과정을 순서대로 상세히 쓴다.
2.	도구의 이름과 설명 상세화: 사용할 도구의 이름과 설명을 구체적으로 적는다..
3.	반복 처리 지침 제공: 원하는 결과가 나올 때까지 몇 번 반복할지 등의 조건을 명시한다.

예시 :

너는 질문에 답변하는 어시스턴트야. 제공된 컨텍스트를 기반으로 사용자의 질문에 답변해줘.

아래 지침을 단계별로 따라야 해:
1. '<문서 검색 도구>'를 사용해서 PDF 문서에서 정보를 검색해.
2. '<관련성 검사 도구>'를 사용해서 사용자의 질문과 검색된 컨텍스트 사이의 관련성을 확인해.
3. '<관련성 검사 도구>'의 결과가 **'no'**라면, 새로운 쿼리를 만들어서 '<문서 검색 도구>'를 다시 사용해.
4. 응답에 반드시 '<관련성 검사 도구>'의 호출을 포함해야 해.

유의사항:
- '<관련성 검사 도구>'의 결과가 **'no'**라면, 최대 20번까지 이 과정을 반복할 수 있어.

에이전틱 RAG는 LLM과 다양한 도구들을 유기적으로 결합해서 사용자에게 최적의 답변을 제공한다. 이렇게 하면 기존 RAG 방식에서 발생하는 한계를 극복하고, 더 정확하고 풍부한 정보를 받는 것이 가능하다. 프롬프트의 중요성을 알고, 에이전트의 행동을 세밀하게 설계해서 더 효과적인 응답 시스템을 만들 수 있다.

Agentic 응용 로직

Agentic RAG는 다양한 도구들을 조합하여 더 효율적인 정보 검색과 응답 생성을 가능하게 한다.

1.	검색 단계: 사용자의 질문에 따라 문서를 검색.
2.	관련성 검사: 검색된 내용이 사용자 질문과 관련이 있는지 확인.
3.	관련성이 낮을 경우:
	- 새로운 쿼리를 만들어서 검색 방향을 바꿈.
	- 컨텍스트 압축 도구를 사용해서 검색 결과를 최적화.
4.	최종 응답 생성: 반복 과정을 통해 최적의 응답을 생성.

에이전틱 RAG는 LLM과 다양한 도구들을 유기적으로 결합하여 사용자에게 최적의 답변을 제공한다.
이렇게 하면 기존 RAG 방식에서 발생하는 한계를 극복하고, 더 정확하고 풍부한 정보를 줄수 있다.
프롬프트의 중요성을 알고, 에이전트의 행동을 세밀하게 설계해서 더 효과적인 응답 시스템을 만들 수 있다.

profile
집요한 주니어 개발자의 호되게 당했던 기록

0개의 댓글