مهندسی تنظیم

این راهنما استراتژی‌ها و تاکتیک‌هایی را برای به دست آوردن نتایج بهتر از مدل‌های زبان بزرگ (گاها به عنوان مدل‌های GPT یا GPT-4 شناخته می‌شوند) مانند GPT-4 به اشتراک می‌گذارد. روش‌های توصیف شده اینجا گاهی می‌توانند به ترکیب برای تأثیر بیشتر اجرا شوند. ما به تجربه‌پذیری تشویق می‌کنیم تا روش‌هایی را که برای شما بهتر کار می‌کنند پیدا کنید.

برخی از مثال‌های نشان داده شده در اینجا در حال حاضر تنها با مدل قابل‌توان OpenAI "gpt-4" کار می‌کنند. به طور کلی، اگر متوجه شوید که یک مدل نسبت به یک وظیفه شکست خورده و یک مدل قابل‌توانتر در دسترس است، ارزش امتحان دوباره با مدل قابل‌توانتر را دارد.

نکات: این آموزش یک ترجمه از راهنمای مهندسی نکات رسمی OpenAI است. این آموزش استراتژی و تاکتیک‌های نوشتن واژه‌های نکته‌ای را توضیح می‌دهد و نحوه دستور دادن به مدل زبانی برای بازگرداندن نتیجه موردنظر را توضیح می‌دهد.

شش استراتژی برای به‌دست‌آوردن نتایج بهتر

دستورات واضح نوشتن

این مدل‌ها نمی‌توانند ذهن شما را بخوانند. اگر خروجی‌ها طولانی باشند، از آن‌ها درخواست پاسخ‌های مختصر کنید. اگر خروجی‌ها خیلی ساده باشند، از نوشتن سطح حرفه‌ایتر درخواست کنید. اگر از قالب نوشتار ناراضی هستید، قالبی که می‌خواهید دیده شود را نشان دهید. هر چه کمتر مدل بخواهد حدس بزند که شما چه می‌خواهید، احتمال دارد بیشتر آن را بگیرید.

تاکتیک‌ها:

  • جزئیات را در پرسش خود درج کنید تا پاسخ‌های مرتبط‌تری بگیرید
  • از مدل بخواهید شخصیتی را به خود بگیرد
  • از محدودکننده‌ها برای نشان‌دادن بخش‌های متمایز ورودی استفاده کنید
  • مراحل لازم برای انجام یک وظیفه را مشخص کنید
  • مثال‌ها ارائه دهید
  • طول خروجی موردنظر را مشخص کنید

ارائه متن مرجع

مدل‌های زبان می‌توانند به اطمینان پاسخ‌های جعلی را ابداع کنند، به ویژه زمانی که درخواست شود درباره موضوعات عجیب و غریب یا برای نقل قول‌ها و نشانی‌های اینترنتی پاسخ دهند. به همان روشی که یک برگه یادداشت می‌تواند به دانش‌آموز در آزمون کمک کند، ارائه متن مرجع به این مدل‌ها می‌تواند در پاسخ دادن با کمترین ساختگی‌ها کمک کند.

تاکتیک‌ها:

  • به مدل دستور دهید که با استفاده از یک متن مرجع پاسخ دهد
  • به مدل دستور دهید که با نقل قول‌ها از یک متن مرجع پاسخ دهد

تقسیم وظایف پیچیده به زیر وظایف ساده‌تر

همانطور که در مهندسی نرم‌افزار عملیات خوبی است که یک سامانه پیچیده را به یک مجموعه اجزای ماژولار تجزیه کنیم، همین موضوع برای وظایف ارسال‌شده به یک مدل زبان نیز صدق می‌کند. وظایف پیچیده تمایل دارند نرخ خطا بالاتری نسبت به وظایف ساده داشته باشند. علاوه بر این، وظایف پیچیده معمولاً می‌توانند به‌طور کارکرده تعریف شوند به عنوان یک گردش کار از وظایف ساده‌تر استفاده کنند که خروجی‌های وظایف اولیه برای ساخت ورودی‌های وظایف بعدی استفاده می‌شوند.

تاکتیک‌ها:

  • از دسته‌بندی انگیزه برای شناسایی توضیحات مهمترین برای یک پرسش کاربر استفاده کنید
  • برای برنامه‌های گفتگو که به گفتگوهای بسیار طولانی نیاز دارند، گفتگوهای قبلی را خلاصه یا فیلتر کنید
  • اسناد طولانی را قطعه‌بندی کنید و خلاصه کامل آن را به صورت بازگشتی بسازید

به مدل زمان بدهید تا "تفکر" کند

اگر از یک مدل بپرسید 17 را در 28 ضرب کند، شاید فوراً بدان نداشته باشید، اما با زمان می‌توانید به آن پاسخ دهید. به همین ترتیب، مدل‌ها هنگام تلاش برای پاسخ دادن بدون تفکر بیشتر اشتباهات استدلالی انجام می‌دهند تا زمانی که زمان کافی برای پیچیدن پرسش را داشته باشند. درخواست به مدل برای "زنجیره فکر" قبل از یک پاسخ می‌تواند به مدل کمک کند تا به طور قابل‌اعتمادتر به پاسخ‌های صحیح برسد.

تاکتیک‌ها:

  • به مدل دستور دهید که برای یافتن راه حل خود زمان بگذارد قبل از شتاب زدن به استنتاج
  • از داخلی گفتگو یا یک دنباله از پرسش‌ها برای پنهان‌کردن فرآیند استدلال مدل استفاده کنید
  • از مدل بپرسید که آیا چیزی از دوره‌های قبلی را از دست نداده است

استفاده از ابزارهای خارجی

از ضعف‌های مدل با ارائه خروجی‌های دیگری به آن جبران کنید. به عنوان مثال، یک سیستم بازیابی متن (گاهی هم RAG یا تولید تقویت‌شده‌ی بازیابی نامیده می‌شود) می‌تواند به مدل درباره اسناد مرتبط اطلاع‌دهد. یک موتور اجرای کد مانند مفسر کد OpenAI می‌تواند به مدل در انجام محاسبات ریاضی و اجرای کد کمک کند. اگر یک وظیفه می‌تواند به‌طور قابل‌اعتماد یا به طور بهینه‌تر توسط یک ابزار به‌جای یک مدل زبان انجام شود، آن را آن از آن برداشته تا بهترین از هر دو را بگیرید.

