کتابخانه‌ی استاندارد · هوش مصنوعی

مدل زبانی بزرگ ai.llm

اجرای مدل‌های زبانی Llama و Qwen از پرونده‌ی GGUF.

واردسازی هوش مصنوعی.مدل زبانی بزرگ

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

این بسته مدل‌های زبانی بزرگ خانواده‌ی Llama را روی پردازنده اجرا می‌کند، با سلام خالص و بی هیچ کتابخانه‌ی بیرونی. مدل را در قالب GGUF دانلود کنید، با بارگذاری مدل جی‌جی‌یو‌اف بخوانید و با تولید متن بسازید، یا حلقه را خودتان با پیشرو و یک نمونه‌بردار (دما، top-k، top-p و جریمه‌ی تکرار) بچرخانید.

برای مدل‌های کوچکی است که درون برنامه‌ی خودتان اجرا می‌شوند: دسته‌بندی یا بازنویسی متن‌های کوتاه بی اینترنت، دستیاری محلی در یک ابزار، یا یاد گرفتن گام به گام کار یک ترنسفورمر. برای مدل‌های بزرگ یا سرعت بالا، سروری مثل llama.cpp یا یک API را از راه net.http صدا بزنید.

چه چیزی اجرا می‌شود و چه هزینه‌ای دارد

  • ساختار لایه‌ها همان Llama است: RMSNorm، موقعیت چرخشی، توجه با پرس‌وجوی گروهی و بلوک پیش‌خور SwiGLU، به همراه بایاس‌های اختیاری توجه که Qwen2 دارد. Qwen2.5 Instruct آزموده شده است؛ Llama و Mistral همین ساختار را دارند. معماری‌هایی با ساختار دیگر، مثل Phi، بار نمی‌شوند یا متن بی‌معنا می‌سازند.
  • محدودیت‌های پرونده در gguf این‌جا هم هست: کوچک‌تر از ۲ گیگابایت و فقط وزن‌های F32، F16، Q8_0، Q4_0 و Q4_1، نه کوانتیزه‌های K.
  • هر وزن هنگام بار شدن مدل به اعشار۳۲ باز می‌شود، پس Qwen2.5 0.5B که پرونده‌اش ۰٫۷ گیگابایت است حدود ۳ گیگابایت حافظه می‌خواهد. حافظه‌ی کلید و مقدار به اندازه‌ی cfg.ctx ساخته می‌شود که در آغاز کل بافت مدل است (۳۲۷۶۸ برای Qwen)؛ برای صرفه‌جویی در حافظه آن را پیش از حافظه کلید مقدار جدید کم کنید.
  • رمزگذاری توکن‌های ویژه‌ای مثل <|im_start|> را درون متن نمی‌شناسد و آن‌ها را به تکه‌های معمولی می‌شکند که مدل نمی‌فهمد. شناسه‌شان را در توکن‌ساز.index پیدا کنید و خودتان بگذاریدشان، همان کاری که نمونه‌ی گفتگو می‌کند.

توکن‌ساز، نمونه‌برداری و تولید روی مدل کوچک تصادفی‌ای هم که با مدل تصادفی ساخته می‌شود کار می‌کنند؛ نمونه‌ی مرجع پایین همین صفحه به همین شکل بی دانلود اجرا می‌شود.

پاسخ گفتگو، توکن به توکن

مدل‌های آموزش دیده برای دستورپذیری، گفتگو را دقیقا در قالبی می‌خواهند که با آن آموزش دیده‌اند. Qwen دور هر نوبت <|im_start|> و <|im_end|> می‌گذارد و ورودی با باز کردن نوبت دستیار تمام می‌شود تا مدل پاسخ را بنویسد. قالب هر مدل در فایل GGUF آن زیر tokenizer.chat_template است؛ برای خواندنش به جی‌جی‌یو‌اف سر بزنید. این نشانه‌ها هر کدام یک توکن ویژه‌اند، پس افزودن نوبت شناسه‌شان را از توکن‌ساز.index می‌گذارد و فقط متن میانشان را رمزگذاری می‌کند.

