สรุป
- กำหนดค่า base URL ให้ชัดเจนเสมอในไคลเอนต์ OpenAI SDK ของคุณ เพื่อหลีกเลี่ยงการเรียกใช้ endpoint ที่ผิด
- แยกวิเคราะห์ชิ้นส่วนสตรีมอย่างระมัดระวังเพื่อดึงการใช้งานโทเค็นสุดท้ายจากเหตุการณ์ SSE สุดท้าย
- ใช้ response_format json_object เพื่อให้แน่ใจว่าผลลัพธ์มีโครงสร้างสำหรับแอป wrapper
- ตรวจสอบขีดจำกัดหน้าต่างบริบทของคุณก่อนส่งพรอมต์ขนาดใหญ่เพื่อหลีกเลี่ยงข้อผิดพลาดการตัดทอน
การลืมที่จะตั้งค่า Base URL สำหรับไคลเอนต์ OpenAI
ข้อผิดพลาดแรกเกิดขึ้นก่อนที่คุณจะส่งคำขอ เมื่อคุณเปลี่ยนจากผู้ให้บริการรายใหญ่ไปเป็นผู้ให้บริการทางเลือกที่มีราคาถูกกว่า คุณมักลืมอัปเดต base URL SDK ของคุณจะส่งคำขอไปยังเอนด์พอยต์เริ่มต้น ซึ่งอาจปิดใช้งานหรือจำกัดอัตราการใช้งาน
กำหนดค่าออบเจ็กต์ client ของคุณทันที ตั้งค่า 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 ของคุณทำงานได้อย่างเชื่อถือได้ตั้งแต่第一天
การกำหนดค่าผิดพลาดของชิ้นส่วนการตอบสนองแบบสตรีม
การสตรีมมีความสำคัญต่อประสบการณ์ผู้ใช้ แต่แนะนำความซับซ้อน นักพัฒนาหลายคนปฏิบัติต่อการตอบสนองแบบสตรีมเหมือน JSON มาตรฐาน พวกเขาพยายามวิเคราะห์สตรีมทั้งหมดเป็นวัตถุเดียว ซึ่งล้มเหลวเพราะข้อมูลมาถึงเป็นชิ้นส่วน
จัดการแต่ละชิ้นส่วนแยกกัน สะสมเนื้อหาข้อความจากแต่ละเหตุการณ์ แยกวิเคราะห์สตริงรวมเฉพาะเมื่อสตรีมสิ้นสุด วิธีนี้ใช้งานได้กับ API LLM ใดๆ ที่คุณเลือก ทำให้โค้ดของคุณเรียบง่ายและแข็งแกร่ง
- ฟังเหตุการณ์
contentfield in each chunk. - ต่อท้ายข้อความไปยังตัวแปร buffer
- ประมวลผลข้อความเต็มรูปแบบหลังจากที่สตรีมปิดลงแล้ว
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 wrapper คุณน่าจะต้องการข้อมูลที่มีโครงสร้าง การขอให้โมเดลส่งคืน JSON โดยไม่บังคับรูปแบบอาจทำให้ parser ผิดพลาด โมเดลอาจเพิ่มบล็อกโค้ด markdown หรือข้อความเพิ่มเติม ซึ่งจะทำลาย logic ด้านหลังของคุณ
ใช้ 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);คุณสมบัตินี้มีความสำคัญสำหรับงานดึงข้อมูล ช่วยให้โปรเจกต์ขนาดเล็กของคุณสามารถจัดการคำขอได้หลายพันรายการโดยไม่ต้องมีการแทรกแซงด้วยมือ
การชนขอบเขตโทเคนโดยไม่ตรวจสอบหน้าต่างบริบท
ขนาดบริบทมีขีดจำกัดที่ตายตัว หากคุณส่งคำขอที่เกินความจุของโมเดล คำขอจะล้มเหลว คุณสูญเสียโทเค็นและเงินไปโดยเปล่าประโยชน์ นักพัฒนาหลายคนสันนิษฐานว่าขีดจำกัดสูงกว่าความเป็นจริง
ตรวจสอบขนาด context window ก่อนส่งข้อมูล โมเดลของเรารองรับ 100,000 tokens รวมทั้ง input และ output เก็บ prompt ไว้ต่ำกว่า 84,000 tokens เพื่อให้เหลือพื้นที่สำหรับการ generate คำนวณจำนวน tokens ให้แม่นยำ ใช้ไลบรารี tokenizer เพื่อความถูกต้อง
- นับโทเค็นในข้อความ prompt ของคุณ
- เพิ่มจำนวนโทเค็นประมาณการสำหรับคำตอบ
- อยู่ต่ำกว่าขีดจำกัด 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 call วางแผนการใช้งาน context ของคุณอย่างระมัดระวัง
สมมติว่าการเรียกใช้ฟังก์ชันทำงานเหมือน 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 บางรายคืนข้อมูลการใช้งานโทเค็นเฉพาะในข้อมูลตอบกลับสุดท้าย บางรายรวมไว้ในทุกชิ้นข้อมูล คุณต้องรู้ว่าจะหาข้อมูลได้ที่ไหน
ตรวจสอบ chunk สุดท้ายของ stream การใช้งาน tokens มักจะรวมอยู่ใน event SSE สุดท้าย วิเคราะห์ข้อมูลนี้เพื่อติดตามการใช้จ่ายของคุณ รวมจำนวน input และ output tokens เพื่อต้นทุนรวม ช่วยให้คุณอยู่ในงบประมาณ
- ฟัง chunk สุดท้ายในสตรีม
- ดึงข้อมูล
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)การติดตามที่แม่นยำช่วยป้องกันบิล surpresa คุณสามารถปรับแต่ง prompt ของคุณตามการใช้ token ความรู้นี้สำคัญมากสำหรับการขยายโปรเจกต์ของคุณ
Not Using Seed for Reproducible Results
LLM เป็นแบบ Non-deterministic โดยค่าเริ่มต้น การรันคำขอเดียวกันสองครั้งอาจให้ผลลัพธ์ที่แตกต่างกัน ซึ่งเหมาะสำหรับงานเชิงสร้างสรรค์ แต่ไม่ดีสำหรับการทดสอบ คุณต้องการผลลัพธ์ที่สม่ำเสมอเพื่อแก้ไขข้อบกพร่องในโค้ดของคุณ
ตั้งค่า seed พารามิเตอร์นี้ในคำขอของคุณ ใช้ค่าจำนวนเต็มคงที่ สิ่งนี้เพิ่มโอกาสในการได้รับเอาต์พุตเดียวกัน มันไม่รับประกันความแน่นอน 100% มันทำให้การทดสอบง่ายขึ้นมาก
- เลือกจำนวนเต็มสุ่มสำหรับ 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);ความสามารถในการทำซ้ำช่วยให้การแก้ไขข้อบกพร่องเร็วขึ้นอย่างมาก คุณสามารถระบุปัญหาได้โดยไม่ต้องคาดเดา ใช้ 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?"}]
}'ตัวเลือกที่ถูกที่สุดอาจไม่ใช่ตัวเลือกที่ดีที่สุดหากมันทำให้ความเร็วลดลง ควรดุลยภาพระหว่างต้นทุนกับประสิทธิภาพ ผู้ใช้ของคุณคาดหวังการตอบสนองที่รวดเร็ว