목차
인터넷 연결과 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 phi32단계: 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_agent는 ReAct 패턴을 사용 — 문제를 추론하고, 도구를 행동으로 취하고, 결과를 관찰하는 루프를 반복한다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 같은 다른 모델로 교체해 성능 비교
참고 자료
- Building AI Agents with Local Small Language Models — MachineLearningMastery (2026-04-23)