به جای تولید که کل متن را در پایان برمی‌گرداند، این برنامه حلقه را خودش اجرا می‌کند تا هر توکن همان وقت که انتخاب شد چاپ شود. نخستین فراخوانی پیشرو کل ورودی را می‌خواند؛ پس از آن هر فراخوانی فقط تازه‌ترین توکن را می‌دهد، چون حافظه کلید مقدار همه‌ی پیش از آن را به یاد دارد. حلقه با توکن پایان نوبت، پس از ۸۰ توکن یا وقتی بافت پر شود می‌ایستد. پیش از آن cfg.ctx به ۴۰۹۶ کم شده تا حافظه‌ی کلید و مقدار به جای ۸۰۰ مگابایت حدود ۱۰۰ مگابایت بگیرد.

mkdir -p models
curl -L -o models/qwen2.5-0.5b-instruct-q8_0.gguf \
  https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q8_0.gguf
salam run llm-guide-chat.salam
llm-guide-chat.salam
واردسازی هوش مصنوعی.مدل زبانی بزرگ
واردسازی هوش مصنوعی.تانسور

تابع افزودن نوبت(توکن‌ساز &: مدل زبانی بزرگ.توکن‌ساز، شناسه‌ها &: وکتور<صحیح>، نقش: رشته، متن: رشته):
    شناسه‌ها.بیفزا(توکن‌ساز.نمایه.بگیر("<|im_start|>"))
    تکه := توکن‌ساز.رمزگذاری(نقش + "\n" + متن)
    هر شناسه در تکه:
        شناسه‌ها.بیفزا(شناسه)
    پایان
    اگر متن.طول() > ۰:
        شناسه‌ها.بیفزا(توکن‌ساز.نمایه.بگیر("<|im_end|>"))
        خط تازه := توکن‌ساز.رمزگذاری("\n")
        هر شناسه در خط تازه:
            شناسه‌ها.بیفزا(شناسه)
        پایان
    پایان
پایان

تابع ریشه:
    مسیر := "models/qwen2.5-0.5b-instruct-q8_0.gguf"
    ناپایا مدل := مدل زبانی بزرگ.مدل {}
    ناپایا توکن‌ساز := مدل زبانی بزرگ.توکن‌ساز جدید(مدل زبانی بزرگ.توکن‌ساز بایتی)
    اگر وارونه مدل زبانی بزرگ.بارگذاری مدل جی‌جی‌یو‌اف(مسیر، مدل، توکن‌ساز):
        سرچاپ "بارگذاری نشد:"، مسیر
        برگشت ۱
    پایان
    توکن‌ساز.افزودن توکن آغاز = نادرست
    علامت توقف := توکن‌ساز.نمایه.بگیر("<|im_end|>")
    مدل.پیکربندی.بیشینه طول = ۴۰۹۶
    ناپایا حافظه := مدل زبانی بزرگ.حافظه کلید مقدار جدید(مدل.پیکربندی)
    ناپایا نمونه‌بردار := مدل زبانی بزرگ.نمونه‌بردار جدید(۴۲)
    نمونه‌بردار.دما = ۰.۷
    نمونه‌بردار.احتمال تجمعی = ۰.۹
    نمونه‌بردار.جریمه تکرارها = ۱.۱
    ناپایا شناسه‌ها := وکتور {} برگردان وکتور<صحیح>
    افزودن نوبت(توکن‌ساز، شناسه‌ها، "system"، "You are a helpful assistant. Answer in Persian, in one sentence.")
    افزودن نوبت(توکن‌ساز، شناسه‌ها، "user"، "چرا آسمان آبی است؟")
    افزودن نوبت(توکن‌ساز، شناسه‌ها، "assistant"، "")
    ناپایا لاجیت‌ها := مدل زبانی بزرگ.پیشرو(مدل، حافظه، شناسه‌ها)
    ناپایا گفته‌ها := وکتور {} برگردان وکتور<صحیح>
    ناپایا گام := وکتور {} برگردان وکتور<صحیح>
    گام.بیفزا(۰)
    تا گفته‌ها.طول() < ۸۰ و حافظه.شمار توکن‌ها < حافظه.گنجایش:
        بعدی := نمونه‌بردار.نمونه(لاجیت‌ها، لاجیت‌ها.بعد(۰) - ۱، گفته‌ها)
        تانسور.آزادسازی(لاجیت‌ها)
        اگر بعدی == علامت توقف یا بعدی == توکن‌ساز.توکن پایانی:
            بشکن
        پایان
        گفته‌ها.بیفزا(بعدی)
        گام.بنشان(۰، بعدی)
        چاپ توکن‌ساز.رمزگشایی(گام)
        لاجیت‌ها = مدل زبانی بزرگ.پیشرو(مدل، حافظه، گام)
    پایان
    سرچاپ ""
    سرچاپ "توکن‌های ورودی:"، شناسه‌ها.طول()، "پاسخ:"، گفته‌ها.طول()
    حافظه.آزادسازی()
    مدل.آزادسازی()
    توکن‌ساز.آزادسازی()
