در دنیای امروز که مدلهای زبانی و سیستمهای مولد هوش مصنوعی در مرکز بسیاری از محصولات نرمافزاری قرار گرفتهاند، مدیریت صحیح توکنها به یکی از مهمترین مهارتهای توسعهدهندگان تبدیل شده است. همه چیز از همین نقطه شروع میشود: توکنایزیشن؛ فرایندی که متن را به واحدهای کوچکی به نام توکن تبدیل میکند تا مدل هوش مصنوعی بتواند آن را پردازش کند.
از درک عملکرد توکنها گرفته تا شمارش و بهینهسازی آنها، هر مرحله تاثیر مستقیمی روی هزینه، سرعت و کیفیت خروجی مدل دارد. بههمین دلیل، توسعهدهندگان باید بدانند توکنها چگونه تولید میشوند، چطور شمارش میشوند و چگونه میتوان مصرف آنها را کاهش داد.
در این مقاله به صورت قدمبهقدم به مفاهیم پایه توکنایزیشن، اهمیت تعداد توکنها، روشهای مختلف شمارش توکنها (بهویژه با Tiktoken)، و استراتژیهای عملی برای کاهش هزینهها پرداختهایم تا دیدی جامع و کاربردی در اختیار شما قرار گیرد.
درک مفهوم Tokenization
تا حالا به این فکر کردهاید که مدلهای هوش مصنوعی چطور زبان انسان را میفهمند؟ پاسخ این سوال در توکنایزیشن نهفته است. توکنایزیشن یعنی شکستن متن به بخشهای کوچکتری که به آنها توکن گفته میشود. این توکنها ممکن است یک کاراکتر باشند یا یک کلمه کامل.
پایتون بهعنوان یکی از محبوبترین زبانها در حوزه هوش مصنوعی، ابزارها و کتابخانههای متنوعی برای انجام توکنایزیشن در اختیار توسعهدهندگان قرار میدهد و این کار را بسیار ساده میکند.
مفاهیم پایه توکنایزیشن
توکنایزیشن یعنی تبدیل یک رشته متنی به مجموعهای از بخشهای کوچکتر به نام توکن. این توکنها واحدهای اصلی هستند که مدلهای زبانی برای درک و تولید متن از آنها استفاده میکنند.
نکته مهم اینجاست که توکنایزیشن فقط جداسازی کلمات با استفاده از فاصله نیست. در فرایند توکنایزیشن، علائم نگارشی، کاراکترهای خاص و حتی بخشهایی از یک کلمه نیز میتوانند بهعنوان یک توکن جداگانه در نظر گرفته شوند. نحوه انجام این فرایند بسته به مدل زبانی و نوع tokenizer مورد استفاده میتواند متفاوت باشد.
مثال سادهای از Tokenization
برای اینکه ببینیم یک متن چگونه توکنایز میشود، میتوانیم از ابزار Tokenizer استفاده کنیم. برای مثال، جمله:
«Natural-language processing is key.»
به شکل زیر توکنایز میشود:
[‘Natural’, ‘-‘, ‘language’, ‘ processing’, ‘ is’, ‘ key’, ‘.’]
این شکستن متن به بخشهای کوچکتر، برای درک نحوه محاسبه تعداد توکنها بسیار مهم است.
در پایتون، با استفاده از کتابخانههایی مثل tiktoken میتوان رشتههای متنی را خیلی سریع به توکن تبدیل کرد. بهعنوان نمونه، با تابع tokenize میتوان از هر رشته متنی یک فهرست از توکنها ساخت. این روش در کارهای مختلفی مثل سیستمهای مولد متن و پردازش زبان طبیعی بسیار کاربردی است. وقتی مفهوم توکن را درک کنید و از ابزارهایی مثل NLTK کمک بگیرید، مدیریت فرایند توکنایزیشن دقیقتر و کمهزینهتر انجام میشود.
اهمیت تعداد توکنها برای بهینهسازی هزینهها

