RAG 이용한 Agent [4] ReAct

Leejaegun·2025년 4월 5일

rag

목록 보기
4/4

1. ✅ ReAct 에이전트 개념 정리

ReAct (Reasoning + Acting) 에이전트
"추론(Reasoning)"과 "행동(Acting)"을 반복하는 방식으로 작동하는 LLM 기반 에이전트입니다.

🔁 작동 방식 요약

  1. 추론 (Reasoning)

    • 주어진 상황을 분석하고 적절한 행동(또는 도구 사용)을 결정합니다.
  2. 행동 (Acting)

    • 선택한 도구를 실행하거나, 직접 응답을 생성합니다.
  3. 관찰 (Observation)

    • 행동 결과를 관찰하고 그 결과를 바탕으로 다시 추론합니다.
  4. 반복 (Feedback Loop)

    • 이 과정을 반복하며 문제를 점점 더 깊이 해결해 나갑니다.

💡 핵심 특징

  • 단순 텍스트 생성이 아닌, 환경과 상호작용하며 도구(tool)를 사용합니다.
  • 결과에 대한 피드백을 바탕으로 새로운 추론을 하여 점점 더 정확한 행동을 하게 됩니다.
  • 복잡한 문제 해결에 적합한 구조입니다.

2. ✅ 프로젝트 개요

  • 목적: 리액트 기반의 랭그래프(LangGraph) 메모리 프로젝트에서, 도구(tool)를 정의하고 LLM과 바인딩하여 다양한 유저 요청을 처리하는 파이프라인 구성.

1️⃣ 초기 셋업

  • 가상환경 커널 선택.
  • .env 등 환경 변수 로딩.
  • 기본적인 라이브러리 및 유틸 불러오기.

2️⃣ 도구 정의 (Tools)

🔧 1. search_menu

  • 목적: 레스토랑 메뉴 벡터 DB에서 유사도 검색
  • 동작 방식:
    • 벡터 DB에서 관련 메뉴 최대 2개 유사도 기반 검색.
    • 검색된 결과를 태그 구조로 포맷팅.
    • @tool 데코레이터로 정의.

🔧 2. search_web

  • 목적: 웹 검색을 통해 최신/일반 정보 검색
  • 동작 방식:
    • Tavily Search API 사용.
    • 최대 3개의 문서 검색 후, 본문 및 URL을 포함하여 포맷팅.
    • @tool 데코레이터로 정의.

3️⃣ LLM 설정 및 도구 바인딩

  • 모델: GPT-4 Omni Mini
  • LLM에 위 두 도구(search_menu, search_web)를 bind_tools를 통해 연결.
  • LLM이 자연어 입력을 분석해 적절한 도구를 선택하도록 설정.

4️⃣ 도구 호출 예시 및 동작

✅ 예시 1: “스테이크 메뉴 가격?”

  • 도구: search_menu 호출됨.
  • 이유: 메뉴에 대한 정보는 내부 DB에서 검색하는 게 적절하다고 LLM이 판단.

✅ 예시 2: “랭그래프는 무엇인가요?”

  • 도구: search_web 호출됨.
  • 이유: 일반 정보이므로 웹 검색이 적절하다고 판단.

✅ 예시 3: “3 + 3은?”

  • 도구 호출 없음.
  • 이유: 단순 연산 질문이므로 LLM 자체 처리.

5️⃣ LangGraph에서 도구 노드 사용

  • LangGraph의 ToolNode 컴포넌트를 사용해 도구 노드를 그래프에 삽입.
  • 동작:
    • 최근 AI 메시지에서 tool_calls 항목 추출.
    • 병렬(parallel)로 각 도구 호출 실행.
    • 결과를 ToolMessage로 구성하여 반환.

6️⃣ LangGraph 동작 확인

  • 메시지를 LLM에 전달 → AI 메시지로부터 도구 호출 정보 추출.
  • ToolNode에 메시지를 전달 → 도구 병렬 실행.
  • 결과:
    • 예: 스테이크 → 시그니처/안심 스테이크 검색 결과 출력.
    • 예: 랭그래프 → 관련 웹 문서 3개 포맷팅 결과 출력.

📌 요약

구성요소기능 설명
search_menu벡터 DB 기반 메뉴 검색 도구
search_web웹 검색 도구 (Tavily 기반)
LLMGPT-4 Omni Mini 사용, 도구 자동 선택
ToolNodeLangGraph에서 병렬 도구 실행 처리