پایان
آسمان آبی است با پسران آبی از طریق تمرکت خود را مطرح می‌کنند.
توکن‌های ورودی: 37 پاسخ: 37

همین خروجی نشان می‌دهد از مدلی با نیم میلیارد وزن چه انتظاری باید داشت: جمله‌ی فارسی می‌سازد ولی معنایش درست نیست. فارسی این مدل‌های کوچک ضعیف است و دانسته‌هایشان هم قابل اعتماد نیست؛ برای فهم واقعی، مدل بزرگ‌تر یا سرور جداگانه لازم است. برای کار واقعی با salam build --release بسازید: مدل روی پردازنده اجرا می‌شود و ساخت انتشار بررسی مرزها را از حلقه‌های درونی برمی‌دارد. با این حال روی یک رایانه‌ی معمولی برای هر توکن چند ثانیه صبر کنید.

متن چطور توکن می‌شود

مدل هرگز حرف نمی‌بیند، فقط شناسه‌ی توکن. توکن‌ساز BPE از تک‌نویسه‌ها شروع می‌کند و فهرست ادغام‌هایش را به ترتیب اعمال می‌کند، پس تکه‌های پرکاربردی مثل lower یک توکن می‌شوند و واژه‌های کمیاب به چند تکه می‌شکنند. BPE بایتی، همان که GPT 2 و Llama 3 و Qwen به کار می‌برند، فاصله را Ġ می‌نویسد، پس فاصله‌ی پیش از هر واژه بخشی از یک توکن است. این توکن‌ساز با پنج ادغام دستی ساخته شده تا گام‌ها دیده شوند.

llm-guide-tokens.salam
واردسازی هوش مصنوعی.مدل زبانی بزرگ

تابع نمایش(توکن‌ساز &: مدل زبانی بزرگ.توکن‌ساز، متن: رشته):
    شناسه‌ها := توکن‌ساز.رمزگذاری(متن)
    ناپایا تکه ها := ""
    هر شناسه در شناسه‌ها:
        تکه ها = تکه ها + "[" + توکن‌ساز.متن توکن(شناسه) + "]"
    پایان
    سرچاپ متن، "<-"، شناسه‌ها.طول()، "توکن"، تکه ها
پایان

تابع ریشه:
    ناپایا توکن‌ساز := مدل زبانی بزرگ.توکن‌ساز جدید(مدل زبانی بزرگ.توکن‌ساز بایتی)
    هر تکه در ["l"، "o"، "w"، "e"، "r"، "n"، "s"، "t"، "Ġ"، "lo"، "low"، "er"، "lower"]:
        _ := توکن‌ساز.افزودن توکن(تکه، ۰.۰)
    پایان
    توکن‌ساز.افزودن ادغام("l"، "o")
    توکن‌ساز.افزودن ادغام("lo"، "w")
    توکن‌ساز.افزودن ادغام("e"، "r")
    توکن‌ساز.افزودن ادغام("low"، "er")
    توکن‌ساز.پایان()
    توکن‌ساز.افزودن توکن آغاز = نادرست
    نمایش(توکن‌ساز، "low")
    نمایش(توکن‌ساز، "lower")
    نمایش(توکن‌ساز، "slower")
    نمایش(توکن‌ساز، "newest")
    نمایش(توکن‌ساز، "lower tower")
    سرچاپ "رفت و برگشت:"، توکن‌ساز.رمزگشایی(توکن‌ساز.رمزگذاری("lower tower")) == "lower tower"
    توکن‌ساز.آزادسازی()
پایان
خروجیlow <- 1 توکن [low] lower <- 1 توکن [lower] slower <- 2 توکن [s][lower] newest <- 6 توکن [n][e][w][e][s][t] lower tower <- 6 توکن [lower][Ġ][t][o][w][er] رفت و برگشت: true

tower به تکه‌های ow ادغام نمی‌شود چون ادغام‌ها فقط lo و low را می‌شناسند. شمردن توکن‌ها به همین روش راه سنجیدن این است که ورودی پیش از فرستادن در بافت مدل جا می‌شود یا نه.

دما و top-k

