خلاصه
- همیشه URL پایه را به صراحت در کلاینت SDK OpenAI خود تنظیم کنید تا از برخورد با انتهای نامناسب جلوگیری شود.
- بخشهای جریاندار را با دقت تجزیه کنید تا مصرف نهایی توکن را از رویداد SSE آخر استخراج کنید.
- از response_format json_object اطمینان حاصل کنید که خروجیهای ساختاریافته برای برنامههای wrapper وجود دارد.
- محدودیتهای پنجره زمینه خود را قبل از ارسال پرامپتهای بزرگ بررسی کنید تا از خطاهای بریدگی جلوگیری کنید.
فراموش کردن تنظیم URL پایه برای کلاینتهای OpenAI
اولین اشتباه قبل از ارسال حتی یک درخواست رخ میدهد. وقتی از یک ارائهدهنده بزرگ به یک جایگزین ارزانتر تغییر مسیر میدهید، اغلب فراموش میکنید URL پایه را بهروزرسانی کنید. SDK شما درخواستها را به نقطه پایانی پیشفرض ارسال میکند که ممکن است بسته باشد یا محدودیت نرخ (Rate-limit) داشته باشد.
شیء کلاینت را فوراً پیکربندی کنید. URL پایه را روی تنظیم کنید https://api.apillmcheapest.com/v1 در راهاندازی SDK شما. این تضمین میکند که تمام درخواستها به سرور صحیح ارسال میشوند. میتوانید از هر کتابخانه استاندارد سازگار با OpenAI استفاده کنید. تغییر معمولاً یک خط کد است.
- کلاینت خود را با 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)این قدم کوچک از ساعتها اشکالزدایی بعدی جلوگیری میکند. میخواهید برنامه wrapper شما از روز اول به طور قابل اعتماد کار کند.
پیکربندی نادرست قطعات پاسخ Streaming
استریم برای تجربه کاربری ضروری است، اما پیچیدگی ایجاد میکند. بسیاری از توسعهدهندگان پاسخهای استریم را مانند JSON استاندارد در نظر میگیرند. آنها سعی میکنند کل استریم را بهعنوان یک شیء واحد تجزیه کنند. این شکست میخورد زیرا دادهها به قطعات میرسند.
هر قطعه را بهتکتک مدیریت کنید. محتوای متنی را از هر رویداد جمعآوری کنید. فقط رشته ترکیبشده نهایی را زمانی که استریم پایان مییابد تجزیه کنید. این رویکرد برای هر API LLM که انتخاب میکنید کار میکند. کد شما را ساده و مقاوم نگه میدارد.
- Listen for the
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)استریمینگ تأخیر ادراکشده را به شدت کاهش میدهد. کاربران توکنها را به صورت بلادرنگ مشاهده میکنند. این موضوع باعث میشود برنامه شما سریعتر و واکنشگراتر به نظر برسد.
نادیده گرفتن حالت JSON برای دادههای ساختاریافته
اگر در حال ساخت یک پوشش (wrapper) هوش مصنوعی هستید، احتمالاً به دادههای ساختاریافته نیاز دارید. درخواست از مدل برای بازگرداندن JSON بدون اجبار فرمت، منجر به شکسته شدن پارسرها میشود. مدل ممکن است بلوکهای کد markdown یا متن اضافی اضافه کند. این منطق downstream شما را خراب میکند.
از 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);این قابلیت برای وظایف استخراج داده حیاتی است. این تضمین میکند که پروژه جانبی شما میتواند هزاران درخواست را بدون مداخله دستی مدیریت کند.
رسیدن به محدودیت توکنها بدون بررسی پنجره زمینه
پنجرههای زمینه محدودیتهای سخت دارند. اگر پرامپتی ارسال کنید که از ظرفیت مدل تجاوز کند، درخواست شکست میخورد. شما توکنها و پول خود را برای هیچ از دست میدهید. بسیاری از توسعهدهندگان فرض میکنند که حد بالاتر از آنچه که واقعاً هست، است.
اندازه پنجره زمینه را قبل از ارسال داده بررسی کنید. مدل ما از مجموع ۱۰۰,۰۰۰ توکن پشتیبانی میکند. این شامل ورودی و خروجی میشود. پرامپت خود را زیر ۸۴,۰۰۰ توکن نگه دارید تا فضای کافی برای تولید باقی بماند. تعداد توکنها را به دقت محاسبه کنید. برای دقت بیشتر از کتابخانه توکنشمار استفاده کنید.
- توکنها را در متن پرامپت خود بشمارید.
- توکنهای تخمینی برای پاسخ را اضافه کنید.
- به طور قابل توجهی زیر حد 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 را در درخواست ارسال کنید.
- مدریت فراخوانی ابزارها در حلقه کد خود.
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ها فقط مصرف توکن را در پاسخ نهایی برمیگردانند. برخی دیگر آن را در هر قطعه شامل میشوند. شما باید بدانید دادهها را کجا پیدا کنید.
قطعه آخر استریم را بررسی کنید. مصرف توکن اغلب در رویداد نهایی SSE گنجانده شده است. این دادهها را تجزیه کنید تا هزینههای خود را ردیابی کنید. توکنهای ورودی و خروجی را جمع بزنید تا هزینه کل را به دست آورید. این به شما کمک میکند تا در محدوده بودجه بمانید.
- Listen for the final chunk in the stream.
- استخراج
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)ردیابی دقیق از صورتهای حساب غیرمنتظره جلوگیری میکند. میتوانید پرامپتهای خود را بر اساس مصرف توکن بهینهسازی کنید. این دانش برای مقیاسپذیری پروژه شما حیاتی است.
عدم استفاده از Seed برای نتایج قابل تکرار
مدلهای زبانی بزرگ به طور پیشفرض غیرقطعی هستند. اجرای یک درخواست یکسان دو بار ممکن است خروجیهای متفاوتی تولید کند. این موضوع برای وظایف خلاقانه خوب است، اما برای تست بد است. شما به نتایج ثابت برای اشکالزدایی کد خود نیاز دارید.
تنظیم seed پارامتر را در درخواست خود تنظیم کنید. از یک مقدار عددی ثابت استفاده کنید. این شانس دریافت خروجی یکسان را افزایش میدهد. این موضوع تضمینکننده ۱۰۰٪ قطعی نیست. اما تست را بسیار آسانتر میکند.
- یک عدد صحیح تصادفی برای seed خود انتخاب کنید.
- 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);تکرارپذیری اشکالزدایی را به طور قابل توجهی تسریع میکند. میتوانید مشکلات را بدون حدس و گمان پیدا کنید. از seedها در طول توسعه استفاده کنید و آنها را در محیط تولید حذف کنید.
انت ارزانترین API LLM بدون بررسی محدودیتها
قیمت به ازای توکن تنها بخشی از داستان است. محدودیت نرخ نیز مهم است. اگر به محدودیت برسید، برنامه شما از کار میافتد. ممکن است برای تلاشهای مجدد یا از دست دادن کاربران هزینه بیشتری بپردازید. محدودیتها را در میان ارائهدهندگان مختلف مقایسه کنید.
تعداد درخواستها در دقیقه و اتصالات همزمان را بررسی کنید. 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?"}]
}'ارزانترین گزینه لزوماً بهترین گزینه نیست اگر سرعت را کاهش دهد. هزینه را با عملکرد تعادل دهید. کاربران شما انتظار پاسخهای سریع دارند.