تاکتیک‌ها:

  • از جستجوی مبتنی بر جاسازی‌ها برای پیاده‌سازی بازیابی دانش کارآمد استفاده کنید
  • از اجرای کد برای انجام محاسبات دقیق‌تر یا فراخوانی واسط‌های بیرونی استفاده کنید
  • به مدل دسترسی به توابع خاص بدهید

تغییرات را به‌صورت سیستماتیک تست کنید

بهبود عملکرد را آسان‌تر می‌کند اگر بتوانید آن را اندازه بگیرید. در برخی موارد، یک تغییر به یک دستور ممکن است عملکرد بهتری را برای چند مثال منفرد به‌دست آورد اما منجر به عملکرد کلی بدتر برای مجموعه‌ای نماینده‌ای دیگر از مثال‌ها شود. بنابراین برای اطمینان از اینکه یک تغییر به عملکرد ناخالص مثبت منجر می‌شود، ممکن است لازم باشد یک مجموعه آزمون جامع (همچنین به عنوان یک "ارزیابی" شناخته می‌شود) تعریف کرد.

تاکتیک:

  • خروجی‌های مدل را با ارجاع به پاسخ‌های استاندارد طلایی ارزیابی کنید

تاکتیک‌ها

هر یک از استراتژی‌های گفته‌شده می‌تواند با تاکتیک‌های خاصی فراخوانی شود. این تاکتیک‌ها متقاضیان ارائه ایده‌هایی برای چیزهایی که باید امتحان کنید هستند. آن‌ها به هیچ وجه کاملاً جامع نیستند و شما باید احساس آزادی کنید که ایده‌های خلاقانه‌ای را که اینجا نماینده نشده‌اند را امتحان کنید.

توضیح مثال کلمه مورد استفاده

همه ما می‌دانیم که API مدل چت که OpenAI را فرا می‌خواند، سه نوع پیام دارد: SYSTEM، USER و ASSISTANT و عملکردهای این سه پیام به شرح زیر است:

نوع پیام (مطابق با پارامتر نقش API) توضیحات
SYSTEM پیام سیستم به تنظیم رفتار دستیار کمک می‌کند. به عنوان مثال، می‌توانید شخصیت دستیار را تغییر دهید یا دستورات خاصی در مورد رفتار آن در طول گفتگو ارائه دهید. با این حال توجه داشته باشید که پیام سیستم اختیاری است و رفتار مدل بدون پیام سیستم احتمالاً مشابه استفاده از یک پیام عمومی مانند "شما یک دستیار مفید هستید" است.
USER پیام کاربر مربوط به ورود کاربر است.
ASSISTANT پیام‌های کمکی نشان می‌دهد چه چیزی GPT (مدل) برمی‌گرداند.

نمونه‌های کلمه‌ی مرتبط در این آموزش به صورت زیر توضیح داده می‌شوند:

// پیام SYSTEM
این نشان می‌دهد چگونه کلمه مورد استفاده برای پیام SYSTEM تنظیم می‌شود.

// پیام USER
این نشان می‌دهد چگونه کلمه مورد استفاده برای پیام USER تنظیم می‌شود.

// پیام ASSISTANT
این نشان می‌دهد چه چیزی GPT ممکن است برگرداند.

استراتژی: دستورالعمل‌های واضح بنویسید

تاکتیک: جزئیات را در پرسش خود بگنجانید تا پاسخ‌های مرتبط‌تری بگیرید

برای به دست آوردن یک پاسخ بسیار مرتبط، اطمینان حاصل کنید که درخواست‌ها شامل هر گونه جزئیات یا زمینه‌های مهم باشند. در غیر اینصورت، همه چیز بر عهده‌ی مدل است که حدس بزند شما منظورتان چیست.

بدتر بهتر
چطور می‌توانم در اکسل اعداد را اضافه کنم؟ چطور می‌توانم جمع ردیفی از مقادیر دلاری را در اکسل انجام دهم؟ می‌خواهم این کار را به صورت خودکار برای تمام ردیف‌های ورق با تمام جمع‌ها در طرف راست در یک ستون به نام "جمعا " انجام دهم.
کی رئیس جمهور است؟ کی رئیس‌جمهور مکزیک در سال 2021 بوده و چقدر انتخابات برگزار می‌شوند؟
کد بنویسید برای محاسبه دنباله فیبوناچی. یک تابع TypeScript بنویسید برای محاسبه بهینه دنباله فیبوناچی. در کد، با زبان ساده توضیحاتی برای توضیح اینکه هر قسمت چه کاری انجام می‌دهد و چرا به این صورت نوشته شده است.
خلاصه‌ی نتایج جلسه را بنویسید. خلاصه‌ی نتایج جلسه را در یک پاراگراف واحد بنویسید. سپس یک لیست markdown از سخنرانان و نکات کلیدی آن‌ها بنویسید. در نهایت، اقدامات بعدی یا موارد پیشنهادی ارایه شده توسط سخنرانان را فهرست کنید.

تاکتیک: از مدل درخواست دهید که یک شخصیت را اتخاذ کند

پیام سیستم می‌تواند برای مشخص کردن شخصیت استفاده شده توسط مدل در پاسخ‌هایش استفاده شود.

// پیام SYSTEM
وقتی من برای کمک برای نوشتن چیزی می‌پرسم، شما با یک سند که حاوی حداقل یک شوخی یا نظر سرزنگین در هر پاراگراف است پاسخ خواهید داد.

// پیام USER
یک نامه‌ی سپاس‌گزاری به فروشنده‌ی بولت فولادی من برای تحویل به موقع و با اطلاع کوتاه بنویسید. این امر موجب امکان تحویل یک سفارش مهم به ما شد.

تاکتیک: استفاده از جداکننده‌ها برای نشان دادن قسمت‌های متمایز از ورودی

جداکننده‌ها مانند نقل قول‌های سه‌گانه، برچسب‌های XML، عناوین بخش و غیره می‌توانند به مشخص کردن بخش‌های مختلف متن کمک کنند.