مدل برای هر توکن واژگان امتیازی (لاجیت) می‌دهد و نمونه‌بردار امتیازها را به یک انتخاب تبدیل می‌کند. حریصانه همیشه بالاترین را برمی‌دارد. نمونه‌بردار به تناسب احتمال‌ها تصادفی انتخاب می‌کند: دمای کمتر از یک احتمال‌ها را به سوی محبوب‌ترین تیز می‌کند، دمای بیشتر از یک صافشان می‌کند، و top_k پیش از انتخاب همه جز k بهترین را کنار می‌گذارد. برنامه با هر تنظیم ۱۰۰۰ بار از چهار امتیاز ثابت انتخاب می‌کند و می‌شمارد هر توکن چند بار برنده شده.

llm-guide-sampling.salam
واردسازی هوش مصنوعی.مدل زبانی بزرگ
واردسازی هوش مصنوعی.تانسور

تابع شمارش(نمونه‌بردار &: مدل زبانی بزرگ.نمونه‌بردار، لاجیت ها &: تانسور.تانسور): رشته:
    ناپایا دیده := [۰، ۰، ۰، ۰]
    ناپایا اخیر := وکتور {} برگردان وکتور<صحیح>
    تکرار ۱۰۰۰:
        دیده[نمونه‌بردار.نمونه(لاجیت ها، ۰، اخیر)] += ۱
    پایان
    برگشت "" + دیده[۰] + " " + دیده[۱] + " " + دیده[۲] + " " + دیده[۳]
پایان

تابع ریشه:
    ناپایا داده := وکتور {} برگردان وکتور<اعشار۳۲>
    هر م در [۲.۰، ۱.۵، ۰.۵، -۱.۰]:
        داده.بیفزا(م برگردان اعشار۳۲)
    پایان
    ناپایا شکل := تانسور.شکل دو(۱، ۴)
    ناپایا لاجیت ها := تانسور.از آرایه(شکل، داده)
    سرچاپ "حریصانه همیشه این را برمی‌دارد:"، مدل زبانی بزرگ.حریصانه(لاجیت ها، ۰)
    ناپایا ساده := مدل زبانی بزرگ.نمونه‌بردار جدید(۱)
    سرچاپ "دمای ۱.۰:"، شمارش(ساده، لاجیت ها)
    ناپایا سرد := مدل زبانی بزرگ.نمونه‌بردار جدید(۱)
    سرد.دما = ۰.۳
    سرچاپ "دمای ۰.۳:"، شمارش(سرد، لاجیت ها)
    ناپایا داغ := مدل زبانی بزرگ.نمونه‌بردار جدید(۱)
    داغ.دما = ۲.۰
    سرچاپ "دمای ۲.۰:"، شمارش(داغ، لاجیت ها)
    ناپایا دو برتر := مدل زبانی بزرگ.نمونه‌بردار جدید(۱)
    دو برتر.شمار محتمل‌ترین‌ها = ۲
    سرچاپ "top_k ۲:  "، شمارش(دو برتر، لاجیت ها)
پایان
خروجیحریصانه همیشه این را برمی‌دارد: 0 دمای ۱.۰: 508 345 121 26 دمای ۰.۳: 832 164 4 0 دمای ۲.۰: 386 321 200 93 top_k ۲: 599 401 0 0

دانه‌ای که به نمونه‌بردار جدید می‌دهید انتخاب‌ها را تکرارپذیر می‌کند و برای همین این خروجی هیچ‌وقت عوض نمی‌شود. برای پاسخ‌های دقیق دمای پایین به کار ببرید؛ برای نوشته‌های گوناگون، حدود ۰.۷ تا ۱.۰ با top_p برابر ۰.۹. repeat_penalty بیشتر از یک امتیاز توکن‌های تازه به کار رفته را پایین می‌آورد و جلوی تکرار بی‌پایان مدل‌های کوچک را می‌گیرد.

گونه‌ها

پیکربندی Config

ساختار پیکربندی
پیکربندی معماری مدل، از نوع Llama.
نامانگلیسیگونهتوضیح
واژگانvocabصحیح = 0اندازه‌ی واژگان.
اندازه جاسازیdimصحیح = 0اندازه‌ی جاسازی.
لایه‌هاlayersصحیح = 0شمار لایه‌ها.
سرهای توجهheadsصحیح = 1شمار سرهای توجه.
سرهای کلید مقدارkv_headsصحیح = 1شمار سرهای کلید و مقدار؛ کمتر از heads یعنی توجه گروهی.
لایه پیشروffصحیح = 0اندازه‌ی لایه‌ی پیشرو.
بیشینه طولctxصحیح = 512بیشترین طول متن.
اپسیلونepsاعشار۶۴ = 1e-05عدد کوچک نرمال‌سازی.
پایه جاسازی چرخشیrope_thetaاعشار۶۴ = 10000پایه‌ی جاسازی چرخشی.
نوع جاسازی چرخشیrope_kindصحیحگونه‌ی جاسازی چرخشی، یکی از ثابت‌های روپ ....
ai-llm-Generate.salam
واردسازی هوش مصنوعی.مدل زبانی بزرگ
واردسازی هوش مصنوعی.تانسور

