概要
- OpenAI SDK クライアントで base URL を明示的に設定してください。これにより、間違ったエンドポイントにアクセスするのを防げます。
- ストリーミングチャンクを注意深く解析し、最後のSSEイベントから最終的なトークン使用量を抽出します。
- ラッパーアプリのために構造化された出力を確実にするためにresponse_format json_objectを使用します。
- 切り捨てエラーを避けるために、大きなプロンプトを送信する前にコンテキストウィンドウの制限を確認してください。
OpenAIクライアント用のベースURLの設定を忘れる
最初のミスは、リクエストを送る前に行われます。大手プロバイダーから安価な代替プロバイダーに切り替える際、ベース URL を更新し忘れることがよくあります。SDK はデフォルトのエンドポイントにリクエストを送りますが、そのエンドポイントが閉鎖されているかレート制限されている可能性があります。
クライアントオブジェクトを直ちに構成してください。ベースURLを https://api.apillmcheapest.com/v1 SDK 初期化内。これにより、すべての呼び出しが正しいサーバーに行きます。標準的な OpenAI 互換ライブラリをいずれも使用できます。変更は通常1行のコードで済みます。
- 新しいベース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 で動作します。コードをシンプルかつ堅牢に保ちます。
- 「
content各チャンク内のフィールド。 - テキストをバッファ変数に追加します。
- ストリームが閉じた後にのみ、全文を処理します。
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)ストリーミングは知覚レイテンシーを大幅に低減します。ユーザーはトークンがリアルタイムで表示されるのを見ることができます。これにより、アプリがより高速でレスポンシブに感じられます。
構造化データのJSONモードを無視
AIラッパーを構築する場合、構造化データが必要になることがほとんどです。モデルにJSONを返すよう指示しても形式が強制されない場合、パーサーが破綻します。モデルはマークダウンのコードブロックや余分なテキストを追加する可能性があります。これにより、後続のロジックが壊れます。
を使用 response_format パラメータ。に設定 {"type": "json_object"}これはモデルに有効なJSONを出力させることを強制します。解析エラーを減らし、コードを簡素化します。毎回一貫した結果が得られます。
- 要件に合わせた厳格なJSONスキーマを定義する。
- リクエストにresponse_formatパラメータを設定します。
- さらに処理する前に出力を検証します。
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);この機能はデータ抽出タスクにとって重要です。これにより、サイドプロジェクトが手動介入なしで数千件のリクエストを処理できます。
コンテキストウィンドウを確認せずにトークン制限に達する
コンテキストウィンドウにはハードリミットがあります。モデルの容量を超えるプロンプトを送信すると、リクエストが失敗します。トークンとお金を無駄に失います。多くの開発者は、実際の制限よりも制限が高いと誤解しています。
データ送信前にコンテキストウィンドウのサイズを確認してください。当モデルは合計100,000トークンをサポートしています。これには入力と出力の両方が含まれます。生成用に余裕を持たせるため、プロンプトは84,000トークン以下に抑えてください。トークン数は正確に計算してください。精度を高めるためにトークナイザーライブラリを使用してください。
- プロンプトテキストのトークンをカウントします。
- レスポンスの推定トークン数を追加してください。
- 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におけるストリーミングトークンカウントを見逃す
トークン数は課金にとって重要です。支出が正確にどれだけかを知る必要があります。一部のAPIは最終レスポンスでのみトークン使用量を返します。他のAPIはすべてのチャンクにそれを含めます。データをどこで探すかを知る必要があります。
ストリームの最終チャンクを確認してください。トークン使用量は、最終のSSEイベントに含まれることがよくあります。このデータを解析して支出を追跡してください。入力トークンと出力トークンを合計して総コストを算出します。これにより、予算内で収めることができます。
- ストリームの最終チャンクをリッスンします。
- 抽出
usageレスポンスからのデータ。 - 請求分析のためにトークン数をログに記録します。
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)正確な追跡で予期せぬ請求を防ぎます。トークン使用量に基づいてプロンプトを最適化できます。この知識はプロジェクトのスケールアップに不可欠です。
Not Using Seed for Reproducible Results
LLM はデフォルトで非決定論的です。同じプロンプトを2回実行すると、異なる出力が得られる可能性があります。これは創造的なタスクには適していますが、テストには適していません。コードのデバッグには一貫した結果が必要です。
「 seed リクエストのパラメータ。固定整数値を使用します。これにより、同じ出力が得られる可能性が高まります。100%の決定論を保証するわけではありませんが、テストが大幅に容易になります。
- シード用のランダム整数を選択します。
- すべてのリクエストにシードを含めます。
- 開発中の出力の一貫性を確認してください。
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の選択
トークン単価は物語の一部に過ぎません。レート制限も重要です。制限に達すると、アプリが動作しなくなります。リトライやユーザー離脱のために追加の費用がかかる可能性があります。プロバイダー間で制限を比較してください。
1分あたりのリクエスト数と同時接続数を確認してください。当APIは1分あたり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?"}]
}'最も安いオプションが必ずしも最善とは限りません。速度が遅くなることがあるからです。コストとパフォーマンスのバランスを取ってください。ユーザーは高速な応答を期待します。