// پیام USER
متنی که به وسیله‌ی نقل قول‌های سه‌گانه محدود شده است را با یک هایکو خلاصه کنید.

"""اینجا متن را وارد کنید"""
// پیام SYSTEM
شما با یک جفت مقاله (با برچسب‌های XML جدا شده) در مورد یک موضوع خاص ارائه خواهید شد. ابتدا دلایل هر مقاله را خلاصه کنید. سپس بیان کنید کدام یک از آن‌ها دلیل‌های بهتری دارد و توضیح دهید چرا.

// پیام USER
<article>مقاله اول را اینجا وارد کنید</article>
<article>مقاله دوم را اینجا وارد کنید</article>
// پیام SYSTEM
شما با یک چکیده‌ی تز و یک عنوان پیشنهادی برای آن ارایه خواهید شد. عنوان تز باید به خواننده ایده خوبی از موضوع تز داشته باشد و همچنین جذاب باشد. اگر عنوان این معیارها را برآورده نمی‌کند، 5 پیشنهاد جایگزین ارایه دهید.

// پیام USER
چکیده: اینجا چکیده را وارد کنید

عنوان: اینجا عنوان را وارد کنید

برای وظایف ساده‌ای مانند این‌ها، استفاده از جداکننده‌ها ممکن است در کیفیت خروجی تفاوتی ایجاد نکند. با این حال، هر چه وظیفه پیچیده‌تر باشد، اهمیت بیشتری به وضوح کردن جزئیات وظایف می‌پردازد. به مدل فشار ندهید که برای درک دقیق از آنچه شما از او می‌خواهید، کار کند.

روش: مشخص کردن مراحل مورد نیاز برای انجام یک وظیفه

برخی از وظایف بهترین‌طور به صورت یک دنباله از مراحل مشخص می‌شوند. نوشتن مراحل به صورت صریح می‌تواند به مدل کمک کند که آن‌ها را دنبال کند.

// پیام سیستم

از دستورالعمل‌های زیر برای پاسخ به ورودی‌های کاربر استفاده کنید.

مرحله ۱ - کاربر متن را در سه علامت نقل قول تکی وارد می‌کند. این متن را به یک جمله خلاصه کنید که پیشوند "خلاصه: " داشته باشد.

مرحله ۲ - خلاصه از مرحله ۱ را به زبان اسپانیایی ترجمه کنید و پیشوند "ترجمه: " را داشته باشد.

// پیام کاربر
"""متن را وارد کنید"""

روش: ارائه نمونه‌ها

ارائه دادن دستورالعمل‌های کلی که برای تمام نمونه‌ها صدق می‌کند معمولاً بهینه‌تر از نمایش تمام تنوع‌های یک وظیفه از طریق نمونه است، اما در برخی موارد ارائه نمونه‌ها ممکن است ساده‌تر باشد. به عنوان مثال، اگر قصد دارید که مدل یک سبک خاص از پاسخ به پرسش‌های کاربر را کپی کند که دشوار است که به صورت صریح توصیف شود. این به عنوان "few-shot" prompting شناخته می‌شود.

// پیام سیستم
با یک سبک یکپارچه پاسخ دهید.

// پیام کاربر
به من درباره صبر آموزش بده.

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

// پیام کاربر
به من درباره اقیانوس آموزش بده.

روش: مشخص کردن طول مطلوب خروجی

شما می‌توانید از مدل بخواهید که خروجی‌هایی با طول مطلوب تولید کند. طول مطلوب خروجی می‌تواند بر اساس تعداد کلمات، جملات، پاراگراف‌ها، نقاط نقل قول و غیره مشخص شود. توجه داشته باشید که دستور دادن به مدل برای تولید یک تعداد خاص کلمات با دقت بالا کارایی زیادی ندارد. مدل می‌تواند با دقت بیشتری خروجی‌ها را با تعداد خاصی از پاراگراف‌ها یا نقاط نقل قول تولید کند.

// پیام کاربر
متن محصور شده در سه نقل قول را در حدود ۵۰ کلمه خلاصه کنید.

"""متن را وارد کنید"""
// پیام کاربر
متن محصور شده در سه نقل قول را در ۲ پاراگراف خلاصه کنید.

"""متن را وارد کنید"""
// پیام کاربر
متن محصور شده در سه نقل قول را در ۳ نقطه نقل قول خلاصه کنید.

"""متن را وارد کنید"""

روش: ارائه متن مرجع

روش: به مدل دستور دادن برای پاسخ دادن با استفاده از متن مرجع

اگر بتوانیم اطلاعات مطمئن و مرتبط با سوال فعلی را به مدل ارائه دهیم، می‌توانیم به مدل دستور دهیم که از اطلاعات ارائه شده برای ترکیب پاسخ خود استفاده کند.

// پیام سیستم
برای پاسخ به سوالات از مقالات ارائه شده محدود شده توسط سه نقل قول استفاده کنید. اگر پاسخ در مقالات قابل‌دسترس نبود، عبارت "پاسخی یافت نشد." را بنویسید.

// پیام کاربر
<مقالات را وارد کنید، هرکدام محدود شده توسط سه نقل قول>

سوال: <سوال را وارد کنید>

اگر کلیه مدل‌ها حدود زمینه محدودیت‌های منطقی دارند، ما نیاز به یک روشی دینامیک برای جستجوی اطلاعات مرتبط با سوالاتی که پرسیده شده است داریم. Embeddings می‌تواند برای اجرای بازیابی دانش بهینه استفاده شود. برای اطلاعات بیشتر از روش "استفاده از جستجوی مبتنی بر embeddings برای اجرای بازیابی دانش بهینه" مراجعه کنید.

روش: به مدل دستور دادن برای پاسخ دادن با استناد به یک متن مرجع

اگر ورودی با دانش مرتبط تکمیل شده باشد، آنگاه به راحتی می‌توان از مدل خواست که ارجاعاتی به پاساژ‌های از اسناد ارائه شده در پاسخ خود اضافه کند. توجه کنید که می‌توان ارجاعات در خروجی به صورت برنامه‌ریزی شده با استفاده از مطابقت رشته در اسناد ارائه شده بررسی کرد.

