درس ۱۰ از ۱۲، بخش ۳: مهندسی پرامپت

کاربردها (۲): خلاصه، ترجمه، تبدیل و نوشتن پاسخ

متنی ۲۵ دقیقه به‌روز شده در ۱۱ آبان ۱۴۰۵

در این درس
  1. خلاصه‌سازی
  2. ترجمه و تبدیل
  3. بسط: نوشتن پاسخ
  4. خلاصه

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

03_08-Summarizing.ipynb، 03_09-Transforming.ipynb و 03_10-Expanding.ipynb

خلاصه‌سازی#

با محدودیت طول#

prompt = f"""
Your task is to generate a short summary of a text in Persian in at most 30 words.
summary: ```{p}```
"""

متن ۱۴۰ کلمه‌ای ویکی‌پدیای علی دایی به ۲۶ کلمه رسید:

علی دایی، بهترین گلزن تاریخ فوتبال ایران با ۱۰۹ گل ملی و رکورددار جام ملت‌های آسیا، بازیکن و مربی بازنشسته این کشور است.

با تمرکز بر مخاطب#

یک نظر مشتری درباره‌ی یک عروسک پاندا: دخترش دوستش دارد، نرم و دوست‌داشتنی است، اما برای قیمتش کوچک است و یک روز زودتر از موعد رسیده. خلاصه‌ی خوب بستگی به این دارد که چه کسی آن را می‌خواند:

پرامپت خلاصه
خلاصه‌ی عمومی «… بسیار دوست‌داشتنی و جذاب است، اما اندازه‌اش کمی کوچک بود. ارسال سریع آن نیز خوشایند بود.»
«…to give feedback to the Shipping department … focusing on any aspects that mention shipping and delivery» «بسته در یک روز پیش از موعد مقرر دریافت شد؛ تحویل سریع و به موقع بود.»
«…to give feedback to the pricing department … focusing on any aspects that are relevant to the price and perceived value» «… نرم و جذاب، دخترم دوست دارد اما نسبت به قیمت کوچک است …»

«استخراج کن» به‌جای «خلاصه کن»#

خلاصه‌ی متمرکز بر ارسال هنوز ممکن است اطلاعات دیگری هم داشته باشد. اگر فقط اطلاعات مربوط به ارسال را می‌خواهید، بگویید «extract»:

Your task is to extract relevant information from a product review from an ecommerce site
to give feedback to the Shipping department.
From the review below, delimited by triple quotes extract the information relevant to
shipping and delivery. Limit to 30 words.

خلاصه‌ی چند نظر#

با یک حلقه روی نظرات، می‌شود صفحه‌ای ساخت که برای هر محصول یک خلاصه‌ی بیست‌کلمه‌ای نشان دهد:

reviews = [review_1, review_2, review_3, review_4]
for i, review in enumerate(reviews):
    prompt = f"""
    Your task is to generate a short summary of a product review from an ecommerce site.
    Summarize the review below, delimited by triple backticks in at most 20 words.
    Review: ```{review}```
    """
    print(i, get_completion(prompt))

ترجمه و تبدیل#

LLMها روی متن‌های چندزبانه آموزش دیده‌اند و ترجمه برایشان کار طبیعی است.

Translate the following English text to Persian: ```Hi, I would like to order a blender```
Only translate with no discussion.
سلام، می‌خواستم یک بلندر سفارش بدم.

تشخیص زبان: «Tell me which language this is: سلام و درود Answer shortly with no discussion.» ← Persian (Farsi)

رسمی و محاوره‌ای: «Translate … to Persian in both the formal and informal forms: 'Would you like to order a pillow?'» با Gemma 3 4B:

**Formal:**   آیا می‌خواهید یک بالش سفارش دهید؟ (Āyā mikhwastid yek balsh soforshad dideh?)
**Informal:** شلت بخوای سفارش بدی؟ (Shelat bakhooyie sofarsh badī?)

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

مدل تخصصی: TranslateGemma#

همان پرامپت با ollama/translategemma:4b، که هم‌اندازه است اما فقط برای ترجمه fine-tune شده:

**Formal:**   آیا مایل به سفارش یک بالش هستید؟ / آیا تمایل دارید یک بالش را سفارش دهید؟
**Informal:** می‌خواید یه بالش سفارش بدید؟ / یه بالش می‌خوای؟

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

def get_translation(text, source_lang, target_lang, model="ollama/translategemma:4b"):
    prompt = f"""<start_of_turn>user
Translate from {source_lang} to {target_lang}:
{text}
<end_of_turn>
<start_of_turn>model
"""
    return get_completion(prompt, model=model)

