AI Sparkup

최신 AI 쉽게 깊게 따라잡기⚡

로컬 SLM 튜토리얼 – Ollama와 LangChain으로 AI 에이전트 직접 만들기

인터넷 연결과 API 비용 없이 내 컴퓨터에서 완전히 동작하는 AI 에이전트를 구축하는 방법을 다룬다. local-slm 을 Ollama로 실행하고, LangChain/LangGraph로 도구와 대화 메모리를 갖춘 에이전트를 단계별로 만든다.

누가 활용하면 좋은가

  • 프라이버시가 중요한 데이터를 처리해야 하는 개발자
  • API 비용 없이 AI 에이전트를 학습·프로토타입하고 싶은 입문자
  • 오프라인 환경에서 AI 도구가 필요한 사용자

사전 요구사항

  • Python 3.9 이상
  • 현대 CPU 또는 소비자용 GPU (4GB+ 메모리 권장)

환경 설정

1단계: Ollama 설치 및 모델 다운로드

ollama.com에서 운영체제에 맞는 설치 파일을 받아 설치한다.

# Phi-3 Mini 모델 다운로드 (3.8B, 입문자 권장)
ollama pull phi3

# 동작 확인 (Ctrl+D 또는 /bye로 종료)
ollama run phi3

2단계: Python 라이브러리 설치

python -m venv agent-env
source agent-env/bin/activate  # Windows: agent-env\Scripts\activate

pip install langchain langchain-ollama langgraph

첫 번째 에이전트: 계산기 도구 사용

from langchain_ollama import OllamaLLM
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import tool
from langchain import hub

# 로컬 Phi-3 모델 로드
llm = OllamaLLM(model="phi3")

# 도구 정의 — @tool 데코레이터로 Python 함수를 도구로 만든다
@tool
def calculator(expression: str) -> str:
    """기본 수식을 계산한다. 유효한 Python 수식을 입력할 것."""
    try:
        return str(eval(expression))
    except Exception as e:
        return f"오류: {str(e)}"

tools = [calculator]

# ReAct 패턴 프롬프트 템플릿 로드 (추론 → 행동 → 관찰 반복)
prompt = hub.pull("hwchase17/react")

# 에이전트 생성 및 실행
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

response = agent_executor.invoke({
    "input": "245에 18을 곱하고 5로 나누면?"
})
print(response["output"])

동작 원리:

  • OllamaLLM이 로컬 Phi-3 모델에 연결한다
  • @tool 데코레이터가 일반 Python 함수를 에이전트 도구로 변환한다
  • create_react_agentReAct 패턴을 사용 — 문제를 추론하고, 도구를 행동으로 취하고, 결과를 관찰하는 루프를 반복한다
  • AgentExecutor가 추론-행동-관찰 루프를 관리한다

두 번째 에이전트: 메모리와 다중 도구 추가

실제 어시스턴트처럼 이전 대화를 기억하는 에이전트다.

from langchain_ollama import OllamaLLM
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import tool
from langchain.memory import ConversationBufferMemory
from langchain import hub

llm = OllamaLLM(model="phi3")

@tool
def calculator(expression: str) -> str:
    """기본 수식을 계산한다."""
    try:
        return str(eval(expression))
    except Exception as e:
        return f"오류: {str(e)}"

@tool
def knowledge_base(query: str) -> str:
    """로컬 지식 베이스에서 정보를 조회한다."""
    kb = {
        "python": "Python은 AI·데이터 과학에 널리 사용되는 입문자 친화적 프로그래밍 언어다.",
        "ai agent": "AI 에이전트는 언어 모델을 사용해 추론하고 행동을 취하는 프로그램이다.",
        "ollama": "Ollama는 내 컴퓨터에서 언어 모델을 로컬로 실행하는 도구다.",
    }
    for key in kb:
        if key in query.lower():
            return kb[key]
    return "해당 쿼리에 대한 정보를 찾을 수 없습니다."

tools = [calculator, knowledge_base]

# 대화 기록을 세션 내 유지
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

prompt = hub.pull("hwchase17/react-chat")
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True)

# 멀티턴 대화 테스트
print(agent_executor.invoke({"input": "AI 에이전트가 무엇인가요?"})["output"])
print(agent_executor.invoke({"input": "Ollama는 무엇인가요?"})["output"])
print(agent_executor.invoke({"input": "50에 12를 곱하면?"})["output"])

ConversationBufferMemory가 세션 내 이전 메시지를 보존해 대화 맥락을 유지한다.

보안 주의: eval()은 교육 목적으로만 사용. 실서비스에서는 신뢰하지 않는 입력에 사용하지 말 것.

알려진 한계

  • SLM은 대형 모델보다 추론 능력이 떨어지므로 복잡한 다단계 논리에서 오류가 날 수 있다
  • 응답 속도는 GPU가 없으면 느릴 수 있다 — Phi-3 Mini나 Llama 3.2 3B 같은 경량 모델부터 시작 권장
  • ConversationBufferMemory는 전체 대화를 컨텍스트에 담으므로, 긴 대화에서는 토큰 한도에 걸릴 수 있다

다음 단계

  • 웹 검색, 파일 읽기, 데이터베이스 쿼리 같은 실제 도구로 확장
  • LangGraph로 조건 분기·병렬 처리 등 복잡한 에이전트 워크플로 구현
  • Llama 3.2 같은 다른 모델로 교체해 성능 비교

참고 자료



AI Sparkup 구독하기

최신 게시물 요약과 더 심층적인 정보를 이메일로 받아 보세요! (무료)