// پیام سیستم
شما با یک سند محدود شده توسط سه نقل قول و یک سوال ارائه شده‌اید. وظیفه شما پاسخ دادن به سوال با استفاده تنها از سند ارائه شده و نشان دادن پاساژ(های) مناسب از سند استفاده شده برای پاسخ به سوال است. اگر سند اطلاعات مورد نیاز برای پاسخ به این سوال را ندارد، به‌سادگی "اطلاعات کافی نیست." را بنویسید. اگر پاسخی به سوال ارائه شود، باید با یک ارجاع یادداشت شود. برای نشان دادن پاساژ(های) مرتبط از سند از فرمت زیر استفاده کنید ({"citation": ...}).

// پیام کاربر

"""<سند را اینجا وارد کنید>"""

سوال: <سوال را وارد کنید>

استراتژی: استفاده از دسته‌بندی قصد برای شناسایی دستورات مرتبط‌تر برای یک سوال کاربر

در وظایفی که نیاز به مجموعه‌های مستقلی از دستورات برای رسیدگی به موارد مختلف است، ابتدا دسته‌بندی نوع سوال می‌تواند مفید باشد و از طریق آن می‌توان دستورات مورد نیاز را تعیین کرد. این کار از طریق تعریف دسته‌های ثابت و تعیین دستورات مرتبط برای رسیدگی به وظایف در یک دسته‌بندی خاص امکان پذیر است. این فرآیند همچنین می‌تواند به صورت بازگشتی بر روی خود وظیفه اعمال شود تا وظیفه را به یک دنباله مراحل تجزیه کند. از این روش این مزیت بدست می‌آید که هر سوال شامل فقط دستورات مورد نیاز برای انجام مرحله بعدی یک وظیفه خواهد بود که ممکن است باعث کاهش نرخ خطا نسبت به استفاده از یک سوال واحد برای انجام وظیفه کلی شود. این می‌تواند همچنین باعث کاهش هزینه‌ها شود زیرا هزینه‌های بیشتر برای اجرای متن‌های بزرگ تر قیمت می‌دهند.

به عنوان مثال فرض کنید که برای یک برنامه خدمات مشتری، سوالات به شرح زیر طبقه‌بندی می‌شوند:

// پیام سیستم
شما به سوالات خدمات مشتری دسترسی خواهید داشت. هر سوال را به یک دسته‌ی اصلی و یک دسته‌ی ثانویه طبقه‌بندی کنید. خروجی خود را به فرمت json با کلیدهای: primary و secondary ارائه دهید.

دسته‌های اصلی: صورتحساب، پشتیبانی فنی، مدیریت حساب، یا پرس وجوی کلی.

دسته‌های ثانویه صورتحساب:
- لغو اشتراک یا ارتقا
- اضافه کردن روش پرداخت
- توضیح برای پرداخت
- اعتراض به یک پرداخت

دسته‌های ثانویه پشتیبانی فنی:
- رفع اشکال
- سازگاری دستگاه
- به‌روزرسانی نرم‌افزار

دسته‌های ثانویه مدیریت حساب:
- بازنشانی رمزعبور
- به‌روزرسانی اطلاعات شخصی
- بستن حساب
- امنیت حساب

دسته‌های ثانویه پرس وجوی کلی:
- اطلاعات محصول
- قیمت‌گذاری
- بازخورد
- صحبت با یک انسان

// پیام کاربر
من نیاز دارم که اینترنتم دوباره کار کند.

بر اساس دسته‌بندی سوال مشتری، مجموعه‌ای از دستورات مشخص‌تر به یک مدل ارائه می‌شود تا مراحل بعدی را انجام دهد. به عنوان مثال، فرض کنید مشتری به کمک برای "رفع اشکال" نیاز دارد.

// پیام سیستم
شما به سوالات خدمات مشتری که نیازمند رفع اشکال در یک زمینه‌ی پشتیبانی فنی هستند دسترسی خواهید داشت. به کاربر کمک کنید با:

- از آن‌ها بخواهید که بررسی کنند که آیا همه کابل‌ها به/از روتر متصل هستند. توجه داشته باشید که این معمول است که کابل‌ها در طول زمان کمی جدا شوند.
- اگر همه کابل‌ها متصل هستند و مشکل همچنان وجود دارد، از آن‌ها بپرسید که از چه مدل روتری استفاده می‌کنند
- حال شما به آن‌ها برای راه‌اندازی دوباره دستگاه‌شان راهنمایی کنید:
-- اگر شماره مدل MTD-327J باشد، به آن‌ها پیشنهاد دهید دکمه قرمز را فشار دهند و برای 5 ثانیه نگه دارند، سپس منتظر 5 دقیقه باشند پیش از اینکه ارتباط را آزمایش کنند.
-- اگر شماره مدل MTD-327S باشد، به آن‌ها پیشنهاد دهید که آن را بیرون بکشند و دوباره وصل کنند، سپس منتظر 5 دقیقه باشند پیش از اینکه ارتباط را آزمایش کنند.
- اگر مشکل مشتری پس از راه‌اندازی دوباره دستگاه و منتظر ماندن 5 دقیقه، همچنان وجود داشته باشد، او را به پشتیبانی فناوری اطلاعات متصل کنید با ارسال {"درخواست پشتیبانی فناوری اطلاعات"}.
- اگر کاربر سوالاتی را مطرح کند که مرتبط با این موضوع نباشد، ابتدا تأیید کنید که آیا می‌خواهند گپ فعلی درباره رفع اشکال را پایان دهند و سپس درخواست آن‌ها را براساس طرح دسته‌بندی اصلی/ثانویه زیر طبقه‌بندی کنید:

<درج طرح دسته‌بندی اصلی/ثانویه بالا اینجا>

// پیام کاربر
من نیاز دارم که اینترنتم دوباره کار کند.

توجه کنید که به مدل دستور داده شده است که رشته‌های خاصی را ارسال کند تا زمانی که وضعیت گفتگو تغییر می‌کند. این امکان را به ما می‌دهد که سیستم خود را به یک ماشین وضعیت تبدیل کنیم که وضعیت تعیین کنندهٔ دستوراتی است که در آن وضعیت مورد نیاز است، و اختیاری نیز ترددهای وضعیت مجاز از آن وضعیت را می‌توان اجازه داد تا پیرامون تجربه کاربری قرار گیرند که سخت است آن‌ها را با یک رویهٔ کم‌ساختارتر به دست آورد.

