Chuyển đến nội dung chính

レッスン 7: Ollama REST API - OpenAI 互換エンドポイント

Ollama は、OpenAI 互換の REST API (/api/chat、/api/generate、/api/embeddings) を公開します。 curl リクエストと Python リクエストを使用します。ストリーミング応答。 OpenAI SDKとの統合。

🧠 AI と ML — レッスン 0 レッスン 7: Ollama REST API - OpenAI 互換 エンドポイント。エンドポイント

Apple Silicon で Ollama を使用して AI Local を実行する

パート 3: API 統合とアプリケーション プログラミング

xdev.asia

はじめに

Ollama は単なる CLI ツールではありません。上で実行される REST API を公開します http://localhost:11434これにより、あらゆるアプリケーションが LLM を呼び出すことができるようになります。特に、Ollama は OpenAI 互換エンドポイント をサポートしています。つまり、OpenAI API 用に作成されたコードは、Ollama モデルをほとんど変更せずに使用できます。


1. 基本 API

サーバーを確認してください

curl http://localhost:11434
# Output: Ollama is running

/api/generate — テキストを生成する

curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "Viết hàm fibonacci bằng Python",
  "stream": false
}'

応答:

{
  "model": "llama3.2",
  "response": "```Python\ndef fibonacci(n):\n ...",
  「完了」: true、
  "合計期間": 3241920000、
  "prompt_eval_count": 12、
  "prompt_eval_duration": 180000000、
  "eval_count": 156、
  "eval_duration": 2890000000
}

/api/chat — Chat với history

カールする http://localhost:11434/api/chat -d '{
  "モデル": "ラマ3.2",
  「メッセージ」: [
    {"role": "system", "content": "あなたは Python の専門家です。ベトナム語で答えてください。"},
    {"role": "user", "content": "辞書理解とは何ですか?"}
  ]、
  「ストリーム」: false
}'

/api/embeddings — Vector embeddings

カールする http://localhost:11434/api/embeddings -d '{
  "モデル": "ノミック埋め込みテキスト",
  "prompt": "Docker はコンテナ化テクノロジーです"
}'

Response chứa vector embedding (mảng số thực), dùng cho RAG, semantic search.


2. Streaming responses

Mặc định stream: true — Ollama trả về từng chunk:

カールする http://localhost:11434/api/generate -d '{
  "モデル": "ラマ3.2",
  "prompt": "マイクロサービスについて説明します"
}'

Mỗi dòng là một JSON object:

{"モデル":"llama3.2","応答":"マイクロ","完了":false}
{"モデル":"llama3.2","応答":"サービス","完了":false}
{"モデル":"llama3.2","応答":" は","完了":false}
...
{"モデル":"llama3.2","応答":"","完了":true,"合計期間":...}

3. OpenAI-compatible endpoint

Ollama expose endpoint tương thích OpenAI tại /v1/:

# チャット完了 (OpenAI など)
カールする http://localhost:11434/v1/chat/completions -d '{
  "モデル": "ラマ3.2",
  「メッセージ」: [
    {"役割": "ユーザー", "コンテンツ": "こんにちは、あなたは誰ですか?"}
  】
}'

Dùng OpenAI Python SDK

pip3 インストール openai
openaiインポートからOpenAI

# OpenAI の代わりに Ollama を指す
クライアント = OpenAI(
    Base_url=http://localhost:11434/v1"、
    api_key="ollama", # Ollama にはキーは必要ありませんが、SDK ではキーが必要です
)

応答 = client.chat.completions.create(
    モデル="ラマ3.2"、
    メッセージ=[
        {"role": "システム", "content": "ベトナム語で返信します。"},
        {"role": "ユーザー", "content": "Kubernetes とは何ですか?"},
    ]、
    温度=0.7、
    max_tokens=500、
)

print(response.choices[0].message.content)

Streaming với OpenAI SDK

openaiインポートからOpenAI

