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ỏi | Tự chạy nó | API lưu trữ trả trước |
|---|---|---|
| Chi phí trên mỗi token | Khô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ập | Cài đặt runtime, tải trọng lượng, tinh chỉnh cài đặt | Cài đặt một gói, dán khóa |
| Độ dài ngữ cảnh | Giới hạn bởi bộ nhớ của bạn | 100.000 token, prompt cộng với hoàn tất |
| Yêu cầu đồng thời | Bất cứ gì máy của bạn xử lý được | 8 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ối | Phụ 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ến | Có | 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.
- 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.
- 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à.
- 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.
- 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 raclient.base_urlnế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
.envcủ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.