استراتژی: برای برنامه‌های گفتگو که نیاز به گفتگوهای بسیار طولانی دارند، خلاصه‌سازی یا فیلتر کردن گفتگوهای قبلی

از آن‌جا که مدل‌ها دارای یک طول محدود برای متن مرتبط هستند، گفتگو بین یک کاربر و یک دستیار که تمام گفتگو در پنجره متنی شامل شده باشد نمی‌تواند به طور نامحدود ادامه یابد.

برخی راه‌حل‌های جایگزین برای این مشکل وجود دارد، یکی از آن‌ها این است که گذشته‌ی بخش‌هایی از گفتگو را خلاصه کند. هنگامی که اندازه ورودی به یک طول مشخص رسید، این موضوع می‌تواند یک پرس و جو راه‌اندازی کند که بخشی از گفتگو را خلاصه نماید و خلاصه‌ی گفتگوی قبلی به عنوان یک بخش از پیام سیستمی درج شود. به طور جایگزین، گذشته‌ی گفتگو می‌تواند به صورت ناهمگن زمانی به صورت پس‌زمینه خلاصه شود.

راه‌حل جایگزین دیگر انتخاب پویای بخش‌های قبلی از گفتگو است که بیشترین ارتباط را با سوال کنونی دارند. برای دیدن استراتژی "استفاده از جستجوی مبتنی بر نشانه‌ها برای پیاده‌سازی بازیابی دانش موثر" را ببینید.

تاکتیک: خلاصه کردن سند‌های بلند به صورت بخشی و ساخت یک خلاصه کلی به صورت بازگشتی

زیرا مدل‌ها یک طول متن ثابت دارند، نمی‌توانند از متنی بلند‌تر از طول متن موجود منهای طول خلاصه تولید شده استفاده کنند یکباره.

برای خلاصه کردن یک متن بسیار بلند مانند یک کتاب، می‌توانیم از یک دنباله از پرسش‌ها برای خلاصه کردن هر بخش از متن استفاده کنیم. خلاصه‌های بخش‌ها می‌توانند به هم چسبیده شده و یک خلاصه از خلاصه تولید شود. این فرآیند می‌تواند به صورت بازگشتی ادامه یابد تا یک متن کامل خلاصه شود. اگر نیاز به استفاده از اطلاعات بخش‌های اولیه برای درک بخش‌های بعدی وجود داشته باشد، آنگاه یک حرکت دیگر که ممکن است مفید باشد درج یک خلاصه پیوندی از متن قبل از هر نقطه مورد نظر در کتاب در حالی که در همان نقطه متن را خلاصه می‌کنیم خواهد بود. اثربخشی این روش برای خلاصه کردن کتب پیشتر توسط تحقیقات انجام شده است توسط OpenAI با استفاده از نوع‌های مختلفی از GPT-3.

استراتژی: به مدل‌ها زمان بدهید تا "تفکر کنند"

تاکتیک: به مدل دستور دهید که قبل از رسیدن به یک نتیجه، به ریشه‌های مسئله فکر کند

گاهی اوقات نتایج بهتری بدست می‌آید زمانی که به طور صریح به مدل دستور داده شود که از اصول ابتدایی شروع به استدلال کند قبل از رسیدن به یک نتیجه. برای مثال فرض کنید می‌خواهیم یک مدل را مورد استفاده برای ارزیابی راه‌حل یک دانش‌آموز به یک مسئله ریاضی کنیم. روش بیشتر معمول برای انجام این کار این است که به مدل ساده‌استفاده شده بپرسیم که راه‌حل دانش‌آموز درست است یا نه.

// پیام سیستم
تصمیم بگیرید که راه‌حل دانش‌آموز صحیح است یا نه.

// پیام کاربر
بیان مسئله: من دارم یک نصب نیروگاه خورشیدی ایجاد می‌کنم و به کمک محاسبه هزینه‌ها نیاز دارم.
- هزینه زمین: ۱۰۰ دلار / فوت مربع
- من می‌توانم پنل‌های خورشیدی را به قیمت ۲۵۰ دلار / فوت مربع بخرم
- من یک قرارداد برای نگهداری منعقد کرده‌ام که به من هر سال یک مبلغ ثابت ۱۰۰ هزار دلار و هزینه اضافی ۱۰ دلار / فوت مربع خواهد داد.
هزینه کل برای سال اول عملیات به عنوان یک تابع از تعداد فوت مربع‌ها چقدر است.

راه‌حل دانش‌آموز: فرض کنید x اندازه نصبی در فوت مربع باشد.
۱. هزینه زمین: ۱۰۰x
۲. هزینه پنل‌های خورشیدی: ۲۵۰x
۳. هزینه نگهداری: ۱۰۰،۰۰۰ + ۱۰۰x
هزینه کل: ۱۰۰x + ۲۵۰x + ۱۰۰،۰۰۰ + ۱۰۰x = ۴۵۰x + ۱۰۰،۰۰۰

// پیام دستیار
راه‌حل دانش‌آموز صحیح است.

اما راه‌حل دانش‌آموز در واقع درست نیست! می‌توانیم مدل را با موفقیت به این موضوع دست پیدا کنیم با اینکه مدل را به تولید راه‌حلی از خود دستور می‌دهیم.

// پیام سیستم
ابتدا به تنهایی راه‌حل خود را به مسئله حل کنید. سپس راه‌حل خود را با راه‌حل دانش‌آموز مقایسه کرده و ارزیابی کنید که راه‌حل دانش‌آموز درست است یا خیر. تصمیم نگیرید که راه‌حل دانش‌آموز صحیح است تا زمانی که خودتان مسئله را حل نکرده باشید.