تابع ریشه:
    ناپایا توکن‌ساز := مدل زبانی بزرگ.توکن‌ساز جدید(مدل زبانی بزرگ.توکن‌ساز بایتی)
    هر متن در ["a"، "b"، "c"، "ab"]:
        _ := توکن‌ساز.افزودن توکن(متن، ۰.۰)
    پایان
    توکن‌ساز.افزودن ادغام("a"، "b")
    توکن‌ساز.پایان()
    توکن‌ساز.افزودن توکن آغاز = نادرست
    ناپایا شناسه‌ها := توکن‌ساز.رمزگذاری("abcab")
    سرچاپ توکن‌ساز.اندازه()، شناسه‌ها.طول()، توکن‌ساز.متن توکن(شناسه‌ها.دریافت(۰))، توکن‌ساز.رمزگشایی(شناسه‌ها)
    سرچاپ مدل زبانی بزرگ.توکن‌ساز قطعه جمله، مدل زبانی بزرگ.روپ عادی، مدل زبانی بزرگ.روپ نئوایکس

    ناپایا پیکربندی := مدل زبانی بزرگ.پیکربندی { واژگان = توکن‌ساز.اندازه()، اندازه جاسازی = ۸، لایه‌ها = ۲، سرهای توجه = ۲، سرهای کلید مقدار = ۱، لایه پیشرو = ۱۶، بیشینه طول = ۳۲ }
    سرچاپ پیکربندی.بعد سر()
    ناپایا مدل := مدل زبانی بزرگ.مدل تصادفی(پیکربندی، ۷)
    ناپایا حافظه := مدل زبانی بزرگ.حافظه کلید مقدار جدید(پیکربندی)
    سرچاپ مدل.موفق، مدل.لایه‌ها.طول()، حافظه.گنجایش

    ناپایا لاجیت‌ها := مدل زبانی بزرگ.پیشرو(مدل، حافظه، شناسه‌ها)
    سرچاپ تانسور.رشته شکل(لاجیت‌ها)، حافظه.شمار توکن‌ها
    ناپایا آخر := مدل زبانی بزرگ.ردیف لاجیت(لاجیت‌ها، شناسه‌ها.طول() - ۱)
    حریص := مدل زبانی بزرگ.حریصانه(لاجیت‌ها، شناسه‌ها.طول() - ۱)
    سرچاپ تانسور.رشته شکل(آخر)، حریص == تانسور.نمایه بیشینه همه(آخر)

    ناپایا نمونه‌بردار := مدل زبانی بزرگ.نمونه‌بردار جدید(۱)
    نمونه‌بردار.دما = ۰.۸
    نمونه‌بردار.شمار محتمل‌ترین‌ها = ۳
    نمونه‌بردار.احتمال تجمعی = ۰.۹
    نمونه‌بردار.جریمه تکرارها = ۱.۱
    ناپایا اخیر := وکتور {} برگردان وکتور<صحیح>
    بعدی := نمونه‌بردار.نمونه(لاجیت‌ها، شناسه‌ها.طول() - ۱، اخیر)
    سرچاپ بعدی >= ۰ و بعدی < توکن‌ساز.اندازه()

    حافظه.بازنشانی()
    تولیدی := مدل زبانی بزرگ.تولید شناسه‌ها(مدل، حافظه، شناسه‌ها، ۴، نمونه‌بردار، -۱)
    سرچاپ تولیدی.طول()
    حافظه.بازنشانی()
    متن تولیدی := مدل زبانی بزرگ.تولید(مدل، حافظه، توکن‌ساز، "ab"، ۳، نمونه‌بردار)
    سرچاپ متن تولیدی.طول() > ۰
    تانسور.آزادسازی(لاجیت‌ها)
    تانسور.آزادسازی(آخر)
    حافظه.آزادسازی()
    مدل.آزادسازی()
    توکن‌ساز.آزادسازی()
