摘要
- 始終在您的 OpenAI SDK 客戶端中明確設定 base URL,以避免命中錯誤的端點。
- 仔細解析串流區塊,從最後一個 SSE 事件中提取最終 token 使用量。
- 使用 response_format json_object 確保包裝應用程式的結構化輸出。
- 在發送大型提示詞之前,請檢查您的上下文視窗限制,以避免截斷錯誤。
忘記為 OpenAI 客戶端設定 Base URL
第一個錯誤發生在您發送請求之前。當您從大型供應商切換到較便宜的替代方案時,您經常忘記更新 base URL。您的 SDK 會將請求發送到預設端點,該端點可能已關閉或受到速率限制。
立即設定您的客戶端物件。將基礎 URL 設為 https://api.apillmcheapest.com/v1 您的 SDK 初始化中。這確保所有呼叫都發送到正確的伺服器。您可以使用任何標準的 OpenAI-compatible 庫。更改通常只需要一行程式碼。
- 使用新的基礎 URL 初始化您的客戶端。
- 透過簡單的模型列表呼叫來驗證連線。
- 檢查 API 金鑰是否正確傳遞。
from openai import OpenAI
client = OpenAI(base_url="https://api.apillmcheapest.com/v1", api_key="YOUR_KEY")
resp = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Summarise this thread without softening it."}],
)
print(resp.choices[0].message.content)這小小的一步能防止後續數小時的除錯。您希望您的包裝應用程式從第一天起就能可靠運作。
誤配串流回應區塊
串流對於使用者體驗至關重要,但會引入複雜性。許多開發人員將串流回應視為標準 JSON。他們嘗試將整個串流解析為單一物件。這會失敗,因為數據是分塊到達的。
個別處理每個區塊。從每個事件累積文字內容。僅在串流結束時解析最終合併的字串。此方法適用於您選擇的任何 LLM API。它讓您的程式碼保持簡單且穩健。
- 監聽
contentfield in each chunk. - 將文字附加至緩衝區變數。
- 在串流關閉後,才處理完整的文字內容。
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Tell the story in second person."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)串流可顯著降低感知延遲。使用者可以即時看到 token 出現。這會讓您的應用程式感覺更快、更具回應性。
忽略 JSON 模式用於結構化數據
如果您正在開發 AI 包裝程式,您可能需要結構化資料。要求模型返回 JSON 但不強制執行格式會導致解析器出錯。模型可能會加入 Markdown 程式碼區塊或額外文字。這會破壞您的下游邏輯。
使用 response_format 參數。將其設定為 {"type": "json_object"}. 這可強制模型輸出有效的 JSON。這能減少解析錯誤並簡化您的程式碼。您每次都能獲得一致的結果。
- 為你的需求定義嚴格的 JSON 結構。
- 設定請求中的回應格式參數。
- 在進一步處理之前驗證輸出。
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.apillmcheapest.com/v1", apiKey: process.env.API_KEY });
const resp = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Draft a villain monologue for my game." }],
});
console.log(resp.choices[0].message.content);此功能對於資料提取任務至關重要。它可確保您的專案能處理數千次請求而無需人工干預。
未檢查上下文視窗即達到 Token 限制
上下文窗口有硬性限制。如果您發送的提示超出模型的容量,請求將失敗。您會白白損失 token 和金錢。許多開發者認為限制比實際情況更高。
發送資料前請檢查上下文視窗大小。我們的模型總共支援 100,000 個 token。這包括輸入和輸出。請將提示保持在 84,000 個 token 以下,以保留生成空間。請準確計算 token 數量。使用 tokenizer 函式庫以確保精確性。
- 計算提示詞文本中的 token。
- 為回應添加預估的令牌數量。
- 遠低於 100,000 的限制。
curl https://api.apillmcheapest.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "What is the current status of the database migration job?"}]
}'忽略限制會導致昂貴的錯誤。你希望最大化每次 API 呼叫的價值。請仔細規劃上下文使用情況。
假設函式呼叫運作方式類似 GPT-4
函式呼叫的語法因供應商而異。工具定義格式可能略有不同。您的程式碼可能會傳送模型無法識別的參數。這會導致產生空的函式呼叫或錯誤。
審查您特定 API 的函數調用文件。使用標準 JSON 格式定義工具。在請求主體中傳遞 tools 陣列。模型會在回應中返回工具調用。執行函數並將結果回傳。
- 定義具有清晰描述的工具。
- 在請求中傳遞 tools 陣列。
- 在程式碼迴圈中處理工具呼叫。
from openai import OpenAI
client = OpenAI(base_url="https://api.apillmcheapest.com/v1", api_key="YOUR_KEY")
resp = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Summarise this thread without softening it."}],
)
print(resp.choices[0].message.content)函式呼叫使複雜的工作流程成為可能。它允許模型決定何時使用外部資料。請確保您的實作符合 API 規格。
忽略 SSE 中的串流計數
Token 計數對於計費至關重要。您需要知道您確切花費了多少。某些 API 僅在最終回應中返回 Token 使用情況。其他 API 則在每個區塊中包含它。您必須知道在哪裡找到數據。
檢查串流的最後一個區塊。Token 用量通常包含在最後一個 SSE 事件中。解析此數據以追蹤您的支出。將輸入和輸出 token 相加以計算總成本。這有助於您將支出控制在預算範圍內。
- 監聽串流中的最後一個區塊。
- 提取
usage來自回應的資料。 - 記錄 token 計數以進行帳單分析。
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Tell the story in second person."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)精確追蹤可避免意外帳單。您可以根據 token 使用量最佳化提示詞。這項知識對於擴展專案至關重要。
未使用 Seed 獲得可重現結果
LLM 預設為非確定性。執行相同的提示兩次可能會產生不同的輸出。這對於創意任務來說沒問題,但對於測試來說卻不好。您需要一致的結果來除錯程式碼。
設定 seed 參數於您的請求中。使用固定的整數值。這增加了獲得相同輸出的機會。它不能保證 100% 的確定性。但它使測試變得更容易。
- 為您的種子選擇一個隨機整數。
- 在每個請求中包含 seed。
- 驗證開發期間的輸出一致性。
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.apillmcheapest.com/v1", apiKey: process.env.API_KEY });
const resp = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Draft a villain monologue for my game." }],
});
console.log(resp.choices[0].message.content);可重現性顯著加快了調試速度。您可以準確定位問題,無需猜測。在開發期間使用種子,並在生產環境中移除它們。
選擇最便宜的 LLM API 而不檢查限制
Token 單價只是故事的一部分。速率限制同樣重要。如果您觸及限制,應用程式就會停止運作。您可能需要為重試付費,或面臨使用者流失。比較不同供應商的限制條件。
檢查每分鐘請求數和並行連線。我們的 API 允許每分鐘 300 次請求。這足以滿足大多數側邊專案。確保限制符合您的使用模式。避免具有嚴格節流措施的供應商。
- 比較各供應商的 RPM 限制。
- 檢查併發請求限制。
- 使用小型負載測試測試限制。
curl https://api.apillmcheapest.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "What is the current status of the database migration job?"}]
}'最便宜的選項未必是最佳選擇,如果它會拖慢速度。請在成本與效能之間取得平衡。您的使用者期望快速的回應。