3. ✅ 프로젝트 04번: LangGraph + React Memory 에이전트 구성 흐름

(1). 환경 설정

  • 가상환경 커널 선택
  • 환경 변수 임포트
  • 필수 라이브러리 불러오기

(2). 도구 정의 (Tools Definition)

🔧 1) Search Menu 도구 (레스토랑 메뉴 검색)

  • 벡터 저장소(Vector DB)에서 유사도 기준으로 관련 문서 2개 검색
  • 검색 결과를 <tag> 기반 포맷으로 정리
  • @tool 데코레이터로 도구로 등록

🔧 2) Search Web 도구 (웹 일반 검색)

  • 인터넷에서 일반 정보 또는 최신 정보 검색
  • Tavily Search를 활용, 최대 3개 문서 검색
  • URL 포함한 <tag> 포맷으로 정리하여 반환

(3). LLM 설정 및 도구 바인딩

  • GPT-4 Omni Mini 모델 사용
  • 위에서 정의한 두 개의 도구를 bind_tools로 모델에 연결
  • 에이전트가 도구를 사용할 준비 완료

(4). 도구 호출 테스트 (Tool Call Test)

사용자 질문사용된 도구작동 결과 요약
"스테이크 메뉴 가격은?"Search Menu벡터 DB 검색 수행 후 결과 출력
"랭그래프는 무엇인가요?"Search Web웹 검색 결과 3개 문서 출력
"3 더하기 3은?"도구 미사용도구 없이 직접 답변 출력 (6)

(5). LangGraph 내 ToolNode 사용

  • ToolNode는 에이전트 그래프 내에서 도구 호출을 병렬 처리하는 노드
  • 가장 최근 AI 메시지에서 tool_calls 추출하여 실행
  • 각 도구 호출 결과를 ToolMessage로 변환하여 반환
  • 병렬 실행으로 효율적이며 빠른 응답 가능

(6). ToolNode 테스트

질문 내용작동 결과 요약
"스테이크 메뉴 가격은?"Search Menu 도구 실행 → 시그니처 스테이크/안심스테이크 가격 정보 출력
"랭그래프는 무엇인가요?"Search Web 도구 실행 → 웹 검색 결과 3개 문서 출력

4. ✅ LangGraph + ReAct Memory 프로젝트 정리

이 프로젝트는 LangGraph 기반의 ReAct 에이전트를 구성하여, 사용자 질의에 따라 적절한 도구(tool)를 호출하고, 그 결과를 바탕으로 응답을 생성하는 구조입니다.

(1). ✅ 기본 구성

  • 가상환경 커널 선택
  • 환경 변수 로드
  • 필요한 라이브러리 임포트

(2). 🛠️ 도구 정의 (Tools)

📌 [1] 메뉴 검색 도구: search_menu

  • 벡터DB에서 유사한 레스토랑 메뉴 문서 2개 검색
  • 결과를 <document> 태그 형식으로 포맷팅
  • @tool 데코레이터로 툴 정의

📌 [2] 웹 검색 도구: search_web

  • 일반적인 질문/최신 정보에 사용
  • Tavily 검색 API를 사용해 최대 3개의 문서 검색
  • URL과 내용을 포함한 결과를 <document> 태그 형식으로 포맷팅

(3). 🤖 LLM 설정

  • GPT-4 Omni-mini 모델 사용
  • bind_tools로 위에서 정의한 두 도구(search_menu, search_web)를 모델에 바인딩

(4). 🧪 도구 호출 테스트

📍 예시 1: "스테이크 메뉴 가격이 어떻게 되나요?"

  • search_menu 도구가 호출됨 (메뉴 관련 질문이므로 웹검색이 아닌 메뉴 검색 판단)

📍 예시 2: "LangGraph가 무엇인가요?"

  • search_web 도구 호출 (일반 정보 검색용)

📍 예시 3: "3 + 3은?"

  • 도구 호출 없이 직접 응답 생성 (툴 사용 불필요 판단)

(5). 🧩 ToolNode 활용 (LangGraph 전용 노드)

  • ToolNodeLangGraph에서 도구 호출을 실행하는 노드
  • 최근 AI 메시지의 tool_calls 추출 → 실행
  • 여러 도구 호출은 병렬(parallel) 실행 가능
  • 실행 결과는 tool_messages 형태로 정리됨

