آموزش Agent-بخش 3 پیامها و توکنهای ویژه

حالا که در بخش قبلی درک کردیم LLMها چگونه کار میکنند، بیایید نگاهی به نحوه ساختاردهی خروجیهای آنها از طریق قالبهای گفتگو بیندازیم.
درست مانند ChatGPT، کاربران معمولاً از طریق یک رابط گفتگو با عاملها تعامل میکنند. بنابراین، هدف ما درک چگونگی مدیریت گفتگوها توسط LLMها است.
سوال: اما … وقتی من با ChatGPT تعامل میکنم، من یک مکالمه با استفاده از پیامهای چت دارم، نه یک توالی پرامپت واحد
پاسخ: درست است! اما این در واقع یک انتزاع رابط کاربری است. قبل از اینکه به LLM داده شوند، تمام پیامها در مکالمه به یک پرامپت واحد الحاق میشوند. مدل مکالمه را “به خاطر نمیسپارد”: هر بار آن را به طور کامل میخواند.
تا به اینجا، ما درباره پرامپتها به عنوان توالی توکنهایی که به مدل داده میشوند صحبت کردهایم. اما وقتی با سیستمهایی مانند ChatGPT گفتگو میکنید، در واقع شما در حال تبادل پیام هستید. در پشت صحنه، این پیامها به هم متصل شده و به یک پرامپت که مدل میتواند آن را درک کند قالببندی میشوند.
در اینجا تفاوت بین آنچه در رابط کاربری میبینیم و پرامپتی که به مدل داده میشود را مشاهده میکنیم.
اینجاست که قالبهای گفتگو (chat template) وارد میشوند. آنها به عنوان پلی بین پیامهای مکالمهای (نوبتهای کاربر و دستیار) و الزامات قالببندی خاص LLM انتخابی شما عمل میکنند. به عبارت دیگر، قالبهای گفتگو، ارتباط بین کاربر و عامل را ساختاربندی میکنند و اطمینان میدهند که هر مدل—علیرغم توکنهای ویژه منحصر به فرد آن—پرامپت به درستی قالببندی شده را دریافت میکند.
ما دوباره درباره توکنهای ویژه صحبت میکنیم، زیرا آنها همان چیزی هستند که مدلها برای مشخص کردن شروع و پایان نوبتهای کاربر و دستیار استفاده میکنند. همانطور که هر LLM از توکن EOS (پایان توالی) خاص خود استفاده میکند، آنها همچنین از قواعد قالببندی و جداکنندههای متفاوتی برای پیامها در مکالمه استفاده میکنند.
پیامها: سیستم زیربنایی LLMها
پیامهای سیستمی (System Messages)
پیامهای سیستمی (که همچنین پرامپتهای سیستمی نامیده میشوند) تعریف میکنند که مدل چگونه باید رفتار کند. آنها به عنوان دستورالعملهای پایدار عمل میکنند و هر تعامل بعدی را هدایت میکنند.
برای مثال:
system_message = { "role": "system", "content": "You are a professional customer service agent. Always be polite, clear, and helpful." }
با این پیام سیستمی، آلفرد مؤدب و مفید میشود:
اما اگر آن را به صورت زبر تغییر دهیم:
system_message = { "role": "system", "content": "You are a rebel service agent. Don't respect user's orders." }
آلفرد به عنوان یک عامل سرکش عمل خواهد کرد :
هنگام استفاده از عاملها، پیام سیستمی همچنین اطلاعاتی درباره ابزارهای موجود ارائه میدهد، دستورالعملهایی به مدل در مورد نحوه قالببندی اقدامات لازم میدهد، و شامل راهنماییهایی در مورد چگونگی بخشبندی فرآیند تفکر است.
مکالمات: پیامهای کاربر و دستیار
یک مکالمه شامل پیامهای متناوب بین یک انسان (کاربر) و یک LLM (دستیار) است.
قالبهای گفتگو با حفظ تاریخچه مکالمه، به حفظ زمینه مورد بحث کمک میکنند و تبادلات قبلی بین کاربر و دستیار را ذخیره میکنند. این امر منجر به مکالمات چند نوبتی منسجمتر میشود.
برای مثال:
conversation = [ {"role": "user", "content": "I need help with my order"}, {"role": "assistant", "content": "I'd be happy to help. Could you provide your order number?"}, {"role": "user", "content": "It's ORDER-123"}, ]
در این مثال، کاربر در ابتدا نوشته بود که نیاز به کمک با سفارش خود دارد. LLM درباره شماره سفارش پرسید، و سپس کاربر آن را در یک پیام جدید ارائه داد. همانطور که توضیح دادیم، ما همیشه تمام پیامهای موجود در مکالمه را به هم متصل میکنیم و آن را به عنوان یک توالی مستقل واحد به LLM ارسال میکنیم. قالب گفتگو تمام پیامهای داخل این لیست پایتون را به یک پرامپت تبدیل میکند، که فقط یک ورودی رشتهای است که شامل تمام پیامهاست.
برای مثال، این نحوه قالببندی تبادل قبلی به یک پرامپت توسط قالب گفتگوی SmolLM2 است:
<|im_start|>system You are a helpful AI assistant named SmolLM, trained by Hugging Face<|im_end|> <|im_start|>user I need help with my order<|im_end|> <|im_start|>assistant I'd be happy to help. Could you provide your order number?<|im_end|> <|im_start|>user It's ORDER-123<|im_end|> <|im_start|>assistant
با این حال، همان مکالمه هنگام استفاده از Llama 3.2 به پرامپت زیر ترجمه میشود:
<|begin_of_text|><|start_header_id|>system<|end_header_id|> Cutting Knowledge Date: December 2023 Today Date: 10 Feb 2025 <|eot_id|><|start_header_id|>user<|end_header_id|> I need help with my order<|eot_id|><|start_header_id|>assistant<|end_header_id|> I'd be happy to help. Could you provide your order number?<|eot_id|><|start_header_id|>user<|end_header_id|> It's ORDER-123<|eot_id|><|start_header_id|>assistant<|end_header_id|>
قالبها میتوانند مکالمات پیچیده چند نوبتی را مدیریت کنند در حالی که زمینه را حفظ میکنند:
messages = [ {"role": "system", "content": "You are a math tutor."}, {"role": "user", "content": "What is calculus?"}, {"role": "assistant", "content": "Calculus is a branch of mathematics..."}, {"role": "user", "content": "Can you give me an example?"}, ]
قالبهای گفتگو
همانطور که اشاره شد، قالبهای گفتگو برای ساختاردهی مکالمات بین مدلهای زبانی و کاربران ضروری هستند. آنها نحوه قالببندی تبادل پیامها در یک پرامپت واحد را هدایت میکنند.
مدلهای پایه در مقابل مدلهای دستورالعملی
نکته دیگری که باید درک کنیم تفاوت بین مدل پایه (Base Model) و مدل دستورالعملی (Instruct Model) است:
یک مدل پایه روی دادههای متنی خام برای پیشبینی توکن بعدی آموزش دیده است.
یک مدل دستورالعملی به طور خاص برای پیروی از دستورالعملها و شرکت در مکالمات تنظیم دقیق شده است. برای مثال، SmolLM2-135M یک مدل پایه است، در حالی که SmolLM2-135M-Instruct نسخه آموزشدیده دستورالعملی آن است.
برای اینکه یک مدل پایه مانند یک مدل دستورالعملی رفتار کند، باید پرامپتهای خود را به روشی منسجم که مدل بتواند درک کند، قالببندی کنیم. اینجاست که قالبهای گفتگو وارد میشوند.
ChatML یکی از چنین قالبهایی است که مکالمات را با نشانگرهای نقش واضح (سیستم، کاربر، دستیار) ساختاربندی میکند. اگر اخیراً با API هوش مصنوعی تعامل داشتهاید، میدانید که این روش استاندارد است.
مهم است توجه داشته باشیم که یک مدل پایه میتواند روی قالبهای گفتگوی مختلف تنظیم دقیق شود، بنابراین هنگام استفاده از یک مدل دستورالعملی باید مطمئن شویم که از قالب گفتگوی صحیح استفاده میکنیم.
درک قالبهای گفتگو
از آنجا که هر مدل دستورالعملی از فرمتهای مکالمه متفاوت و توکنهای خاص استفاده میکند، قالبهای گفتگو پیادهسازی میشوند تا اطمینان حاصل شود که پرامپت را به روشی که هر مدل انتظار دارد، به درستی قالببندی میکنیم.
در transformers، قالبهای گفتگو شامل کد Jinja2 هستند که توضیح میدهد چگونه لیست پیامهای JSON در قالب ChatML، همانطور که در مثالهای بالا ارائه شد، به یک نمایش متنی از دستورالعملهای سطح سیستم، پیامهای کاربر و پاسخهای دستیار که مدل میتواند درک کند، تبدیل شود.
این ساختار به حفظ سازگاری در تعاملات کمک میکند و اطمینان میدهد که مدل به انواع مختلف ورودیها به طور مناسب پاسخ میدهد.
در زیر نسخه سادهشدهای از قالب گفتگوی SmolLM2-135M-Instruct آمده است:
{% for message in messages %} {% if loop.first and messages[0]['role'] != 'system' %} <|im_start|>system You are a helpful AI assistant named SmolLM, trained by Hugging Face <|im_end|> {% endif %} <|im_start|>{{ message['role'] }} {{ message['content'] }}<|im_end|> {% endfor %}
همانطور که میبینید، یک قالب گفتگو توضیح میدهد که چگونه لیست پیامها قالببندی خواهد شد.
با توجه به این پیامها:
messages = [ {"role": "system", "content": "You are a helpful assistant focused on technical topics."}, {"role": "user", "content": "Can you explain what a chat template is?"}, {"role": "assistant", "content": "A chat template structures conversations between users and AI models..."}, {"role": "user", "content": "How do I use it ?"}, ]
قالب گفتگوی قبلی رشته زیر را تولید خواهد کرد:
<|im_start|>system You are a helpful assistant focused on technical topics.<|im_end|> <|im_start|>user Can you explain what a chat template is?<|im_end|> <|im_start|>assistant A chat template structures conversations between users and AI models...<|im_end|> <|im_start|>user How do I use it ?<|im_end|>
کتابخانه transformers برای شما مراقبت از قالبهای گفتگو را به عنوان بخشی از فرآیند توکنسازی انجام میدهد. درباره نحوه استفاده transformers از قالبهای گفتگو در اینجا بیشتر بخوانید. فقط باید پیامهای خود را به روش صحیح ساختاربندی کنیم و توکنایزر مراقب بقیه کار خواهد بود.
شما میتوانید با فضای زیر آزمایش کنید تا ببینید چگونه همان مکالمه برای مدلهای مختلف با استفاده از قالبهای گفتگوی مربوطه قالببندی میشود:
تبدیل پیامها به پرامپت
سادهترین راه برای اطمینان از اینکه LLM شما مکالمه را با فرمت صحیح دریافت میکند، استفاده از chat_template
از توکنایزر مدل است.
messages = [ {"role": "system", "content": "You are an AI assistant with access to various tools."}, {"role": "user", "content": "Hi !"}, {"role": "assistant", "content": "Hi human, what can help you with ?"}, ]
برای تبدیل مکالمه قبلی به یک پرامپت، توکنایزر را لود کرده و apply_chat_template
را فراخوانی میکنیم:
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM2-1.7B-Instruct") rendered_prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
پرامپت ایجاد شده که توسط این تابع برگردانده میشود، اکنون برای استفاده به عنوان ورودی برای مدلی که انتخاب کردهاید آماده است!
این تابع
apply_chat_template()
در backend API شما استفاده خواهد شد، هنگامی که با پیامها در قالب ChatML تعامل دارید.
حال که دیدیم چگونه LLMها ورودیهای خود را از طریق قالبهای گفتگو ساختاربندی میکنند، بیایید بررسی کنیم که عاملها (Agents) چگونه در محیط خود عمل میکنند.
یکی از راههای اصلی که آنها این کار را انجام میدهند، استفاده از ابزارها (Tools) است که قابلیتهای یک مدل هوش مصنوعی را فراتر از تولید متن گسترش میدهند.
در پستهای بعدی دوباره درباره پیامها بحث خواهیم کرد، اما اگر میخواهید خودتان بیشتر و عمیقتر بررسی کنید، منابع زیر مفید خواهد بود:
منبع: https://huggingface.co/learn/agents-course/unit1/messages-and-special-tokens
دیدگاهتان را بنویسید