Goal →Planning →Execution →Reflection →(Iteration) →Collaboration
복잡한 목표를 단계적으로 나누어 AI가 실행할 수 있도록 계획을 수립하는 과정입니다.
예시:
핵심 포인트: 좋은 계획을 유도하기 위해 인간의 의도 전달이 중요합니다.
AI가 자신의 결과물을 검토하고, 오류를 발견하거나 개선점을 찾아 수정하는 루프를 구성합니다.
예시:
하나의 AI 에이전트가 모든 작업을 담당하지 않고, 역할을 나누어 전문화된 에이전트들 간 협업을 수행합니다.
예시:
AI 에이전트가 자신이 수행한 작업에 대해 스스로 평가하고 분석하는 과정(루프 자체도 자동화)
Agentic Workflow는 명확한 성능 향상을 만든다!!
AI는 다양한 응답을 생성하며 분기(branch)를 만듭니다.
각 분기에서 스스로 평가하여 더 나은 가치를 탐색해 나가는 방식입니다.
이러한 구조는 문제 해결을 위해 여러 가능성을 동시에 고려할 수 있도록 설계되었습니다.
단순히 응답을 생성하는 데 그치지 않고, 생성된 응답이 적절한지 스스로 피드백을 통해 판단합니다.
이를 통해 점진적으로 더 나은 결과를 도출할 수 있습니다.
Exploration(탐색): 다양한 답변을 먼저 생성합니다.
Evaluation(평가): 생성된 답변을 비교하고 적합성을 평가합니다.
Pruning(제거): 불필요하거나 가치 없는 경로를 제거하여 효율성을 높입니다.
여러 에이전트가 협력하여 복잡한 작업을 수행하는 구조
각각의 에이전트가 서로 다른 관점과 기능을 제공하여, 단일 에이전트가 할 수 없는 복잡한 과업을 분할/협력하여 처리
여러 AI 에이전트가 동시에 작업을 수행하며, 각각의 결과를 통합하여 최종 결과를 도출하는 방식
특징:
예시:
에이전트들이 단계 별로 작업을 수행하며, 이전 단계의 결과를 다음 단계로 전달하는 방식
특징:
예시:
서로 다른 의견이나 접근 방식을 가진 에이전트들이 토론과 협상을 통해 최적의 결론을 도출하는 방식
특징:
예시:
병렬, 순차, 협상 기반 협업은 각각의 상황과 문제에 따라 적합하게 활용될 수 있는 AI 설계 패턴입니다.
이러한 구조는 AI 시스템의 효율성과 문제 해결 능력을 극대화하는 데 중요한 역할을 합니다.
from langgraph.graph import StateGraph
# Define your agent functions
def researcher(state): ...
def analyzer(state): ...
def strategist(state): ...
def writer(state): ...
# Define the graph
builder = StateGraph()
builder.add_node("researcher", researcher)
builder.add_node("analyzer", analyzer)
builder.add_node("strategist", strategist)
builder.add_node("writer", writer)
# Define agent flow
builder.set_entry_point("researcher")
builder.add_edge("researcher", "analyzer")
builder.add_edge("analyzer", "strategist")
builder.add_edge("strategist", "writer")
graph = builder.compile()
output = graph.invoke({"user_input": "EV 시장침체개선전략"})
⇒ 4개의 에이전트로 구성됨
단순 검색 도구가 아니라, 목적 지향적 사고를 수행하는 AI Agent에게 필요한 도구
⇒ 검색하는 과정에서 Agent가 다양한 DB와 Tool을 사용해서 검색하는 과정을 진행
(검색 전략을 스스로 세우고, 해당 전략을 검토하여 피드백을 진행함)
AI agent-based implementation of RAG
AI가 정보를 검색하고 생성하는 방식에서 Agent 처럼 동작하도록 설계된 개념
반복적인 검색과 생성 과정
구분 | Traditional RAG | Agentic RAG |
---|---|---|
정보 검색 방식 | 정적이고 단일 단계의 검색 | 반복적이고 능동적인 검색 |
응답 생성 과정 | 단순히 검색된 정보를 바탕으로 응답 생성 | 검색된 정보를 요약, 통합, 분석 후 응답 생성 |
복잡한 요청 처리 | 제한적인 특질성 처리 | 다단계 요청을 처리하며, 불확실성 해결하도록 반복 처리 |
실시간성 | 최신 정보 반영 어려움 (확보된 문서 기준 처리) | 최신 정보와 실시간 데이터 반영 가능 |
적용 사례 | Simple Q&A, FAQ | In-depth Q&A, 검색 기반 보고서 생성 |
Traditional RAG: 단순하고 정적이며 제한적인 방식으로 정보를 처리.
Agentic RAG: 반복적이고 능동적인 접근으로 복잡한 요청과 실시간 데이터를 처리하며 더 심층적인 응답 생성 가능.
구분 | Single (Vanilla) Agent | Multi Agent |
---|---|---|
프로세스 | 하나의 에이전트가 모든 작업(정보 검색, 생성, 판단 등)을 수행. | 여러 에이전트가 각각 다른 역할을 맡아 협력하며 작업 수행. |
구조 | 새로운 도구나 기능을 추가하려면 기존 에이전트의 기능을 확장해야 함. | 각 에이전트의 역할이 분리되어 있어 새로운 도구를 에이전트 단위로 구분하여 설계 추가 가능. |
유연성/확장성 | 단일 에이전트가 모든 작업을 처리. | 각 에이전트가 전문화된 작업을 병렬로 수행. |
성능 | 복잡한 작업에서는 성능 저하나 비효율 발생 가능. | 복잡한 작업에서도 성능을 확보하며 높은 효율성 유지 가능. |
예시 | 에이전트는 두 개 이상의 지식 소스를 검색하는 Router 역할 수행. | 메인 에이전트가 여러 특화 에이전트를 조율하여 다양한 소스(내부, 웹사이트, SNS, 이메일 등)에서 정보를 검색하고 통합하여 응답 생성. |
Single Agent: 단순한 구조로 모든 작업을 하나의 에이전트가 처리하며 확장성이 제한적.
Multi Agent: 전문화된 역할 분담과 협력을 통해 복잡한 작업에서도 효율적이고 유연한 성능 발휘 가능.
정의: CrewAI에서 특정 작업을 수행하도록 프로그래밍된 자율적인 AI.
역할: 특정 능력과 역할을 통해 팀의 목표 달성에 기여.
예시:
정의: 에이전트가 작업을 수행하는 데 사용하는 소프트웨어, API, 데이터베이스 등.
중요성: 적절한 도구 선택은 작업 효율성과 정확성에 큰 영향을 미침.
예시:
정의: 에이전트가 수행해야 할 구체적인 과제나 작업.
구성 요소: 작업의 세부 사항, 수행 방법, 필요한 도구 포함.
예시:
정의: 에이전트들이 태스크를 효율적으로 수행할 수 있도록 작업 흐름을 조정하는 역할.
특징:
예시:
마케팅 캠페인을 위한 데이터 분석 프로세스:
⇒ 2개의 Agent 대화 방식
*LCEL(LangChain Expression Language)**은 LangChain 프레임워크에서 사용되는 언어로, 언어 모델을 활용한 워크플로우를 효율적으로 구성하고 실행하기 위해 설계되었습니다.
이를 통해 언어 모델 기반의 다양한 응용 프로그램을 생성하고 관리할 수 있습니다.
스트리밍 지원
비동기 지원
병렬 실행
재시도 및 오류 처리
중간결과 액세스
입/출력 스키마
LangSmith 추적
LangServe 배포
항목 | CrewAI | AutoGen | LangGraph |
---|---|---|---|
주요 목적 | 역할 기반 다중 에이전트 협업 시스템 | 대화형 다중 에이전트 시나리오 자동화 | 상태(State) 기반으로 에이전트 흐름 구성 |
핵심 구조 | Crew → Agents → Task + Process | GroupChat, Assistant/Agent, UserProxy 등 모듈화 | Graph 구성요소: Node, Edge (Node=Agent, Edge=Flow) |
흐름 제어 방식 | 각 에이전트 역할과 순서 정의/선언 | 대화 기반 흐름으로 상태 전이 자동/동적 | 명시적 상태 전이를 통한 흐름 관리 (프로그래밍적 접근) |
구현 편의성 | 자연어 선언형 구성 용이 | 대화 흐름 설계 필요 | 프로그래밍 기반 설계/개발 필요 |
에이전트 메모리 | 단기 기억 위주 (Task 단위로 Context 유지) | 상태 추적 지원 (모듈 기반 메모리 확장 가능) | State와 Memory, Context를 자유롭게 설계 가능 |
확장성 | 기본 구조는 고정 | 모듈 기반 구성 | State 기반 구성 |
외부 연동 | LangChain 기반으로 RAG 등과 연동 가능 | API 호출, 함수 실행, 사용자 피드백 포함 | LangChain 생태계와 연결 |
CrewAI: 빠르고 직관적인 다중 에이전트 협업 도구가 필요할 때 적합. 역할 기반 협업 및 명확한 작업 분담에 유리.
AutoGen: 대화형 인터페이스와 반복 피드백 구조가 필요한 경우 적합. 사용자 참여형 시나리오 설계에 유리.
LangGraph: 복잡한 상태 관리와 흐름 제어가 필요한 프로세스 자동화에 적합. 명시적 상태 전이를 통한 정밀한 흐름 관리 가능.
[추가-1] 평가자, Query Transform(Rewrite)
[추가-2] 추가 검색기를 통하여 문맥(context) 보강
[추가-3] 문서-답변 간 관련성 여부를 판단하는 ’평가자2’를 추가하여 검증
구성 요소 | 목적 | 역할 |
---|---|---|
Node | 어떤 작업(task)을 수행할지 정의 | 특정 로직 수행 또는 상태 업데이트(입력으로 현재 상태를 받고, 업데이트된 상태 반환) |
Edge | 다음으로 실행할 동작 정의 | 워크플로우의 흐름 제어 조건부 라우팅, 다음에 실행할 노드 결정 |
Conditional Edge | 조건에 따른 분기 처리 | 워크플로우의 흐름 제어 조건부 라우팅, 다음에 실행할 노드 결정 |
State | 현재의 상태값을 저장 및 전달 | 전체 워크플로우의 컨텍스트 유지, 노드 간 정보 공유 |
LangGraph 전체 흐름의 기억 저장소이며, 노드 간 연결성과 판단을 위한 핵심 데이터 구조
⇒ State는 노드를 거치면서 “Overwrite 방식”으로 업데이트
LangGraph의 각 단계를 수행하는 작업 유닛(함수)
⇒ LangGraph 내에서 실제로 어떤 행동(작업)을 수행하는 단위로 각 노드는 하나의 함수로 정의
# 데코레이터 추가하여 함수 -> 도구로 변환
# LLM이 함수를 호출할 때 함수의 역할을 확인할 수 있도록 주석을 반드시 추가 (in English)
@tool
def add_numbers(a: int, b: int) -> int:
""" Add two numbers
"""
return a + b
@tool
def mult_numbers(a: int, b: int) -> int:
""" Multiply two numbers
"""
return a * b
add_numbers.invoke({'a': 10, 'b':5})
해당 코드는 LangChain에서 제공하는 @tool
데코레이터를 사용해서 "함수를 LangChain Tool로 등록" 한 것입니다.
하지만 여기서 보이는 add_numbers.invoke(...)
, mult_numbers.invoke(...)
는 그냥 Python 함수 호출처럼 실행되는 거고, LLM은 호출되지 X.