مترجم جهانی#

فرض کنید مسئول IT یک شرکت چندملیتی هستید و پیام‌ها به زبان‌های مختلف می‌رسند:

user_messages = [
    "La performance du système est plus lente que d'habitude.",
    "Mi monitor tiene píxeles que no se iluminan.",
    "Il mio mouse non funziona",
    # …
]
for issue in user_messages:
    prompt = f"""
Translate the following text to English and Persian: ```{issue}```

Output ONLY these two lines, NOTHING else:
English: <English>
Persian: <Persian>
"""
    print(issue, "\n", get_completion(prompt))
La performance du système est plus lente que d'habitude.
English: The system's performance is slower than usual.
Persian: عملکرد سیستم کندتر از حد معمول است.

تغییر لحن#

«Translate the following from slang to a business letter: 'Dude, This is Joe, check out this spec on this standing lamp.'» یک یادداشت خودمانی را به نامه‌ی اداری تبدیل می‌کند. همین کار برای فارسی هم انجام می‌شود، مثلاً تبدیل پیام محاوره‌ای مشتری به متن رسمی برای گزارش.

تبدیل قالب#

data_json = {"resturant employees": [
    {"name": "Shyam", "email": "shyamjaiswal@gmail.com"},
    {"name": "Bob", "email": "bob32@gmail.com"},
    {"name": "Jai", "email": "jai87@gmail.com"},
]}
prompt = f"Translate the following python dictionary from JSON to an HTML table with column headers and title: {data_json}"

from IPython.display import HTML, display
display(HTML(get_completion(prompt)))

مدل یک جدول HTML کامل با عنوان و سرستون می‌سازد. همین‌طور می‌شود از Markdown به HTML یا از CSV به JSON تبدیل کرد.

ویرایش متن و دیدن تفاوت‌ها#

«Proofread and correct the following text» غلط‌های املایی و دستوری را درست می‌کند. برای اینکه ببینید دقیقاً چه چیزی عوض شده، کتابخانه‌ی Redlines تفاوت دو متن را رنگی نشان می‌دهد:

from redlines import Redlines   # pip install redlines
diff = Redlines(original_text, corrected_text)
display(Markdown(diff.output_markdown))
~~Got~~ I bought this for my daughter for her birthday ~~cuz~~ because she keeps taking mine …

بسط: نوشتن پاسخ#

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

sentiment = "negative"   # خروجی مرحله‌ی استنتاج
prompt = f"""
You are a customer service AI assistant.
Your task is to send an email reply to a valued customer.
Given the customer email delimited by ```, Generate a reply to thank the customer for their review.
If the sentiment is positive or neutral, thank them for their review.
If the sentiment is negative, apologize and suggest that they can reach out to customer service.
Make sure to use specific details from the review.
Write in a concise and professional tone.
Sign the email as `AI customer agent`.
Customer review: ```{review}```
Review sentiment: {sentiment}
"""

برای نظر منفی، ایمیل با عذرخواهی و اشاره به جزئیات شکایت مشتری (صدای عجیب موتور مخلوط‌کن) شروع شد. برای نظر مثبت «ممنون از بابت سایت خوبتون. همه کالاها به موقع دستم رسید …» ایمیل تشکر نوشته شد.

دو نکته:

  • پرامپت به مدل می‌گوید که یک هوش مصنوعی است و ایمیل را با AI customer agent امضا کند. شفافیت با کاربر درباره‌ی اینکه با ماشین طرف است، یک اصل مهم در ساخت این برنامه‌هاست.
  • این‌جا یکی از جاهایی است که دمای بیشتر (مثلاً ۰٫۷) منطقی است: نمی‌خواهید همه‌ی مشتری‌ها دقیقاً یک متن را دریافت کنند.

خلاصه#

  • خلاصه را با محدودیت طول و مخاطب مشخص بخواهید. اگر فقط یک جنبه مهم است، بگویید «استخراج کن».
  • ترجمه، تشخیص زبان، تغییر لحن و تبدیل قالب همه با پرامپت انجام می‌شوند. مدل‌های کوچک تخصصی مثل TranslateGemma در کار خودشان از مدل‌های عمومی هم‌اندازه بهترند.
  • خروجی یک مرحله، مثل احساس، می‌تواند ورودی مرحله‌ی بعد، مثل نوشتن پاسخ، باشد. این اولین قدم به سمت زنجیره است که در LangChain رسمی‌اش می‌کنیم.