집에서 무료로 에이전트 구축하기: 오픈소스 도구와 모델
무료 도구와 오픈소스 모델만으로 노트북에서 작동하는 멀티 에이전트 시스템을 구축할 수 있다. 신용카드도, API 속도 제한도, 벤더 종속도 없다. 대신 치러야 할 대가는? 느린 추론과 약간 낮은 능력. 하지만 학습, 실험, 소규모 자동화에는 충분하다.
이 가이드를 마치면, 자신의 하드웨어에서 동작하는 로컬 리서치 에이전트가 생긴다 — 웹 검색, 파일 읽기, 정보 종합 — 완전히 무료로.
오픈소스 에이전트 개발의 이유
비용 현실
Claude API 가격은 프로덕션 워크로드에는 합리적이지만, 학습과 실험은 금세 쌓인다. 로컬 추론은 이 걱정을 완전히 없애준다 — 한계 비용 제로로 무한한 반복.
프라이버시와 데이터 제어
일부 워크로드는 클라우드 API로 보낼 수 없다. 환자 데이터, 독자적인 코드, 민감한 비즈니스 로직 — 이 모든 것이 자신의 머신에 남아 있는 것이 유리하다. 로컬 모델은 데이터가 하드웨어를 떠나지 않고 동일한 지능적인 동작을 제공한다.
현실 확인
7~13B 파라미터의 오픈소스 모델은 복잡한 추론, 코드 생성, 지시 따르기에서 프론티어 모델보다 눈에 띄게 뒤처진다. 정확도가 중요한 프로덕션에서는 상업용 API가 여전히 최선이다. 학습과 프로토타이핑에는 로컬 모델이 훌륭하다.
오픈소스 LLM 선택
LLM 패밀리
- Llama (Meta): 가장 광범위하게 지원되는 패밀리. Llama 3이 특히 우수.
- Mistral: 뛰어난 품질/파라미터 비율. Mistral-7B는 크기를 뛰어넘는 성능.
- Phi (Microsoft): 매우 효율적인 소형 모델. Phi-3 Mini는 GPU 없이 실행.
- Qwen (Alibaba): 강력한 다국어 성능.
모델 크기와 하드웨어 요구사항
| 모델 | 파라미터 | 양자화 | VRAM | 속도 | 품질 |
|---|---|---|---|---|---|
| Phi-3 Mini | 3.8B | 4-bit | 4GB | 매우 빠름 | 좋음 |
| Mistral-7B | 7B | 4-bit | 8GB | 빠름 | 좋음 |
| Llama-3-8B | 8B | 4-bit | 8GB | 빠름 | 매우 좋음 |
| Llama-3-13B | 13B | 4-bit | 10GB | 중간 | 매우 좋음 |
| Mixtral-8x7B | 46.7B (MoE) | 4-bit | 24GB | 느림 | 탁월 |
양자화: 왜 중요한가
양자화는 메모리 사용량을 줄이기 위해 모델 가중치를 압축한다. 7B 파라미터 모델은 전체 정밀도에서 ~28GB RAM이 필요하다. 같은 모델이 4-bit 양자화에서는 ~4GB만 필요하며, 품질 손실은 최소화된다.
하드웨어별 시작점:
- 노트북 (8~16GB RAM): Phi-3 Mini 또는 4-bit Mistral-7B
- 중간급 GPU 데스크톱: GPU 가속으로 Mistral-7B 또는 Llama-3-8B
- 고성능 GPU 데스크톱: 4-bit Mixtral-8x7B 또는 Llama-3-70B
로컬 추론 설정
Ollama: 가장 쉬운 시작점
# macOS에 설치brew install ollama
# Linux에 설치curl -fsSL https://ollama.com/install.sh | sh
# Mistral-7B 다운로드ollama pull mistral
# 느린 하드웨어를 위한 가벼운 옵션ollama pull phi3
# 추론 서버 시작ollama serve작동 확인:
curl http://localhost:11434/api/generate -d '{ "model": "mistral", "prompt": "AI 에이전트가 무엇인지 한 문장으로 설명해줘.", "stream": false}'LM Studio: GUI 대안
LM Studio는 모델을 다운로드하고 실행하기 위한 그래픽 인터페이스를 제공하는 데스크톱 애플리케이션. OpenAI 호환 API 엔드포인트를 노출한다.
오픈소스 에이전트 프레임워크
| 프레임워크 | 최적 용도 | 학습 곡선 |
|---|---|---|
| LangChain | 광범위한 도구 지원 | 중간 |
| LangGraph | 상태 머신 워크플로우 | 중간-높음 |
| AutoGen | 멀티 에이전트 대화 | 낮음 |
| CrewAI | 역할 기반 멀티 에이전트 | 낮음-중간 |
AutoGen 또는 LangChain으로 시작하자. AutoGen은 프로토타이핑이 더 빠르다; LangChain은 에이전트 루프에 더 많은 제어를 준다.
첫 번째 에이전트 구축: 로컬 리서치 어시스턴트
환경 설정
python3 -m venv agent-envsource agent-env/bin/activatepip install langchain langchain-ollama langchain-community duckduckgo-search완전한 에이전트
#!/usr/bin/env python3"""Ollama + LangChain을 사용한 로컬 리서치 에이전트사전 요구사항: - ollama serve (백그라운드에서 실행 중) - ollama pull mistral - pip install langchain langchain-ollama langchain-community duckduckgo-search"""
import jsonfrom langchain_core.tools import toolfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_ollama import ChatOllamafrom langchain.agents import AgentExecutor, create_react_agentfrom duckduckgo_search import DDGS
@tooldef search_web(query: str) -> str: """DuckDuckGo를 사용하여 웹에서 정보를 검색한다.""" try: with DDGS() as ddgs: results = list(ddgs.text(query, max_results=5)) if not results: return "결과를 찾을 수 없습니다." return json.dumps( [{"title": r["title"], "snippet": r["body"], "url": r["href"]} for r in results], indent=2, ensure_ascii=False ) except Exception as e: return f"검색 실패: {e}"
@tooldef read_file(filepath: str) -> str: """로컬 파일을 읽고 내용을 반환한다.""" try: with open(filepath, "r") as f: return f.read() except FileNotFoundError: return f"파일을 찾을 수 없음: {filepath}"
@tooldef calculate(expression: str) -> str: """단순 산술 표현식을 안전하게 평가한다.""" try: result = eval(expression, {"__builtins__": {}}, {}) return str(result) except Exception as e: return f"계산 오류: {e}"
llm = ChatOllama( model="mistral", base_url="http://localhost:11434", temperature=0.3,)
prompt = ChatPromptTemplate.from_messages([ ("system", """당신은 리서치 어시스턴트입니다. 도구를 사용하여 질문에 답하세요.
사용 가능한 도구: {tool_names}도구 설명: {tools}
이 형식을 정확히 따르세요:Thought: 무엇을 알아내야 하는가?Action: 도구_이름Action Input: 도구에 대한 입력Observation: 도구 결과... (필요에 따라 반복)Thought: 이제 충분한 정보가 있다.Final Answer: 완전한 답변"""), ("user", "{input}"), ("placeholder", "{agent_scratchpad}"),])
tools = [search_web, read_file, calculate]agent = create_react_agent(llm, tools, prompt)agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, max_iterations=8, handle_parsing_errors=True,)
if __name__ == "__main__": result = agent_executor.invoke({ "input": "지금 가장 인기 있는 오픈소스 LLM 세 가지는 무엇인가? 이름과 각각의 주요 특징을 알려줘." }) print(f"\n최종 답변:\n{result['output']}")실행
# 터미널 1: Ollama 시작ollama serve
# 터미널 2: 에이전트 실행python research_agent.py기능 확장: API 없는 도구
로컬 데이터베이스 접근
import sqlite3
@tooldef query_database(sql: str) -> str: """로컬 데이터베이스에 읽기 전용 SQL 쿼리를 실행한다.""" try: conn = sqlite3.connect("data.db") cursor = conn.cursor() cursor.execute(sql) rows = cursor.fetchall() columns = [desc[0] for desc in cursor.description] conn.close() return json.dumps([dict(zip(columns, row)) for row in rows], indent=2) except Exception as e: return f"데이터베이스 오류: {e}"임베딩을 사용한 로컬 문서 검색
pip install sentence-transformers chromadbfrom sentence_transformers import SentenceTransformerimport chromadb
model = SentenceTransformer("all-MiniLM-L6-v2")client = chromadb.Client()collection = client.create_collection("docs")
@tooldef search_docs(query: str) -> str: """의미적 유사성으로 로컬 문서를 검색한다.""" results = collection.query( query_embeddings=[model.encode(query).tolist()], n_results=3 ) return json.dumps(results["documents"][0], indent=2)실제 제약과 해결책
지연 시간
추론 단계마다 2~30초를 예상하자. 전략:
- 더 적은 단계로 에이전트 설계하기; 단순할수록 빠르다
- 가능하면 도구 호출을 묶기
정확도 차이
완화 전략:
- 더 짧고 명확한 프롬프트 — 예상 형식을 정확히 지정하라
- 복잡한 작업을 단계로 나누기
- 에이전트에 반환하기 전에 도구 출력 검증하기
- 도구 사용 시 0.1~0.3의 온도 사용
배포: 노트북에서 항상 켜진 상태로
Docker
FROM python:3.12-slimRUN pip install langchain langchain-ollama langchain-community duckduckgo-searchCOPY research_agent.py .ENV OLLAMA_HOST=host.docker.internal:11434CMD ["python3", "research_agent.py"]Systemd 서비스 (Linux)
sudo systemctl enable ollamasudo systemctl start ollama더 깊이: 집에서의 멀티 에이전트 시스템
def run_pipeline(question: str) -> str: research_result = researcher.invoke({"input": question}) final_output = writer.invoke({ "input": f"이 연구를 바탕으로 명확한 요약을 작성하세요:\n{research_result['output']}" }) return final_output["output"]오픈소스 에이전트 개발은 오늘날 실용적이다. 경로는 이렇다: 추론에 Ollama, 에이전트 루프에 LangChain 또는 AutoGen, 검색에 DuckDuckGo, 나머지 모든 것에 자신의 머신 파일 시스템.
단순하게 시작하자 — 위의 리서치 에이전트. 동작하게 만들자. 그런 다음 두 번째 도구를 추가하자. 그런 다음 두 번째 에이전트를.