머신러닝/자연어 처리

Agent

shinetheworld 2025. 2. 25. 15:06

Agent

LangChain 및 기타 LLM 애플리케이션에서 인공지능 시스템이 자율적이고 목표지향적으로 작업을 수행할 수 있게 해 주는 컴포넌트이다.

주어진 목표를 달성하기 위해 환경과 상호작용하며 의사결정을 내리고 행동을 취하는 지능형 개체로 볼 수 있다.

 

주요 특징

1. 자율성: 에이전트는 사전에 정의된 규칙이나 명시적인 프로그래밍 없이도 스스로 결정을 내리고 행동할 수 있다.

2. 목표지향성: 특정 목표나 작업을 달성하기 위해 설계되어 있다.

3. 환경 인식: 주변 환경이나 상황을 인식하고 이에 따라 적응할 수 있다.

4. 도구 사용: 다양한 도구나 API를 활용해 작업을 수행할 수 있다.

5. 연속성: 주어진 목표를 달성하기 위해 1회 수행이 아닌 반복 수행을 통해 목표 달성을 추구한다.

 

LangChain에서의 에이전트 구성요소

1. Agent: 의사결정을 담당하는 핵심 컴포넌트

2. Tools: 에이전트가 사용할 수 있는 기능들의 집합

3. Toolkits: 관련된 도구들의 그룹

4. AgentExecutor: 에이전트의 실행을 관리하는 컴포넌트

 

에이전트의 작동 방식

1. 입력 수신: 사용자로부터 작업이나 질문을 수령

2. 계획 수립: 주어진 작업을 완료하기 위한 단계별 계획을 세움

3. 도구 선택: 각 단계에 적합한 도구를 선택

4. 실행: 선택한 도구를 사용하여 작업을 수행

5. 결과 평가: 수행 결과를 평가하고 필요시 계획 조정

6. 출력 생성: 최종 결과나 답변을 사용자에게 제공

 

활용 사례

  • 정보 검색 및 분석: 웹 검색, 데이터베이스 쿼리 등을 수행
  • 작업 자동화: 복잡한 워크플로우를 자동으로 처리
  • 고객 서비스: 질문에 답변하고 문제 해결
  • 의사 결정 지원: 데이터를 분석하고 권장 사항 제공
  • 창의적 작업: 글쓰기, 코드 생성 등의 창의적 작업 수행

 

장점과 한계

장점

  • 복잡한 작업의 자동화
  • 유연성과 적응성
  • 다양한 도구와의 통합 가능성

한계

  • 제어와 예측 가능성의 어려움
  • 계산 비용과 리소스 요구사항

 

도구(Tools)

에이전트, 체인 또는 LLM이 외부 세계와 상호작용하기 위한 인터페이스

LangChain에서 기본 제공하는 도구를 사용해 쉽게 도구를 활용할 수 있으며, 사용자 정의 도구(Custom Tool)를 쉽게 구축 가능

 

https://python.langchain.com/v0.1/docs/integrations/tools/

 

Tools | 🦜️🔗 LangChain

📄️ Python REPL Sometimes, for complex calculations, rather than have an LLM generate the answer directly, it can be better to have the LLM generate code to calculate the answer, and then run that code to get the answer. In order to easily do that, we

python.langchain.com

# API 키를 환경변수로 관리하기 위한 설정 파일
from dotenv import load_dotenv

# API 키 정보 로드
load_dotenv()

# 출력
# True
# LangSmith 추적 설정 https://smith.langchain.com
# !pip install -qU langchain-teddynote
from langchain_teddynote import logging

# 프로젝트 이름 입력
logging.langsmith("CH15-Tools")

# 출력
# LangSmith 추적을 시작합니다.
# [프로젝트명]
# CH15-Tools
import warnings

# 경고 메시지 무시
warnings.filterwarnings("ignore")

빌트인 도구(Built-in tools)

LangChain에서 제공하는 사전에 정의된 도구(tool)와 툴킷(toolkit)을 사용할 수 있다.

tool은 단일 도구, toolkit은 여러 도구를 묶어 하나의 도구로 사용 가능

 

Python REPL 도구

python 코드를 REPL(Read-Eval-Print Loop) 환경에서 실행하기 위한 주요 클래스 제공

  • python 셸 환경 제공
  • 유효한 python 명령어를 입력으로 받아 실행
  • 결과를 보려면 print() 함수를 사용해야 함

 

