Agentic RAG 상세 구현

Agentic RAG 워크플로우 동영상 [바로가기arrow-up-right]

이전 'AgenticRAG 만들기' 튜토리얼에서는 Agentic RAG의 개념과 그 필요성에 대해 알아보았습니다. 이번 튜토리얼에서는 실제 Agentic RAG 워크플로우를 단계별로 구축하는 구체적인 방법을 안내합니다.

목표

genos 환경에서 다음과 같은 기능들을 포함하는 Agentic RAG 워크플로우를 구현합니다.

  1. RAG 여부 검사: 사용자의 질의를 분석하여 RAG를 수행할지 여부를 판단합니다.

  2. Relevance Checker: 검색된 문서, 생성된 답변을 분석하여 사용자의 질문과 최종적으로 관련이 있는지 평가합니다.

  3. Query Rewritte: 사용자의 질의를 분석하여 검색 문서를 더 잘 찾을 수 있도록 Query를 재작성합니다.

  4. Loop Counter: 기준에 맞지 않는 답변 생성 혹은 문서 검색이 반복될 경우, 무한루프를 빠져나올 수 있도록 합니다.


1. 워크플로우 생성 및 기본 구성

먼저 Flowise에서 새로운 워크플로우를 생성하고, Agentic RAG를 구현하기 위한 기본 틀을 설정합니다.

  • 새 워크플로우 생성: Genos의 에이전트 -> 워크플로우 -> 워크플로우 생성에서 새 워크플로우를 생성합니다.

  • Agentflow 생성: 본 튜토리얼에서는 Agnetflow 2.2.3 버전으로 Agentic RAG를 구현합니다.

2. 핵심 노드 구현하기

<목표>에서 작성된 Agentic RAG의 노드를 각각 설정합니다. Grader는 LLM Node를 활용하여 구성할 수 있으며, 평가 노드의 경우 System Prompt를 통해 평가 기준을 명확히 정의하는 것이 중요합니다.

2.0. 기본 세팅

Agentflow를 구성하기 전 기본적인 세팅에 대해 안내합니다.

  • 사진과 같이 노드를 구성합니다.이는 Sequential Agentflow의 기본 시작 노드 구성입니다.

  • State에서는 다음과 같이 변수를 추가합니다.

Key
Operation
Default Value

Retrieved Documents

Replace

Default Value

Loopcnt

Replace

0

RewrittenQuery

Replace

보강된 질의가 없습니다. 사용자의 질문으로 검색하세요.

Answer

Replace

Default Value

2.1. RAG Checker

사용자의 질의를 분석해 RAG 여부를 판단합니다.

  • 노드 추가: LLM Node를 추가하고 Document Grader로 이름을 변경합니다.

  • 프롬프트 설정: 아래 예시와 같이 프롬프트를 작성하여 사용자 질문을 분석하도록 지시합니다.

2.2. Condition Node 설정 1

RAG Checker의 Output을 Input으로 받아 RAG의 여부를 결정합니다.

  • 사진과 같은 설정을 통해 분기를 설정할 수 있습니다.

  • Chat으로 인계될 경우, LLM Node에 간단한 프롬프트로 질문에 대응할 수 있도록 설정합니다.

  • 본 튜토리얼에서는

    으로 구성하였습니다.

2.3. Retriever Use Node 및 Loopcnt 세팅

사용자의 질의가 RAG로 분기되었을 때의 노드 구성을 설정합니다.

  • 노드 추가: 사진과 같은 구성으로 노드를 설정합니다.

  • 프롬프트 설정: RAG Manager의 Prompt를 다음과 같이 설정합니다.

    • RewrittenQuery는 첫 시행시 '보강된 질의가 없습니다. 사용자의 질문으로 검색하세요.' 가 입력되고, 두번째 시행부터 보강된 질의가 입력됩니다.

  • Loopcnt 갱신 및 검색 결과 저장: 일반적으로는 Tool Node의 State 업데이트는 사진과 같이 진행됩니다.

    하지만 이번 Case의 경우, Tool Node를 사용할 때마다 Loopcnt를 갱신해야 하기에 Code를 활용하여 State를 업데이트합니다.

    • 위 코드를 통해 Tool Node가 한번 호출될 때마다 RetrievedDocument에 검색된 문서가 Replace 형태로 저장되며, cnt는 +1된 값이 저장됩니다.

2.4. LoopCondition

Loopcnt를 검사하여 횟수가 초과되었을 경우, Loop를 탈출하도록 분기합니다.

  • 왼쪽 LoopCondition에 해당하는 Condition Node의 구성입니다. 코드에서 분기합니다.

  • CantAnswer로 분기되었을 경우, LLM Node를 통해 사용자에게 내부 VDB에 존재하지 않는 정보이기에 답변할 수 없음을 알리도록 지시합니다.

