LLM Agent
기존의 LLM은 정적인 응답 생성에 머물렀다면, Agent는 다음과 같은 능력을 가짐
- 사용자의 지시를 이해하고 목표로 변환
- 문제를 여러 단계로 분해
- 필요시 외부 도구(API, 검색엔진, 계산기 등)를 사용
- 결과를 검토하고 반복 시도 또는 조정
- 궁극적으로 목표에 도달
요소 | 역할 |
LLM | 추론과 응답 생성의 두뇌 |
Tool | 외부 정보/기능 접근 수단 |
Planning | 목표 달성 전략 수립 |
Memory | 장기 기억 또는 대화 맥락 저장 |
Planning without feedback
- 한 번 계획 → 그대로 실행
- 작업 흐름이 예측 가능하고 안정적
- 구현이 간단하고 디버깅이 쉬움
- 처음 계획이 잘못됐을 경우, 전체 결과가 무의미해질 수 있음
- 중간 단계의 실패를 무시하고 계속 진행됨
Planning with feedback
- ReAct (Reasoning + Acting)를 수행하도록 Prompt를 구성
- 생각(Thought) : 현재 상황이나 문제 분석 후 행동 계획
- 행동(Action) : 계획된 행동 실행
- 관찰(Observation) : 결과 관찰 및 기록
- 반복
- 매 단계마다 생각하고 행동하므로 유연하게 반응 가능 / 매 단계마다 생각/도구 사용을 반복해야 해서 속도 느림
- 복잡한 문제도 여러 단계로 나눠 해결 가능 / 여러 번의 LLM 호출과 Tool 사용이 필요
- 중간 "Thought"가 있어 모델의 사고 과정 추적 가능 / 중간 단계에서 잘못된 Action 선택 시 전체 실패 가능성 존재
Basic Agent 예시
LlamaIndex의 AgentWorkflow를 이용해 간단한 계산을 수행할 수 있는 LLM Agent를 구성한 코드
# 필수 패키지 설치: LlamaIndex Core, OpenAI 연동 모듈, 환경변수 로더
!pip install --upgrade llama-index-core llama-index-llms-openai python-dotenv
# API 키 설정을 위한 모듈 import
import getpass
import os
# 환경 변수로 OpenAI API 키 설정
os.environ["OPENAI_API_KEY"] = "your API KEY" # 실제 키로 대체 필요
# Jupyter Notebook에서 asyncio 관련 충돌 방지를 위한 설정
import nest_asyncio
nest_asyncio.apply()
# .env 파일로부터 환경변수 로드 (추가 설정이 있다면 여기에 포함됨)
from dotenv import load_dotenv
load_dotenv()
# OpenAI LLM 및 에이전트 워크플로우 관련 클래스 임포트
from llama_index.llms.openai import OpenAI
from llama_index.core.agent.workflow import AgentWorkflow
# 사용자 정의 함수 1: 곱셈 기능
def multiply(a: float, b: float) -> float:
"""두 숫자를 곱해 결과를 반환"""
return a * b
# 사용자 정의 함수 2: 덧셈 기능
def add(a: float, b: float) -> float:
"""두 숫자를 더해 결과를 반환"""
return a + b
# 사용할 OpenAI 모델 설정 (gpt-4o-mini 사용 중)
llm = OpenAI(model="gpt-4o-mini")
# 에이전트 워크플로우 정의:
# multiply, add 함수 두 개를 도구(tool)로 등록
workflow = AgentWorkflow.from_tools_or_functions(
[multiply, add], # 사용할 함수 리스트
llm=llm, # 사용할 LLM
system_prompt="You are an agent that can perform basic mathematical operations using tools."
# LLM에게 주어지는 시스템 프롬프트
)
# 비동기로 실행할 main 함수 정의
async def main():
# 에이전트에게 수식을 전달하고 실행
response = await workflow.run(user_msg="What is 20+(2*4)?")
# 결과 출력
print(response)
# Jupyter 환경에서 비동기 함수 실행
import asyncio
asyncio.run(main())
llama-index에 존재하는 tool을 활용 예시
Llama Hub
A repository of data loaders, agent tools and more to kickstart your RAG application.
llamahub.ai
# 필요한 패키지를 설치 (최신 버전으로 업그레이드)
!pip install --upgrade llama-index-core llama-index-llms-openai python-dotenv llama-index-tools-yahoo-finance
# 환경 변수 설정을 위한 라이브러리와 OS 모듈을 불러옴
import getpass
import os
# OpenAI API 키를 환경 변수로 설정 (본인의 API 키로 변경 필요)
os.environ["OPENAI_API_KEY"] = "your API KEY"
# Jupyter 환경에서 asyncio 이벤트 루프가 충돌하지 않도록 nest_asyncio를 적용합니다
import nest_asyncio
nest_asyncio.apply()
# OpenAI LLM, 에이전트 워크플로우, 야후 파이낸스 툴을 불러옴
from llama_index.llms.openai import OpenAI
from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.tools.yahoo_finance import YahooFinanceToolSpec
# 기본 수학 함수 정의 (곱셈)
def multiply(a: float, b: float) -> float:
"""두 수를 곱한 결과를 반환"""
return a * b
# 기본 수학 함수 정의 (덧셈)
def add(a: float, b: float) -> float:
"""두 수를 더한 결과를 반환"""
return a + b
# OpenAI 모델 인스턴스 생성 (GPT-4o-mini 사용)
llm = OpenAI(model="gpt-4o-mini")
# 야후 파이낸스 툴 생성 후 리스트로 변환
finance_tools = YahooFinanceToolSpec().to_tool_list()
# 여기에 기본 수학 함수(multiply, add)를 툴 목록에 추가
finance_tools.extend([multiply, add])
# 툴 리스트와 LLM을 기반으로 워크플로우 에이전트 생성
workflow = AgentWorkflow.from_tools_or_functions(
finance_tools,
llm=llm,
system_prompt="You are an agent that can perform basic mathematical operations using tools." # 에이전트에게 수학 연산 가능하다는 지시
)
# 비동기 함수로 NVIDIA의 현재 주가를 묻는 쿼리를 실행
async def main():
response = await workflow.run(user_msg="What's the current stock price of NVIDIA?")
print(response)
# 위에서 정의한 main 함수를 실행 (비동기 환경에서 실행)
import asyncio
asyncio.run(main())
# 같은 요청을 한 번 더 실행하려 했지만 이 부분은 오류 발생 가능 (async 함수 밖에서 await 사용 불가)
# 주석 처리하거나 main 함수 내부에서 실행해야 정상 작동
# response = await workflow.run(user_msg="What's the current stock price of NVIDIA?")
# response
# -----------------------------------------------------
# FunctionTool 사용 예시 (사용자 정의 툴을 생성하는 방법)
# 특정 위치의 날씨 정보를 반환하는 함수 정의
def get_weather(location: str) -> str:
"""주어진 위치의 날씨 정보를 반환합니다."""
print(f"Getting weather for {location}")
return f"The weather in {location} is sunny"
# 위 함수를 기반으로 FunctionTool 객체를 생성
from llama_index.core.tools import FunctionTool
tool = FunctionTool.from_defaults(
get_weather, # 실제 실행할 함수
name="my_weather_tool", # 툴 이름
description="Useful for getting the weather for a given location.", # 설명
)
# 생성한 툴을 사용하여 "New York"의 날씨를 요청
tool.call("New York")
RAG Tool Agent 예시
# 필요한 llama-index 관련 패키지 설치
!pip install --upgrade llama-index-core llama-index-llms-openai python-dotenv \
llama-index-agent-openai llama-index-readers-file \
llama-index-embeddings-openai llama-index-vector-stores-chroma
# 기본 패키지 import 및 환경 변수 설정
import getpass
import os
# OpenAI API 키 환경 변수로 설정
os.environ["OPENAI_API_KEY"] = "your API KEY" # 실제 키로 교체하세요
# Jupyter Notebook 환경에서 async 충돌 방지
import nest_asyncio
nest_asyncio.apply()
import asyncio
# llama-index 및 chroma 관련 import
from llama_index.core.vector_stores import VectorStoreInfo
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, StorageContext
from llama_index.core.tools import QueryEngineTool
from llama_index.embeddings.openai import OpenAIEmbedding
import chromadb
# llama-index LLM 및 워크플로우 관련 import
from llama_index.llms.openai import OpenAI
from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.core.workflow import Context
from llama_index.core.workflow import JsonPickleSerializer, JsonSerializer
# Google Drive 마운트 (Colab 전용)
from google.colab import drive
drive.mount('/content/drive')
# 지역별 여행 데이터 경로 지정
seoul_data_path = "/content/drive/MyDrive/Project_data/Travel/수도권"
mid_data_path = "/content/drive/MyDrive/Project_data/Travel/중부지역"
south_data_path = "/content/drive/MyDrive/Project_data/Travel/남부지역"
# OpenAI 임베딩 모델 설정
embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# ---------------------------
# ✅ 벡터 툴 생성 함수 정의
# ---------------------------
def create_vector_tool(directory_path: str, tool_description: str, collection_name: str):
"""
주어진 디렉토리에서 문서를 읽고, 벡터 인덱스를 만들고,
이를 쿼리 가능한 툴로 반환하는 함수입니다.
"""
# 1. 문서 로딩
documents = SimpleDirectoryReader(directory_path).load_data()
# 2. Chroma 클라이언트 및 컬렉션 생성 (인메모리)
chroma_client = chromadb.Client()
chroma_collection = chroma_client.create_collection(name=collection_name)
# 3. 저장 컨텍스트 및 벡터 스토어 초기화
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 4. 문서로부터 벡터 인덱스 생성
vector_index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=embed_model
)
# 5. 쿼리 엔진 생성 (tree_summarize 방식 + 비동기)
query_engine = vector_index.as_query_engine(
response_mode="tree_summarize",
use_async=True
)
# 6. 쿼리 엔진을 툴로 래핑하여 반환
tool = QueryEngineTool.from_defaults(
query_engine=query_engine,
name=collection_name,
description=tool_description
)
return tool
# ---------------------------
# ✅ 지역별 툴 생성
# ---------------------------
# 서울 여행지 추천 툴 생성
seoul_tool = create_vector_tool(
directory_path=seoul_data_path,
tool_description="서울 지역의 여행지를 추천하거나 정보를 제공하는 도구입니다.",
collection_name="travel_seoul"
)
# 중부 지역 여행지 추천 툴 생성
mid_tool = create_vector_tool(
directory_path=mid_data_path,
tool_description="충청, 강원 등 중부 지역 여행지를 추천하는 도구입니다.",
collection_name="travel_mid"
)
# 남부 지역 여행지 추천 툴 생성
south_tool = create_vector_tool(
directory_path=south_data_path,
tool_description="부산, 전라도, 경상도 등 남부 지역 여행지를 추천하는 도구입니다.",
collection_name="travel_south"
)
# seoul_tool이 받을 수 있는 매개변수 스키마 출력 (선택적으로 사용)
schema = seoul_tool.metadata.get_parameters_dict()
print(schema)
# ---------------------------
# ✅ LLM 및 AgentWorkflow 구성
# ---------------------------
# LLM 설정 (GPT-4o-mini)
llm = OpenAI(model="gpt-4o-mini")
# AgentWorkflow 생성: 세 개의 지역 툴을 하나의 에이전트에 연결
workflow = AgentWorkflow.from_tools_or_functions(
tools_or_functions=[seoul_tool, mid_tool, south_tool],
llm=llm,
system_prompt="관광지를 추천해주는 여행 도우미입니다. 사용자의 요청에 따라 적절한 장소 정보를 제공합니다."
)
# Context 객체 생성 (워크플로우 실행 중 상태 추적용)
ctx = Context(workflow)
# ---------------------------
# ✅ 쿼리 실행
# ---------------------------
response = await workflow.run(user_msg="강릉에서 갈만한 관광지를 알려줘.", ctx=ctx)
print(response)
response = await workflow.run(user_msg="대전에서 갈만한 관광지를 알려줘.", ctx=ctx)
print(response)
response = await workflow.run(user_msg="위에서 조사한 내용들을 합쳐서 여행 일정을 만들어줘.", ctx=ctx)
print(response)
GitHub - ahujasid/ableton-mcp
Contribute to ahujasid/ableton-mcp development by creating an account on GitHub.
github.com
'AI' 카테고리의 다른 글
RAG를 활용한 챗봇 개발 - RAG(Retrieval Augmented Generation) (0) | 2025.05.27 |
---|---|
RAG를 활용한 챗봇 개발 - Agentic Prompt (0) | 2025.05.26 |
Multi-Agent with LangGraph (1) | 2025.05.16 |
VectorDB와 RAG (0) | 2025.05.16 |
프롬프트와 LLM 엔지니어링 (0) | 2025.05.16 |