LLM 개발환경 세팅
시스템 환경
그래픽카드 : Intel(R) UHD Graphics 770 128MB // GPU는 거의 없다고 보시면됩니다...
램 : 16.0GB
프로세서 : 12th Gen Intel(R) Core(TM) i7-12700(2.10 GHz)
사전준비
1. Ollama 설치
Download Ollama on macOS
Download Ollama for macOS
ollama.com
2. VSCode 설치
https://code.visualstudio.com/download
Download Visual Studio Code - Mac, Linux, Windows
Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.
code.visualstudio.com
3.python 설치
https://www.python.org/downloads/
Download Python
The official home of the Python Programming Language
www.python.org
LLM 모델 설치
vscode에서 터미널을 열고 아래 명령어를 입력해서 llm모델을 내려받습니다.
저는 제 컴퓨터성능에 맞게 qwen2.5:7b-instruct 모델을 선택했습니다.
ollama pull qwen2.5:7b-instruct

설치가 다되면 아래 명령어로 테스트를 해봅니다.
ollama run qwen2.5:7b-instruct "한 줄로 자기소개해줘"

시스템 구조
[사용자(브라우저/앱)]
│ (HTTP POST /chat, JSON: {text:"..."})
▼
[mini 서버: FastAPI @ :8200]
- 프롬프트 구성(시스템/유저)
- Ollama API 호출 (/api/generate)
│ (HTTP POST → http://127.0.0.1:11434)
▼
[Ollama 서버 @ :11434]
- 로컬에 받은 Qwen2.5 7B Instruct 모델로 토큰 생성
- 응답 텍스트 반환
▲
│
[mini 서버]
- 응답 가공(필요시: 툴콜 결과 합치기, 포맷팅)
- 최종 JSON 응답
▲
│ (HTTP 응답: {reply:"..."} )
└────────────── 사용자 화면에 표시
Ollama 는 로컬 LLM 엔진입니다. pull로 모델을 PC에 다운로드해두고, HTTP API(11434)로 질문을 받아 답변을 생성합니다.
mini 서버 : 클라이언트가 직접 Ollama에 붙지 않도록 중계(BFF) 역할을 합니다.
클라이언트 : /chat 같은 단일 API만 호출하면 되므로 단순해집니다.
여기서 mini서버
보안(로컬 포트/ 토큰 숨김), 프롬프트 템플릿 관리, 툴콜(Influx/SQL/날씨/RAG) 결과를 합쳐 문장형 응답으로 가공하기 좋습니다.
파이썬 개발환경 세팅
1) 가상환경 생성 및 실행
python -m venv .venv
. .\.venv\Scripts\Activate.ps1
2) 라이브러리 설치
pip install fastapi uvicorn[standard] httpx python-dotenv
3) 환경변수 세팅
$env:OLLAMA_BASE="http://127.0.0.1:11434"
$env:LLM_MODEL="qwen2.5:7b-instruct"
참고로 11434는 ollama서버 기본포트입니다.
4) 파이썬파일 생성 mini_server.py
import os, httpx
from fastapi import FastAPI
from pydantic import BaseModel
OLLAMA_BASE = os.getenv("OLLAMA_BASE", "http://127.0.0.1:11434")
LLM_MODEL = os.getenv("LLM_MODEL", "qwen2.5:7b-instruct")
app = FastAPI(title="LLM Smoke Test")
class ChatReq(BaseModel):
text: str
@app.post("/chat")
async def chat(req: ChatReq):
sys_prompt = "너는 샌드위치 판매원이다. 어떻게 해서든 팔아야한다."
prompt = f"<|system|>{sys_prompt}\n<|user|>{req.text}\n<|assistant|>"
payload = {"model": LLM_MODEL, "prompt": prompt, "stream": False, "options": {"num_predict": 256}}
async with httpx.AsyncClient(base_url=OLLAMA_BASE, timeout=60) as cli:
r = await cli.post("/api/generate", json=payload)
r.raise_for_status()
return {"reply": r.json().get("response", "").strip()}
실행
uvicorn mini_server:app --reload --port 8200
Invoke-RestMethod -Method POST -Uri http://localhost:8200/chat `
-Body (@{ text = "안녕" } | ConvertTo-Json) `
-ContentType "application/json" `
| Select-Object -ExpandProperty reply
결과