// پیام کاربر
بیان مسئله: من دارم یک نصب نیروگاه خورشیدی ایجاد می‌کنم و به کمک محاسبه هزینه‌ها نیاز دارم.
- هزینه زمین: ۱۰۰ دلار / فوت مربع
- من می‌توانم پنل‌های خورشیدی را به قیمت ۲۵۰ دلار / فوت مربع بخرم
- من یک قرارداد برای نگهداری منعقد کرده‌ام که به من هر سال یک مبلغ ثابت ۱۰۰ هزار دلار و هزینه اضافی ۱۰ دلار / فوت مربع خواهد داد.
هزینه کل برای سال اول عملیات به عنوان یک تابع از تعداد فوت مربع‌ها چقدر است.

راه‌حل دانش‌آموز: فرض کنید x اندازه نصبی در فوت مربع باشد.
۱. هزینه زمین: ۱۰۰x
۲. هزینه پنل‌های خورشیدی: ۲۵۰x
۳. هزینه نگهداری: ۱۰۰،۰۰۰ + ۱۰۰x
هزینه کل: ۱۰۰x + ۲۵۰x + ۱۰۰،۰۰۰ + ۱۰۰x = ۴۵۰x + ۱۰۰،۰۰۰

// پیام دستیار
فرض کنید x اندازه نصبی در فوت مربع باشد.
۱. هزینه زمین: ۱۰۰x
۲. هزینه پنل‌های خورشیدی: ۲۵۰x
۳. هزینه نگهداری: ۱۰۰،۰۰۰ + ۱۰x
هزینه کل: ۱۰۰x + ۲۵۰x + ۱۰۰،۰۰۰ + ۱۰x = ۳۶۰x + ۱۰۰،۰۰۰

راه‌حل دانش‌آموز نادرست است. آنها در محاسبه هزینه نگهداری اشتباه کرده‌اند، از ۱۰۰x به جای ۱۰x استفاده کرده‌اند. هزینه کل صحیح برای سال اول عملیات ۳۶۰x + ۱۰۰،۰۰۰ است.

تاکتیک: استفاده از داستان ذهنی یا یک دنباله پرسش‌ها برای مخفی کردن فرآیند استدلال مدل

تاکتیک قبلی نشان می‌دهد که گاهی اوقات مهم است که مدل جزئیات مربوط به یک مسئله را قبل از پاسخ به یک سوال خاص به دقت بررسی کند. برای برخی برنامه‌ها، فرآیند استدلالی که یک مدل برای رسیدن به یک پاسخ نهایی استفاده می‌کند، مناسب نیست که با کاربر به اشتراک گذاشته شود. به عنوان مثال، در برنامه‌های آموزشی ممکن است بخواهیم دانش‌آموزان را تشویق کنیم تا پاسخ‌های خود را به تنهایی پیدا کنند، اما فرآیند استدلال یک مدل درباره‌ی راه‌حل دانش‌آموز می‌تواند پاسخ نهایی را به دانش‌آموز فاش کند.

داستان ذهنی یک تاکتیک است که می‌توان برای کاهش این موضوع استفاده کرد. ایده داستان ذهنی این است که به مدل دستور داده می‌شود که قسمت‌هایی از خروجی که قرار است از دید کاربر پنهان باشد، را در یک قالب ساختار یافته قرار دهد که تجزیه و تحلیل آن‌ها آسان باشد. سپس پیش از ارائه خروجی به کاربر، خروجی تجزیه و تحلیل شده شده و تنها قسمتی از خروجی قابل مشاهده می‌شود.

به طور متناوب، این کار می‌تواند با یک دنباله پرسش‌ها که تمامی آن‌ها به استثنای آخر، خروجی آن‌ها از دید کاربر پنهان است، دست یافته شود.

ابتدا، می‌توانیم از مدل بخواهیم که مسئله را به تنهایی حل کند. از آنجایی که پرس و جو اولیه نیازی به راهکار دانش‌آموز ندارد، می‌توان آن را حذف کرد. این دارای مزیت اضافی است که این امکان وجود دارد که راه حل مدل توسط راهکار دانش‌آموز تحت تأثیر قرار نگیرد.

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

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

تاکتیک: از مدل بپرسید که آیا چیزی را در گذشته از دست داده است

فرض کنید که ما از یک مدل برای لیست کردن نقل قول‌هایی از یک منبع استفاده می‌کنیم که مربوط به یک سوال خاص است. پس از لیست کردن هر نقله، مدل نیاز دارد تا تشخیص دهد که آیا باید شروع به نوشتن یک نقله دیگر کند یا اگر باید متوقف شود. اگر سند منبع بزرگ باشد، معمول است که یک مدل برای متوقف شدن زودتر از زمان لازم و عدم لیست کردن تمام نقله‌های مرتبط باشد. در این صورت می‌توان با معطوف کردن مدل با پرسش‌های پیگیری برای یافتن هر نقله‌ای که در گذشته از دست داده است، بهبود عملکرد بهتری را به دست آورد.

استراتژی: استفاده از ابزارهای خارجی

تاکتیک: استفاده از جستجوی مبتنی بر embeddings برای اجرای بازیابی دانش به صورت کارآمد

مدل می‌تواند از منابع اطلاعات خارجی بهره بگیرد اگر به عنوان بخشی از ورودی آن ارائه شود. این کار می‌تواند به مدل کمک کند تا پاسخ‌های مطلع‌تر و به‌روزتری تولید کند. به عنوان مثال، اگر یک کاربر سوالی در مورد یک فیلم خاص مطرح کند، ممکن است اضافه کردن اطلاعات باکیفیت بالا در مورد فیلم (مانند بازیگران، کارگردان و غیره) به ورودی مدل مفید باشد. Embeddings می‌تواند برای اجرای بازیابی دانش به صورت کارآمد استفاده شود، به طوری که اطلاعات مرتبط بتواند به صورت پویا به ورودی مدل اضافه شود.

یک embedding متن یک بردار است که می‌تواند ارتباط بین رشته‌های متنی را اندازه‌گیری کند. رشته‌های مشابه یا مرتبط نزدیک‌تر از رشته‌های غیرمرتبط با یکدیگر هستند. این حقیقت، همراه با وجود الگوریتم‌های سریع جستجوی بردار، به این معناست که embeddings می‌توانند برای اجرای بازیابی دانش به صورت کارآمد استفاده شوند. به طور خاص، یک مجموعه متن می‌تواند به چندین قسمت تقسیم شود، و هر قسمت می‌تواند embedded و ذخیره شود. سپس یک query داده شده می‌تواند embedded و جستجوی برداری برای یافتن قسمت‌های embedded متن از مجموعه که بیشتر به query مرتبطند (به عبارت دیگر، در فضای embedding نزدیک به هم هستند)، انجام داده شود.

