Ollama를 Python과 통합하는 방법: REST API 및 Python 클라이언트 예제

+ 사고형 LLM을 사용한 구체적인 예시

Page content

이 포스트에서는 Python 애플리케이션을 Ollama에 연결하는 방법에 대해 두 가지 방법을 소개합니다: 1. HTTP REST API를 통해; 2. 공식 Ollama Python 라이브러리를 통해.

우리는 채팅생성 요청을 모두 다루고, 이후 **“사고 모델”**을 효과적으로 사용하는 방법에 대해 논의할 것입니다.

ollama and python

Ollama 는 대규모 언어 모델(LLM)을 로컬에서 실행하는 데 있어 가장 편리한 방법 중 하나로 빠르게 자리 잡았습니다. Ollama가 vLLM, Docker Model Runner, LocalAI 및 클라우드 제공업체와 비교되는 방식을 보고, 각각을 언제 선택해야 하는지 알고 싶다면 LLM Hosting: Local, Self-Hosted & Cloud Infrastructure Compared를 참조하세요. 간단한 인터페이스와 Llama 3, Mistral, Qwen2.5qwen3과 같은 “사고” 변형 모델을 포함한 인기 있는 오픈 모델에 대한 지원을 제공하므로, 외부 클라우드 API에 의존하지 않고도 Python 프로젝트에 AI 기능을 쉽게 통합할 수 있습니다.


🧩 사전 조건

시작하기 전에 다음을 확인하세요:

  • Ollama가 로컬에서 설치되고 실행되고 있습니다 (ollama serve)
  • Python 3.9 이상
  • 필요한 의존성:
pip install requests ollama

Ollama가 실행되고 있는지 확인하려면 다음을 실행하세요:

ollama list

llama3, mistral, 또는 qwen3와 같은 사용 가능한 모델을 보시게 될 것입니다.


⚙️ 선택 1: Ollama의 REST API 사용

HTTP 요청을 이미 처리하는 프레임워크와 통합하거나 최대한의 제어를 원할 때 REST API가 이상적입니다.

예제 1: 채팅 API

import requests
import json

url = "http://localhost:11434/api/chat"

payload = {
    "model": "llama3.1",
    "messages": [
        {"role": "system", "content": "당신은 Python 보조 프로그램입니다."},
        {"role": "user", "content": "문자열을 뒤집는 함수를 작성하세요."}
    ]
}

response = requests.post(url, json=payload, stream=True)

for line in response.iter_lines():
    if line:
        data = json.loads(line)
        print(data.get("message", {}).get("content", ""), end="")

👉 Ollama REST API는 OpenAI의 스트리밍 API와 유사하게 응답을 줄 단위로 스트리밍합니다. 챗봇 또는 CLI 도구에서 실시간으로 내용을 표시하거나 누적할 수 있습니다.


예제 2: 생성 API

채팅 컨텍스트 또는 역할이 필요하지 않다면, 더 간단한 /api/generate 엔드포인트를 사용하세요:

import requests

url = "http://localhost:11434/api/generate"
payload = {
    "model": "llama3.1",
    "prompt": "재귀를 한 문장으로 설명하세요."
}

response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
    if line:
        print(line.decode("utf-8"))

이 엔드포인트는 단일 텍스트 생성 작업 — 요약, 코드 스니펫 등에 이상적입니다.


🐍 선택 2: Ollama Python 라이브러리 사용

Ollama Python 클라이언트는 완전히 Python에서 작업하는 것을 선호하는 개발자들에게 더 깔끔한 인터페이스를 제공합니다.

예제 1: 채팅 API

import ollama

response = ollama.chat(
    model="llama3.1",
    messages=[
        {"role": "system", "content": "당신은 코드 보조 프로그램입니다."},
        {"role": "user", "content": "디렉토리에 있는 모든 파일을 나열하는 Python 스크립트를 생성하세요."}
    ]
)

print(response['message']['content'])

이것은 최종 메시지를 딕셔너리로 반환합니다. 스트리밍을 원한다면, 챗 스트림을 반복할 수 있습니다:

stream = ollama.chat(
    model="llama3.1",
    messages=[
        {"role": "user", "content": "재귀에 대한 하이쿠를 작성하세요."}
    ],
    stream=True
)

for chunk in stream:
    print(chunk['message']['content'], end='', flush=True)

예제 2: 생성 API

import ollama

output = ollama.generate(
    model="llama3.1",
    prompt="파이썬에서 데코레이터의 개념을 요약하세요."
)

print(output['response'])

또는 결과를 스트리밍할 수 있습니다:

stream = ollama.generate(
    model="llama3.1",
    prompt="파이썬으로 AI 프로젝트에 사용하는 세 가지 장점을 나열하세요.",
    stream=True
)

for chunk in stream:
    print(chunk['response'], end='', flush=True)

🧠 “사고” 모델 사용

Ollama는 *“사고 모델”*과 같은 qwen3을 지원합니다. 이 모델들은 중간 추론 단계를 보여주는 것이 설계되었습니다. 이러한 모델은 종종 다음과 같은 형식의 구조화된 출력을 생성합니다:

</think>

  여기 추론 단계가 있습니다...

이것은 다음과 같은 용도로 유용합니다:

  • 모델 추론 디버깅
  • 해석 가능성 연구
  • 사고출력을 분리하는 도구 개발

예제: 사고 모델 사용

import ollama

response = ollama.chat(
    model="qwen3",
    messages=[
        {"role": "user", "content": "호주 수도는 어디인가요?"}
    ]
)

content = response['message']['content']

# 선택적으로 "사고" 부분 추출
import re
thinking = re.findall(r"</think>", content, re.DOTALL)
answer = re.sub(r"