2.5. Generator

검색된 문서를 바탕으로 사용자의 질문에 답변하는 노드를 구성합니다.

  • Generator는 일반적인 RAG 답변 생성에 사용되는 방식으로 구현됩니다. 'Generator'라는 이름을 갖는 LLM Node를 LoopCondition 분기로부터 연결한 뒤, 다음과 같은 프롬프트를 작성합니다.

  • LLM Node의 하단 Update State에서 'Answer' 변수에 $flow.output.content를 지정하여 'Answer' 키에 답변이 저장되도록 합니다.

2.6. Relevance Checker

검색된 문서와 생성된 답변이 사용자의 질문과 긴밀히 연관되어 있는지 확인합니다. 해당 노드를 통해 RAG의 품질을 자체적으로 평가하고 판단할 수 있습니다.

  • 'Relevance Checker'라는 노드를 추가한 뒤, 다음과 같이 프롬프트를 작성합니다. 평가 기준은 작성자의 요구사항에 따라 다르게 작성할 수 있습니다.

2.7. Condition Node 설정 2

Relevance Checker의 Output을 바탕으로 질의를 재작성할지 최종 답변을 생성할지 분기합니다.

  • Relevance Checker의 Output이 'PASS'라면 FinalAnswerGenerator로, 'NO'라면 QueryRewritter로 분기되도록 설정합니다.

2.8. QueryRewritter

검색된 문서와 답변이 질문에 대답하기에 충분하지 않다면, Query를 새롭게 작성하여 문서를 다시 검색합니다.

  • 'QueryRewritter'라는 이름을 갖는 LLM Node를 생성한 뒤, Relevance Check의 'Rewrite'와 연결합니다.

  • LLM의 Output을 안정성 높게 제어하기 위해 Json Structured Output을 사용합니다.

    이를 사용하지 않을 경우,

Output은 State의 RewrittenQuery에 저장되도록 설정합니다. 이후, Loop Node를 생성하여 RAGManager로 돌아가도록 설정합니다.

2.9. FinalAnswerGenerator

평가 결과가 PASS일 경우, 최종적으로 답변을 생성하는 노드입니다.

  • LLM Node를 생성하여 다음과 같이 프롬프트를 작성합니다.

2.10. Node별 History 제어하기

Node마다의 History 접근 권한을 제어하여 LLM의 성능을 최고로 이끌어낼 수 있도록 합니다.

  • 본 튜토리얼에서는 아래와 같이 Memory 접근 권한을 설정하였습니다.

    Node Name
    Memory

    RAGChecker

    All conversation Messages

    Assistant

    Empty

    RAG Manager

    Empty

    Generator

    Empty

    RelevanceChecker

    Empty

    RAGAssistant

    Empty

    QueryRewritter

    All conversation Messages

    FinalAnswerGenerator

    Empty

  • Memory 접근 권한 선정은 각 Node의 역할이 이전 기록을 반드시 참고해야 하는지를 기준으로 두어 설정하였습니다.

3. 워크플로우 테스트하기

여태까지의 구성을 바탕으로 워크플로우를 테스트합니다. 워크플로우 우측 상단의 채팅 아이콘을 클릭해 질의를 던져볼 수 있습니다.

  • VDB에 존재하는 내용에 대해 질의하면, 내부 평가를 거친 뒤 답변이 생성됩니다.

  • VDB에 존재하지 않는 내용에 대해 질의할 경우, 설정한 횟수만큼(해당 튜토리얼에서는 3번) Query를 재작성하며 평가를 반복한 뒤, 횟수를 초과할 경우 "VDB에 존재하지 않는 문서이기에 답변드릴 수 없습니다." 라는 답변을 내보내며 답변을 종료합니다.

4. 결론 및 추가 개선사항

본 튜토리얼을 통해 Genos에서 자체 평가를 거치고, 미리 정한 반복 횟수를 초과하면 Loop를 탈출하는 Agentic RAG 워크플로우를 구현했습니다. 해당 워크플로우는 일반적인 RAG에 비해 더 높은 신뢰도와 정확성을 제공합니다.

여기서 더 나아가 다음 사항들을 개선해볼 수 있습니다.

  • 프롬프트 고도화: 각 평가 노드의 프롬프트를 더욱 정교하게 다듬어 평가 기준을 강화할 수 있습니다.

  • 평가 노드 추가: 해당 튜토리얼에서는 RelevanceChecker 노드만을 활용하여 RAG의 품질을 평가하였지만, 자체적인 평가 노드들을 추가해 더 엄격한 기준을 적용할 수 있습니다.

Last updated

Was this helpful?