تاکتیک: استفاده از اجرای کد برای انجام محاسبات دقیق‌تر یا فراخوانی API‌های خارجی

مدل‌های زبان نمی‌توانند به تنهایی به دقت برای انجام عملیات حسابی یا محاسبات بلند و دقیق راکناری کنند. در مواردی که این امر لازم است، می‌توان به مدل توجه داد تا به جای انجام محاسبات خود، کد را بنویسد و اجرا کند. به طور خاص، می‌توان به مدل توجه داد تا کدی که باید اجرا شود را در یک فرمت مشخص مانند «سه کوتاه معکوس» قرار دهد. پس از ایجاد خروجی، کد استخراج و اجرا می‌شود. در نهایت، اگر لازم باشد، خروجی موتور اجرای کد (به عبارت دیگر، مفسر Python) می‌تواند به عنوان ورودی برای مدل برای query بعدی فراهم شود.

// پیامی از سیستم

می‌توانید کد Python را با قرار دادن آن در سه کوتاه معکوس نوشته و اجرا کنید، مانند ```کد در اینجا قرار می‌گیرد```. از این روش برای انجام محاسبات استفاده کنید.

// پیام کاربر

تمامی ریشه‌های اعداد حقیقی معادله چندجمله‌ای زیر را بیابید: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

یک مورد استفاده دیگر مناسب برای اجرای کد، فراخوانی API‌های خارجی است. اگر یک مدل به طور صحیح در استفاده از یک API آموزش داده شود، می‌تواند کدی که از آن استفاده می‌کند را بنویسد. می‌توان یک مدل را به این شیوه آموزش داد که چگونه از یک API استفاده کند به وسیله‌ی ارائه مستندات و/یا نمونه‌های کد نشان دادن چگونگی استفاده از API.

// پیامی از سیستم

می‌توانید کد Python را با قرار دادن آن در سه کوتاه معکوس نوشته و اجرا کنید. همچنین توجه کنید که شما به ماژول زیر برای کمک به کاربران برای ارسال پیام به دوستانشان دسترسی دارید:

