danbibibi
article thumbnail
Published 2025. 5. 28. 13:26
Llama index Agents AI

LLM Agent

기존의 LLM은 정적인 응답 생성에 머물렀다면, Agent는 다음과 같은 능력을 가짐

  • 사용자의 지시를 이해하고 목표로 변환
  • 문제를 여러 단계로 분해
  • 필요시 외부 도구(API, 검색엔진, 계산기 등)를 사용
  • 결과를 검토하고 반복 시도 또는 조정
  • 궁극적으로 목표에 도달

요소  역할
LLM 추론과 응답 생성의 두뇌
Tool 외부 정보/기능 접근 수단
Planning 목표 달성 전략 수립
Memory 장기 기억 또는 대화 맥락 저장

 

 

Planning without feedback

  • 한 번 계획 → 그대로 실행
  • 작업 흐름이 예측 가능하고 안정적
  • 구현이 간단하고 디버깅이 쉬움
  • 처음 계획이 잘못됐을 경우, 전체 결과가 무의미해질 수 있음
  • 중간 단계의 실패를 무시하고 계속 진행됨

사용자의 요청(User Request)를 해결하기위한 하위 작업 분석 진행

 

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

 

profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로