VI ▾
NSFW Video Generator

API không kiểm duyệt cho quy trình video người lớn

LLM miễn phí cho Python: Mô hình cục bộ so với API lưu trữ

LLM miễn phí cho Python bao gồm hai loại: các mô hình trọng số mở bạn chạy trên máy của mình và các endpoint lưu trữ tính phí vài xu. Hướng dẫn này so sánh chúng và cung cấp mã hoạt động cho phương án lưu trữ.

Cập nhật

Minh họa đẳng hướng của một máy cục bộ được kết nối với cụm máy chủ lưu trữ, so sánh LLM cục bộ và lưu trữ

Điểm chính

  1. Các mô hình trọng số mở cục bộ không tốn chi phí trên mỗi token nhưng cần bộ nhớ, thời gian thiết lập và bảo trì.
  2. API lưu trữ tương thích OpenAI: cài đặt gói openai, đặt Base URL, sử dụng ID mô hình uncensored.
  3. Streaming, gọi hàm và chế độ JSON đều hoạt động thông qua lệnh gọi chat completions bình thường.
  4. Một khóa dùng thử cung cấp $0.50 tín dụng trong 7 ngày, với 2 yêu cầu đồng thời và 60 yêu cầu mỗi phút.

Hai cách để đưa LLM miễn phí vào một tập lệnh Python

Khi mọi người tìm kiếm llms miễn phí cho python, họ thường muốn nói đến một trong hai điều. Thứ nhất là một mô hình trọng số mở mà bạn tải xuống và tự chạy, sử dụng thứ gì đó như Ollama, llama.cpp hoặc thư viện transformers của Hugging Face. Thứ hai là một endpoint lưu trữ có chi phí rất thấp hoặc đi kèm với đủ tín dụng dùng thử để nó cảm thấy miễn phí cho một bản mẫu. Cả hai đều hợp lệ và phù hợp với các công việc khác nhau.

Chạy cục bộ nghĩa là không có hóa đơn theo token và dữ liệu không rời khỏi máy của bạn. Nó cũng nghĩa là bạn cần đủ RAM hoặc bộ nhớ GPU cho mô hình bạn chọn, bạn chờ tải xuống, và các mô hình nhỏ vừa trên laptop trả lời kém hơn các mô hình lớn. API lưu trữ loại bỏ câu hỏi về phần cứng, nhưng bạn trả tiền theo token sau khi hết dùng thử. Trang này bao gồm cả hai cách một cách trung thực, sau đó hiển thị mã Python cho tùy chọn lưu trữ trên trang web này, tương thích OpenAI và hoạt động với gói openai tiêu chuẩn.

Các mô hình cục bộ và API lưu trữ cạnh nhau

Câu hỏiTự chạy nóAPI lưu trữ trả trước
Chi phí trên mỗi tokenKhông, nhưng bạn trả tiền cho phần cứng và điện năng$0.15 cho mỗi 1M token đầu vào, $0.50 cho mỗi 1M token đầu ra
Thời gian thiết lậpCài đặt runtime, tải trọng lượng, tinh chỉnh cài đặtCài đặt một gói, dán khóa
Độ dài ngữ cảnhGiới hạn bởi bộ nhớ của bạn100.000 token, prompt cộng với hoàn tất
Yêu cầu đồng thờiBất cứ gì máy của bạn xử lý được8 yêu cầu cùng lúc trên khóa đầy đủ, 2 trên khóa dùng thử
Lời từ chốiPhụ thuộc vào trọng số bạn chọnĐược tinh chỉnh để trả lời mà không từ chối nội dung cho mục đích người trưởng thành hợp pháp
Sử dụng ngoại tuyếnCóKhông

Nếu bạn có GPU mạnh và công việc của bạn là riêng tư hoặc ngoại tuyến, cục bộ là một câu trả lời tốt và bạn có thể dừng đọc ở đây. Nếu bạn muốn một mô hình lớn hơn mà không sở hữu máy, hoặc nếu bạn muốn tập lệnh của mình hoạt động giống nhau trên máy tính xách tay, máy chủ và trình chạy CI, phương án lưu trữ đơn giản hơn. Nhiều dự án sử dụng cả hai: một mô hình cục bộ nhỏ trong khi phát triển, mô hình lưu trữ trong sản xuất, được chuyển đổi bằng cách thay đổi một Base URL.