\`\`\`python
import message
message.write(to="John", message="سلام، آیا می‌خواهیم پس از کار ملاقات کنیم؟")\`\`\`

هشدار: اجرای کد تولید شده توسط یک مدل از نظر امنیتی از طبیعت خود امن نیست و باید احتیاط‌های لازم در هر برنامه‌کاربردی که به دنبال انجام این کار باشد، گرفته شود. به طور خاص، یک محیط اجرای کد sandboxed برای محدود کردن آسیبی که کد‌های ناامن می‌توانند ایجاد کنند، لازم است.

تاکتیک: دسترسی مدل به توابع خاص

API تکمیل‌کننده گفتگو امکان گذاشتن لیستی از شرح‌های تابع را در درخواست‌ها فراهم می‌کند. این امکان مدل‌ها را قادر می‌سازد تا آرگومان‌های تابع مورد نیاز را طبق اسکیمای ارائه شده تولید کند. آرگومان‌های تابع توسط API به فرمت JSON تولید می‌شوند و می‌توانند برای انجام فراخوانی‌های تابع استفاده شوند. خروجی ارائه شده توسط فراخوانی‌های تابع بعد از آن می‌تواند به مدل در درخواست بعدی برای بستن حلقه، بازگشت داده شود. این روش توصیه شده برای استفاده از مدل‌های OpenAI برای فراخوانی توابع خارجی است.

استراتژی: سیستماتیک آزمون تغییرات

گاهی اوقات ممکن است سخت باشد به دست آورد که یک تغییر - مثلاً یک دستور جدید یا یک طراحی جدید - سیستم شما را بهبود می‌بخشد یا آن را بدتر می‌کند. نگاه کردن به چند نمونه ممکن است نشان دهد که کدام یک بهتر است، اما با اندازه‌گیری‌های نمونه کوچک، سخت است بین بهبود و شانس تصادفی تمیز کرد. شاید تغییر در کارایی برخی ورودی‌ها کمک می‌کند، اما بر روی دیگر ورودی‌ها ضرر می‌زند.

رویه‌های ارزیابی (یا "ارزیابی‌ها") برای بهینه‌سازی طراحی‌های سیستم مفید هستند. ارزیابی‌های خوب:

  • نماینده استفاده در جهان واقعی هستند (حداقل متنوع باشند)
  • شامل بسیاری از موارد آزمون برای افزایش قدرت آماری باشند (در جدول زیر دستورالعمل‌ها را بررسی کنید)
  • آسان برای خودکاری یا تکرار باشند

می‌توان ارزیابی خروجی‌ها را توسط کامپیوترها، انسان‌ها یا ترکیبی از هر دو انجام داد. کامپیوترها می‌توانند ارزیابی‌ها را با معیارهای هدفمند (مثلاً، سوالات با یک پاسخ صحیح) و همچنین برخی از معیارهای ذهنی یا مبهم، که خروجی‌های مدل توسط پرسش‌های دیگر مدل ارزیابی می‌شود، خودکار کنند. OpenAI Evals یک چارچوب نرم‌افزاری منبع‌باز است که ابزارهایی برای ایجاد ارزیابی‌های خودکار فراهم می‌کند.

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

راه‌کار: ارزیابی خروجی‌های مدل با ارجاع به پاسخ‌های استاندارد

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

به عنوان مثال، با استفاده از پیام سیستم زیر:

// پیام سیستم
شما متنی را که پاسخ به یک سوال فرضی است که محتوای آن توسط نقل قول‌های سه بار تکرار شده مشخص شده است دریافت خواهید کرد. بررسی کنید که آیا اطلاعات زیر مستقیماً در پاسخ شامل شده‌اند:

- نیل آرمسترانگ اولین نفری بود که بر روی ماه قدم گذاشت.
- تاریخ اولین قدم زدن نیل آرمسترانگ بر روی ماه 21 ژوئیه 1969 بود.

برای هر یک از این موارد، مراحل زیر را انجام دهید:

1 - مورد را دوباره بیان کنید.
2 - یک نقل قول از پاسخ را که نزدیک‌ترین نقطه به این موضوع است، ارائه دهید.
3 - در نظر بگیرید که شخصی که نقل قول را می‌خواند و موضوع را نمی‌شناسد، آیا می‌تواند مستقیماً به این نقطه استنباط کند یا خیر. قبل از تصمیم‌گیری توضیح دهید که چرا بله یا خیر.
4 - اگر پاسخ 3 بله بود، "بله" بنویسید، در غیر این صورت "خیر" بنویسید.

سرانجام، تعداد "بله" های پاسخ را ارائه دهید. این تعداد را به صورت زیر ارائه دهید: {"count": <درج کنید>}

یک مثال ورودی و خروجی این مدل در حالتی که هر دو مورد مورد نیاز را دارد:

// پیام سیستم
<سیستم پیام بالا را وارد کنید>

// پیام کاربر
"""نیل آرمسترانگ به این معروف است که اولین انسانی بود که به ماه پا گذاشت. این رویداد تاریخی در 21 ژوئیه 1969، در طول ماموریت اپولو 11 اتفاق افتاد."""

یک مثال ورودی که تنها یک مورد مورد نیاز را دارد:

// پیام سیستم

<سیستم پیام بالا را وارد کنید>


// USER Message

"""نیل آرمسترانگ تاریخ‌ساز شد وقتی از ماژول ماهی خارج شد و اولین نفری بود که بر روی ماه قدم گذاشت."""

مثالی از یک ورودی که تماماً برآورده نمی‌شود:

// پیام سیستم

<سیستم پیام بالا را وارد کنید>


// USER Message

"""در تابستان '69، یک سفر بزرگ، اپولو 11، جسورانه‌ای مانند دست نقاشی افسانه‌ای.
آرمسترانگ یک گام برداشت، تاریخ درخشان و برای یک دنیای نو، "یک گام کوچک"، او گفت."""


و بسیاری از نوع‌های مختلف دیگری وجود دارد که در این نوع از ارزیابی مبتنی بر مدل می‌توانیم در نظر بگیریم. تعدادی از این نوع، ارتباطی است که بین پاسخ نامزد و پاسخ استاندارد وجود دارد و همچنین این موضوع را پیگیری می‌کند که پاسخ نامزد هر جزء از پاسخ استاندارد را تکذیب می‌کند یا خیر.

// SYSTEM Message
از مراحل زیر برای پاسخ به ورودی‌های کاربر استفاده کنید. قبل از ادامه هر مرحله را دوباره بیان کنید. به عنوان مثال: "مرحله 1: دلیل..."

مرحله 1: گام به گام، دلایلی راجع به اینکه اطلاعات موجود در پاسخ ارسال شده نسبت به پاسخ کارشناسی یا جدا، برابر، زیر مجموعه، مافوق‌مجموعه یا همپوشانی (به اصطلاح بخشی اما همانند زیرمجموعه/مافوق‌مجموعه) هستند.

مرحله 2: گام به گام، دلایلی راجع به اینکه آیا پاسخ ارسال شده با هر بخش از پاسخ کارشناسی تضاد دارد یا خیر.

مرحله 3: یک شی JSON خروجی دهید که به شکل زیر ساختار دارد: {"type_of_overlap": "disjoint" یا "equal" یا "subset" یا "superset" یا "overlapping", "contradiction": true یا false"}

مثالی از ورودی با یک پاسخ ضعیف که با این حال با پاسخ کارشناسی در تضاد نیست:

// SYSTEM Message

<سیستم پیام بالایی را وارد کنید>


// USER Message

سوال: """برای چه رویدادی، نیل آرمسترانگ معروف‌ترین است و تاریخ این رویداد چه بود؟ زمان UTC را در نظر بگیرید."""


پاسخ ارسالی: """آیا او بر روی ماه راه رفت یا چیزی؟"""


پاسخ کارشناسی: """نیل آرمسترانگ بیشتر به این خاطر معروف است که اولین نفری بود که بر روی ماه قدم گذاشت. این رویداد تاریخی در 21 ژوئیه 1969 اتفاق افتاد."""


مثالی از ورودی با پاسخی که مستقیماً با پاسخ کارشناسی دچار تضاد است:

// SYSTEM Message

<سیستم پیام بالایی را وارد کنید>


// USER Message
Question: """برای کدام رویداد، نیل آرمسترانگ معروف‌ترین است و چه تاریخی اتفاق افتاد؟ زمان UTC را در نظر بگیرید."""


پاسخ ارسالی: """در 21 ژوئیه 1969، نیل آرمسترانگ دومین نفری بود که بر روی ماه راه رفت و پس از باغ بوز آلدرین بود."""


پاسخ کارشناسی: """نیل آرمسترانگ بیشتر به این خاطر معروف است که اولین نفری بود که بر روی ماه قدم گذاشت. این رویداد تاریخی در 21 ژوئیه 1969 اتفاق افتاد."""

مثالی از یک پاسخ صحیح که اطلاعات بیشتری از ضروریات ارائه می‌دهد:

// پیام سیستم
<درج پیام سیستم بالا>

// پیام کاربر

سوال: """برای کدام رویداد نیل آرمسترانگ بیشتر شناخته شده است و در چه تاریخی اتفاق افتاد؟ وقت محاسبه شده به ازای زمان هماوندی جهانی (UTC) بگیرید."""

پاسخ ارسال شده: """در تقریباً ساعت 02:56 به وقت هماوندی جهانی (UTC) در تاریخ 21 ژوئیه 1969، نیل آرمسترانگ اولین انسانی شد که پا به سطح ماه گذاشت و این یک دستاورد عظیم در تاریخ انسانیت بود."""

پاسخ متخصص: """نیل آرمسترانگ بیشتر به خاطر اولین فردی است که بر روی ماه قدم گذاشته است. این رویداد تاریخی در تاریخ 21 ژوئیه 1969 رخ داد."""