การควบคุมการใช้งาน Token บน OpenAPI ผ่าน Completion API

Paul Story
NexaByte Dispatches
2 min readApr 27, 2023

By @NexaByte Dispatches

สืบเนื่องจาก Part 1 เพื่อให้เข้าใจหลักการทำงานของ Text Completion มากขึ้น

กำหนดจำนวน Token ก่อนใช้งาน

อย่างที่ทราบกัน OpenAI คิดค่าใช้จ่ายตามจำนวน token ที่เราเรียกใช้งาน ดังนั้นหากเราไม่ระมัดระวังในการสร้างคำถาม prompt และไม่มีการกำหนด limit ให้กับ token ก็จะทำให้ token ของเราหมดเร็วขึ้น

เราจึงควรต้องสร้างรูปแบบคำถาม prompt ให้เฉพาะเจาะจงลงไปและกำหนดจำนวน limit ให้กับ token เพื่อหลีกเลี่ยงคำตอบที่ได้มาเกินความจำเป็นและลดการใช้จำนวน token ลงไปด้วย

ทาง OpenAI ใช่ว่าจะใจร้ายนะครับ เขาได้ให้ค่า property ที่ชื่อว่า “max_tokens” มาเพื่อกำหนดจำนวน limit ของ token ที่ใช้ในการสร้างคำตอบ ซึ่งจะช่วยควบคุมความยาวของคำตอบ หากคำตอบยาวเกินไปก็จะถูกตัดให้สั้นลง และเหตุผลของการหยุดสร้างคำตอบคือ “length” ซึ่งบอกว่าคำตอบนั้นถูกตัดก่อนที่คำตอบจะถูกสร้างเสร็จสมบูรณ์

// Bad answer (completion response), เกินจำนวน token ที่ถูก limit ไว้
{
...
"finish_reason": "length"
}

ต่อมาเราดูกันว่าถ้ากำหนด limit ให้กับจำนวน token แล้วจะเกิดอะไรขึ้น ในที่นี้ผมจะกำหนด limit ไว้ที่ 2000 tokens

{
"model": "text-davinci-003",
"prompt": "Explain the text completion api.",
"max_tokens": 2000
}

Completion Request บน Postman (ดูวิธีการทดสอบได้ ที่นี้ ครับ)

Completion Request ด้วย max_tokens = 2000

Completion Response บน Postman

Completion Response ด้วย max_tokens = 2000

ซึ่งเราจะเห็นว่าค่า finish_reason มีค่าเป็น “stop” ก็คือข้อความคำตอบถูกสร้างเสร็จสมบูรณ์เรียบร้อบแล้ว และจำนวน Token ที่ใช้สร้างคำตอบอยู่ที่ 116 token

ยกอีกตัวอย่างถ้าเราต้องการใช้ token ในการสร้างคำตอบกลับมาแค่ 50 token ละครับ

{
"model": "text-davinci-003",
"prompt": "Explain the text completion api.",
"max_tokens": 50
}
Completion Response ด้วย max_token = 50

ค่า finish_reason มีค่าเป็น “length” แสดงว่าข้อความถูกตัดก่อนที่คำตอบจะถูกสร้างเสร็จสมบูรณ์ ซึ่งแบบนี้จะกลายเป็นเราได้คำตอบที่อาจเอาไปใช้งานต่อไม่ได้

จากปัญหาข้างต้นมีเทคนิควิธีการแก้ไขด้วยการระบุจำนวน limit ให้กับ token ลงไปใน prompt ได้เลยครับ

{
"model": "text-davinci-003",
"prompt": "Explain the text completion api in 50 or less tokens.",
"max_tokens": 50
}

มาดู Completion response กันครับ

Completion Response ด้วยการกำหนดจำนวน limit ของ token ลงใน prompt

เราจะได้ค่า finish_reason มีค่าเป็น “stop” ก็คือข้อความคำตอบถูกสร้างเสร็จสมบูรณ์และเป็นคำตอบที่สามารถเอาไปใช้งานต่อไปได้ครับ

หวังว่าเทคนิคนี้จะทำให้เราเข้าใจการควบคุม token ของเรามากขึ้นนะครับ

ไว้คร่าวหน้าจะมาอธิบายส่วนสำคัญอื่นๆ ที่จำเป็นต้องรู้ในการนำไปใช้ต่อยอดในการพัฒนาเชิงธุรกิจต่อไปครับ

สำหรับเนื้อหาในส่วนของ Part 1 หากใครยังไม่ได้อ่านครับ

--

--