TH ▾
รับคีย์ API

API Ollama ใน Python แล้วใช้เอนด์พอยต์แบบโฮสต์

การใช้ไคลเอนต์ ollama api python ใช้เวลาประมาณสิบบรรทัด: ติดตั้งแพ็กเกจ เริ่มต้นเซิร์ฟเวอร์ และเรียกใช้ chat บทแนะนำนี้ครอบคลุมส่วนนั้น จากนั้นแสดงวิธีทำให้โปรแกรมเดียวกันทำงานกับเอนด์พอยต์ OpenAI แบบโฮสต์ได้โดยการเปลี่ยนตัวแปรสภาพแวดล้อม

อัปเดต

งูแสงเรืองรองพันรอบจากเคสคอมพิวเตอร์เดสก์ท็อปขึ้นไปยังคลาวด์เซิร์ฟเวอร์ แสดงให้เห็นการเคลื่อนย้ายโค้ดโลคอลของ Python ไปยังแบบโฮสต์
หน้าต่างแชทเชื่อมต่อกับคอมพิวเตอร์ท้องถิ่นและเซิร์ฟเวอร์คลาวด์ด้วยสายไฟเรืองแสง

ไม่ต้องใช้บัตร หลังสมัคร ให้รับเครดิตทดลองใช้ฟรี $0.50 ด้วยคลิกเดียว (หนึ่งครั้งต่อคน)

รับคีย์ API

ประเด็นสำคัญ

  • pip install ollama รันเซิร์ฟเวอร์ Ollama บนพอร์ต 11434 และเรียกใช้ ollama.chat ด้วยโมเดลที่คุณได้ดึงไว้
  • การสตรีมคือ stream=True ซึ่งให้ชิ้นข้อมูลที่มี message.content
  • จัดการ ResponseError สำหรับโมเดลที่หายไป และ ConnectionError สำหรับเซิร์ฟเวอร์ที่หยุดทำงาน
  • เพื่อเปลี่ยนเป็นแบบโฮสต์ ให้สลับไปใช้ SDK ของ OpenAI และตั้งค่า base URL, คีย์ และโมเดลผ่านตัวแปรสภาพแวดล้อม

ตั้งค่าไคลเอนต์ Python

ติดตั้ง Ollama ก่อน เริ่มเซิร์ฟเวอร์ แล้วดึงโมเดลจากเทอร์มินัล: ollama pull llama3. เซิร์ฟเวอร์จะฟังที่ http://localhost:11434 จากนั้นติดตั้งแพ็กเกจ Python ใน virtual environment:

python -m venv .venv
source .venv/bin/activate
pip install ollama openai

แพ็กเกจ ollama จะติดต่อไปยัง routes ดั้งเดิมของ Ollama ภายใต้ /api แพ็กเกจ openai ใช้สำหรับส่วนที่สองของบทช่วยสอนนี้ ซึ่งเป้าหมายคือเอนด์พอยต์แบบโฮสต์ หากคุณต้องการเครื่องมือแบบกราฟิกก่อนการเขียนโค้ด โปรดดูที่ การใช้ Ollama กับ GUI

ตรวจสอบการติดตั้งโดยรัน ollama list ในเทอร์มินัล หากโมเดลของคุณปรากฏที่นั่น Python จะสามารถระบุโมเดลได้ หากพบข้อผิดพลาดการเชื่อมต่อในภายหลัง เซิร์ฟเวอร์อาจยังไม่ทำงาน

การเรียกแชทครั้งแรกของคุณ

นี่คือพื้นฐานของ Python API ของ Ollama ในโค้ดตัวอย่างเดียว: ข้อความระบบ ข้อความผู้ใช้ และตัวเลือกสองรายการ

import ollama

resp = ollama.chat(
    model="llama3",
    messages=[
        {"role": "system", "content": "Answer in one short paragraph."},
        {"role": "user", "content": "What is a context window?"},
    ],
    options={"temperature": 0.4, "num_ctx": 8192},
)
print(resp["message"]["content"])

การตอบกลับเป็นออบเจกต์คล้าย dict; เนื้อหาอยู่ใน message.content ใน options คุณสามารถตั้งค่าพารามิเตอร์การสร้างได้ temperature ควบคุมความสุ่ม และ num_ctx กำหนดความยาวของหน้าต่างบริบทสำหรับการเรียกใช้นั้น Ollama จะตั้งค่าหน้าต่างบริบทให้ค่อนข้างเล็กเป็นค่าเริ่มต้น เว้นแต่คุณจะเพิ่มค่า ซึ่งอาจทำให้ผู้ใช้ที่วางเอกสารยาวๆ แล้วได้รับคำตอบที่ละเลยส่วนต้นรู้สึกประหลาดใจ

สำหรับการแชทหลายรอบ ให้เก็บรายการข้อความและเพิ่มการตอบกลับแต่ละรายการด้วยตนเอง Ollama เช่นเดียวกับ API แชทส่วนใหญ่ ไม่มีสถานะระหว่างการเรียกใช้

การตอบกลับแบบสตรีมมิง

