참고
로컬 vscode에서 Ollama 서버를 띄워보고, 그 위에 다수 sLLM을 띄워보자.
# Linux 환경
# 0-1) Ollama 설치
curl -fsSL https://ollama.com/install.sh | sh
# 0-2) 서비스 기동
ollama serve # <- 새 터미널에서 계속 켜두기 (기본 포트: 11434)
# Qwen2.5 7B
ollama pull qwen2.5:7b-instruct # Qwen 모델 가중치(및 실행 레시피)가 로컬에 내려옴
ollama run qwen2.5:7b-instruct # Ollama 서버가 그 Qwen 모델을 로드해서 CPU/GPU로 추론
# -- 프롬프트를 바로 입력해 대화 가능
# 설치되어있는 (pull받은) 모델 목록에서 qwen 확인
# grep -i: 대소문자 구분하지 않고 문자열 탐색
ollama serve
ollama list | grep -i qwen
Qwen은 모델이고, Ollama는 그 모델을 내려받아 실행하는 서버 + CLI → ollama가 qwen을 실행해주는 도구리눅스 상에 Ollama 서버를 설치해보자.
curl -fsSL https://ollama.com/install.sh | sh
대부분의 Linux 배포판에 가장 편리한 방법은 공식 설치 스크립트를 사용하는 것이다.
이 명령은 스크립트를 다운로드하고 sh를 사용하여 실행한다.
~/.ollama/models에 저장된다.
127.0.0.1:11434 (local)
127.0.0.1:11434 접속 결과모델을 실행하기 위해서는, 우선 서버를 가동시켜야 한다.
ollama serve

사용할 sLLM 모델을 받아보자.
아래 페이지에서 사용 가능한 모델의 리스트를 확인할 수 있다.
: 사용 가능한 모델은 Ollama 웹사이트의 라이브러리 페이지에서 찾아볼 수 있다.
아래는 gpt-oss 모델에 대한 리드미 및 사용 방법 일부를 캡처한 것이다.
형광펜으로 표시해둔 것을 리눅스 터미널에서 실행하면 바로 활용할 수 있다.


🎯 나는 qwen2.5:7b-instruct 모델을 사용해보겠다!
# Qwen2.5 7B
ollama pull qwen2.5:7b-instruct # Qwen 모델 가중치(및 실행 레시피)가 로컬에 내려옴
ollama run qwen2.5:7b-instruct # Ollama 서버가 그 Qwen 모델을 로드해서 CPU/GPU로 추론
ollama serve가 실행 중인 상태에서 진행해야 한다!
ollama pull을 통해 쉽게 액세스할 수 있다.
ollama run 을 사용하는 것 로컬에 저장된 - ollama 서버 내 설치된 모델 리스트 확인: ollama list

로컬에 저장된 - ollama 서버 내 설치된 qwen 확인: ollama list | grep -i qwen

~/.ollama/models

⭐ 양자화(quantization)
- 딥러닝 모델의 파라미터나 연산을 더 작은 정밀도 로 표현하는 기술
- 더 낮은 비트수(예: INT8, INT4)로 숫자를 근사해서 저장/연산하는 방법
- 예: 원래 32비트(약 43억 가지 값)로 표현하던 걸 → 8비트(256가지 값)로 줄여 표현.
- 이렇게 하면?
- 메모리 사용량: 줄어듦 (모델을 더 작은 GPU/CPU에서도 실행 가능)
- 연산 속도: 빨라짐 (특히 CPU, 모바일 환경에서 효과적)
- 정확도: 약간 손실될 수 있음 (하지만 잘 튜닝하면 거의 유지)
아래는 Ollama 서버에 띄운 qwen 모델을 활용하여 프롬프틀 이용해 질문과 컨텍스트가 반영된 답변을 생성한 예시이다.
SYSTEM_MSG = (
"너는 RAG 스타일 답변기다. 제공 컨텍스트만 근거로 한국어로 간결히 답해라. "
"모르면 모른다고 말해라. 날짜 추정 금지. "
"출력은 <Answer>…</Answer> 만 포함."
)
...
def build_user_prompt(question: str, ctx_texts: list[str], max_chars=MAX_CHARS) -> str:
buf, total = [], 0
for t in ctx_texts:
t = " ".join(t.split())
if total + len(t) > max_chars:
remain = max_chars - total
if remain > 200:
buf.append(t[:remain] + "…")
break
buf.append(t)
total += len(t)
ctx = "\n---\n".join(buf) if buf else "(컨텍스트 없음)"
return f"질문: {question}\n\n[컨텍스트]\n{ctx}\n\n규칙: 컨텍스트 밖 내용 금지. <Answer>만 출력."
...
def main():
load_dotenv() # .env에서 OLLAMA_BASE_URL, OLLAMA_API_KEY 읽음
base_url = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1")
api_key = os.getenv("OLLAMA_API_KEY", "ollama")
client = OpenAI(base_url=base_url, api_key=api_key)
...
try:
resp = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": SYSTEM_MSG},
{"role": "user", "content": user_msg},
],
temperature=0.2,
max_tokens=700,
)
answer = resp.choices[0].message.content.strip()
latency_ms = int((time.perf_counter() - t0) * 1000)
except Exception as e:
answer = f"<Answer>오류: {e}</Answer>"
latency_ms = 0
# 콘솔에 바로 확인
print("="*80)
print(f"[{i}] Q:", q)
print(f"Latency: {latency_ms} ms")
print("Ans:", answer[:400] + ("…" if len(answer) > 400 else ""))
pd.DataFrame(outputs).to_csv(OUT_PATH, index=False, encoding="utf-8-sig")
print(f"\n[DONE] saved -> {OUT_PATH} (rows={len(outputs)})")
if __name__ == "__main__":
main()