1. ✅ ReAct 에이전트 개념 정리
ReAct (Reasoning + Acting) 에이전트는
"추론(Reasoning)"과 "행동(Acting)"을 반복하는 방식으로 작동하는 LLM 기반 에이전트입니다.
🔁 작동 방식 요약
-
추론 (Reasoning)
- 주어진 상황을 분석하고 적절한 행동(또는 도구 사용)을 결정합니다.
-
행동 (Acting)
- 선택한 도구를 실행하거나, 직접 응답을 생성합니다.
-
관찰 (Observation)
- 행동 결과를 관찰하고 그 결과를 바탕으로 다시 추론합니다.
-
반복 (Feedback Loop)
- 이 과정을 반복하며 문제를 점점 더 깊이 해결해 나갑니다.
💡 핵심 특징
- 단순 텍스트 생성이 아닌, 환경과 상호작용하며 도구(tool)를 사용합니다.
- 결과에 대한 피드백을 바탕으로 새로운 추론을 하여 점점 더 정확한 행동을 하게 됩니다.
- 복잡한 문제 해결에 적합한 구조입니다.
2. ✅ 프로젝트 개요
- 목적: 리액트 기반의 랭그래프(LangGraph) 메모리 프로젝트에서, 도구(tool)를 정의하고 LLM과 바인딩하여 다양한 유저 요청을 처리하는 파이프라인 구성.
1️⃣ 초기 셋업
- 가상환경 커널 선택.
.env 등 환경 변수 로딩.
- 기본적인 라이브러리 및 유틸 불러오기.
- 목적: 레스토랑 메뉴 벡터 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 기반) |
LLM | GPT-4 Omni Mini 사용, 도구 자동 선택 |
ToolNode | LangGraph에서 병렬 도구 실행 처리 |
3. ✅ 프로젝트 04번: LangGraph + React Memory 에이전트 구성 흐름
(1). 환경 설정
- 가상환경 커널 선택
- 환경 변수 임포트
- 필수 라이브러리 불러오기
- 벡터 저장소(Vector DB)에서 유사도 기준으로 관련 문서 2개 검색
- 검색 결과를
<tag> 기반 포맷으로 정리
@tool 데코레이터로 도구로 등록
🔧 2) Search Web 도구 (웹 일반 검색)
- 인터넷에서 일반 정보 또는 최신 정보 검색
Tavily Search를 활용, 최대 3개 문서 검색
- URL 포함한
<tag> 포맷으로 정리하여 반환
(3). LLM 설정 및 도구 바인딩
- GPT-4 Omni Mini 모델 사용
- 위에서 정의한 두 개의 도구를
bind_tools로 모델에 연결
- 에이전트가 도구를 사용할 준비 완료
| 사용자 질문 | 사용된 도구 | 작동 결과 요약 |
|---|
| "스테이크 메뉴 가격은?" | Search Menu | 벡터 DB 검색 수행 후 결과 출력 |
| "랭그래프는 무엇인가요?" | Search Web | 웹 검색 결과 3개 문서 출력 |
| "3 더하기 3은?" | 도구 미사용 | 도구 없이 직접 답변 출력 (6) |
ToolNode는 에이전트 그래프 내에서 도구 호출을 병렬 처리하는 노드
- 가장 최근 AI 메시지에서
tool_calls 추출하여 실행
- 각 도구 호출 결과를
ToolMessage로 변환하여 반환
- 병렬 실행으로 효율적이며 빠른 응답 가능
| 질문 내용 | 작동 결과 요약 |
|---|
| "스테이크 메뉴 가격은?" | Search Menu 도구 실행 → 시그니처 스테이크/안심스테이크 가격 정보 출력 |
| "랭그래프는 무엇인가요?" | Search Web 도구 실행 → 웹 검색 결과 3개 문서 출력 |
4. ✅ LangGraph + ReAct Memory 프로젝트 정리
이 프로젝트는 LangGraph 기반의 ReAct 에이전트를 구성하여, 사용자 질의에 따라 적절한 도구(tool)를 호출하고, 그 결과를 바탕으로 응답을 생성하는 구조입니다.
(1). ✅ 기본 구성
- 가상환경 커널 선택
- 환경 변수 로드
- 필요한 라이브러리 임포트
- 벡터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은?"
- 도구 호출 없이 직접 응답 생성 (툴 사용 불필요 판단)
ToolNode는 LangGraph에서 도구 호출을 실행하는 노드
- 최근 AI 메시지의
tool_calls 추출 → 실행
- 여러 도구 호출은 병렬(parallel) 실행 가능
- 실행 결과는
tool_messages 형태로 정리됨
(6). 🔁 실제 실행 흐름 요약
- 사용자 질문 입력
- LLM이 툴 호출 여부 판단
- 툴 호출 시 →
ToolNode에서 실행
- 결과 메시지 생성 및 반환
- 최종 응답 생성
📌 결론
이 LangGraph ReAct 시스템은:
- 도구 호출 기반의 에이전트 시스템
- 상황에 따라 적절한 도구를 선택하고, 결과를 바탕으로 응답을 생성
- 복잡한 질의 처리, 최신 정보 검색, 내부 DB 연동 등 다양한 작업 수행 가능
5. ✅ 프로젝트 04번: LangGraph 리액트 메모리 정리
1️⃣ 환경 구성
- 리액트 메모리 프로젝트 파일 임포트
- 가상환경 커널 선택
- 환경 변수(.env 등) 임포트
- 기본 라이브러리 불러오기
- 목적: 레스토랑 메뉴 정보 검색
- 동작
- 벡터 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 내에서 도구 실행 노드 구성
- LangGraph의 프리빌트 모듈에서 제공
- 역할: LLM이 생성한
tool_calls 요청을 병렬로 실행
- 과정
- AI 메시지에서 도구 호출 정보 추출
- 여러 개의 도구 요청이 있을 경우 병렬로 실행
- 결과를
ToolMessage 형태로 에이전트 그래프에 반환
6️⃣ 실행 결과 확인
▶ 스테이크 메뉴 질문
- AI 메시지에 도구 호출 포함됨
ToolNode에서 호출 처리
- 결과: 시그니처/안심 스테이크 등 메뉴 정보가 포맷 형태로 출력
▶ LangGraph 질문
- 웹 검색 도구 실행
- 결과: 관련된 문서 3개가 정리된 텍스트로 반환
🧩 정리 표
| 구성 요소 | 설명 |
|---|
search_menu | 벡터 DB 기반 메뉴 검색 도구 |
search_web | Tavily API 기반 일반 웹 검색 도구 |
| GPT-4 Omni Mini | LLM, 도구 자동 선택 및 응답 |
ToolNode | 도구 호출 병렬 실행 처리 노드 |
| AI 메시지 | 도구 호출 포함 결과 혹은 직접 응답 |
6. ✅ 프로젝트 04: LangGraph + React Memory 기반 에이전트 구현
(1). 초기 설정
- 프로젝트 파일(
LangGraph React Memory) 임포트
- 가상환경 커널 선택
- 환경 변수 로딩
- 필수 라이브러리 불러오기
- 목적: 벡터 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 출력) |
- 용도: 그래프 구조 내에서 AI가 요청한 도구를 병렬로 실행
- 작동 방식:
- AI 메시지에서
tool_calls 추출
- 여러 도구 요청을 병렬(Parallel)로 처리
- 결과는
ToolMessage 형태로 반환
| 질문 내용 | 결과 요약 |
|---|
| "스테이크 메뉴 가격은?" | 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 + ReAct | Reasoning + Acting 기반 도구 호출형 에이전트 |
| 메모리 기능 | 동일한 thread_id로 이전 대화 유지 |
| Gradio 연동 | 실시간 채팅 인터페이스 구축 |
| 클래스 구조 | 여러 인스턴스의 독립된 대화 흐름 가능 |