Thiết lập endpoint lưu trữ trong năm phút

Bạn cần một khóa trước. Đăng ký với Google hoặc với email và mật khẩu, sau đó nhận tín dụng dùng thử $0,50 với một cú nhấp chuột trên trang khóa API. Tín dụng này có hiệu lực trong 7 ngày, mỗi người một lần và không cần thanh toán. Sau đó, hãy cài đặt SDK và giữ khóa ra khỏi mã nguồn của bạn.

pip install openai
export NOTRACK_API_KEY="sk-your-key-here"

Máy khách cần hai thay đổi từ thiết lập OpenAI tiêu chuẩn: URL cơ sở và khóa. ID mô hình là uncensored, và chỉ một mô hình được cung cấp.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.nsfwvideogenerator.cc/v1",
    api_key=os.environ["NOTRACK_API_KEY"],
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a concise writing assistant."},
        {"role": "user", "content": "Give me three title ideas for a noir short story."},
    ],
    temperature=0.8,
)

print(resp.choices[0].message.content)
print(resp.usage)

Xác thực là tiêu đề Authorization: Bearer tiêu chuẩn, SDK thêm nó cho bạn. Có hai phương thức: POST /v1/chat/completions và GET /v1/models. Bạn có thể xác nhận kết nối với client.models.list(), trả về ID mô hình có sẵn. Danh sách tham số đầy đủ có trên trang tài liệu.

Phản hồi streaming

Đối với bất cứ thứ gì con người xem, hãy truyền phát. Đặt stream=True và lặp qua các chunk khi sự kiện gửi từ máy chủ đến. Việc sử dụng được báo cáo ở cuối luồng, vì vậy bạn vẫn có thể ghi lại số lượng token.

stream = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Write a four-line poem about rain on a tin roof."}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    usage = getattr(chunk, "usage", None)
    if usage:
        print("\n", usage)

Một chi tiết khiến mọi người bất ngờ: một yêu cầu truyền phát giữ khe độ đồng thời của nó cho đến khi luồng kết thúc. Trên khóa dùng thử với 2 khe, hai luồng mở nghĩa là một cuộc gọi thứ ba sẽ nhận được 429 với mã concurrency. Luôn tiêu thụ hoặc đóng luồng.

Gọi công cụ và chế độ JSON

Endpoint hỗ trợ tools, tool_choice, truyền phát tool_calls và kết quả được gửi lại dưới dạng role: "tool". Dưới đây là một chu trình đầy đủ với một hàm.

import json

tools = [{
    "type": "function",
    "function": {
        "name": "word_count",
        "description": "Count the words in a piece of text.",
        "parameters": {
            "type": "object",
            "properties": {"text": {"type": "string"}},
            "required": ["text"],
        },
    },
}]

messages = [{"role": "user", "content": "How many words are in: the quick brown fox jumps"}]
first = client.chat.completions.create(
    model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)
msg = first.choices[0].message

if msg.tool_calls:
    messages.append(msg)
    for call in msg.tool_calls:
        args = json.loads(call.function.arguments)
        result = len(args["text"].split())
        messages.append({
            "role": "tool",
            "tool_call_id": call.id,
            "content": str(result),
        })
    final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
    print(final.choices[0].message.content)

Luôn phân tích cú pháp arguments một cách phòng thủ; mô hình trả về nó dưới dạng chuỗi JSON và bất kỳ mô hình nào cũng có thể đôi khi tạo ra một chuỗi không hợp lệ. Để có đầu ra có cấu trúc mà không dùng công cụ, hãy sử dụng chế độ JSON.

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "Reply with a JSON object with keys title and tags (list of strings)."},
        {"role": "user", "content": "Describe a lighthouse keeper's diary."},
    ],
    response_format={"type": "json_object"},
    temperature=0.2,
)
data = json.loads(resp.choices[0].message.content)
print(data["title"], data["tags"])

Hãy nhắc đến JSON và đặt tên các khóa trong prompt của bạn, đồng thời giữ nhiệt độ thấp. Bao bọc json.loads trong một khối try cho mã sản xuất.

