Sec 22 AI Agents & Workflows
274.
목표
- LangGraph를 사용해 매우 단순한 AI 에이전트 구축
- 이전의 수동 방식이 아닌 그래프 기반 방식 적용
LangGraph 설치
pip install langgraph- LLM 연결을 위해
langchain-openai설치 - OpenAI 대신 다른 LLM도 연결 가능 (프레임워크의 장점)
핵심 개념 복습
- 메시지는 에이전트의 핵심 상태
- 상태(State)를 통해 메시지를 누적 관리
- 메시지를 덮어쓰지 않고 append 하는 구조가 중요
State 정의
- TypedDict 기반 State 클래스 생성
- messages: List 타입
- add_messages 어노테이션 사용
- 목적
- 기존 메시지 유지
- 새로운 메시지 추가
- 컨텍스트 지속성 확보
Bot 정의
- 클래스 대신 간단한 함수로 구현
- 입력: state
- 내부에서 ChatOpenAI 모델 생성
- state["messages"]를 model.invoke()에 전달
- 결과 반환
Graph 생성 단계
1️⃣ StateGraph 생성
- graph_builder = StateGraph(State)
2️⃣ Node 추가
- 이름: "bot"
- 실행 함수: bot
- 노드 = 실행 단위
3️⃣ Entry Point 설정
- graph_builder.set_entry_point("bot")
- 시작 노드 정의
4️⃣ Finish Point 설정
- graph_builder.set_finish_point("bot")
- 종료 노드 정의
5️⃣ Compile
- graph = graph_builder.compile()
- 실제 실행 가능한 그래프 완성
실행 예시
- graph.invoke({ "messages": [("human", "Hello, how are you?")] })
- 출력 결과
- HumanMessage
- AIMessage
- 각각 고유 ID 포함
- 토큰 사용량 정보 포함
중요한 구조적 차이
이전 방식
- 직접 루프 작성
- 직접 상태 관리
- 직접 액션 파싱
LangGraph 방식
- 상태 관리 자동화
- 메시지 누적 관리 내장
- 노드 기반 구조화
- 그래프 실행 엔진 사용
핵심 이해
- State = 메모리
- Node = 실행 단위
- Entry / Finish = 시작과 종료
- Graph = 전체 오케스트레이션 구조
의미
- 매우 단순한 구조지만
- 이미 완전한 그래프 기반 AI 에이전트
- 확장 시
- Tool 노드 추가
- Conditional Edge 추가
- 루프 추가
- Human-in-the-loop 추가 가능
결론
- LangGraph는
- 에이전트의 상태 + 실행 흐름을 구조적으로 관리
- 수동 구현 대비 확장성과 유지보수성 우수
- 복잡한 자율형 에이전트 구축의 기반이 되는 프레임워크
- LangGraph는
275.
목적
- LangGraph 기반 에이전트를 콘솔 앱 형태로 확장
- 실시간 상호작용 가능하도록 개선
콘솔 루프 구조
while True사용- 사용자 입력 받기
"quit","exit","q"입력 시 종료- 반복적으로 질문 가능
invoke()대신stream()사용stream()은 실행 과정을 이벤트 단위로 반환- 단계별로 결과를 스트리밍
- 내부 실행 흐름을 실시간으로 확인 가능
동작 흐름
- 사용자 입력 → messages에 추가
- graph.stream(...) 호출
- 이벤트 발생 시 값 추출
- assistant의 마지막 메시지 출력
메시지 구조 특징
- HumanMessage와 AIMessage 객체 생성
- 각 메시지에 고유 ID 존재
- 이전 메시지 유지 (append 방식)
- 상태(State)가 모든 메시지 보관
Hallucination 예시
- “LangChain”에 대한 잘못된 답변 발생
- 원인
- 모델 학습 시점 한계
- 최신 정보 부족
- 해결 방향
- Tools 추가 필요
- 외부 지식 연결 필요
상태(State)의 중요성
- State = 메시지 저장소
- 매 호출마다 state 전달
- 컨텍스트 유지
- 대화 일관성 확보
Graph 구성 요약
- StateGraph(State) 생성
- 노드 추가
- 이름: "bot"
- 실행 함수: bot
- Entry Point 설정
- Finish Point 설정
- compile()로 실행 그래프 생성
현재 구조의 한계
- 단일 노드 구조
- 외부 데이터 접근 불가
- Tool 없음
- 단순 LLM 응답 에이전트
다음 단계
- Tools 추가
- 에이전트 능력 확장
- 외부 데이터 조회
- 맞춤형 지식 활용
- Tool 실행 → LLM → 응답 구조 구현
핵심 이해
- LangGraph는 구조를 제공
- State는 기억을 담당
- Node는 실행 단위
- Tools가 추가되면 진짜 에이전트로 발전
결론
- 현재는 기본 대화형 에이전트
- 다음 단계에서
- 도구 기반 자율형 에이전트로 확장 예정
276.
목표
- LangGraph 기반 기본 에이전트에 Tools 추가
- LLM 단독 응답 → 외부 검색 기반 응답 확장
구조 개념
- Entry Point → Bot Node
- 필요 시 Tool 호출
- Tool 결과 반환
- 다시 Bot으로 전달
- 조건 충족 시 종료
- 조건 미충족 시 반복
외부 검색 Tool 추가
Tavily 검색 엔진 사용
목적
- LLM을 웹과 연결
- 최신 정보 검색 가능
Tavily 준비 단계
- 계정 생성
- 대시보드에서 API Key 발급
- 환경 변수에 저장
패키지 설치
pip install tavily-pythonpip install langchain-community
Tool 생성
TavilySearchimport- Tool 객체 생성
tool.invoke("질문")테스트- 검색 결과 정상 반환 확인
Tools 리스트 구성
tools = [tavily]
리스트 형태로 전달
이유
- 여러 Tool 확장 가능
모델에 Tool 연결
- 기존 ChatOpenAI 모델 사용
model.bind_tools(tools)- Tool 기능이 포함된 모델 생성
Tool 연결 확인 테스트
model_with_tools.invoke("질문")반환값 확인
JSON 구조 포함
- function call 정보
- call_id
- response 데이터
핵심 이해
- LLM은 Tool을 “직접 실행”하지 않음
- LLM은 Tool 사용 요청만 생성
- 실제 Tool 실행은 코드가 담당
- Tool 결과를 다시 LLM에 전달
현재 상태
모델 + Tool 연결 완료
검색 기능 활성화
하지만
- 아직 Tool 사용 규칙 미설정
- 에이전트에게 Tool 사용 방법 미지시
다음 단계
- 프롬프트로 Tool 사용 방법 명시
- Tool 호출 → 결과 처리 → 재전달 자동화
- Conditional Edge 구성
- 완전한 Tool 기반 자율 에이전트 완성
277
목표
- 에이전트가 어떤 Tool을 실행해야 하는지 스스로 결정하도록 구성
- Tool 실행을 별도 Node로 분리
핵심 개념
- LLM은 Tool을 “직접 실행”하지 않음
- LLM은 Tool 호출 요청(JSON payload) 생성
- Tool 실행은 그래프의 Tool Node가 담당
BasicToolNode 클래스 역할
- 마지막 AI 메시지에서 Tool 호출 요청 확인
- 어떤 Tool을 실행해야 하는지 판단
- 해당 Tool 실행
- 실행 결과를 ToolMessage 객체로 생성
- Tool 결과를 다시 모델에 전달
ToolMessage의 의미
- Tool 실행 결과를 모델로 전달하는 메시지 객체
- content 필드에 Tool 결과 포함
- tool_call_id 포함
- 모델이 이전 Tool 호출과 결과를 연결 가능
처리 흐름
- AI 메시지에서 tool_call 추출
- tool 이름 확인
- 해당 tool 실행
- Tool 결과 → ToolMessage 생성
- 메시지 리스트에 추가
Conditional Edge 추가
목적
- 상태에 따라 다음 Node 결정
route_tools 함수
- Tool 호출 존재 → "tools" 노드로 이동
- Tool 호출 없음 → END로 이동
그래프 구성 변화
- Node 1: bot
- Node 2: tools
- Conditional Edge: bot → tools 또는 END
- tools 실행 후 → 다시 bot으로 복귀
- 루프 구조 형성
Finish Point 제거 이유
- Conditional Edge가 종료 조건을 처리
- END 상태로 자동 전이
실행 결과 변화
- 이전
- LangChain 질문 시 환각(Hallucination) 발생
- 현재
- Tool 호출
- Tavily 검색 실행
- 검색 결과 기반 응답 생성
- 이전
동작 예시
- 질문: “Tell me about LangChain”
- LLM → Tool 호출
- Tavily 검색
- 검색 결과 반환
- LLM이 결과 정리 후 응답
- 질문: “Tell me about the solar system”
- 검색 실행
- Wikipedia 기반 정보 반환
- 응답 생성
- 질문: “Tell me about LangChain”
핵심 이해
- Node = 실행 단위
- Tool Node = 외부 능력 확장 지점
- Conditional Edge = 의사결정 엔진
- State = 메시지 기억
구조 요약
- User Input
- → Bot Node
- → Conditional Edge
- Tool 필요 → Tools Node
- Tool 불필요 → END
- → Bot 재실행
- → 최종 Answer
의미
- 이제 에이전트는
- 외부 웹 검색 가능
- 최신 정보 활용 가능
- 환각 감소
- 반복적 Tool 호출 가능
- 이제 에이전트는
결론
- LangGraph + Tools + Conditional Edge
- 완전한 Tool 기반 자율형 에이전트 구조 완성
- 확장 시
- 여러 Tool 추가 가능
- 데이터베이스 연결 가능
- API 연결 가능
- 복잡한 Workflow 구성 가능
278
코드 정리
- 사용자 정의
BasicToolNode제거 - 사용자 정의
route_tools제거 - LangGraph prebuilt 사용
ToolNodetools_condition
- 사용자 정의
ToolNode 사용 방식
tool_node = ToolNode(tools)- tools 리스트 전달
- 별도 클래스 구현 불필요
Conditional Edge 설정
graph_builder.add_conditional_edges("bot", tools_condition)의미
- 마지막 메시지에 tool_call 존재 → tools 노드 이동
- tool_call 없음 → END로 이동
모델과 Tool 연결 핵심
- 반드시
model.bind_tools(tools)사용 - bot에서 반환 시 model_with_tools 사용
- Tool이 바인딩되지 않으면 호출 불가
- 반드시
전체 흐름 구조
Entry → bot
bot 실행
Conditional Edge 판단
- Tool 필요 → tools 노드
- Tool 불필요 → END
tools 실행 후 → bot 복귀
반복 후 종료
작동 예시
- 질문: “Tell me about Microsoft”
- LLM → tool_call 생성
- Tavily 검색 실행
- 결과 ToolMessage로 반환
- bot 재실행
- 최종 응답 생성
핵심 구성 요소 정리
- Tools 정의
- Tools 리스트 생성
- Model에 bind_tools
- ToolNode 생성
- Conditional Edge 추가
- Graph compile
- stream() 실행
중요 포인트
- Tool은 LLM이 “직접 실행”하지 않음
- LLM은 Tool 호출 요청 생성
- ToolNode가 실제 실행
- Tool 결과는 다시 모델로 전달
- State가 모든 메시지 유지
구조적 의미
- Node = 실행 단위
- ToolNode = 외부 능력 확장
- Conditional Edge = 의사결정
- State = 기억
결과
- 단순 챗봇 → Tool 기반 에이전트
- 웹 검색 가능
- 최신 정보 활용
- 환각 감소
- 확장 가능 구조 확보
결론
- LangGraph + ToolNode + tools_condition 조합으로
- 코드 간결성 확보
- 유지보수 용이
- 실제 활용 가능한 AI 에이전트 구조 완성
279
문제
- 현재 에이전트는 Tool은 사용 가능
- 그러나 대화 기억(Memory) 없음
- 이전 대화 맥락을 유지하지 못함
- 일관된 대화 흐름 제한
해결 방법
- Checkpointer를 이용해 Memory 추가
- LangGraph의 Thread 기반 상태 저장 구조 활용
Thread 개념
- Thread = 대화 버킷
- 각 Thread는 고유 ID 보유
- 모든 메시지와 상태가 해당 Thread에 저장
- 여러 대화를 ID 기반으로 분리 가능
Checkpointer 역할
각 노드 실행 사이 상태 저장
실행 중 상태를 저장 및 복원 가능
장점
- 장기 실행 프로세스 지원
- Fault tolerance
- 분산 실행 가능
- 실행 중단 후 재개 가능
SQLiteSaver 사용
from langgraph.checkpoint.sqlite import SqliteSavermemory = SqliteSaver.from_conn_string("memory")- compile 시 checkpointer 전달
graph = builder.compile(checkpointer=memory)
Thread 설정
- config 객체 생성
{ "configurable": { "thread_id": "1" } }- 모든 메시지는 해당 thread에 저장
- stream 호출 시 config 전달
stream 호출 방식 변경
graph.stream(input, config=config, stream_mode="values")- 두 번째 인자로 config 전달
- 해당 thread에 상태 누적
동작 예시
입력 1
- “My name is Bond”
입력 2
- “Do you remember my name?”
결과
- 모델이 이름 기억
입력 확장
- “I have been happy for 100 years”
- 이후
- “How long have I been happy?”
결과
- 100년 정보 기억
핵심 이해
- Memory는 자동으로 state에 저장
- Checkpointer가 노드 간 상태를 지속 저장
- Thread ID 기반으로 대화 구분
- 동일 thread_id → 동일 기억 유지
- 다른 thread_id → 새로운 대화 시작
Snapshot 조회
snapshot = graph.get_state(config)- 현재 상태 확인 가능
- 모든 누적 메시지 포함
- 대화 전체 히스토리 확인 가능
구조 요약
- State = 메시지 저장소
- Checkpointer = 상태 저장 메커니즘
- Thread = 대화 단위 컨테이너
- Config = thread 연결 정보
결과
- Tool 사용 가능
- 대화 기억 가능
- 장기 대화 가능
- 맥락 기반 응답 가능
- 실제 서비스 수준 구조 완성
최종 의미
LangGraph + Tool + Conditional Edge + Memory
완전한 자율형 AI 에이전트 아키텍처 구현
확장 시
- 외부 DB 저장 가능
- 멀티 사용자 세션 관리 가능
- 장기 기억 시스템 구축 가능
280
목표
- 에이전트에 Human-in-the-Loop 추가
- Tool 실행 전에 인간 승인 가능하도록 구성
왜 Human-in-the-Loop가 필요한가
- 에이전트는 LLM + Tool에 의존
- Tool 오류 가능성 존재
- 잘못된 검색 / 잘못된 실행 가능
- 중요한 작업 전 인간 검증 필요
구현 방식
compile()시interrupt_before사용- 예
compile(checkpointer=memory, interrupt_before=["tools"])
- 의미
- tools 노드 실행 전에 중단
동작 구조
- User Input
- → bot 노드
- → Tool 호출 필요 판단
- → tools 실행 직전 인터럽트 발생
- → 인간 개입 가능
- → 승인 후 계속 실행
interrupt 옵션
interrupt_before- 특정 노드 실행 전에 중단
interrupt_after- 특정 노드 실행 후 중단
실행 흐름 설명
- 입력
- “Could you research astrology for me?”
- LLM 판단
- Tavily 검색 필요
- tools 노드 직전 인터럽트 발생
graph.get_state(config)로 상태 확인- next step 정보 확인
- 호출될 tool 확인 가능
- tool name
- tool arguments
- tool_call_id
- 입력
인터럽트 시 확인 가능한 정보
- 호출될 tool 목록
- 전달될 query
- JSON payload 구조
- 실행 전 검토 가능
승인 후 흐름
- None 전달 → 계속 실행
- Tool 실행
- Tool 결과 반환
- bot 재실행
- 최종 응답 생성
구조 요약
- State = 대화 기억
- Checkpointer = 상태 저장
- Conditional Edge = Tool 분기
- ToolNode = Tool 실행
- Interrupt = 인간 개입 지점
장점
- 안전성 향상
- 고위험 작업 전 승인 가능
- 민감 데이터 접근 제어
- 감사(Audit) 가능 구조
확장 가능성
- 특정 Tool만 인터럽트
- 특정 조건에서만 인터럽트
- 자동 승인 + 수동 승인 혼합
- 멀티 사용자 승인 시스템 구축
최종 이해
- LangGraph는
- 자율 에이전트 구현 가능
- 메모리 추가 가능
- Tool 확장 가능
- Human-in-the-loop 삽입 가능
- 즉
- 완전 자동화 + 인간 감독 구조를
- 동시에 설계할 수 있는 프레임워크
- LangGraph는
281
섹션 전체 요약
- LangGraph 기반 AI 에이전트 직접 구현
- 단순 구조 → 점진적 확장
단계별 발전 과정
1️⃣ 기본 에이전트
- Entry → Bot → End
- 단순 LLM 응답 구조
2️⃣ Tools 추가
- Tavily 검색 연동
- Conditional Edge 구성
- ToolNode 사용
- 외부 데이터 활용 가능
3️⃣ Memory 추가
- Checkpointer 사용
- SQLiteSaver 적용
- Thread 기반 상태 관리
- 대화 맥락 유지
4️⃣ Human-in-the-Loop 추가
- interrupt_before 사용
- Tool 실행 전 인간 개입 가능
- 승인/검토 기반 실행 구조
핵심 개념 정리
- State = 대화 및 실행 상태
- Node = 실행 단위
- Conditional Edge = 의사결정 로직
- ToolNode = 외부 능력 확장
- Checkpointer = 상태 저장
- Thread = 대화 단위
- Interrupt = 인간 개입 지점
구조적 이해
- 단순 챗봇 →
- Tool 기반 자율형 에이전트 →
- Memory 기반 컨텍스트 에이전트 →
- Human-in-the-loop 감독형 에이전트
의미
LangGraph는
- 에이전트 구조를 체계적으로 설계 가능
- 확장성과 안정성 확보 가능
- 실제 서비스 수준 아키텍처 구현 가능
다음 단계
- 실제 실무에 가까운
- Full-fledged AI Agent 구축
- Tools + Memory + Human-in-the-loop 통합
- 현실 세계 문제 해결용 구조 구현
결론
지금까지는 개념 + 구조 이해 단계
다음 섹션에서
- 실전형 에이전트 완성 단계로 진입
284
목표
- Finance Agent의 전체 노드 구현
- 단계별 워크플로우 구성
- 분석 → 경쟁사 조사 → 비교 → 비평 → 수정 → 최종 보고서
구조 원칙
- 모든 노드는
state: AgentState입력 - 각 노드는 상태를 읽고 수정
- 결과를 다시 state에 저장
- 그래프는 순환 구조
- 모든 노드는
1️⃣ Gather Financials Node
역할
- CSV 파일을 Pandas로 로드
- DataFrame → 문자열 변환 (
df.to_string()) - 사용자 task + 재무 데이터 결합
메시지 구성
- System: “You are an expert financial analyst…”
- Human: task + financial_data
출력
- 재무 요약 결과
- state에 financial_data 업데이트
2️⃣ Analyze Data Node
역할
- 내부 재무 데이터 심층 분석
System: Analyze Data Prompt
Human: financial_data
출력
- analysis 결과
- state.analysis 저장
3️⃣ Research Competitors Node
역할
- state.competitors 순회
- 구조화 출력 사용 (
with_structured_output) - Queries 모델 기반 쿼리 생성
흐름
- 각 competitor → 최대 3개 검색 쿼리 생성
- Tavily 검색 수행
- 결과 content 리스트에 append
출력
- competitor_data 저장
4️⃣ Compare Performance Node
역할
- 내부 분석 + 경쟁사 데이터 결합
- 비교 분석 수행
입력
- task
- analysis
- competitor_data
System: Compare Performance Prompt
출력
- comparison 결과
- revision_number + 1
5️⃣ Research Critique Node
역할
- 초안에 대한 비평 보완
Structured Output 사용
최대 3개 쿼리 생성
Tavily 검색 반복
content 누적
출력
- 보완 데이터 업데이트
6️⃣ Write Report Node
역할
- 최종 보고서 작성
System: Write Report Prompt
Human:
- analysis
- comparison
- critique 보완 결과
출력
- report 생성
- state.report 저장
7️⃣ Should Continue Node
역할
- revision_number 확인
조건
- revision_number > max_revisions → END
- 그렇지 않으면 → feedback 수집 후 루프
설계 핵심 포인트
메시지를 append해야 하는 이유
- 에이전트는 점진적으로 정보 축적
- 이전 단계 정보 유지 필수
- overwrite하면 컨텍스트 손실
Structured Output 사용 이유
- 검색 쿼리 정확성
- JSON 구조 강제
- 안정적 Tool 호출
Cyclic 구조
- Compare → Critique → Rewrite → Check
- 조건 충족 시 종료
전체 흐름 요약
- Gather Financials
- → Analyze
- → Research Competitors
- → Compare
- → Critique
- → Rewrite
- → Check Revision
- → 반복 또는 종료
의미
- 단순 챗봇이 아님
- 도메인 특화 다단계 분석 시스템
- 반복 수정 가능한 리포트 생성 에이전트
- 실제 업무 자동화 구조
다음 단계
- StateGraph 생성
- 노드 추가
- Conditional Edge 연결
- 루프 구성
- Full Finance Agent 완성
286
목표
- 모든 노드를 그래프에 연결
- Finance Agent 전체 워크플로우 완성
- 실제 실행 테스트
Graph 생성
builder = StateGraph(AgentState)- AgentState에는
- task
- competitors
- financial_data
- analysis
- comparison
- report
- revision_number
- max_revisions 포함
노드 등록
- gather_financials
- analyze_data
- research_competitors
- compare_performance
- collect_feedback
- research_critique
- write_report
Entry Point 설정
- 시작 노드:
gather_financials - 첫 단계는 항상 CSV 분석
- 시작 노드:
Conditional Edge 설정
- compare_performance → should_continue
- 조건
- revision_number > max_revisions → END
- 아니면 → collect_feedback
Edge 연결 흐름
- gather_financials → analyze_data
- analyze_data → research_competitors
- research_competitors → compare_performance
- collect_feedback → research_critique
- research_critique → compare_performance
- compare_performance → write_report
Memory 추가
- Checkpointer 적용
- thread_id 기반 상태 저장
- 전체 워크플로우 동안 상태 유지
실행 입력 구성
- task:
- “Analyze the financial performance…”
- competitors:
- Microsoft
- Nvidia
- CSV 경로 전달
- max_revisions 설정
- revision_number 초기값 1
- task:
실행 결과 흐름
- CSV 읽기
- 재무 데이터 분석
- CAGR 계산
- 수익/비용 분석
- 경쟁사 검색 (Tavily 활용)
- 경쟁사 정보 수집
- 비교 분석 수행
- 보고서 초안 작성
- 자체 비평 수행
- 재검색 및 보완
- 재작성
- 반복 (revision loop)
- 최종 보고서 생성
중요한 특징
- 멀티스텝 분석
- Tool 기반 외부 데이터 활용
- 반복 수정 구조
- 상태 기반 워크플로우
- 자동 비평 루프 포함
구조적 의미
- 단순 챗봇 아님
- 자율 분석 시스템
- 문서 생성 엔진
- 반복 개선 알고리즘 내장
핵심 통찰
- 패턴은 동일
- State
- Node
- Edge
- Conditional Edge
- Loop
- Tool
- Memory
- 도메인만 바뀌었을 뿐 구조는 동일
- 패턴은 동일
최종 의미
- 실제 실무형 AI Agent 완성
- CSV → 분석 → 경쟁사 비교 → 보고서 작성 자동화
- 이 구조를 다른 도메인에 그대로 적용 가능
- 확장성 매우 높음
다음 단계
- UI 추가
- 결과 시각화
- 사용자 친화적 인터페이스 구축
결론
- 이제 단순한 Agent 수준이 아님
- 완전한 업무 자동화 AI 시스템
- 구조를 이해하면 어떤 산업에도 적용 가능
287
목표
- AI Agent 성능 최적화 전략 이해
- 비용 절감 + 속도 향상 + 안정성 개선
1️⃣ 모델 최적화
작은 모델 사용
- 단순 작업 → 경량 모델
- 복잡 분석 → 대형 모델
예
- 요약 → 작은 모델
- 심층 분석 → GPT-4
장점
- 비용 절감
- 응답 속도 향상
2️⃣ 모델 양자화 (Quantization)
- 모델 파라미터 압축
- 모델 크기 감소
- 추론 속도 개선
- 정확도 손실 최소화
- 온프레미스 환경에 특히 유리
3️⃣ 파인튜닝 (Fine-tuning)
- 도메인 특화 데이터 학습
- 재무 분석, 법률, 의료 등 특화 가능
- 프롬프트 의존도 감소
- 더 일관된 응답
4️⃣ 병렬 처리 (Parallel Processing)
- 경쟁사 조사 노드에 적용 가능
- 각 competitor 검색 병렬 실행
- Spark, Dask 등 분산 프레임워크 활용
- 대량 데이터 처리 시 효과적
5️⃣ 배치 처리 (Batch Processing)
- 여러 요청을 묶어서 처리
- API 호출 횟수 감소
- 처리량 증가
- 대규모 시스템에서 유리
6️⃣ 캐싱 (Caching)
TTLCache 사용 가능
자주 조회되는 결과 저장
중복 계산 제거
API 호출 비용 절감
예
- 동일 competitor 검색 결과 재사용
7️⃣ 전처리 (Pre-processing)
- 불필요한 데이터 필터링
- CSV 정리
- 중복 제거
- irrelevant 정보 제거
- 모델 입력 토큰 감소
Finance Agent에 적용 가능한 최적화 지점
Gather 단계
- CSV 필터링
- 필요한 컬럼만 전달
Research 단계
- 병렬 검색
- 검색 결과 캐싱
Compare 단계
- 불필요 데이터 제거 후 전달
Report 단계
- 요약 모델 분리 사용
구조적 최적화 전략
- 작은 모델 + 큰 모델 혼합 사용
- Tool 호출 최소화
- 반복 루프 횟수 제한
- revision 최소화
비용 최적화
- 토큰 수 감소
- 중복 검색 방지
- 캐시 적극 활용
- 구조화 출력 사용으로 재시도 감소
핵심 통찰
Agent 성능 =
- 모델 선택
- 데이터 품질
- 병렬 처리
- 캐싱 전략
- 프롬프트 설계
결론
- Agent는 “완성”이 아니라 “계속 최적화” 대상
- 구조는 이미 완성
- 이제는 효율, 비용, 확장성 개선 단계
- 실무에서는 최적화가 곧 경쟁력
288
전체 과정 요약
1️⃣ 에이전트 기초
AI Agent 개념 이해
핵심 특징 학습
- 자율성
- 목표 중심성
- 학습 및 적응
주요 활용 사례 분석
2️⃣ 수동 구현 단계
- OpenAI API 기반 간단한 Agent 구현
- Thought → Action → Observation 구조 이해
- Tool 호출 로직 직접 구현
- 루프 자동화 구조 설계
3️⃣ LangGraph 도입
- 그래프 기반 에이전트 설계
- Node
- Edge
- Conditional Edge
- Entry / End 구조
- 상태 머신 개념 이해
4️⃣ 기능 확장
Tool 추가
- Tavily 검색 연결
- ToolNode + Conditional routing
Memory 추가
- Checkpointer 사용
- Thread 기반 상태 저장
- 대화 맥락 유지
Human-in-the-Loop
- interrupt_before
- Tool 실행 전 승인 가능
5️⃣ Full Finance Agent 구축
- CSV 재무 데이터 분석
- 경쟁사 검색
- 비교 분석
- 자동 비평 루프
- 반복 수정 구조
- 최종 보고서 생성
6️⃣ GUI 구현
- Streamlit 기반 UI
- 에이전트 실행 시각화
- 실제 사용 가능한 인터페이스 구축
핵심 학습 포인트
- 에이전트는 단순 챗봇이 아님
- 구조화된 워크플로우 시스템
- State 기반 설계 중요
- Tool + Memory + Loop 조합이 핵심
- 반복 개선 구조가 품질을 높임
가장 중요한 부분
Finance Agent 구조를 깊이 이해할 것
해당 구조를
- 조직
- 개인 프로젝트
- 특정 산업 도메인 에 맞게 확장 가능
최종 메시지
이제 기본기가 완성됨
구조 이해 → 응용 가능
도메인만 바꾸면
- 리서치 Agent
- 법률 분석 Agent
- 의료 분석 Agent
- 내부 데이터 분석 Agent 모두 구축 가능
결론
- 이것은 시작점
- 이미 강력한 기반 확보
- 이제는 확장, 최적화, 실제 문제 해결 단계
- 스스로 Agent를 설계하고 개선할 수 있는 수준 도달