پایان
خروجی4 3 ab abcab 0 0 1 4 true 2 32 3x4 3 1x4 true true 4 true

بعد سر head_dim

تابع بعد سر(): صحیح
اندازه‌ی هر سر توجه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

لایه Layer

ساختار لایه
وزن‌های یک لایه‌ی ترنسفورمر.
نامانگلیسیگونهتوضیح
نرمال‌سازی توجهattn_normتانسور.تانسورنرمال‌سازی پیش از توجه.
وزن پرسشwqتانسور.تانسوروزن پرسش.
وزن کلیدwkتانسور.تانسوروزن کلید.
وزن مقدارwvتانسور.تانسوروزن مقدار.
وزن خروجی توجهwoتانسور.تانسوروزن خروجی توجه.
بایاس پرسشbqتانسور.تانسوربایاس پرس‌وجو؛ برای مدل‌هایی که ندارند خالی است. مدل‌های Qwen2 آن را دارند.
بایاس کلیدbkتانسور.تانسوربایاس کلید؛ اگر مدل نداشته باشد خالی است.
بایاس مقدارbvتانسور.تانسوربایاس مقدار؛ اگر مدل نداشته باشد خالی است.
نرمال‌سازی پیشروffn_normتانسور.تانسورنرمال‌سازی پیش از لایه‌ی پیشرو.
وزن دروازهw_gateتانسور.تانسوروزن دروازه‌ی SwiGLU.
وزن بالاw_upتانسور.تانسوروزن بالابر.
وزن پایینw_downتانسور.تانسوروزن پایین‌بر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

آزادسازی free

تابع آزادسازی()
وزن‌ها را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

مدل Model

ساختار مدل
مدل زبانی.
نامانگلیسیگونهتوضیح
پیکربندیcfgپیکربندیپیکربندی.
جاسازی توکن‌هاtok_embedتانسور.تانسورجدول جاسازی توکن‌ها.
لایه‌هاlayersوکتور<لایه>لایه‌ها.
نرمال‌سازی پایانیout_normتانسور.تانسورنرمال‌سازی پایانی.
وزن خروجیout_headتانسور.تانسوروزن خروجی به واژگان.
موفقokمنطقی = نادرستدرست ساخته یا بارگذاری شد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

آزادسازی free

تابع آزادسازی()
مدل را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

حافظه کلید مقدار KVCache

ساختار حافظه کلید مقدار
حافظه‌ی کلید و مقدار: کلیدها و مقدارهای توکن‌های پیشین را نگه می‌دارد تا هر توکن تازه فقط یک بار حساب شود.
نامانگلیسیگونهتوضیح
کلیدهاkوکتور<تانسور.تانسور>کلیدها، یکی برای هر لایه.
مقدارهاvوکتور<تانسور.تانسور>مقدارها.
شمار توکن‌هاlenصحیح = 0شمار توکن‌های پردازش‌شده.
گنجایشctxصحیح = 0گنجایش.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

بازنشانی reset

تابع بازنشانی()
برای متن تازه خالی می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

آزادسازی free

تابع آزادسازی()
آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

توکن‌ساز Tokenizer

ساختار توکن‌ساز
توکن‌ساز: متن را به شماره‌ها و برعکس تبدیل می‌کند.
نامانگلیسیگونهتوضیح
گونهkindصحیحگونه.
توکن‌هاtokensوکتور<رشته>متن توکن‌ها.
امتیازهاscoresوکتور<اعشار۶۴>امتیازها برای SentencePiece.
نمایهindexنگاشت<رشته، صحیح>شماره‌ی هر توکن.
ادغام‌هاmergesنگاشت<رشته، صحیح>رتبه‌ی ادغام‌های BPE.
کلیدهای ادغامmerge_keysوکتور<رشته>کلیدهای ادغام.
توکن آغازbosصحیح = -1شماره‌ی توکن آغاز؛ ۱- یعنی ندارد.
توکن پایانیeosصحیح = -1شماره‌ی توکن پایان.
توکن ناشناختهunkصحیح = 0شماره‌ی توکن ناشناخته.
افزودن توکن آغازadd_bosمنطقی = درسترمزگذاری توکن آغاز را بیفزاید.
شماره بایت‌هاbyte_idsوکتور<صحیح>شماره‌ی توکن هر بایت.
نگاشت بایت نویسهb2uوکتور<صحیح>نگاشت بایت به نویسه در BPE بایتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

