23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요! SK AX AI 엔지니어 조경진입니다.
요즘(?) AI Agent 얘기가 정말 뜨거운데요, 막상 현업에서 구현하려고 하면 "어디서부터 시작해야 하지?" 하는 막막함이 있죠.
오늘은 생성형 AI를 활용한 Agent 구현의 핵심인 ReAct 패턴에 대해 실무 관점에서 풀어보려고 합니다!
현 시점에서 생성형 AI를 다루려면 LangChain 프레임워크를 다루는 것은 필수적인데요, LangChain이 과연 무엇인지 간략하게 한번 살펴보고 가겠습니다.
LangChain이란 LLM을 활용한 어플리케이션 개발을 쉽게 해주는 오픈소스 프레임워크입니다.
기존에 LLM은 단순한 언어 모델로써 "텍스트 입력 → 텍스트 출력" 수준의 모델로만 활용할 수 있었던 반면,
LangChain 프레임워크를 활용하면 여러가지 기능을 추상화하고 외부 API를 활용하여 훨씬 더 복잡하고 실용적인 기능을 수행할 수 있게 됩니다.
쉽게 말해: ChatGPT가 단순히 대화만 하는 것에서 → 검색도 하고, 계산도 하고, 파일도 읽는 "만능 어시스턴트"로 진화하게 해주는 도구가 바로 LangChain이에요!
다음부터 나오는 개념들과 모듈들은 모두 LangChain을 기반으로 합니다. 그러니 LangChain에 대해서 잘 알고 있어야 생성형 AI 서비스를 잘 구축할 수 있겠죠?
LangChain을 기반으로 만들어진 기능 중 하나가 바로 AI Agent입니다.
GPT나 Claude와 같은 LLM은 기본적으로 "질문 → 답변"의 수동적인 응답 시스템을 보여주는 반면,
실제 LLM 서비스에서는 보다 복잡한 목표를 달성하기 위해 능동적으로 행동하고 외부 API를 활용하는 서비스를 구현하고자 합니다.
이 한계를 극복하기 위해서 LLM이 스스로 판단하고 행동하는 구조, 즉 AI Agent가 필요해졌습니다.
AI Agent(AI 에이전트)는 스스로 목표를 설정하고, 계획을 세우고, 실행까지 수행할 수 있는 자율적인 인공지능 시스템입니다.
단순히 질문에 답하는 수준을 넘어서:
다양한 도구(검색, 계산, API 호출 등)를 활용하고
상태를 기억하면서
점진적으로 작업을 완수합니다
최근에는 LLM을 중심으로 구성된 에이전트들이 많아서, 자연어로 주어진 목표를 이해하고, reasoning(추론)과 planning(계획)을 통해 문제 해결이 가능합니다.
예를 들어:
RAG 파이프라인을 구성해 문서를 찾아 요약하거나
이메일을 분석해 자동으로 회신을 작성하는 것도 가능합니다
💡 요약하면: AI 에이전트는 스스로 생각하고 행동하며 문제를 해결하는 지능형 작업자입니다!
이러한 AI Agent도 많은 발전을 이루고 있으며, 그중에서 주요한 발전 단계들을 소개드리겠습니다.
가장 초기의 AI 에이전트 개념으로, 사람이 미리 정의한 조건-행동 규칙(if-then) 에 따라 작동합니다.
특징:
특정 문장을 인식하면 정해진 응답을 하는 챗봇 등이 대표적
상태 추론 없이 입력에 대한 정해진 반응만 수행
지능적인 사고나 적응은 불가능
초기 엑스퍼트 시스템(expert system), RPA 봇들이 여기에 해당
한계점:
복잡한 문제에는 대응하기 어려움
사전 정의된 환경에서만 안정적으로 동작
하지만 지금의 AI 에이전트 설계에도 여전히 룰 기반 요소가 병합되어 활용됩니다. 즉, 인간이 통제할 수 있는 구조로서 중요한 시작점이었습니다.
AI가 목표를 달성하기 위해 일련의 행동 계획을 스스로 수립하는 연구로, STRIPS, GOAP 등이 대표적입니다.
작동 방식:
AI가 가능한 행동의 조합을 시뮬레이션하며 "이 상태에서 어떤 행동이 최선인가?"를 판단
주로 게임 AI나 로봇 행동 제어 등에서 사용
단순 반응형이 아니라, 상태와 목표를 고려하는 구조로 진화
아쉬운 점:
자연어 기반이 아니기 때문에 LLM 기반 에이전트와는 거리가 있음
그럼에도 불구하고, 현대 에이전트 프레임워크들이 사용하는 Task Planning 기법의 뿌리가 됩니다. (예: AutoGen Planner, LangGraph의 조건 분기 노드 구조 등)
GPT-3의 등장 이후, 자연어만으로도 고차원적 사고와 판단이 가능해지며 LLM 기반 에이전트가 등장합니다.
주요 발전:
ReAct 패턴(Reasoning + Acting) 이 2022년에 제안되며, 추론과 도구 사용이 결합
에이전트가 자연어로 문제를 분석하고, 필요한 경우 Tool(예: 검색, 계산)을 호출
LangChain, OpenAI Function calling 기능도 이 시기에 본격 등장하며 빠르게 확산
구조적 특징:
주로 "입력 → 생각 → 도구 사용 → 결과 정리"의 단순 루프 구조
복잡한 상태 추적이나 협업은 아직 부족했지만, 현대 LLM Agent의 토대를 마련
ReAct, MRKL, AutoGPT 초기 버전이 여기에 해당합니다.
2023년에는 LLM에게 목표를 주면 계획 수립, 태스크 분해, 반복 실행까지 가능한 자율 에이전트 구조가 유행합니다.
대표 서비스:
AutoGPT, BabyAGI, AgentGPT 등
LLM을 루프 구조로 감싸 반복 실행하게 설계
작동 방식:
목표 → 작업 생성 → 실행 → 검토 → 반복이라는 loop 기반으로 작동
파일 시스템 접근, 브라우저 조작, 외부 API 호출 등이 가능해지며 실제 환경과 상호작용하는 수준까지 발전
아쉬운 점:
대부분 불안정한 계획, 루프 오류, 비용 낭비 문제로 실무 적용에는 제한적
단일 LLM으로만 구성했기 때문에 복잡한 협업은 어려움
하지만 실제 행동하는 AI의 가능성을 대중적으로 알린 계기가 되었습니다.
2024년 이후에는 단일 LLM 대신 여러 역할을 가진 에이전트들이 협업하는 멀티 에이전트 구조가 주류가 됩니다.
주요 프레임워크별 특징:
프레임워크 | 특징 |
|---|---|
AutoGen | 에이전트를 Coder, Critic, Planner 등으로 분리하고, 서로 대화하며 작업을 완성 |
LangGraph | 그래프 기반 워크플로우로 복잡한 분기와 반복, 상태 관리가 가능 |
CrewAI | 각 에이전트를 직무처럼 정의해 팀 단위로 일하게 함 |
Agentic RAG | 검색-요약-결합 등 과정을 분리해 체계화 |
현재 상황:
이제는 에이전트가 단순한 도구가 아니라 하나의 작업 주체로서 설계되고 있음
Langfuse, W&B Traces 등을 활용한 로깅, 평가, 디버깅 툴도 병행되어 프로덕션 적용이 가능해짐
문제 이해: 에이전트가 받은 사용자 지시나 환경 상태를 자연어로 해석하는 데 LLM이 사용됩니다.
추론 및 판단: 주어진 정보에 대해 "무엇을 해야 할까?", "다음에 어떤 도구를 써야 할까?"를 결정하는 사고 루틴을 LLM이 수행합니다.
행동 계획: ReAct, AutoGPT, LangGraph 등에서는 LLM이 "검색해보자", "계산이 필요하다"는 식으로 다음 행동을 말로 결정합니다.
결과 요약 및 학습: 도구 사용 결과를 받아 해석하거나 다음 단계로 연결하는 것도 LLM이 담당합니다.
# 실제 ReAct 패턴의 작동 예시
Question: "2026년 대선 일정이 언제야?"
Thought: 사용자의 질문은 최신 정보를 필요로 한다.
Action: Search("2026년 대선 일정")
Observation: 2026년 6월 3일 예정.
Thought: 이 일정을 바탕으로 요약해보자.
Final Answer: 2026년 대선은 6월 3일에 예정되어 있습니다.이 전 과정을 LLM이 수행합니다. 즉, "생각 → 행동 → 관찰 → 다음 생각" 의 루프를 LLM이 주도하는 구조입니다.
LLM = 머리 (두뇌)
Tool = 손 (행동 도구)
Memory = 기억 (상태 저장)
즉, LLM이 없으면 에이전트는 아무런 사고도 할 수 없습니다.
지금의 AI 에이전트는 "LLM의 사고력"을 기반으로 그 위에 행동과 협업을 쌓아올린 구조예요.
이제 두뇌 역할까지 봤습니다. 그럼 이제 실질적으로 행동을 수행하는 Tool에 대해서 다뤄보도록 하겠습니다.
Tool은 Agent가 행동을 수행할 수 있도록 하는 여러가지 도구들을 의미합니다.
Agent가 Tool을 인식하고 다루려면 Tool로 등록을 해야 하는데, 해당 부분도 역시 LangChain이 지원합니다.
import os
from langchain.agents import tool
from langchain_openai import ChatOpenAI
# 도구를 정의합니다.
@tool
def get_word_length(word: str) -> int:
"""Returns the length of a word."""
return len(word)
@tool
def add_function(a: float, b: float) -> float:
"""Adds two numbers together."""
return a + b
tools = [get_word_length, add_function]
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)
query = "What is 3 + 12?"
result = llm_with_tools.invoke(query)도구 만드는 부분에서 가장 핵심은 tool을 불러오는 것과, decorator, docstring입니다.
커스터마이징이 중요한 이유:
도구(tool)은 사실 남들이 만들어 놓은 것을 사용할 수도 있지만, 각자의 개발과정과 개발 산출물은 다를 수 있고, 보통 다릅니다. 각자가 편한 구현이 있을 테니까요.
또한 서비스 구현 과정에서 도구는 그 회사나 개인의 강점 및 역량을 보여주는 포인트가 될 수 있습니다. 따라서 커스터마이징을 한다는 것을 전제로 합니다.
우선 도구를 정의할 수 있도록 tool을 임포트 한다.
함수를 만들어 도구의 기능과 역할을 구성하고, decorator로 도구임을 표시한다.
LLM이 도구의 기능을 파악하게 하기 위해 docstring으로 설명을 쓴다.
만들어 놓은 tool들을 list에 담으면 끝!
💡 중요: Tool calling을 지원하는 LangChain chat model은
.bind_tools()메소드를 지원합니다. bind_tools는 agent에게 tool에 대한 정보를 제공해줍니다.
이러한 tool을 만들고 나면 이제 agent는 단순한 text generation 말고 더 복잡한 업무를 수행할 수 있게 됩니다.
Tool 종류 | 설명 | 실제 활용 예시 |
|---|---|---|
웹 검색 툴 | LLM이 알지 못하는 최신 정보 검색 | 뉴스, 환율, 날씨 조회 |
계산기 툴 | 수학, 통계 등 정확한 계산 | 수익률 계산, 미적분 |
코드 실행 툴 | LLM이 작성한 코드 실행 결과 얻기 | Python 코드 블록 실행 |
SQL/DB 툴 | 데이터베이스 질의 후 결과 분석 | 매출 집계, 고객 분석 |
문서 요약 툴 | PDF, 웹페이지 등 긴 문서 내용을 요약 | 보고서 요약, 논문 리뷰 |
RAG 검색 툴 | 벡터 DB에서 유사 문서 검색 후 인용 답변 | 사내 문서 검색 |
API 호출 툴 | 외부 REST API 연동 | Slack 전송, 예약 등록 |
파일 변환 툴 | Excel, PDF 등 파일 파싱 및 변환 | 데이터 전처리 |
이로써 text generation만 수행하던 LLM에서 계산, 실시간 크롤링, 정보 확인, 외부 API까지 접근 가능한 똑똑한 Agent로 진화하게 되었습니다!
우리는 한발 더 나아가서 Agent가 얼마나 더 똑똑하게 Tool을 다루는지에 대해 알아볼 필요가 있습니다.
구체적인 예시로 ReAct라는 기술을 소개해드리겠습니다.
기존 LLM은 훈련할 때 사용했던 데이터를 기반으로 의존해서 대답을 했었습니다. 즉, 실시간 정보나 복잡한 계산, 외부 시스템과의 연동이 불가능했죠.
ReAct는 "Reasoning and Acting in Language Models" 의 약자로, LLM이:
**자신의 생각을 자연어로 드러내며 추론(Thought)**하고
필요한 외부 행동을 Action으로 요청하며
그 결과(Observation)를 받아 다음 추론에 반영하는 순환 구조입니다
Thought (생각): 모델이 다음에 무엇을 해야 할지를 스스로 설명합니다.
Action (행동): 외부 도구나 API를 사용하기 위한 구체적인 명령.
Action Input (행동 입력): 해당 도구에 넘길 입력값.
Observation (관찰): 도구 사용 결과.
(반복 가능)
Final Answer: 최종적인 응답을 출력.
Question: 서울에서 뉴욕까지 비행시간은?
Thought: 인터넷을 통해 검색해야 할 것 같다.
Action: Search
Action Input: "서울에서 뉴욕까지 비행시간"
Observation: 약 14시간 소요됨
Thought: 이제 답변할 수 있다.
Final Answer: 서울에서 뉴욕까지 비행시간은 약 14시간입니다.중심적인 추론 엔진
Thought 및 Action을 생성
LLM은 주어진 prompt와 이전 단계의 상태를 보고 다음 단계의 출력을 생성합니다
LLM이 Action으로 호출할 수 있는 도구 집합
예: 계산기, 검색 엔진, 데이터베이스 쿼리, 코드 실행기 등
각 도구는 고유한 이름, 입력 형식, 출력 형식을 가짐
LLM의 Thought/Action/Observation 사이클을 반복하면서 최종 답을 얻을 때까지 수행
주로 다음과 같은 형태로 구성됨:
LLM에게 prompt를 주고 Thought와 Action을 받음
해당 Action을 실행하고 Observation을 수집
Observation을 다시 LLM에게 전달하여 다음 Thought/Action을 요청
Final Answer가 나올 때까지 반복
이전의 Thought, Action, Observation을 저장하여 문맥 유지
LangChain 등에서 제공하는 memory 모듈을 활용하기도 함
Thought/Action/Observation 패턴을 유도하는 프롬프트 설계가 핵심
LLM이 ReAct 흐름을 따르도록 학습되어야 하거나, 체계적인 예시가 필요함 (few-shot prompting)
ReAct는 Function Calling을 사용하는데요, 이에 대해 좀 더 자세히 알아보겠습니다.
ReAct (Reasoning + Acting) 는 LLM이 문제를 해결하기 위해 "생각하고 행동하고 관찰"하는 순서를 반복하는 방법론입니다.
여기서 Function Calling은 "Action" 단계에서 외부 도구나 함수(=Tool)를 호출하는 방식을 말합니다.
즉,
LLM이 자연어로 추론한 결과를 기반으로 특정 함수를 호출하도록 명시적으로 지시하는 것이 바로 Function Calling입니다.
Question: 서울의 내일 날씨는?
Thought: 날씨 API를 호출해서 확인해야겠다.
Action: get_weather(city="Seoul", date="tomorrow")
Observation: 내일 서울은 맑고 기온은 23도입니다.
Thought: 이제 답변할 수 있다.
Answer: 내일 서울의 날씨는 맑고 23도입니다.여기서 get_weather(...)가 바로 Function Calling입니다.
이를 OpenAI API나 LangChain에서는 다음과 같은 JSON 형태로 구조화합니다:
{
"name": "get_weather",
"arguments": {
"city": "Seoul",
"date": "tomorrow"
}
}구성 요소 | 설명 |
|---|---|
Reasoning (Thought) | 어떤 정보를 얻기 위해 어떤 행동이 필요한지 LLM이 생각함 |
Function Calling (Action) | 실제 필요한 행동을 API 호출 형태로 명시 |
Observation | 실행 결과를 받아 다음 추론에 활용 |
LLM Loop | 위의 과정을 반복하여 문제 해결 |
ReAct의 Function Calling은 LLM이 reasoning 기반으로 선택한 외부 도구 호출 방법
일반적으로 JSON 또는 structured call 형태로 표현됨
대표적으로 OpenAI Function Calling, LangChain Tools, AutoGPT에서 사용
목적은 LLM이 인간처럼 "생각 후 도구 사용" 하는 능력을 부여하는 것
from langchain.agents import AgentExecutor
# AgentExecutor 생성
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=10,
max_execution_time=10,
handle_parsing_errors=True,
)
# AgentExecutor 실행
result = agent_executor.invoke({"input": "다음 텍스트를 스페인어로 번역해 줘. 안녕하세요!"})
print("Agent 실행 결과:")
print(result["output"])AI 에이전트 툴을 현업에서 실제 서비스로 구현하려면, 단순한 기술 구현을 넘어서 시스템 통합, 사용자 경험, 보안, 성능, 유지보수 등 여러 현실적인 요소를 고려해야 합니다.
구체적인 예시로 제 사례를 간단하게 소개드리고자 합니다.
배경:
사내보안이 매우 철저한 환경에서는 외부에서 공개한 AI Agent를 사용하는 게 매우 제한적일 수 있습니다.
따라서 AI Agent 구현을 처음부터 끝까지 전부 다 직접해야 하는데요.
제가 AI Agent 서비스를 구현하면서 고려한 핵심 사항들:
도메인 지식을 AI Agent한테 최대한 잘 주입해야 한다.
회사의 업무 프로세스, 전문 용어, 규정 등을 정확히 학습시키는 것이 핵심
RAG(Retrieval-Augmented Generation)를 활용해 사내 문서와 연동
업무별로 특화된 지식베이스 구축
Prompt Engineering을 최대한 섬세하게 진행한다. (w/ 현업 도메인 베테랑)
현업 전문가와 협업하여 실제 업무 상황을 반영한 프롬프트 설계
A/B 테스트를 통한 프롬프트 최적화
예외 상황 처리를 위한 fallback 시나리오 구성
Tool 구현을 최대한 비즈니스 로직에 맞춰서 설계한다.
범용 Tool이 아닌 회사 특화 Tool 개발
기존 레거시 시스템과의 연동 고려
단계별 승인 프로세스를 반영한 Tool 설계
QA를 최대한 자주 반영하여 현업 관련자에게 피드백을 받는다.
주간 단위 현업 테스트 및 피드백 수집
실제 업무 시나리오 기반 테스트 케이스 구성
지속적인 모델 성능 모니터링 및 개선
지금까지 LangChain부터 ReAct Agent까지, 생성형 AI의 핵심 기술들을 살펴봤습니다.
핵심 포인트 요약:
LangChain: LLM 활용의 필수 프레임워크
AI Agent: 단순 대화를 넘어선 능동적 문제해결 시스템
ReAct: 추론과 행동을 결합한 혁신적 패턴
Tool: Agent의 실질적 행동력을 담당하는 핵심 요소
실무 적용: 기술과 비즈니스 요구사항의 균형이 관건
앞으로의 전망:
AI Agent 기술은 계속해서 발전하고 있고, 특히 Multi-Agent 협업과 Graph-based 워크플로우가 주목받고 있습니다.
하지만 기술의 발전만큼이나 중요한 것은 실제 현업에서 안정적으로 동작하는 서비스를 만드는 것입니다.
이를 위해서는 기술적 이해뿐만 아니라 도메인 지식, 사용자 경험, 운영 노하우까지 종합적으로 고려해야 합니다.
AI Agent 기술을 활용해서 정말 멋진 서비스들을 만들어보시길 바랍니다!
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.