(6). 🔁 실제 실행 흐름 요약

  1. 사용자 질문 입력
  2. LLM이 툴 호출 여부 판단
  3. 툴 호출 시 → ToolNode에서 실행
  4. 결과 메시지 생성 및 반환
  5. 최종 응답 생성

📌 결론

이 LangGraph ReAct 시스템은:

  • 도구 호출 기반의 에이전트 시스템
  • 상황에 따라 적절한 도구를 선택하고, 결과를 바탕으로 응답을 생성
  • 복잡한 질의 처리, 최신 정보 검색, 내부 DB 연동 등 다양한 작업 수행 가능

5. ✅ 프로젝트 04번: LangGraph 리액트 메모리 정리

1️⃣ 환경 구성

  • 리액트 메모리 프로젝트 파일 임포트
  • 가상환경 커널 선택
  • 환경 변수(.env 등) 임포트
  • 기본 라이브러리 불러오기

2️⃣ 도구 정의 (Tools)

📌 1. search_menu

  • 목적: 레스토랑 메뉴 정보 검색
  • 동작
    • 벡터 DB에서 메뉴와 관련된 유사도 높은 문서 2개 검색
    • 검색 결과를 태그 기반 포맷으로 정리
    • @tool 데코레이터로 도구 등록

📌 2. search_web

  • 목적: 최신 정보 및 일반 웹 검색
  • 동작
    • Tavily Search API 사용
    • 최대 3개의 문서를 검색하고, 각 문서의 본문(content)과 URL 추출
    • 태그 포맷으로 구성 후 반환
    • @tool 데코레이터로 도구 등록

3️⃣ LLM 모델 설정 및 바인딩

  • 모델: GPT-4 Omni Mini
  • 바인딩: bind_tools()를 통해 위 두 도구 바인딩
  • LLM은 사용자의 질문에 따라 적절한 도구(search_menu, search_web) 선택 가능

4️⃣ 도구 호출 시나리오 예시

✅ 질문 1: “스테이크 메뉴 가격?”

  • 선택된 도구: search_menu
  • 이유: 메뉴 관련 질문 → 벡터 DB 검색이 적절

✅ 질문 2: “LangGraph는 무엇인가요?”

  • 선택된 도구: search_web
  • 이유: 일반 정보 → 웹 검색 필요

✅ 질문 3: “3 + 3은?”

  • 도구 호출 없음
  • 이유: 단순 연산이므로 LLM 자체 응답 처리

5️⃣ LangGraph 내에서 도구 실행 노드 구성

📌 ToolNode 사용

  • LangGraph의 프리빌트 모듈에서 제공
  • 역할: LLM이 생성한 tool_calls 요청을 병렬로 실행
  • 과정
    1. AI 메시지에서 도구 호출 정보 추출
    2. 여러 개의 도구 요청이 있을 경우 병렬로 실행
    3. 결과를 ToolMessage 형태로 에이전트 그래프에 반환

6️⃣ 실행 결과 확인

▶ 스테이크 메뉴 질문

  • AI 메시지에 도구 호출 포함됨
  • ToolNode에서 호출 처리
  • 결과: 시그니처/안심 스테이크 등 메뉴 정보가 포맷 형태로 출력

▶ LangGraph 질문

  • 웹 검색 도구 실행
  • 결과: 관련된 문서 3개가 정리된 텍스트로 반환

🧩 정리 표

구성 요소설명
search_menu벡터 DB 기반 메뉴 검색 도구
search_webTavily API 기반 일반 웹 검색 도구
GPT-4 Omni MiniLLM, 도구 자동 선택 및 응답
ToolNode도구 호출 병렬 실행 처리 노드
AI 메시지도구 호출 포함 결과 혹은 직접 응답

6. ✅ 프로젝트 04: LangGraph + React Memory 기반 에이전트 구현

(1). 초기 설정

  • 프로젝트 파일(LangGraph React Memory) 임포트
  • 가상환경 커널 선택
  • 환경 변수 로딩
  • 필수 라이브러리 불러오기

(2). 도구 정의 (Tools)

🧩 1) Search Menu: 메뉴 검색 도구

  • 목적: 벡터 DB에서 레스토랑 메뉴 검색
  • 과정:
    • 벡터 저장소로부터 유사한 메뉴 2개 검색
    • 검색 결과를 <태그> 구조 포맷으로 정리
  • 결과: @tool 데코레이터로 Search Menu라는 도구 생성