افزودن توکن add_token

تابع افزودن توکن(text: رشته، score: اعشار۶۴): صحیح
توکنی می‌افزاید و شماره‌اش را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

افزودن ادغام add_merge

تابع افزودن ادغام(a: رشته، b: رشته)
قاعده‌ی ادغام BPE به ترتیب رتبه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

پایان finish

تابع پایان()
پس از افزودن توکن‌ها صدا بزنید تا جدول‌ها آماده شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

اندازه size

تابع اندازه(): صحیح
شمار توکن‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

متن توکن token_text

تابع متن توکن(id: صحیح): رشته
متن یک توکن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

رمزگذاری encode

تابع رمزگذاری(text: رشته): وکتور<صحیح>
متن به شماره‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

رمزگشایی decode

تابع رمزگشایی(ids &: وکتور<صحیح>): رشته
شماره‌ها به متن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

آزادسازی free

تابع آزادسازی()
آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

نمونه‌بردار Sampler

ساختار نمونه‌بردار
نمونه‌بردار: توکن بعدی را از لاجیت‌ها برمی‌گزیند.
نامانگلیسیگونهتوضیح
دماtemperatureاعشار۶۴ = 1دما؛ کمتر یعنی پاسخ قطعی‌تر.
شمار محتمل‌ترین‌هاtop_kصحیح = 0فقط از k توکن محتمل‌تر؛ صفر یعنی بی محدودیت.
احتمال تجمعیtop_pاعشار۶۴ = 1فقط از توکن‌هایی که مجموع احتمالشان تا p است.
جریمه تکرارهاrepeat_penaltyاعشار۶۴ = 1جریمه‌ی تکرار توکن‌های اخیر.
مولد تصادفیrngتانسور.مولد تصادفیمولد تصادفی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

نمونه sample

تابع نمونه(logits &: تانسور.تانسور، row: صحیح، recent &: وکتور<صحیح>): صحیح
توکن بعدی را با توجه به توکن‌های اخیر برمی‌گزیند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

پایاها و متغیرها

روپ عادی ROPE_NORMAL

پایا روپ عادی: صحیح۳۲ = 0
جاسازی چرخشی Llama.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

روپ نئوایکس ROPE_NEOX

پایا روپ نئوایکس: صحیح۳۲ = 1
جاسازی چرخشی GPT-NeoX، برای Qwen و مدل‌های مشابه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

توکن‌ساز قطعه جمله TOK_SPM

پایا توکن‌ساز قطعه جمله: صحیح۳۲ = 0
توکن‌ساز SentencePiece، مثل Llama 2.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

توکن‌ساز بایتی TOK_BPE

پایا توکن‌ساز بایتی: صحیح۳۲ = 1
توکن‌ساز BPE بایتی، مثل GPT-2، Llama 3 و Qwen.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

تابع‌ها

پیکربندی از جی‌جی‌یو‌اف ConfigFromGguf

تابع پیکربندی از جی‌جی‌یو‌اف(g &: جی‌جی‌یو‌اف.جی‌جی‌یو‌اف): پیکربندی
پیکربندی از فراداده‌ی GGUF.
ai-llm-Load.salam
واردسازی هوش مصنوعی.مدل زبانی بزرگ
واردسازی هوش مصنوعی.جی‌جی‌یو‌اف