หากไม่ใช้สตรีมมิง คุณจะต้องรอจนกว่าคำตอบจะเสร็จสมบูรณ์ หากใช้ stream=True ฟังก์ชันจะส่งคืนเจนเนอเรเตอร์ และคุณสามารถพิมพ์ชิ้นส่วนข้อมูลเมื่อข้อมูลมาถึง:

import ollama

for part in ollama.chat(
    model="llama3",
    messages=[{"role": "user", "content": "Explain recursion with a cooking analogy."}],
    stream=True,
):
    print(part["message"]["content"], end="", flush=True)

แต่ละชิ้นส่วนมี message.content เล็กๆ ชิ้นสุดท้ายมี done ตั้งเป็น true และรวมเวลาและการนับโทเคน สำหรับเว็บแอปพลิเคชัน ให้ส่งต่อชิ้นส่วนเหล่านี้ไปยังเบราว์เซอร์ผ่าน server-sent events หรือ websocket

ข้อผิดพลาดที่คุณจะพบ

ความล้มเหลวสองประเภทครอบคลุมปัญหาส่วนใหญ่ของผู้เริ่มต้น

import ollama

try:
    ollama.chat(model="llama3", messages=[{"role": "user", "content": "hi"}])
except ollama.ResponseError as exc:
    if exc.status_code == 404:
        print("Model missing. Run: ollama pull llama3")
    else:
        raise
except ConnectionError:
    print("Cannot reach Ollama. Is the server running on port 11434?")

สถานะ 404 จาก ResponseError หมายความว่าชื่อโมเดลไม่ตรงกับโมเดลที่คุณดึงมา ชื่อโมเดลมีแท็กประกอบ ดังนั้น llama3 และ llama3:70b จึงเป็นโมเดลคนละตัวกัน ข้อผิดพลาดการเชื่อมต่อหมายความว่าเซิร์ฟเวอร์ไม่ได้ทำงาน หรือคุณอยู่ภายในคอนเทนเนอร์ที่ localhost ชี้ไปที่คอนเทนเนอร์ ไม่ใช่โฮสต์ ในกรณีนี้ให้ส่งไคลเอนต์พร้อมโฮสต์ที่ถูกต้อง: ollama.Client(host="http://host.docker.internal:11434")

รูปแบบเพิ่มเติมถูกรวบรวมไว้ใน ข้อผิดพลาดทั่วไปของ API Ollama

โปรแกรมเดียวกัน, เอนด์พอยต์แบบโฮสต์

โมเดลท้องถิ่นถูกจำกัดโดยหน่วยความจำและความเร็วของคุณ เมื่อสคริปต์ต้องทำงานบนเซิร์ฟเวอร์ จัดการงานพร้อมกันจำนวนมาก หรือใช้หน้าต่างบริบทขนาดใหญ่ เอนด์พอยต์แบบโฮสต์จะใช้งานง่ายกว่า เคล็ดลับคือเขียนโปรแกรมโดยใช้ SDK ของ OpenAI และจัดการ Base URL, คีย์ API และโมเดลเป็นการกำหนดค่า:

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ.get("LLM_BASE_URL", "https://api.ollamansfw.com/v1"),
    api_key=os.environ["LLM_API_KEY"],
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")

def ask(prompt, history=None):
    messages = (history or []) + [{"role": "user", "content": prompt}]
    out = ""
    for chunk in client.chat.completions.create(model=MODEL, messages=messages, stream=True):
        if chunk.choices and chunk.choices[0].delta.content:
            piece = chunk.choices[0].delta.content
            out += piece
            print(piece, end="", flush=True)
    return out

ask("Explain recursion with a cooking analogy.")

สำหรับ Ollama ท้องถิ่น ให้ตั้งค่า LLM_BASE_URL=http://localhost:11434/v1, LLM_API_KEY=ollama (ค่าที่ไม่เป็นค่าว่างจะถูกยอมรับ) และ LLM_MODEL=llama3 สำหรับ API แบบโฮสต์ ให้ใช้ค่าเริ่มต้นด้านบน คีย์จริงของคุณ และโมเดล uncensored ส่วนอื่นของโค้ดไม่มีการเปลี่ยนแปลง

รับคีย์ API ที่หน้า หน้าคีย์ API บัญชีใหม่สามารถขอเครดิตทดลองใช้มูลค่า $0.50 ได้ในคลิกเดียว โดยไม่ต้องชำระเงิน และใช้งานได้เป็นเวลา 7 วัน โมเดลเป็นโมเดลแบบเปิดน้ำหนักจากผู้ให้บริการอิสระ ซึ่งปรับแต่งมาเพื่อตอบคำถามโดยไม่มีการปฏิเสธเนื้อหา สำหรับการใช้งานของผู้ใหญ่ที่ถูกต้องตามกฎหมาย รองรับเฉพาะข้อความ และไม่ใช่ API อย่างเป็นทางการของแล็บใหญ่ใดๆ

การรันพรอมต์หลายรายการแบบขนาน