🧩 2) Search Web: 웹 검색 도구

  • 목적: 일반적/최신 정보 검색
  • 과정:
    • Tavily 검색 API 사용
    • 최대 3개 문서를 검색
    • 본문 + URL을 포함한 <태그> 포맷으로 정리
  • 결과: Search Web 도구 생성

(3). LLM 설정 및 도구 바인딩

  • 모델: GPT-4 Omni Mini
  • 작업:
    • bind_tools를 통해 두 도구를 LLM에 연결
    • 에이전트가 상황에 따라 적절한 도구 선택 가능

(4). 도구 호출 테스트

사용자 질문도구 선택동작 설명
"스테이크 메뉴 가격은?"Search Menu메뉴 벡터 DB에서 검색 수행
"랭그래프는 무엇인가요?"Search Web일반 정보이므로 웹 검색 수행
"3 더하기 3은?"없음도구 사용 없이 직접 답변 (6 출력)

(5). LangGraph 내 ToolNode 사용

🧱 ToolNode: 도구 실행 전용 노드

  • 용도: 그래프 구조 내에서 AI가 요청한 도구를 병렬로 실행
  • 작동 방식:
    • AI 메시지에서 tool_calls 추출
    • 여러 도구 요청을 병렬(Parallel)로 처리
    • 결과는 ToolMessage 형태로 반환

(6). ToolNode 실행 테스트

질문 내용결과 요약
"스테이크 메뉴 가격은?"Signature 스테이크 / 안심 스테이크 가격 정보 포맷 출력
"랭그래프는 무엇인가요?"Tavily 웹 검색 결과 3개 문서가 포맷 형태로 출력

💡 핵심 요약

  • LLM은 사용자의 질문에 따라 적절한 도구(Search Menu 또는 Search Web)를 자동 판단
  • 도구 호출은 LangGraph의 ToolNode를 통해 병렬로 실행되어 빠르고 유연하게 처리됨
  • 단순 질문은 도구 호출 없이 LLM이 직접 답변

7. ✅ LangGraph + ReAct + Gradio 에이전트 구현 정리

이 구현은 LangGraph 그래프 + ReAct 메모리 에이전트Gradio UI를 통해 사용자와 상호작용 가능한 형태로 만들고, 대화 맥락 유지(메모리) 기능을 포함합니다.

(1). 📦 초기 설정

  • 메모리 세이버 준비
    LangGraph 컴파일 시, checkpoint에 메모리 설정 → 대화 상태 유지 가능
  • Gradio 인터페이스 구성
  • 예제 질문 3가지 제공
    → 인터페이스 초기화 시 사용

(2). 🧠 메시지 처리 함수: process_message

  • 사용자 입력 메시지와 Gradio의 history (튜플 형태)를 받아 처리
  • 내부적으로 LangGraph 실행 시 스레드 ID(thread_id)를 설정하여 대화 지속성 유지
  • 입력 메시지를 config에 담아 LangGraph에 전달
  • 실행 결과에서 AI 메시지 중 최종 응답(콘텐츠)을 추출하여 반환

(3). 🧾 스레드 ID 고정 방식: ChatBot 클래스 정의

  • UUID로 고유한 thread_id를 클래스 초기화 시 생성
  • 클래스 내부 메서드 chat(message, history)에서 thread_id와 함께 process_message 호출
  • 이렇게 하면 각 인스턴스마다 고유한 대화 흐름이 유지됨

(4). 🧪 Gradio 연결

  • Gradio의 chat_interface()의 실행 함수로 ChatBot 클래스의 chat 메서드 전달
  • UI에서 메시지를 입력하면 process_message → LangGraph 실행 → AI 응답 반환

(5). 💬 동작 예시

질문 1: "채식주의자를 위한 메뉴를 추천해줘."

  • → 메뉴 도구(search_menu) 호출
  • 가든 샐러드버섯 크림 수프 추천

질문 2: "이 중에서 가격이 더 저렴한 메뉴는?"

  • 이전 대화를 기억하고 비교
  • → 버섯 크림 수프가 더 저렴하다고 응답 + 가격 비교 포함

→ ✅ LangGraph가 메모리를 활용해 이전 대화를 기억하고 있는 것 확인

🧩 핵심 정리

구성 요소설명
LangGraph + ReActReasoning + Acting 기반 도구 호출형 에이전트
메모리 기능동일한 thread_id로 이전 대화 유지
Gradio 연동실시간 채팅 인터페이스 구축
클래스 구조여러 인스턴스의 독립된 대화 흐름 가능
profile
Lee_AA

0개의 댓글