주요 특징

  • sanitize_input: 입력을 정제하는 옵션(기본값: True)
  • python_repl: PythonREPL 인스턴스(기본값: 전역 범위에서 실행)

 

사용 방법

  • PythonREPLTool 인스턴스 생성
  • run 또는 arun, invoke 메서드를 사용해 Python 코드 실행

 

입력 정제

입력 문자열에서 불필요한 공백, 백틱, 'python' 키워드 등 제거

from langchain_experimental.tools import PythonREPLTool

# 파이썬 코드를 실행하는 도구 생성
python_tool = PythonREPLTool()

# 파이썬 코드를 실행하고 결과 반환
print(python_tool.invoke("print(100 + 200)"))

# 출력
# 300

 

 

흐름 정리

1. LLM 모델에게 특정 작업을 수행하는 Python 코드를 작성하도록 요청

2. 작성된 코드를 실행해 결과

3. 결과 출력

 

 

from langchain_openai import ChatOpenAI
from langchain_core.prompt import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda

# 파이썬 코드를 실행하고 중간 과정을 출력하고 도구 실행 결과를 반환하는 함수
def print_and_execute(code, debug=True):
	if debug:
    	print("CODE:")
        print(code)
    return python_tool.invoke(code)
    
# 파이썬 코드를 작성하도록 요청하는 프롬프트
prompt = ChatPromptTemplate.from_messages(
	[
    	(
        	"system",
            "You are Raymond Hetting, an expert python programmer, well versed in meta-programming and elegant, concise and short but well documented code. You follow the PEP8 style guide. "
            "Return only the code, no intro, no explanation, no chatty, no markdown, no code block, no nothing. Just the code.",
        ),
        ("human", "{input}"),
    ]
)
# LLM 모델 생성
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 프롬프트와 LLM 모델을 사용해 체인 생성
chain = prompt | llm | StrOutputParser() | RunnableLambda(print_and_execute)

# 결과 출력
print(chain.invoke("로또 번호 생성기를 출력하는 코드를 작성하세요."))
# 출력
# CODE:
# import random
#
# def generate_lotto_numbers():
#	return sorted(random.sample(range(1, 46), 6))
#
# print(generate_lotto_numbers())
# [14, 17, 18, 22, 23, 37]

 

검색 API 도구

Tavily 검색 API를 활용해 검색 기능을 구현하는 도구

TravilySearchResults, TravilyAnswer 와 같은 주요 클래스 제공

 

API 키 발급 주소

https://app.tavily.com/

 

Tavily AI

 

app.tavily.com

 

.env 파일에 아래와 같이 설정

TRAVILY_API_KEY=tvly-blahblahblahblahblahblah

 

TravilySearchResults

Travily 검색 API를 쿼리하고 JSON 형식의 결과 반환

포괄적이고 정확하며 신뢰할 수 있는 결과에 최적화된 검색 엔진

현재 이벤트에 대한 질문에 답변할 때 유용

 

주요 매개변수

  • max_result(int): 반환할 최대 검색 결과 수 (default: 5)
  • search_depth(str): 검색 깊이 ("basic" 또는 "advanced")
  • include_domains(List[str]): 검색 결과에 포함할 도메인 목록
  • exclude_domains(List[str]): 검색 결과에서 제외할 도메인 목록
  • include_answer(bool): 원본 쿼리에 대한 짧은 답변 포함 여부
  • include_raw_content(bool): 각 사이트의 정제된 HTML 콘텐츠 포함 여부
  • include_images(bool): 쿼리 관련 이미지 목록 포함 여부

 

Image 생성 도구 (DALL-E)

DallEAPIWrapper 클래스

OpenAI의 DALL-E 이미지 생성기를 위한 래퍼(wrapper)

DALL-E API를 쉽게 통합해 텍스트 기반 이미지 생성 기능을 구현할 수 있음

다양한 설정 옵션을 통해 유연하고 강력한 이미지 생성 도구로 활용 가능

 

주요 속성

  • model : 사용할 DALL-E 모델 이름 (default: "dall-e-2", "dall-e-3")
  • n : 생성할 이미지 수 (default: 1)
  • size : 생성할 이미지 크기
    • "dall-e-2" : "1024 x 1024", "512 x 512", "256 x 256"
    • "dall-e-3" : "1024 x 1024", "1792 x 1024", "1024 x 1792"
  • style : 생성될 이미지의 스타일 (default: "natural", "vivid")
  • quality : 생성될 이미지의 품질 (default: "standard", "hd")
  • max_retries : 생성 시 최대 재시도 횟수