در مدلهای هوش مصنوعی، هزینه و عملکرد مستقیما با تعداد توکنها گره خورده است. هرچه ورودی و خروجی طولانیتر باشد، مصرف توکن و در نتیجه هزینه افزایش پیدا میکند. به همین دلیل، مدیریت و بهینهسازی تعداد توکنها برای توسعهدهندگان ضروری است تا هم هزینه کنترل شود و هم مدل بدون خطا عمل کند.
۱. تاثیر مستقیم بر هزینه API
تعداد توکنهای ورودی و خروجی، مستقیما هزینه استفاده از مدلهای هوش مصنوعی را تعیین میکند. هرچه تعداد توکنها بیشتر باشد، هزینه نیز افزایش پیدا میکند. بنابراین مدیریت توکنها برای کاهش هزینه اهمیت زیادی دارد.
۲. محدودیتهای هر مدل
هر مدل یک سقف مشخص برای تعداد توکن دارد (مثلا GPT-3.5 حدود ۴٬۰۹۶ توکن). اگر ورودی از این حد عبور کند، ممکن است خطا بگیرید یا مدل نتواند پاسخ کامل بدهد. بنابراین کنترل تعداد توکن به جلوگیری از خطا و هزینههای اضافه کمک میکند.
۳. استفاده بهینه از منابع
با شناخت فرایند توکنایزیشن میتوانید پرامپتها را مختصرتر بنویسید و مشخص کنید چه بخشهایی از متن واقعا باید پردازش شوند. این کار مانع هدررفت توکنها روی اطلاعات غیرضروری میشود و منابع را بهتر مدیریت میکند.
۴. کنترل طول خروجی مدل
با تنظیم مقدار max_tokens میتوانید طول پاسخ مدل را محدود کنید. این کار باعث میشود اندازه پاسخها قابلپیشبینی باشد و هزینهها از کنترل خارج نشوند.
۵. پردازش دستهای (Batch Processing)
دانستن تعداد توکنها موقع تقسیم مجموعهدادههای بزرگ به چند بخش کوچکتر بسیار کمک میکند. به این صورت از محدودیت توکن در هر درخواست API جلوگیری میکنید و هم هزینه، هم عملکرد بهینهتر میشود.
در نهایت، هر چه تعداد توکنهای شما بیشتر باشد، هزینه نهایی نیز افزایش پیدا میکند. بنابراین استفاده هوشمندانه و بهینه از توکنها فقط یک موضوع فنی نیست؛ بلکه یک راهکار موثر برای صرفهجویی در هزینهها است.
راهنمای گامبهگام برای بهدستآوردن تعداد توکنها در پایتون

محاسبه تعداد توکنها در پایتون ساده است.
گام ۱: ابزارها و کتابخانههای موردنیاز برای Tokenization
پایتون ابزارها و کتابخانههای زیادی دارد که توکنایزیشن را برای کارهای پردازش زبان طبیعی آسانتر میکنند. یکی از گزینههای شناختهشده NLTK (Natural Language Toolkit) است. این کتابخانه چندین tokenizer مختلف دارد که بسته به نیاز میتوان از آنها استفاده کرد؛ مانند word tokenizer در NLTK که متن را به کلمات جداگانه تبدیل میکند.
گزینه عالی دیگر کتابخانه Tiktoken از OpenAI است. Tiktoken یک توکنایزر سریع است که مخصوص مدلهای OpenAI، شامل GPT-3 و GPT-4، طراحی شده است. این کتابخانه از الگوریتم کارامد Byte Pair Encoding (BPE) استفاده میکند که آن را برای این مدلها بسیار مناسب میسازد.
نصب این کتابخانهها با pip، مدیر بستههای پایتون، بسیار ساده است. برای مثال، برای نصب Tiktoken کافی است دستور زیر را وارد کنید:
|
1 |
pip install tiktoken |
گام ۲: پیادهسازی شمارش توکن در کد پایتون
اضافهکردن شمارش توکن به پروژههای پایتونی بسیار آسان است. ابتدا باید یک کتابخانه مثل Tiktoken را ایمپورت کنید: import tiktoken. سپس encoding مناسب مدل OpenAI پروژهتان را بارگذاری کنید. بهعنوان مثال، اگر از gpt-3.5-turbo استفاده میکنید، بنویسید:
|
1 |
encoding = tiktoken.encoding_for_model(“gpt-3.5-turbo”) |
برای شمارش توکنهای موجود در متن، از متد encode مربوط به encoding استفاده کنید. برای مثال:
|
1 |
tokens = encoding.encode(“Your text string”)tokens = encoding.encode(“Your text string”) |
سپس با بررسی طول لیست tokens تعداد توکنها را بهدست آورید:
|
1 |
token_count = len(tokens) token_count = len(tokens) |
فراموش نکنید که بهجای «Your text string» متن واقعی خود را قرار دهید. با همین چند خط ساده، میتوانید مصرف توکن را در اپلیکیشنهای هوش مصنوعی پایتونی بررسی و بهینهسازی کنید.
برای راحتی کار، میتوانید مستقیما کد زیر را کپی کنید:
|
1 2 3 4 5 6 7 8 9 |
import tiktoken # Select the encoding model (e.g., “gpt-3.5-turbo”) encoding = tiktoken.get_encoding(“gpt-3.5-turbo”) # Input text text = “This is a sample sentence to count tokens.” # Count tokens tokens = encoding.encode(text) token_count = len(tokens) print(f“Token count: {token_count}”) |
استراتژیهای بهینهسازی توکن برای کاهش هزینههای هوش مصنوعی