Giới hạn tốc độ, lỗi và thử lại

Một khóa đầy đủ cho phép 8 yêu cầu đồng thời và 300 yêu cầu mỗi phút. Một khóa dùng thử cho phép 2 và 60. Vượt quá giới hạn, bạn sẽ nhận HTTP 429 với mã rate_limited (quá nhiều yêu cầu mỗi phút) hoặc concurrency (quá nhiều yêu cầu cùng lúc). Khi quá tải tạm thời, API cũng trả về 429 kèm tiêu đề Retry-After: 5. SDK tự động thử lại một số lỗi; đối với một script phân tán, một lớp vỏ bọc nhỏ rõ ràng hơn.

import time
from concurrent.futures import ThreadPoolExecutor
from openai import RateLimitError

def ask(prompt, tries=4):
    for attempt in range(tries):
        try:
            r = client.chat.completions.create(
                model="uncensored",
                messages=[{"role": "user", "content": prompt}],
                max_tokens=300,
            )
            return r.choices[0].message.content
        except RateLimitError:
            time.sleep(5 * (attempt + 1))
    raise RuntimeError("still rate limited")

prompts = [f"Summarize idea number {i} in one sentence." for i in range(20)]
with ThreadPoolExecutor(max_workers=2) as pool:   # 8 on a full key
    results = list(pool.map(ask, prompts))

Cân bằng max_workers với giới hạn độ đồng thời của khóa của bạn sẽ ngăn hầu hết các lỗi 429 trước khi chúng xảy ra. Mỗi phản hồi cũng mang theo X-Request-Id, X-Balance-USD và hai tiêu đề giới hạn tốc độ, mà bạn có thể đọc thông qua client.chat.completions.with_raw_response.create(...) khi bạn cần chúng để gỡ lỗi hoặc hỗ trợ.

Cách chọn giữa cục bộ và lưu trữ

Bỏ qua ý thức hệ và trả lời bốn câu hỏi về dự án của bạn.

  1. Dữ liệu có phải được giữ trên máy của bạn không? Nếu hợp đồng hoặc thói quen yêu cầu điều này, hãy chạy local. Các prompt được lưu trữ từ xa không được dùng cho việc huấn luyện ở đây, nhưng chúng vẫn được truyền qua mạng.
  2. Bạn có bao nhiêu bộ nhớ? Kích thước mô hình quyết định chất lượng. Một máy tính xách tay không có GPU chuyên dụng sẽ giới hạn bạn ở các mô hình nhỏ, và câu trả lời sẽ cho thấy điều đó. Một mô hình được lưu trữ cho bạn một mô hình lớn với cửa sổ ngữ cảnh 100.000 token, điều này khó đạt được tại nhà.
  3. Bạn sẽ gửi bao nhiêu yêu cầu? Vài trăm mỗi tuần là rất dễ dàng ở cả hai phía. Hàng trăm nghìn mỗi tháng biến hóa đơn được lưu trữ thành một con số thực tế, và một máy cục bộ sẽ trở nên hấp dẫn nếu nó nhàn rỗi vào những lúc khác. Hãy tính toán: 100.000 yêu cầu với 1.000 token đầu vào và 500 token đầu ra tốn 100.000 x $0,0004 = $40.
  4. Bạn có cần từ chối được xử lý theo cách nhất định không? Nhiều mô hình trọng số mở đi kèm với hành vi từ chối tích hợp, và những mô hình khác được tinh chỉnh để loại bỏ nó. Mô hình lưu trữ ở đây được tinh chỉnh để trả lời mà không có từ chối nội dung cho việc sử dụng người lớn hợp pháp, vì vậy bạn không cần tìm kiếm các trọng số phù hợp.

Nếu câu trả lời của bạn chỉ cả hai hướng, hãy bắt đầu lưu trữ trong tuần đầu tiên. Dùng thử không tốn gì, và bạn sẽ học được những gì prompt của bạn cần trước khi bạn mua phần cứng hoặc tải xuống một tệp nhiều gigabyte khác.

Những sai lầm phổ biến trong các tập lệnh Python

