문서/LangChain/LangChain Agents 구현

LangChain Agents 구현

LangChain으로 AI Agent 구현하기

LangChain Agents 구현 가이드

LangChain을 사용하여 도구를 활용하는 AI Agent를 구현하는 방법을 알아봅니다.

Agent 기본 구현

from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
from langchain.tools import tool

# 1. 도구 정의
@tool
def search(query: str) -> str:
    """웹에서 정보를 검색합니다."""
    # 실제 검색 로직
    return f"검색 결과: {query}"

@tool
def calculator(expression: str) -> str:
    """수학 계산을 수행합니다."""
    try:
        return str(eval(expression))
    except:
        return "계산 오류"

# 2. LLM 설정
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 3. 프롬프트 로드
prompt = hub.pull("hwchase17/react")

# 4. Agent 생성
tools = [search, calculator]
agent = create_react_agent(llm, tools, prompt)

# 5. 실행기 생성
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True
)

# 6. 실행
result = agent_executor.invoke({
    "input": "서울의 인구수에 2를 곱하면?"
})

Tool Calling Agent (권장)

from langchain.agents import create_tool_calling_agent

# OpenAI Function Calling 사용
agent = create_tool_calling_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True
)

Structured Chat Agent

from langchain.agents import create_structured_chat_agent

# 복잡한 입력을 처리하는 Agent
agent = create_structured_chat_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=10
)

커스텀 도구 고급 패턴

복잡한 입력 스키마

from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description="검색할 내용")
    max_results: int = Field(default=5, description="최대 결과 수")
    language: str = Field(default="ko", description="언어 코드")

@tool(args_schema=SearchInput)
def advanced_search(query: str, max_results: int, language: str) -> str:
    """고급 웹 검색을 수행합니다."""
    return perform_search(query, max_results, language)

비동기 도구

@tool
async def async_fetch(url: str) -> str:
    """URL의 내용을 비동기로 가져옵니다."""
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

Agent 메모리

from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(
    memory_key="chat_history",
    k=5,  # 최근 5개 대화만 유지
    return_messages=True
)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True
)

에러 처리

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=True,  # 파싱 오류 자동 처리
    max_iterations=15,            # 최대 반복 횟수
    max_execution_time=60,        # 최대 실행 시간 (초)
    early_stopping_method="force" # 강제 중단
)