Agentic Workflow
1편에서 전통적 RAG 의 제한적 요소들에 대해 언급하였는데 이 중 의사결정, 동적 프롬프트 조정 그리고 외부 tool 접근 등은 AI Agent 기술의 등장과 더불어 보다 진보된 RAG 로서 그 면모를 새롭게 갖추게 되었다. 우선 그럼 Agent 라는 것이 무엇인가를 살펴볼 필요가 있다. 아래 그림 5 는 Agentic workflow 가 이전 zero shot 방식의 workflow 와 어떻게 다른지를 직관적으로 설명한다.
아래 그림 왼쪽의 워크플로우는 어떤 주제에 대한 에세이를 작성하는데 있어서 시작부터 끝까지 한번에 쉼없이 작성하는 워크플로우를 나타낸다. 전통적 RAG 의 워크플로우라고 할 수 있겠다. 반면에 오른쪽 Agentic workflow 는 우리 사람들이 통상 하듯이 주제에 대해 에세이 개요를 먼저 생각해보고 초안을 작성하고 생각한 다음, 변경이나 조사가 필요한 부분을 조사한 후 변경하는 형태의 생각과 수정을 반복하는 과정을 거친다. Think Fast and Slow 의 저자 다니얼 커너먼은 이를 system 1 과 system 2 로 설명한다. 즉 우리가 10X 12 와 같은 곱셈은 직관적으로 120 이라고 답하는 system1 과 같은 사고라면, 240X126 과 같은 곱셈은 가만 있어 보자 하고 생각하면서 좀 더 시간과 두뇌를 더 쓰면서 답변하는 system 2 라는 사고 과정이라는 것이다. 이렇게 LLM 이 좀 더 숙고하고 변경을 거치는 워크플로우는 따라서 AGI 에 가까워지는 보다 고도화된 지능을 갖는 과정이라고도 할 수 있다.
<그림 5. Agentic Workflow>
Agentic RAG
그러면 Agentic RAG 는 무엇일까? 기존 RAG 기능에 더해서 아래 그림 6과 같은 4가지 예로 보여지는 기능을 수행할 수 있는 RAG 를 뜻한다. 첫째, 기존 RAG 가 질문에 의미론적으로 유사한 문맥에 근거한 답변만을 제공하는 기능에서 제공하지 못했던 요약이나 비교, 계획등의 기능을 실현하는 것
둘째, 보다 중의적이고 복잡한 질문을 agent 의 회고(reflection)를 통하여 문장을 분석하고 보다 지능적인 답변을 제고하는 부분
셋째, 지식기반중에 정형 SQL 데이터를 보유한 경우에 자연어 질문으로부터 정형데이터의 접근 필요성을 감지하고 자연어 질문을 SQL 형태의 코드로 변환하여 SQL 데이터베이스를 검색하여 답변을 제공
넷째, function calling 기능이 부여된 LLM 을 통하여 web search 같은 외부 tool 을 통한 외부정보 검색 등을 제공하는 것을 의미한다.
<그림 6. Agentic RAG 예>
Spotify 에서 상위 5위까지의 유행곡
아래 그림 7은 이러한 tool을 통한 외부 정보 검색의 예를 보여준다. 1)에서 들어온 질문이 외부 tool 을 사용하여 답변해야 하는지가 결정되면 Agent 가 지원되는 LLM 을 통하여 2)와 같이 LLM 이 어떤 외부 tool을 자동선택(이 경우 web search tool) 하여 웹접근용 코드를 작성(실행)하고 3)번과 같이 웹검색에 전달될 tool 의 매개변수를 예측하여, 4)에서 5개 음악 곡의 곡명과 가수명 랭킹을 추출하여 5)번에 agent LLM 을 거쳐 6)번 LLM 을 통한 응답하는 흐름이다.
<그림 7. tool 을 통한 외부 검색 예>
예: tool 을 통한 외부 정보 검색
아래 그림 8은 Llama 3.1 70B 함수 호출 기능을 사용하여 "스포티파이에서 상위5위까지의 유행 곡을 알려줘?" 라는 질문에 대해 내부적으로 함수 호출의 형식과 매개변수표시등의 프롬프트 방식의 예를 보여준다.
Llama 3.1 은 웹서치 기능을 제공하는 brave_search 함수, 계산 기능을 제공하는 wolfram_alpha 와 파이선 코딩을 지원하는 ipython 함수를 내장하고 있다. 이번 예 에서는 brave_search 와 ipython 함수가 선택되어 사용되었고 내부 매개변수는 5개 곡 곡명, 가수명 랭킹 등이 내부적으로 LLM 함수 호출에서 자동 예측되었다.
<그림 8. Llama 3.1 70B 함수 호출 예>
Behind the Scene
아래 그림 9는 그림 8 의 함수호출에서 내부적으로 수행되는 코드를 보여준다. 윗쪽 화살표에 보여지는 시스템 프롬프트에 담긴 내용은 ipython 환경이고 brave_search 라는 웹검색 도구와, wolfram_alpha 라는 계산기 도구들이 있으며 tool instruction 은 언제나 파이선 코드를 실행하고 실시간 정보를 탐색 시 만약 관련 함수가 있으면 사용하고 없으면 brave_search 을 사용하도록 되어있다. 아래 화살표는 agent 가 생성한 내부적으로 수행된 코드를 보여준다. spotify 를 import 하고 client id 를 가지고 spotify 계정의 토큰을 획득하며 items['name'] 과 items['artists'] 을 limit=5 로 국한하여 검색함을 알 수 있다.
<그림 9. Behind the scene>
Vector Index vs Summary Index
아래 그림 10은 전통적 RAG 의 vector index 와 더불어 요약을 담은 summary index 를 통하여 전통적 RAG에서 구현할 수 없었던 문서 요약을 수행하는 예를 보여준다. 질문이 주어졌을 때 Router 를 통하여 전통적 질의 응답에 관련된 경우인지 요약을 필요로 하는 경우인지가 판별되고 요약이라고 판별될 경우에 오른쪽 경로를 타고 Summary 담당 query engine 이 summary index 를 통하여 요약을 검색한다. 이러한 과정에서 LLM Agent 가 필요한 함수와 연관되는 매개변수 역시 자동으로 유추한다.
<그림 10. Vector vs Summary Index>
Retrieving using Vector & Summary Tool
아래 그림 11은 이러한 vector index 와 summary index 라는 2개의 인덱스가 있는 상태에서 질문이 들어왔을 때 summary tool 과 vector tool 중에 어떠한 것을 사용할지를 LLM 의 agent 기능이 어떤 도구와 매개변수를 명시하여 사용할지를 지능적으로 유추하는 예를 보여준다. summary_tool 은 query_engine 으로 summary_query_engine 을 사용할 것을 함수에 명시적으로 선언하고 description 에 "llmissue_spri.pdf 와 관련된 요약에 대한 질문에 사용됨." 이라는 placeholder 를 선언해준다. agent tool 에서 함수는 전통적 파이선 함수와 다른 점은 LLM 이 이 description placeholder 내용을 함수 수행에 활용한다는 점이 차이점이다.
아래 두번째 주피터 노트북 셀에서 ReActAgent.from_tools 라는 REACT agent 구성을 선언하였다. tool 의 매개변수로 [vector_tool, summary_tool], lllm 을 명시하였고 결국 REACT agent 가 이 둘 중에 질문의 내용을 보고 어떤 함수와 매개변수를 명시할지를 결정한다.
아래에 response=agent.chat("ChatGPT 기술의 차이점은 요약은?") 이라는 질문에대해 하단에 Thought, Action, Action Input, Observation, Thought 로 진행되는 절차로 reasoning 과 action 이 반복 됨을 확인할 수 있고 마지막으로 Answer 를 출력하는 것을 보여준다.
<그림 11. Vector & Summary Tool 을 이용한 검색>
ReACT: Reasoning + Acting with LLM
앞에서 설명한 ReAct Agent 호출은 아래 그림 12 에 표시된 ReAcT 논문 에 기반한 이론을 기초로한다. 2023년 3월에 구글 브레인과 프린스턴대학교에서 발표된 논문을 요약하면, 이전까지는 Chain of thought 로 대별되는 Reason only 와, WebGPT 와 같은 행동을 취한 다음에 결과를 관측하는 Act only 가 별도로 분리되어 있었는데, 논문에 의하면 이러한 Act-Observation 같은 Reason only 프롬프트 방식이나, Act-Observation 같은 Act only 프롬프트 방식으로 풀지 못하는 문제를 앞의 그림 11에서 나타난 Thought-Act-Observation 이 순환되는 형태의 프롬프트가 응답을 도출해내며 보다 높은 지능을 보여 준다는 것이다. 이를 위하여 이러한 Thought-Act-Observation 의 절차에 충실한 few-shot 형태의 프롬프트 template를 통하거나 langchain 같은 프레임워크에서는 이러한 few-shot 형태에서 보다 표준화된 template 를 사용하여 ReAcT Agent 를 구현한다.
<그림 12. ReAcT>
Text to SQL with ReAcT Agent
Agent 를 사용하여 기존 RAG 에서 수행할 수 없었던 SQL 데이터베이스 정보 검색 수행을 할 수 있다. 아래 그림 13은 11개의 테이블 스키마를 보유한 SQLITE Tutorial 의 음원 판매 정보 관련 데이터베이스들을 예를 들어 설명한다.
<그림 13. 샘플 SQL DB>
Agentic RAG Flow: 앨범판매에 어느 국가가 가장 많은 돈을 지출?
아래 그림 14는 "국가별 총 판매액을 나열하세요. 어느 국가의 고객이 가장 많은 돈을 지불했나요?" 라는 자연어 형식의 질문에 대하여 ReAcT 를 agent 를 활용하여 SQL Agent 가 선택되고 flow 가 진행되는 것을 보여준다.
1)에서 주어진 질문이 SQL Agent 를 사용해하는가 를 판별하고
2)에서 Agent 를 통해 테이블 schema 를 보고 관련 query 처리 여부르 판단하는 SQL Query 를 작성하도록 생성하며, 만약 SQL 처리가 맞다면
3)에서 schema 들로부터 agent 가 판별한 'customer' 와 'invoice' 라는 매개변수를 예측한다.
4)에서 질문에 답을 하기위해 'customer' 와 'invoice'를 join 한 SQL 문을 작성한다. 결코 쉽지 않는 SQL 구문이다.
5)에서 query 를 실행하여 국가별 전체 매출을 순서대로 출력하여 6) 과 7)을 거쳐 응답을 리턴한다.
<그림 14. text-to-SQL 예>
ReAcT Agent & ChatOllama
아래 그림 15는 llama3.1 70B 모델을 Ollama 를 사용하여 chat 형태로 구현한 예로 첫번째 cell 에서는 Langchain 프레임워크를 사용한 AgentType.ZERO_SHOT_REACT_DESCRIPTION 을 사용하였다. 그 아래로 Entering new SQL Agent Executor chain... 이라는 SQL Agent 를 자동 선택한 내용이 보이고 이어서 Thought-Action-Action Input-Observation 등이 계속 반복되며 진행되어 sql_db_list_tables 를 검색하기 위한 SQL 코드가 작성되고, 그 다음 sql_db_schema를 검색하는 진행절차가 보인다.
verbose=True 로 설정하여 주피터노트북에 표시되는 내부 실행 내용은 무척 길어 Action 부분만 캡쳐하여 표시하였다.
맨 마지막에 Final Answer 로 미국의 고객이 가장 많은 돈을 지불했으며, 총 판매액은 523.86 입니다 라는 응답을 보여준다. 내부적으로 생성되는 SQL 코드는 쉽지 않은 자연어 질문에 대해 reason-act-observation 이라는 과정을 통해 정답을 찾기위한 agent 의 자체 학습, 목표 설정 그리고 동적 프롬프트 조정 능력을 보여준다.
정형데이터 검색에 초기의 접근법을 보여준 것으로 보이고 지능적인 답변을 위해 소요되는 컴퓨팅 파워와 시간등을 감안하면 실제 정형데이터 검색에 얼마나 프로덕션 수준에 접근할 수 있을지 그 귀추가 주목된다. 아울러 생성된 SQL 코드의 실시간 검증이라는 부분이 어떻게 해결될지도 생각해볼 부분이다.
<그림 15. ChatOllama 로 구현한 Text-to-SQL>
결언
눈부시게 발전하는 OpenAI 와 같은 폐쇄형의 선두 기술들을 오픈소스 프레임워크등을 통해 폐쇄형의 온프레미스 환경에서 구현하는 것은 여러면에서 도전적이다. 오픈소스 진영이 폐쇄형 선두주자들과 어깨를 나란히 하는 시점이 올것이라는 믿음으로 이제 Agent 라는 새로운 지평의 초입에 서있다.
전통적 RAG 이 시간과 정확성에 중점을 두고 진화해 왔다면, 이제 Agentic RAG 이라는 명제는 각 산업의 보다 다양한 내부 업무흐름에 보다 고도화된 지능에 기반한 검색 요구를 대응하기위한 하나의 방안일 것이라는 것에는 이견이 없을 것 같다.
ChatGPT 가 2023년 6월 function calling 이라는 기능을 발표하면서 촉발된 이 agent 기능이 RAG 에 접목되는 매우 초보적 수준의 개념 증명 같은 내용을 공유한 것 같다. 그러나 확실한 것은, agent 는 결국 모든 산업 프로세스에 중간 broker 들을 없애고 agent 가 직접 추론 유추해서 적절한 기능을 자동 수행한다는 점에서 그 성장성은 매우 크고 Agentic RAG 또한 많은 관심을 받을것으로 예상한다.