सारांश
- गलत एंडपॉइंट पर हिट करने से बचने के लिए अपने OpenAI SDK क्लाइंट में बेस यूआरएल स्पष्ट रूप से सेट करें।
- अंतिम SSE इवेंट से अंतिम टोकन उपयोग निकालने के लिए स्ट्रीमिंग चंक को सावधानी से पार्स करें।
- व्रैपर ऐप्स के लिए स्ट्रक्चर्ड आउटपुट्स को सुनिश्चित करने के लिए response_format json_object का उपयोग करें।
- बड़े प्रॉम्प्ट्स भेजने से पहले अपने कॉन्टेक्स्ट विंडो सीमाओं की जांच करें ताकि ट्रंकेशन त्रुटियों से बचा जा सके।
OpenAI क्लाइंट्स के लिए बेस यूआरएल सेट न करना
पहली गलती तब होती है जब आप अनुरोध भेजने से भी पहले। जब आप एक प्रमुख प्रदाता से सस्ते विकल्प पर स्विच करते हैं, तो आप अक्सर बेस URL अपडेट करना भूल जाते हैं। आपका SDK डिफ़ॉल्ट एंडपॉइंट पर अनुरोध भेजता है, जो बंद या रेट-लिमिटेड हो सकता है।
अपने क्लाइंट ऑब्जेक्ट को तुरंत कॉन्फ़िगर करें। base 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)यह छोटा कदम बाद में घंटों की डिबगिंग से बचाता है। आप चाहते हैं कि आपका व्रैपर एप्लिकेशन पहले दिन से ही विश्वसनीय रूप से काम करे।
स्ट्रीमिंग प्रतिक्रिया चंक्स की गलत विन्यास
यूजर एक्सपीरियंस के लिए स्ट्रीमिंग आवश्यक है, लेकिन इसमें जटिलता आती है। कई डेवलपर्स स्ट्रीमिंग रिस्पॉन्स को स्टैंडर्ड JSON की तरह मानते हैं। वे पूरी स्ट्रीम को एकल ऑब्जेक्ट के रूप में पार्स करने का प्रयास करते हैं। यह विफल हो जाता है क्योंकि डेटा टुकड़ों में आता है।
प्रत्येक चंक को अलग-अलग हैंडल करें। प्रत्येक इवेंट से टेक्स्ट कंटेंट को एकत्र करें। स्ट्रीम समाप्त होने पर केवल अंतिम संयुक्त स्ट्रिंग को पार्स करें। यह दृष्टिकोण आप जिस भी LLM API का चयन करते हैं, उसके लिए काम करता है। यह आपके कोड को सरल और मजबूत रखता है।
- सुनें
contentfield प्रत्येक चंक में। - टेक्स्ट को एक बफर वेरिएबल में जोड़ें।
- स्ट्रीम बंद होने के बाद ही पूर्ण टेक्स्ट को प्रोसेस करें।
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 स्कीमा परिभाषित करें।
- रिस्पॉन्स फॉर्मेट पैरामीटर को अपने रिक्वेस्ट में सेट करें।
- अधिक प्रसंस्करण से पहले आउटपुट की जांच करें।
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 एरे पास करें।
- अपने कोड लूप में टूल कॉल्स हैंडल करें।
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 में स्ट्रीमिंग टोकन काउंट को नजरअंदाज करना
टोकन गिनती बिलिंग के लिए महत्वपूर्ण है। आपको यह जानने की आवश्यकता है कि आप बिल्कुल कितना खर्च करते हैं। कुछ APIs केवल अंतिम प्रतिक्रिया में टोकन उपयोग लौटाते हैं। अन्य इसे हर चंक में शामिल करते हैं। आपको डेटा कहाँ मिलना चाहिए, यह जानना जरूरी है।
स्ट्रीम के अंतिम चंक की जाँच करें। टोकन उपयोग अक्सर अंतिम 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)सटीक ट्रैकिंग से अचानक बिल से बचा जा सकता है। आप टोकन उपयोग के आधार पर अपने प्रॉम्प्ट्स को अनुकूलित कर सकते हैं। अपनी परियोजना को स्केल करने के लिए यह ज्ञान अत्यंत महत्वपूर्ण है।
पुनरुत्पादक परिणामों के लिए सीड का उपयोग न करें
LLMs डिफ़ॉल्ट रूप से गैर-निर्धारक होते हैं। एक ही प्रॉम्प्ट को दो बार चलाने से अलग-अलग आउटपुट मिल सकते हैं। यह रचनात्मक कार्यों के लिए ठीक है, लेकिन परीक्षण के लिए बुरा है। आपको अपने कोड को डिबग करने के लिए स्थिर परिणामों की आवश्यकता होती है।
सेट करें 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);पुनरुत्पादन डिबगिंग को काफी तेज बनाता है। आप बिना अनुमान लगाए समस्याओं की पहचान कर सकते हैं। विकास के दौरान बीज (seeds) का उपयोग करें और उत्पादन में उन्हें हटा दें।
सीमाओं को जांचे बिना सबसे सस्ता LLM API चुनना
प्रति टोकन कीमत कहानी का केवल एक हिस्सा है। दर सीमाएँ भी मायने रखती हैं। यदि आप सीमा तक पहुँच जाते हैं, तो आपका एप्लिकेशन काम करना बंद कर देता है। आपको रेट्रीज़ या उपयोगकर्ता चयन के लिए अधिक भुगतान करना पड़ सकता है। प्रदाताओं के बीच सीमाओं की तुलना करें।
प्रति मिनट अनुरोध और समवर्ती कनेक्शन की जांच करें। हमारी 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?"}]
}'सबसे सस्ता विकल्प सबसे अच्छा नहीं हो सकता यदि वह आपकी गति को धीमा कर दे। लागत और प्रदर्शन के बीच संतुलन बनाएं। आपके उपयोगकर्ता तेज़ प्रतिक्रियाओं की उम्मीद करते हैं।