โมเดลท้องถิ่นบนเครื่องเดียวมักจะจัดการคำขอได้ครั้งละหนึ่งคำขอ ดังนั้นการวนลูปจึงทำงานแบบลำดับ เอนด์พอยต์แบบโฮสต์อนุญาตให้ทำงานแบบขนานได้ ซึ่งทำให้การทำงานแบบแบทช์เร็วขึ้นมาก ให้คงจำนวนเวิร์กเกอร์ไว้ต่ำกว่าขีดจำกัดอัตราของคีย์ของคุณ: คำขอพร้อมกัน 8 คำขอสำหรับคีย์เต็ม และ 2 คำขอสำหรับคีย์ทดลอง

from concurrent.futures import ThreadPoolExecutor
from openai import OpenAI

client = OpenAI(base_url="https://api.ollamansfw.com/v1", api_key="YOUR_KEY")

def summarize(text):
    r = client.chat.completions.create(
        model="uncensored",
        messages=[{"role": "user", "content": "Summarize in one line: " + text}],
        max_tokens=60,
    )
    return r.choices[0].message.content

docs = ["first text", "second text", "third text"]
with ThreadPoolExecutor(max_workers=6) as pool:
    results = list(pool.map(summarize, docs))
print(results)

ตัวทำงานหกตัวจะเหลือพื้นที่สำรองไว้ใต้ขีดจำกัด 8 หากตัวทำงานใดได้รับสถานะ 429 SDK ของ OpenAI จะลองใหม่โดยอัตโนมัติสองสามครั้ง แต่ควรเพิ่มการหน่วงเวลาของคุณเองสำหรับการรันระยะยาว นอกจากนี้ โปรดจำไว้ว่าคำขอสตรีมมิงแต่ละคำจะสงวนช่องของมันไว้จนกว่าสตรีมจะสิ้นสุด ดังนั้นอย่าผสมการแชทสตรีมมิงที่ยาวนานกับแบตช์ขนาดใหญ่บนคีย์ทดลองเดียวกัน

ความแตกต่างที่ต้องวางแผน

  • ไม่มีตัวเลือกที่ใช้ได้เฉพาะกับโมเดลท้องถิ่น num_ctx และ keep_alive ไม่มีความหมายในส่วนแบบโฮสต์ หน้าต่างบริบทคือ 100,000 โทเคน รวมพรอมต์และการสร้าง
  • ขีดจำกัดอัตรา คีย์แบบเต็มอนุญาตให้ทำคำขอพร้อมกัน 8 คำขอ และ 300 คำขอต่อนาที; คีย์แบบทดลองใช้อนุญาตให้ทำ 2 และ 60 คำขอ เมื่อเกินกว่านั้นคุณจะได้รับสถานะ 429 พร้อม rate_limited หรือ concurrency ให้ลองใหม่หลังจากหยุดพัก; ในกรณีที่มีภาระเกินชั่วคราว การตอบสนองจะระบุ Retry-After: 5
  • ค่าใช้จ่าย อินพุตคิด $0.15 ต่อ 1M โทเคน และเอาต์พุตคิด $0.50 ต่อ 1M สคริปต์ที่ส่ง 2,000 พรอมต์ที่มีอินพุต 600 โทเคนและเอาต์พุต 400 โทเคน จะใช้เงิน 2,000 x (600 x $0.15 + 400 x $0.50) / 1M = 2,000 x $0.00029 = $0.58
  • การเรียกเก็บเงิน เครดิตแบบเติมเงินล่วงหน้า เริ่มต้นที่ $20 ถึง $500 จ่ายด้วยคริปโต (USDT บน TRC20 หรือ USDC บน Base) คำขอที่ล้มเหลวหรือถูกปฏิเสธจะไม่ถูกเรียกเก็บเงิน

เพื่อดูการเปรียบเทียบเอนด์พอยต์แบบเคียงข้างกัน อ่าน บันทึกการกำหนดราคา API ของเรา หรือ เอกสาร

ถาม-ตอบ

ฉันจะเรียกใช้ Ollama จาก Python ได้อย่างไร?

ติดตั้งแพ็กเกจ ollama เริ่มต้นเซิร์ฟเวอร์ ดึงโมเดล แล้วเรียกใช้ ollama.chat โดยระบุชื่อโมเดลและรายการข้อความ

ฉันสามารถใช้ Python SDK ของ OpenAI กับ Ollama ได้หรือไม่?

ใช่ ตั้งค่า base_url เป็น http://localhost:11434/v1 และใช้คีย์ API ที่ไม่ว่างเปล่า; Ollama จะให้บริการเลเยอร์ที่เข้ากันได้กับ OpenAI ที่ที่อยู่นั้น

ฉันจะสตรีมเอาต์พุตของ Ollama ใน Python ได้อย่างไร?

ส่ง stream=True ไปยัง ollama.chat และวนลูปผ่านชิ้นข้อมูลที่ส่งกลับมา พิมพ์ message.content จากแต่ละชิ้น

อะไรเปลี่ยนแปลงเมื่อฉันสลับไปยังเอนด์พอยต์แบบโฮสต์?

URL ฐาน, คีย์ API และชื่อโมเดล ตัวเลือกแบบโลคอลเช่น num_ctx ไม่ใช้ และคุณควรจัดการกับสถานะ 429 จากขีดจำกัดอัตรา