تابع ریشه خطادار:
    مسیر := "models/qwen2.5-0.5b-instruct-q8_0.gguf"
    ناپایا مدل := مدل زبانی بزرگ.مدل {}
    ناپایا توکن‌ساز := مدل زبانی بزرگ.توکن‌ساز جدید(مدل زبانی بزرگ.توکن‌ساز بایتی)
    اگر وارونه مدل زبانی بزرگ.بارگذاری مدل جی‌جی‌یو‌اف(مسیر، مدل، توکن‌ساز):
        سرچاپ "مدل بارگذاری نشد:"، مسیر
        برگشت
    پایان
    ناپایا حافظه := مدل زبانی بزرگ.حافظه کلید مقدار جدید(مدل.پیکربندی)
    ناپایا نمونه‌بردار := مدل زبانی بزرگ.نمونه‌بردار جدید(۴۲)
    نمونه‌بردار.دما = ۰.۷
    سرچاپ مدل زبانی بزرگ.تولید(مدل، حافظه، توکن‌ساز، "پایتخت ایران"، ۲۰، نمونه‌بردار)

    ناپایا پرونده := تلاش جی‌جی‌یو‌اف.بارگذاری جی‌جی‌یو‌اف(مسیر)
    پیکربندی := مدل زبانی بزرگ.پیکربندی از جی‌جی‌یو‌اف(پرونده)
    سرچاپ پیکربندی.واژگان، پیکربندی.اندازه جاسازی، پیکربندی.لایه‌ها، پیکربندی.سرهای توجه، پیکربندی.سرهای کلید مقدار، پیکربندی.لایه پیشرو، پیکربندی.بیشینه طول، پیکربندی.اپسیلون، پیکربندی.پایه جاسازی چرخشی، پیکربندی.نوع جاسازی چرخشی
    ناپایا مدل۲ := مدل زبانی بزرگ.مدل از جی‌جی‌یو‌اف(پرونده)
    ناپایا توکن‌ساز۲ := مدل زبانی بزرگ.توکن‌ساز از جی‌جی‌یو‌اف(پرونده)
    سرچاپ توکن‌ساز۲.توکن آغاز، توکن‌ساز۲.توکن پایانی، توکن‌ساز۲.توکن ناشناخته
    مدل۲.آزادسازی()
    توکن‌ساز۲.آزادسازی()
    پرونده.آزادسازی()
    حافظه.آزادسازی()
    مدل.آزادسازی()
    توکن‌ساز.آزادسازی()
پایان

مدل از جی‌جی‌یو‌اف ModelFromGguf

تابع مدل از جی‌جی‌یو‌اف(g &: جی‌جی‌یو‌اف.جی‌جی‌یو‌اف): مدل
وزن‌ها را از پرونده‌ی GGUF بارگذاری می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Load.salam

توکن‌ساز از جی‌جی‌یو‌اف TokenizerFromGguf

تابع توکن‌ساز از جی‌جی‌یو‌اف(g &: جی‌جی‌یو‌اف.جی‌جی‌یو‌اف): توکن‌ساز
توکن‌ساز را از واژگان پرونده می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Load.salam

بارگذاری مدل جی‌جی‌یو‌اف LoadGgufModel

تابع بارگذاری مدل جی‌جی‌یو‌اف(path: رشته، m &: مدل، t &: توکن‌ساز): منطقی
مدل و توکن‌ساز را از پرونده‌ی .gguf بارگذاری می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Load.salam

حافظه کلید مقدار جدید NewKVCache

تابع حافظه کلید مقدار جدید(cfg &: پیکربندی): حافظه کلید مقدار
حافظه برای پیکربندی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

مدل تصادفی RandomModel

تابع مدل تصادفی(cfg &: پیکربندی، seed: صحیح۶۴): مدل
مدل با وزن‌های تصادفی؛ برای آزمون بی دانلود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

توکن‌ساز جدید NewTokenizer

تابع توکن‌ساز جدید(kind: صحیح): توکن‌ساز
توکن‌ساز خالی از یک گونه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

پیشرو Forward

تابع پیشرو(m &: مدل، cache &: حافظه کلید مقدار، tokens &: وکتور<صحیح>): تانسور.تانسور
توکن‌ها را از مدل می‌گذراند و لاجیت هر جایگاه را برمی‌گرداند؛ حافظه به‌روز می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

ردیف لاجیت LogitsRow

تابع ردیف لاجیت(logits &: تانسور.تانسور، row: صحیح): تانسور.تانسور
لاجیت یک جایگاه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

نمونه‌بردار جدید NewSampler

تابع نمونه‌بردار جدید(seed: صحیح۶۴): نمونه‌بردار
نمونه‌بردار با بذر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

حریصانه Greedy

تابع حریصانه(logits &: تانسور.تانسور، row: صحیح): صحیح
محتمل‌ترین توکن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

تولید شناسه‌ها GenerateIds

تابع تولید شناسه‌ها(m &: مدل، cache &: حافظه کلید مقدار، prompt_ids &: وکتور<صحیح>، max_new: صحیح، sp &: نمونه‌بردار، eos: صحیح): وکتور<صحیح>
تا n توکن تازه پس از شماره‌های آغازین تولید می‌کند؛ با توکن پایان می‌ایستد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam

تولید Generate

تابع تولید(m &: مدل، cache &: حافظه کلید مقدار، tok &: توکن‌ساز، prompt: رشته، max_new: صحیح، sp &: نمونه‌بردار): رشته
متن آغازین را ادامه می‌دهد و متن تازه را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: ai-llm-Generate.salam