client = OpenAI(base_url=http://localhost:11434/v1"、api_key="オラマ")

stream = client.chat.completions.create(
    モデル="ラマ3.2"、
    messages=[{"role": "user", "content": "Python でクイックソート関数を書く"}],
    ストリーム=真、
)

ストリーム内のチャンクの場合:
    chunk.choices[0].delta.contentの場合:
        print(chunk.choices[0].delta.content, end="", flash=True)
プリント()

💡 Tại sao điều này quan trọng? Bất kỳ thư viện/framework nào hỗ trợ OpenAI API (LangChain, LlamaIndex, Vercel AI SDK, Cursor, Continue.dev...) đều có thể dùng Ollama chỉ bằng cách đổi base_url.


4. Python requests (không cần SDK)

インポートリクエスト
jsonをインポートする

def チャット(メッセージ、モデル = "llama3.2"、ストリーム = False):
    応答 = リクエスト.post(
        」http://localhost:11434/api/chat"、
        json={"モデル": モデル、"メッセージ": メッセージ、"ストリーム": ストリーム}
    )
    ストリームの場合:
        response.iter_lines() の行:
            行の場合:
                データ = json.loads(行)
                データ["完了"]でない場合:
                    生成データ["メッセージ"]["コンテンツ"]
    それ以外の場合:
        return response.json()["メッセージ"]["コンテンツ"]

# 非ストリーミング
結果 = チャット([
    {"role": "user", "content": "Docker とは何ですか?"}
])
印刷(結果)

#ストリーミング
print("\n--- ストリーミング ---")
チャット内のトークン用(
    [{"ロール": "ユーザー", "コンテンツ": "二分検索関数を作成する"}],
    ストリーム=真
):
    print(トークン、end=""、flush=True)

5. JavaScript/TypeScript (Node.js)

Fetch API

非同期関数 chat(メッセージ) {
  const 応答 = fetch を待ちます('http://localhost:11434/api/chat'、{
    メソッド: 'POST'、
    ヘッダー: { 'Content-Type': 'application/json' },
    本文: JSON.stringify({
      モデル: 'ラマ3.2'、
      メッセージ、
      ストリーム: false、
    })、
  });
  const data = 応答を待ちます.json();
  データ.メッセージ.コンテンツを返します。
}

// 使用する
const result = チャットを待ちます([
  { 役割: 'ユーザー'、コンテンツ: 'JavaScript で Promise を説明する' },
]);
console.log(結果);

Streaming với ReadableStream

非同期関数 streamChat(messages) {
  const 応答 = fetch を待ちます('http://localhost:11434/api/chat'、{
    メソッド: 'POST'、
    ヘッダー: { 'Content-Type': 'application/json' },
    本文: JSON.stringify({
      モデル: 'ラマ3.2'、
      メッセージ、
      ストリーム: true、
    })、
  });

  const リーダー = 応答.body.getReader();
  const デコーダ = 新しい TextDecoder();

  while (true) {
    const {完了、値} = Reader.read(); を待ちます。
    (終わったら)休憩する。

    const Lines = decoder.decode(value).split('\n').filter(Boolean);
    for (const 行) {
      const データ = JSON.parse(line);
      if (!data.done) {
        process.stdout.write(data.message.content);
      }
    }
  }
  コンソール.log();
}

ストリームチャットを待ちます([
  { 役割: 'ユーザー', コンテンツ: 'TypeScript でデータを取得する非同期関数を作成する' },
]);

Dùng OpenAI SDK cho JavaScript

npm インストール openai
「openai」から OpenAI をインポートします。

const client = new OpenAI({
  ベースURL: 'http://localhost:11434/v1'、
  apiKey: 'オラマ',
});

const completed = await client.chat.completions.create({
  モデル: 'ラマ3.2'、
  メッセージ: [{ 役割: 'ユーザー'、コンテンツ: 'こんにちは!' }]、
});

console.log(completion.choices[0].message.content);

6. API Parameters quan trọng

ParameterMô tảMặc định
temperatureĐộ sáng tạo (0.0-2.0)0.8
top_pNucleus sampling0.9
top_kTop-k sampling40
num_predictMax tokens generate128
num_ctxContext window size2048
stopStop sequences[]
seedRandom seed (cho reproducible)random
keep_aliveThời gian giữ model loaded"5m"
カールする http://localhost:11434/api/generate -d '{
  "モデル": "ラマ3.2",
  "prompt": "プログラミングについての詩を書いてください",
  "オプション": {
    「温度」: 1.2、
    "top_p": 0.95、
    "num_predict": 300、
    「種」:42
  }、
  「ストリーム」: false
}'

7. Model management API

# モデルをリストする
カールする http://localhost:11434/api/tags

# モデル情報を表示
カールする http://localhost:11434/api/show -d '{"名前": "llama3.2"}'

# プルモデル
カールする http://localhost:11434/api/pull -d '{"名前": "gemma3:4b"}'

# モデルの削除
カールする http://localhost:11434/api/delete -d '{"名前": "ミストラル"}'

# 実行中のモデル
カールする http://localhost:11434/api/ps

8. Expose API ra mạng local

Mặc định Ollama chỉ listen trên localhost. Để expose cho các máy khác trong mạng:

# すべてのインターフェイスでリッスンする
エクスポート OLLAMA_HOST=0.0.0.0:11434
オラマサーブ

Giờ các máy khác trong mạng có thể truy cập:

# 別のデバイスから
カールする http://192.168.1.100:11434/api/generate -d '{
  "モデル": "ラマ3.2",
  "プロンプト": "こんにちは!",
  「ストリーム」: false
}'

⚠️ Bảo mật: Chỉ expose trong mạng nội bộ (LAN). Không expose ra internet public nếu không có authentication.


Tóm tắt

EndpointMethodMô tả
/api/生成POSTGenerate text
/api/チャットPOSTChat với message history
/api/embeddingsPOSTVector embeddings
/v1/チャット/コンプリートPOSTOpenAI-compatible
/api/タグGETList models
/api/showPOSTModel info
/api/プルPOSTPull model
/api/psGETRunning models

Bài tập

  1. Dùng curl gọi /api/チャット với system prompt tiếng Việt
  2. Viết Python script tạo chatbot terminal dùng requests + streaming
  3. Dùng OpenAI SDK Python/JS trỏ tới Ollama, chạy chat
  4. Đo thời gian response với các `温度が異なる (0.1、0.7、1.5)
  5. Ollama を LAN に公開し、携帯電話から (ブラウザ経由で) 通話してみます。

次の記事: Python でローカル チャットボットを構築する →