Hầu hết các vấn đề mà mọi người gặp phải đều nhỏ và có thể khắc phục.

  • URL cơ sở sai. Nó phải kết thúc bằng /v1. Thiếu hậu tố sẽ cho ra lỗi 404, thay vì một thông báo hữu ích. In ra client.base_url nếu bạn nghi ngờ.
  • Khóa trong mã. Đọc nó từ một biến môi trường, như ở trên, và thêm tệp .env của bạn vào .gitignore.
  • Tên mô hình sai. Chỉ có một ID mô hình là uncensored. Các tên từ các nhà cung cấp khác sẽ không hoạt động, vì vậy hãy thay đổi chúng khi bạn chuyển mã.
  • Vòng lặp không giới hạn. Một vòng lặp gọi công cụ không bao giờ kết thúc là một lỗi tốn kém. Hãy giới hạn nó ở, ví dụ, năm vòng.
  • Bỏ qua ngân sách ngữ cảnh. Prompt và phần hoàn thành chia sẻ 100.000 token. Nếu bạn thêm mọi lượt mãi mãi, bạn sẽ cuối cùng đạt đến giới hạn. Cắt ngắn hoặc tóm tắt các tin nhắn cũ.
  • Giả định JSON luôn hợp lệ. Ngay cả trong chế độ JSON, hãy kiểm tra các khóa bạn cần trước khi sử dụng chúng.

Khi có gì đó có vẻ sai ở phía máy chủ, hãy trích dẫn giá trị X-Request-Id từ phản hồi khi bạn viết cho support. Nó cho phép các nhà vận hành tìm ra cuộc gọi chính xác của bạn.

Chi phí tùy chọn lưu trữ cho công việc Python

Một lệnh gọi tập lệnh điển hình với 1.000 token đầu vào và 500 token đầu ra tốn $0,00015 cộng $0,00025, tức là $0,0004. Tín dụng $0,50 đủ cho khoảng 1.250 lần như vậy. Nạp tiền $20, mức tối thiểu, đủ cho 50.000. Tín dụng không bao giờ hết hạn, các yêu cầu thất bại hoặc bị từ chối không bị tính phí, và prompt không được sử dụng để huấn luyện. Nạp tiền lên đến $500 với tiền thưởng từ $50, và thanh toán bằng tiền mã hóa, USDT trên TRC20 hoặc USDC trên Base. Xem trang giá cả để biết chi tiết.

Nó chỉ là văn bản: không có hình ảnh, âm thanh, video, embedding hoặc tinh chỉnh. Và quy tắc cứng duy nhất là không có nội dung tình dục liên quan đến người chưa thành niên. Đối với một dự án Python cần tạo văn bản với ít từ chối hơn, đó là toàn bộ phạm vi.

Hỏi đáp

Tôi cần gói Python nào?

Gói openai chính thức. Đặt base_url thành https://api.nsfwvideogenerator.cc/v1, truyền khóa của bạn dưới dạng api_key và sử dụng model ID uncensored.

Tôi có thể sử dụng LangChain hoặc các khung khác không?

Bất kỳ máy khách nào cho phép bạn đặt Base URL và khóa tương thích với OpenAI đều hoạt động, vì API tuân theo định dạng chat completions. Hãy trỏ nó đến Base URL và sử dụng uncensored làm tên mô hình.

Các mô hình cục bộ miễn phí có tốt như một mô hình được lưu trữ không?

Điều đó phụ thuộc vào mô hình và phần cứng của bạn. Các mô hình vừa với máy tính xách tay thường nhỏ hơn và yếu hơn so với một mô hình được lưu trữ lớn, nhưng chúng không tốn phí mỗi token và hoạt động ngoại tuyến.

Làm thế nào để tránh lỗi 429 trong Python?

Giữ số lượng luồng công việc ở mức bằng hoặc thấp hơn giới hạn độ đồng thời của bạn (2 trên khóa dùng thử, 8 trên khóa đầy đủ), và thử lại sau một khoảng thời gian ngủ ngắn khi bạn nhận được rate_limited, concurrency hoặc phản hồi Retry-After: 5.

Khóa của bạn chỉ cách một biểu mẫu

Tạo tài khoản, sao chép khóa, thay đổi URL cơ sở. Đó là toàn bộ thiết lập.