🦾

DjangoとOllamaでGPT-OSSをアプリに組み込む

に公開

DjangoとOllamaでGPT-OSSをアプリに組み込む

サムネイル

近年、ChatGPTをはじめとする生成AIの利用が一般化し、Webサービスや業務システムにも組み込まれるようになっています。クラウド提供のAI APIは手軽で高性能ですが、利用コスト外部サーバーへのデータ送信によるプライバシーリスク、そしてインターネット接続に依存する といった課題も抱えています。

こうした背景から注目されているのが、ローカル環境で動作可能なオープンソースの大規模言語モデルです。自分のマシンで推論を行えば、クラウド依存を避けつつ、コストとセキュリティをコントロールできます。

この記事では、その一例として OpenAIが公開したオープンウェイトモデル「GPT-OSS」 を取り上げます。このモデルには gpt-oss-120bgpt-oss-20b の2種類があり、特に 20B 版は約16GBのRAMで動作可能とされており、ハイエンドなGPUサーバーがなくてもローカルで試せる点が非常に魅力的です。

さらに Ollama を利用すると、DjangoのようなWebフレームワークから直接このモデルを呼び出し、完全にローカルなAIアシスタントを構築できます。
本記事では、Djangoアプリケーションに簡単なチャットAPIを実装し、GPT-OSSをローカルで利用したいと思います。

必要なもの

  • 16GB以上のRAMとGPUを備えたシステム(またはApple Silicon Mac)

  • Python 3.10以上

  • Django (v4以上推奨)

  • Ollama(インストール済み・起動中)

  • GPT-OSSモデルは事前にプルしておいてください:

    ollama pull gpt-oss:20b
    

実装

ステップ1: Djangoプロジェクトの作成

django-admin startproject gptoss_django
cd gptoss_django
python manage.py startapp chat

settings.pyにアプリを追加します。

# settings.py
INSTALLED_APPS = [
    ...,
    "chat",
]

ステップ2: ビューを実装

chat/views.py に以下を記述します。DjangoからOllamaのREST APIへリクエストを送り、レスポンスを返すシンプルなチャットAPIです。

import requests
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json

API_URL = "http://localhost:11434/api/chat"
MODEL = "gpt-oss:20b"

history = []

@csrf_exempt
def simple_chat_view(request):
    if request.method == "POST":
        body = json.loads(request.body)
        user_input = body.get("message")

        history.append({"role": "user", "content": user_input})

        response = requests.post(
            API_URL,
            headers={"Content-Type": "application/json"},
            json={"model": MODEL, "messages": history, "stream": False},
        )
        print(f"{response=}")
        data = response.json()
        reply = data["message"]["content"]
        print(f"☆{reply=}")

        history.append({"role": "assistant", "content": reply})

        return JsonResponse(
            {"reply": reply},
            json_dumps_params={"ensure_ascii": False},
            content_type="application/json; charset=utf-8",
        )

    return JsonResponse({"error": "POST only"}, status=405)

ちなみに、上記は、ストリーミング無しの場合です。
もしストリーミングで流したい場合には、関数部分は以下のようになります。

@csrf_exempt
def simple_stream_chat_view(request):
    if request.method != "POST":
        return JsonResponse({"error": "POST only"}, status=405)

    body = json.loads(request.body)
    user_input = body.get("message", "")
    history.append({"role": "user", "content": user_input})

    with requests.post(
        API_URL,
        headers={"Content-Type": "application/json"},
        json={"model": MODEL, "messages": history, "stream": True},
        stream=True, timeout=300
    ) as r:
        r.raise_for_status()
        content = []
        for line in r.iter_lines(decode_unicode=True):
            if not line:
                continue
            chunk = json.loads(line)  # 1行=1 JSON
            msg = chunk.get("message", {})
            piece = msg.get("content", "")
            if piece:
                content.append(piece)
            if chunk.get("done"):
                break

    reply = "".join(content)
    history.append({"role": "assistant", "content": reply})
    return JsonResponse(
        {"reply": reply},
        json_dumps_params={"ensure_ascii": False},
        content_type="application/json; charset=utf-8",
    )

ステップ3: URLを設定

/gptoss_django/urls.py

#/gptoss_django/urls.py
from django.urls import path, include

urlpatterns = [
    path("", include("chat.urls")),
]

続いて、chat/urls.pyを作成し、以下のように記述

from django.urls import path
from . import views

urlpatterns = [
    path("simple-chat/", views.simple_chat_view), # ストリーミング無し
    path("simple-stream-chat/", views.simple_stream_chat_view), #ストリーミングあり
]

ステップ4: サーバー起動とチャット利用

Djangoを起動します。

python manage.py runserver

別のターミナルを開いて、curlでテスト可能です。

curl -X POST http://127.0.0.1:8000/simple-chat/ \
    -H "Content-Type: application/json" \
    -d '{"message": "こんにちは"}'

応答は以下のようにjsonで返ってきます

{"reply": "こんにちは!何かお手伝いできることがありますか?" }

今後の発展

以上で、DjangoとOllamaを使ってGPT-OSSモデルとやり取りできるシンプルなチャットAPIが構築できました。
更なる応用・拡張開発としては、次のような方向性が考えられます。

  • ドキュメントQ&A: ベクトル検索やRAG(Retrieval-Augmented Generation)を組み合わせ、社内資料やマニュアルに基づいて回答できるようにする。

  • 外部サービス連携: 外部APIやデータベースを呼び出すことで、タスク処理や情報取得を自動化する。

  • コード支援ツール: 入力されたコードの解説や修正提案、スニペット生成を行うアシスタントを構築する。

  • マルチエージェント: 複数のAIエージェントを役割分担させ、協調して複雑なタスクを処理する仕組みに拡張する。

Djangoなら様々なPythonライブラリと組み合わせての拡張もしやすいのが嬉しいポイントですね。

まとめ

この記事では、Djangoプロジェクトを作成し、Ollama経由でGPT-OSSモデルにリクエストを送る簡単なチャットAPIを実装しました。
会話履歴を保持することで文脈に応じた応答も可能になります。

ここで紹介したコードは最小限の実装ですが、会話履歴の管理方法やフロントエンドとの統合、さらにはRAGやエージェントとの組み合わせなどを行うことで、より実用的なローカルAIアシスタントへと発展させることができます。クラウドに依存せず、自分の環境でAIを動かせることは大きな利点であり、学習用途にも本番システムにも応用可能です。

Discussion