بهینهسازی مصرف توکن نقش بسیار مهمی در کاهش هزینههای توسعه هوش مصنوعی دارد. میتوانید از رویکردهای زیر استفاده کنید:
۱- ساده کردن متن ورودی
یکی از بهترین روشها برای بهینهسازی توکنها، سادهتر کردن متن ورودی است. در بسیاری از مواقع، متن شامل جزئیات اضافی، تکرارها یا عباراتی است که فهم آنها دشوار است و در نتیجه تعداد توکن را بدون هیچ سود واقعی افزایش میدهد. همچنین بررسی کنید که آیا میتوان همان اطلاعات را با استفاده کمتر از متادیتا یا توضیحات طولانی منتقل کرد.
به یاد داشته باشید:
متن کوتاهتر و شفافتر نهتنها تعداد توکنها را کاهش میدهد، بلکه معمولا باعث ارتباط بهتر با مدل هوش مصنوعی و تولید خروجی دقیقتر و مفیدتر میشود.
۲- بهینهسازی پرامپتها
نحوه طراحی پرامپتها برای مدلهای مولد هوش مصنوعی اهمیت زیادی دارد. پرامپتهای خوب هم پاسخهای باکیفیتتری تولید میکنند و هم باعث مصرف کمتر توکن میشوند. از زبان ساده استفاده کنید و مطمئن شوید که در پرامپت شما هیچ ابهامی وجود ندارد. همچنین میتوانید ساختارهای مختلف پرامپت را امتحان کنید تا بهترین روش برای انتقال منظور خود را پیدا کنید.
به یاد داشته باشید:
وقتی پرامپت بهدرستی طراحی شده باشد، مدل بهتر عمل میکند و از پاسخهای طولانی و غیرضروری که تعداد توکن را بالا میبرد جلوگیری میشود.
۳- استفاده از توکنایزرهای کارآمدتر
انتخاب tokenizer مناسب و شیوه کدگذاری آن تاثیر زیادی روی مصرف توکن دارد. مهم است که گزینههای مختلف tokenizer را بررسی کنید و تنظیمات آنها را امتحان کنید تا تعداد توکنها کاهش پیدا کند.
برای مثال، اگر بیشتر از مدلهای GPT شرکت OpenAI استفاده میکنید، بهترین انتخاب tokenizer مخصوص آنها یعنی Tiktoken است. Tiktoken از الگوریتم Byte Pair Encoding (BPE) استفاده میکند که برای این مدلها طراحی شده و معمولا عملکرد بهتری نسبت به گزینههای عمومیتر دارد.
چگونه با Tiktoken توکنها را بشماریم؟
Tiktoken یک کتابخانه متنباز و بسیار سریع برای توکنسازی است که توسط OpenAI ساخته شده است. این ابزار متن را به توکنهایی تبدیل میکند که مدلهای GPT دقیقا بر اساس آنها ورودی را میفهمند و پردازش میکنند. Tiktoken از الگوریتم Byte Pair Encoding (BPE) استفاده میکند که آن را برای مدلهای GPT بسیار بهینه و دقیق میکند.
مزیت اصلی Tiktoken سرعت بالا، دقت زیاد و سازگاری کامل با مدلهای OpenAI است؛ به همین دلیل برای توسعهدهندگانی که روی بهینهسازی هزینه و مدیریت تعداد توکنها کار میکنند، یکی از بهترین گزینههاست.
در ادامه نحوه شمارش توکنها با Tiktoken را بررسی میکنیم.
Encodingها
Encodingها مشخص میکنند که متن چگونه به توکن تبدیل شود. مدلهای مختلف از encodingهای متفاوتی استفاده میکنند. کتابخانه tiktoken سه نوع encoding را پشتیبانی میکند که در مدلهای OpenAI استفاده میشوند:
| نام Encoding | مدلهای OpenAI |
| o200k_base | gpt-4o، gpt-4o-mini |
| cl100k_base | gpt-4-turbo، gpt-4، gpt-3.5-turbo، text-embedding-ada-002، text-embedding-3-small، text-embedding-3-large |
| p50k_base | مدلهای Codex، text-davinci-002، text-davinci-003 |
| r50k_base (یا gpt2) | مدلهای GPT-3 مانند davinci |
شما میتوانید encoding مربوط به یک مدل را با استفاده از تابع tiktoken.encoding_for_model() به صورت زیر بهدست آورید:
|
1 |
encoding = tiktoken.encoding_for_model(‘gpt-4o-mini’)encoding = tiktoken.encoding_for_model(‘gpt-4o-mini’) |
توجه داشته باشید که p50k_base تا حد زیادی با r50k_base همپوشانی دارد و در کاربردهای غیرمرتبط با کدنویسی، معمولا خروجی هر دو یکسان خواهد بود.
کتابخانههای Tokenizer بر اساس زبان برنامهنویسی
برای encodingهای o200k_base، cl100k_base و p50k_base:
- Python: tiktoken
- .NET / C#: SharpToken، TiktokenSharp
- Java: jtokkit
- Golang: tiktoken-go
- Rust: tiktoken-rs
برای encoding r50k_base (gpt2)، توکنایزرهای متعددی در زبانهای مختلف موجود است:
- Python: tiktoken (یا GPT2TokenizerFast)
- JavaScript: gpt-3-encoder
- .NET / C#: GPT Tokenizer
- Java: gpt2-tokenizer-java
- PHP: GPT-3-Encoder-PHP
- Golang: tiktoken-go
- Rust: tiktoken-rs
نحوه توکنایز شدن معمول رشتهها
در زبان انگلیسی، طول توکنها معمولا از یک کاراکتر تا یک کلمه کامل متغیر است (برای مثال: “t” یا ” great”). البته در برخی زبانها، یک توکن میتواند کوتاهتر از یک کاراکتر یا طولانیتر از یک کلمه باشد. در بیشتر موارد، فاصلهها همراه با ابتدای کلمات گروهبندی میشوند؛
برای مثال: بهجای “is ” یا ” ” + “is”، توکن ” is” ساخته میشود.
از طریق OpenAI Tokenizer یا وباپ شخص ثالث Tiktokenizer، میتوانید خیلی سریع بررسی کنید که یک رشته چگونه توکنایز میشود.
۱. نصب tiktoken
در صورت نیاز، tiktoken را با pip نصب کنید:
|
1 2 3 |
%pip install —upgrade tiktoken –q %pip install —upgrade openai –q |
۲. ایمپورت tiktoken
|
1 |
import tiktoken |
۳. بارگذاری یک encoding
برای بارگذاری یک encoding بر اساس نام آن، از تابع tiktoken.get_encoding() استفاده کنید. بار اول که این تابع اجرا میشود، به اینترنت نیاز دارد تا فایلهای لازم را دانلود کند اما در اجراهای بعدی، دیگر نیازی به اتصال اینترنت نخواهد بود.
|
1 |
encoding = tiktoken.get_encoding(“cl100k_base”) |
با استفاده از tiktoken.encoding_for_model() میتوانید بهصورت خودکار encoding مناسب را برای نام هر مدل بارگذاری کنید
|
1 |
encoding = tiktoken.encoding_for_model(“gpt-4o-mini”) |
۴. تبدیل متن به توکن با استفاده از encoding.encode()
متد .encode() یک رشته متنی را به فهرستی از اعداد صحیح که نمایانگر توکنها هستند تبدیل میکند.
|
1 |
encoding.encode(“tiktoken is great!”) |
با شمردن طول فهرستی که توسط .encode() برگردانده میشود، میتوانید تعداد توکنها را محاسبه کنید.
|
1 2 3 4 5 6 7 |
def num_tokens_from_string(string: str, encoding_name: str) -> int: “”“Returns the number of tokens in a text string.”“” encoding = tiktoken.get_encoding(encoding_name) num_tokens = len(encoding.encode(string)) return num_tokens num_tokens_from_string(“tiktoken is great!”, “o200k_base”) |
۵. تبدیل توکنها به متن با استفاده از encoding.decode()
متد .decode() یک فهرست از اعداد صحیحِ مربوط به توکنها را دوباره به یک رشته متنی تبدیل میکند.
|
1 |
encoding.decode([83, 8251, 2488, 382, 2212, 0]) |
هشدار:
اگرچه میتوان از .decode() برای توکنهای تکی هم استفاده کرد، اما توجه داشته باشید که برای توکنهایی که دقیقاً روی مرزهای UTF-8 قرار نمیگیرند، ممکن است تبدیل بهصورت ناقص یا lossy انجام شود.
برای تبدیل ایمنِ یک توکن تکی، از متد .decode_single_token_bytes() استفاده کنید. این متد یک عدد صحیح (توکن) را به بایتهایی که نمایانگر آن هستند، بهدرستی و بدون از دست رفتن اطلاعات تبدیل میکند.
|
1 |
[encoding.decode_single_token_bytes(token) for token in [83, 8251, 2488, 382, 2212, 0]] |
حرف b که در ابتدای رشتهها قرار میگیرد نشان میدهد که آن رشتهها از نوع byte string هستند.
۶. مقایسه Encodingها
Encodingهای مختلف در نحوه شکستن کلمات، گروهبندی فاصلهها و پردازش کاراکترهای غیرانگلیسی با یکدیگر متفاوت هستند. با استفاده از روشهایی که در بخشهای قبل گفته شد، میتوانیم چند رشته نمونه را با encodingهای مختلف مقایسه کنیم.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def compare_encodings(example_string: str) -> None: “”“Prints a comparison of three string encodings.”“” # print the example string print(f‘\nExample string: “{example_string}”‘) # for each encoding, print the # of tokens, the token integers, and the token bytes for encoding_name in [“r50k_base”, “p50k_base”, “cl100k_base”, “o200k_base”]: encoding = tiktoken.get_encoding(encoding_name) token_integers = encoding.encode(example_string) num_tokens = len(token_integers) token_bytes = [encoding.decode_single_token_bytes(token) for token in token_integers] print() print(f“{encoding_name}: {num_tokens} tokens”) print(f“token integers: {token_integers}”) print(f“token bytes: {token_bytes}”) |
موارد زیر را میتوانید امتحان کنید:
|
1 2 3 4 5 |
compare_encodings(“antidisestablishmentarianism”) compare_encodings(“2 + 2 = 4”) compare_encodings(“お誕生日おめでとう”) |
۷. شمارش توکنها برای فراخوانیهای Chat Completions API
مدلهای ChatGPT مانند gpt-4o-mini و gpt-4 به همان روشی از توکنها استفاده میکنند که مدلهای قدیمیتر completions استفاده میکردند اما بهدلیل ساختار پیاممحور (message-based) این مدلها، محاسبه تعداد توکنهایی که یک مکالمه مصرف میکند سختتر است.
در ادامه یک تابع نمونه ارائه شده که تعداد توکنهای پیامهای ارسالشده برای مدلهایی مثل gpt-3.5-turbo، gpt-4، gpt-4o و gpt-4o-mini را تخمین میزند. توجه داشته باشید که نحوه دقیق شمارش توکنها در پیامها ممکن است بین مدلها متفاوت باشد.
بنابراین اعدادی که این تابع برمیگرداند، تخمینی هستند و نه یک تضمین قطعی و همیشگی. بهطور مشخص، درخواستهایی که از ورودی اختیاری functions استفاده میکنند، بیش از مقادیر تخمینی زیر توکن مصرف خواهند کرد.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
def num_tokens_from_messages(messages, model=“gpt-4o-mini-2024-07-18”): “”“Return the number of tokens used by a list of messages.”“” try: encoding = tiktoken.encoding_for_model(model) except KeyError: print(“Warning: model not found. Using o200k_base encoding.”) encoding = tiktoken.get_encoding(“o200k_base”) if model in { “gpt-3.5-turbo-0125”, “gpt-4-0314”, “gpt-4-32k-0314”, “gpt-4-0613”, “gpt-4-32k-0613”, “gpt-4o-mini-2024-07-18”, “gpt-4o-2024-08-06” }: tokens_per_message = 3 tokens_per_name = 1 elif “gpt-3.5-turbo” in model: print(“Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0125.”) return num_tokens_from_messages(messages, model=“gpt-3.5-turbo-0125”) elif “gpt-4o-mini” in model: print(“Warning: gpt-4o-mini may update over time. Returning num tokens assuming gpt-4o-mini-2024-07-18.”) return num_tokens_from_messages(messages, model=“gpt-4o-mini-2024-07-18”) elif “gpt-4o” in model: print(“Warning: gpt-4o and gpt-4o-mini may update over time. Returning num tokens assuming gpt-4o-2024-08-06.”) return num_tokens_from_messages(messages, model=“gpt-4o-2024-08-06”) elif “gpt-4” in model: print(“Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.”) return num_tokens_from_messages(messages, model=“gpt-4-0613”) else: raise NotImplementedError( f“”“num_tokens_from_messages() is not implemented for model {model}.”“” ) num_tokens = 0 for message in messages: num_tokens += tokens_per_message for key, value in message.items(): num_tokens += len(encoding.encode(value)) if key == “name”: num_tokens += tokens_per_name num_tokens += 3 # every reply is primed with <|start|>assistant<|message|> return num_tokens # let’s verify the function above matches the OpenAI API response from openai import OpenAI import os client = OpenAI(api_key=os.environ.get(“OPENAI_API_KEY”, “<your OpenAI API key if not set as env var>”)) example_messages = [ { “role”: “system”, “content”: “You are a helpful, pattern-following assistant that translates corporate jargon into plain English.”, }, { “role”: “system”, “name”: “example_user”, “content”: “New synergies will help drive top-line growth.”, }, { “role”: “system”, “name”: “example_assistant”, “content”: “Things working well together will increase revenue.”, }, { “role”: “system”, “name”: “example_user”, “content”: “Let’s circle back when we have more bandwidth to touch base on opportunities for increased leverage.”, }, { “role”: “system”, “name”: “example_assistant”, “content”: “Let’s talk later when we’re less busy about how to do better.”, }, { “role”: “user”, “content”: “This late pivot means we don’t have time to boil the ocean for the client deliverable.”, }, ] for model in [ “gpt-3.5-turbo”, “gpt-4-0613”, “gpt-4”, “gpt-4o”, “gpt-4o-mini” ]: print(model) # example token count from the function defined above print(f“{num_tokens_from_messages(example_messages, model)} prompt tokens counted by num_tokens_from_messages().”) # example token count from the OpenAI API response = client.chat.completions.create(model=model, messages=example_messages, temperature=0, max_tokens=1) print(f‘{response.usage.prompt_tokens} prompt tokens counted by the OpenAI API.’) print() |
۸. شمارش توکنها برای chat completions همراه با فراخوانی ابزارها (tool calls)
در ادامه بررسی میکنیم که چطور میتوان این محاسبات را روی پیامهایی اعمال کرد که ممکن است شامل فراخوانی تابع (function call) باشند. این کار بهخاطر فرمت خاص خودِ ابزارها، در نگاه اول چندان بدیهی نیست. در زیر، یک تابع نمونه برای شمارش توکنهای پیامهایی آورده شده است که شامل tools هستند و به مدلهای gpt-3.5-turbo، gpt-4، gpt-4o و gpt-4o-mini ارسال میشوند.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
def num_tokens_for_tools(functions, messages, model): # Initialize function settings to 0 func_init = 0 prop_init = 0 prop_key = 0 enum_init = 0 enum_item = 0 func_end = 0 if model in [ “gpt-4o”, “gpt-4o-mini” ]: # Set function settings for the above models func_init = 7 prop_init = 3 prop_key = 3 enum_init = –3 enum_item = 3 func_end = 12 elif model in [ “gpt-3.5-turbo”, “gpt-4” ]: # Set function settings for the above models func_init = 10 prop_init = 3 prop_key = 3 enum_init = –3 enum_item = 3 func_end = 12 else: raise NotImplementedError( f“”“num_tokens_for_tools() is not implemented for model {model}.”“” ) try: encoding = tiktoken.encoding_for_model(model) except KeyError: print(“Warning: model not found. Using o200k_base encoding.”) encoding = tiktoken.get_encoding(“o200k_base”) func_token_count = 0 if len(functions) > 0: for f in functions: func_token_count += func_init # Add tokens for start of each function function = f[“function”] f_name = function[“name”] f_desc = function[“description”] if f_desc.endswith(“.”): f_desc = f_desc[:–1] line = f_name + “:” + f_desc func_token_count += len(encoding.encode(line)) # Add tokens for set name and description if len(function[“parameters”][“properties”]) > 0: func_token_count += prop_init # Add tokens for start of each property for key in list(function[“parameters”][“properties”].keys()): func_token_count += prop_key # Add tokens for each set property p_name = key p_type = function[“parameters”][“properties”][key][“type”] p_desc = function[“parameters”][“properties”][key][“description”] if “enum” in function[“parameters”][“properties”][key].keys(): func_token_count += enum_init # Add tokens if property has enum list for item in function[“parameters”][“properties”][key][“enum”]: func_token_count += enum_item func_token_count += len(encoding.encode(item)) if p_desc.endswith(“.”): p_desc = p_desc[:–1] line = f“{p_name}:{p_type}:{p_desc}” func_token_count += len(encoding.encode(line)) func_token_count += func_end messages_token_count = num_tokens_from_messages(messages, model) total_tokens = messages_token_count + func_token_count return total_tokens tools = [ { “type”: “function”, “function”: { “name”: “get_current_weather”, “description”: “Get the current weather in a given location”, “parameters”: { “type”: “object”, “properties”: { “location”: { “type”: “string”, “description”: “The city and state, e.g. San Francisco, CA”, }, “unit”: {“type”: “string”, “description”: “The unit of temperature to return”, “enum”: [“celsius”, “fahrenheit”]}, }, “required”: [“location”], }, } } ] example_messages = [ { “role”: “system”, “content”: “You are a helpful assistant that can answer to questions about the weather.”, }, { “role”: “user”, “content”: “What’s the weather like in San Francisco?”, }, ] for model in [ “gpt-3.5-turbo”, “gpt-4”, “gpt-4o”, “gpt-4o-mini” ]: print(model) # example token count from the function defined above print(f“{num_tokens_for_tools(tools, example_messages, model)} prompt tokens counted by num_tokens_for_tools().”) # example token count from the OpenAI API response = client.chat.completions.create(model=model, messages=example_messages, tools=tools, temperature=0) print(f‘{response.usage.prompt_tokens} prompt tokens counted by the OpenAI API.’) print() |
نتیجهگیری
توکنایزیشن فقط یک بخش کوچک از پردازش زبان طبیعی نیست؛ بلکه جزء حیاتی هر پروژهای است که از مدلهای زبانی استفاده میکند. آشنایی با نحوه شکستن متن به توکن، شیوه شمارش آنها، تفاوت encodingها و محاسبه دقیق توکنها در سناریوهای مختلف از ورودی ساده گرفته تا مکالمات پیچیده همراه با فراخوانی ابزارها به شما این امکان را میدهد که برنامههای هوش مصنوعی را با هزینه کمتر، سرعت بیشتر و دقت بالاتر اجرا کنید. کتابخانههایی مانند Tiktoken کار شمارش و مدیریت توکن را ساده میکنند، اما مسئولیت اصلی همچنان بر عهده توسعهدهنده است:
نوشتن پرامپتهای مختصر و دقیق، حذف متنهای اضافی، انتخاب tokenizer مناسب و پایش مداوم مصرف توکن.
با بهکارگیری اصول و تکنیکهایی که در این مقاله بررسی شد، میتوانید پروژههای هوش مصنوعی خود را هوشمندانهتر مدیریت کنید و نهتنها عملکرد مدل را بهبود دهید، بلکه هزینههای API را بهطور چشمگیری کاهش دهید. این دانش برای هر توسعهدهندهای که با مدلهای GPT کار میکند، یک مزیت رقابتی مهم به شمار میرود.
منابع
medium.com | cookbook.openai.com
سوالات متداول
چون تعداد توکنها هزینه API و امکان پردازش ورودی توسط مدل را تعیین میکند. با شمارش توکنها میتوان از خطاهای سقف محدودیت و هزینههای ناخواسته جلوگیری کرد.
بهترین گزینه Tiktoken است که توسط خود OpenAI ساخته شده و برای مدلهای GPT بهینه شده است. برای NLP عمومی هم NLTK کاربرد دارد، اما دقت Tiktoken برای تخمین هزینه بیشتر است.
با Tiktoken متن را توکنایز کنید و تعداد آن را با سقف مدل مقایسه کنید. اگر بالاتر بود، باید متن را خلاصه کنید یا در چند بخش جداگانه ارسال کنید.
سادهسازی متن ورودی، نوشتن پرامپتهای کوتاه و دقیق، استفاده از tokenizer کارآمد و در صورت نیاز انتخاب مدل ارزانتر.




دیدگاهتان را بنویسید