% prompts_appendix.tex
% Compile with: XeLaTeX

\documentclass[11pt]{article}

% Tighter margins to fit more per page
\usepackage[margin=0.75in]{geometry}

\usepackage{fontspec}
\usepackage{xeCJK}

\setmainfont{TeX Gyre Termes}

\IfFontExistsTF{DejaVu Sans Mono}{
  \setmonofont{DejaVu Sans Mono}[Scale=MatchLowercase]
}{
  \setmonofont{FreeMono}[Scale=MatchLowercase]
}

\IfFontExistsTF{Noto Serif CJK SC}{
  \setCJKmainfont{Noto Serif CJK SC}
}{
  \IfFontExistsTF{Source Han Serif SC}{
    \setCJKmainfont{Source Han Serif SC}
  }{
    \setCJKmainfont{FandolSong}
  }
}

\IfFontExistsTF{Noto Sans Mono CJK SC}{
  \setCJKmonofont{Noto Sans Mono CJK SC}
}{
  \IfFontExistsTF{Noto Sans CJK SC}{
    \setCJKmonofont{Noto Sans CJK SC}
  }{
    \setCJKmonofont{FandolFang}
  }
}

% ===== Table + Unicode-safe verbatim blocks =====
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{array}
\usepackage{fvextra}

% Very small blocks so more fits per page
\DefineVerbatimEnvironment{Prompt}{Verbatim}{
  fontsize=\tiny,
  breaklines=true,
  breakanywhere=true
}



% Full-width longtable
\setlength{\LTleft}{0pt}
\setlength{\LTright}{0pt}

% Tighten table spacing
\setlength{\tabcolsep}{3pt}
\renewcommand{\arraystretch}{0.92}

\begin{document}

\pagestyle{empty}

\section*{Prompt Templates Used for Training (DimASQP)}

% Placeholders used in templates:
% {instruction}  -> load_prompt(language, domain, possible_categories)
% {text}         -> data_sample["Text"]
% {answer_json}  -> answer_json_string produced in create_new_instruction_prompt

% Make the table exactly full width (accounting for tabcolsep)
\newlength{\PromptTableW}
\setlength{\PromptTableW}{\dimexpr\textwidth-4\tabcolsep\relax}


\begin{longtable}{@{}
  p{\dimexpr\PromptTableW*14/100\relax}
  p{\dimexpr\PromptTableW*43/100\relax}
  p{\dimexpr\PromptTableW*43/100\relax}
@{}}

\toprule
\textbf{Lang\_Domain} & \textbf{Instruction} & \textbf{Training chat template (user + assistant)} \\
\midrule
\endfirsthead

\toprule
\textbf{Lang/Domain} & \textbf{Instruction (original prompt)} & \textbf{Training chat template (user + assistant)} \\
\midrule
\endhead

\midrule
\multicolumn{3}{r}{\scriptsize Continued on next page.}\\
\endfoot

\bottomrule
\endlastfoot

% =========================================================
% eng_restaurant (LLaMA ONLY)
% =========================================================
\textbf{eng\_restaurant} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
You are an expert sentiment analysis tool. Your task is to extract all quadruplets from the given review.
Here are the rules:
1. You MUST format your answer as a single, valid JSON list of objects.
2. Each object MUST have the keys: 'Aspect', 'Category', 'Opinion', 'Valence', and 'Arousal'.
3. 'Aspect' and 'Opinion' MUST be exact substrings from the input text.
   - Copy the text EXACTLY as it appears, including spacing, punctuation errors, or typos.
   - Do NOT correct or normalize the text.
3b. Always try your best to find explicit 'Aspect' and 'Opinion' mentions.
   - The 'Opinion' may appear before or after the 'Aspect' in the text; always extract the full 'Aspect' and 'Opinion', regardless of order in the sentence.
   - Use 'NULL' only if a real 'Aspect' or 'Opinion' span truly does not exist.
3c. 'Opinion' MUST be complete and include all adjectives, negations, and modifiers.
4. 'Category' MUST be one of the following values: [{CATEGORIES}].
5. 'Valence' and 'Arousal' MUST be numbers from 1.00 to 9.00, with up to two decimal places.
6. Your entire response MUST be *only* the JSON list.
Now, perform the task for the following review:
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|begin_of_text|><|start_header_id|>user<|end_header_id|>

{instruction}

Review: "{text}"<|eot_id|>

<|start_header_id|>assistant<|end_header_id|>
{answer_json}<|eot_id|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% eng_laptop (LLaMA ONLY)
% =========================================================
\textbf{eng\_laptop} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
You are an expert sentiment analysis tool. Your task is to extract all quadruplets from the given review.
Here are the rules:
1. You MUST format your answer as a single, valid JSON list of objects.
2. Each object MUST have the keys: 'Aspect', 'Category', 'Opinion', 'Valence', and 'Arousal'.
3. 'Aspect' and 'Opinion' MUST be exact substrings from the input text.
   - Copy the text EXACTLY as it appears, including spacing, punctuation errors, or typos.
   - Do NOT correct or normalize the text.
3b. Always try your best to find explicit 'Aspect' and 'Opinion' mentions.
   - The 'Opinion' may appear before or after the 'Aspect' in the text; always extract the full 'Aspect' and 'Opinion', regardless of order in the sentence.
   - Use 'NULL' only if a real 'Aspect' or 'Opinion' span truly does not exist.
3c. 'Opinion' MUST be complete and include all adjectives, negations, and modifiers.
3d. 'Aspect' MUST be complete and include descriptive adjectives.
4. 'Category' MUST be one of the following values: [{CATEGORIES}].
5. 'Valence' and 'Arousal' MUST be numbers from 1.00 to 9.00, with up to two decimal places.
6. Your entire response MUST be *only* the JSON list.
Now, perform the task for the following review:
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|begin_of_text|><|start_header_id|>user<|end_header_id|>

{instruction}

Review: "{text}"<|eot_id|>

<|start_header_id|>assistant<|end_header_id|>
{answer_json}<|eot_id|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% zho_restaurant (Qwen)
% =========================================================
\textbf{zho\_restaurant} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
你是一個精準且嚴格的中文情感四元組抽取模型。
你的任務是從評論中抽取所有可能且明確存在的四元組，並且不要遺漏任何明確的 Aspect-Opinion 組合，同時嚴格避免假陽性。

每個四元組包含以下欄位（欄位順序必須固定）：
"Aspect"（評論中出現的詞，必須完全照抄原文字串）
"Category"（必須與 {CATEGORIES} 中的某一項完全一致，不可創造、改寫或合併新分類）
"Opinion"（完整且連續描述該 Aspect 的情緒片段，必須完全照抄原文字串，包括所有否定、程度、副詞或連續修飾語）
"Valence"（情緒正負強度，1.00–9.00，小數兩位，基於語義強度的主觀連續估計）
"Arousal"（情緒喚起強度，1.00–9.00，小數兩位，基於語義強度的主觀連續估計）

請遵守以下規則：
1. 輸出必須是一個 JSON 陣列，不得包含任何非 JSON 文字
2. Aspect 與 Opinion 必須完全照抄原文，不可修改、標準化、裁切或推測
3. 若評論中存在多個不同的 Aspect 或 Opinion，需分別生成多個 JSON 物件；若同一 Aspect 對應多個不同 Opinion，也需分別生成多個四元組
4. 僅當評論中存在明確情緒表達，但無法在原文中找到任何可對應的 Aspect 或 Opinion 文字片段時，才允許填寫 "NULL"
5. 若評論中不存在任何明確可抽取的情感四元組，輸出空陣列 []
6. 嚴格避免假陽性：僅在 Aspect 與 Opinion 均在原文中明確存在時才生成四元組
7. 請檢查評論中所有可能的 Aspect-Opinion 組合，務必完整覆蓋所有明確表達的情感
8. 僅輸出 JSON，不要附加任何說明、分析或解釋

請根據以下評論抽取情感四元組：
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|im_start|>user
{instruction}

評論: "{text}"
<|im_end|>
<|im_start|>assistant
{answer_json}
<|im_end|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% zho_laptop (Qwen)
% =========================================================
\textbf{zho\_laptop} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
你是一個精準且嚴格的中文情感四元組抽取模型。
你的任務是從評論中抽取所有可能且明確存在的四元組，並且不要遺漏任何明確的 Aspect-Opinion 組合，同時嚴格避免假陽性。

每個四元組包含以下欄位（欄位順序必須固定）：
"Aspect"（評論中出現的詞，必須完全照抄原文字串）
"Category"
"Opinion"（完整且連續描述該 Aspect 的情緒片段，必須完全照抄原文字串，包括所有否定、程度、副詞或連續修飾語）
"Valence"（情緒正負強度，1.00–9.00，小數兩位，基於語義強度的主觀連續估計）
"Arousal"（情緒喚起強度，1.00–9.00，小數兩位，基於語義強度的主觀連續估計）

請遵守以下規則：
1. 輸出必須是一個 JSON 陣列，不得包含任何非 JSON 文字
2. Aspect 與 Opinion 必須完全照抄原文，不可修改、標準化、裁切或推測
3. 若評論中存在多個不同的 Aspect 或 Opinion，需分別生成多個 JSON 物件；若同一 Aspect 對應多個不同 Opinion，也需分別生成多個四元組
4. 僅當評論中存在明確情緒表達，但無法在原文中找到任何可對應的 Aspect 或 Opinion 文字片段時，才允許填寫 "NULL"
5. 若評論中不存在任何明確可抽取的情感四元組，輸出空陣列 []
6. 嚴格避免假陽性：僅在 Aspect 與 Opinion 均在原文中明確存在時才生成四元組
7. 請檢查評論中所有可能的 Aspect-Opinion 組合，務必完整覆蓋所有明確表達的情感
8. 僅輸出 JSON，不要附加任何說明、分析或解釋

請根據以下評論抽取情感四元組：
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|im_start|>user
{instruction}

評論: "{text}"
<|im_end|>
<|im_start|>assistant
{answer_json}
<|im_end|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% jpn_hotel (Qwen)
% =========================================================
\textbf{jpn\_hotel} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
あなたは日本語レビューから感情四つ組を抽出するモデルです。以下の規則に厳密に従い、入力テキストから四つ組をすべて抽出してください。【使用可能なカテゴリ一覧】{CATEGORIES}【抽出項目】1. "Aspect"：テキスト内に実際に出現する対象語（原文を一字一句そのまま抽出）2. "Category"：上記カテゴリ一覧から最も適切なカテゴリ名を選択 3. "Opinion"：Aspect に対する評価表現（原文をそのまま抽出し、否定・程度語も含める）4. "Valence"：感情の正負強度（1.00〜9.00）5. "Arousal"：感情の覚醒度（1.00〜9.00）【出力規則】- JSON 配列のみを出力し、余計な文字を一切含めないこと。- 原文に存在しない語句を作らないこと。- 明確な Aspect または Opinion がない場合は "NULL" を使用する。- 抽出すべき四つ組が存在しない場合は [] を返す。- 複数ある場合は要素を分けてすべて出力する。
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|im_start|>user
{instruction}

レビュー本文："{text}"
<|im_end|>
<|im_start|>assistant
{answer_json}
<|im_end|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% rus_restaurant (Qwen)  <-- INCLUDED
% =========================================================
\textbf{rus\_restaurant} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
Вы — эксперт по анализу настроений. Ваша задача — извлечь все эмоциональные четверки из данного пользовательского отзыва.
Вот правила:
1. Вы ДОЛЖНЫ форматировать ответ как один корректный JSON-список объектов.
2. Каждый объект ДОЛЖЕН содержать ключи: 'Aspect', 'Category', 'Opinion', 'Valence' и 'Arousal'.
3. 'Aspect' и 'Opinion' ДОЛЖНЫ быть точными подстроками из исходного текста.
   - Копируйте текст ТОЧНО как он есть, включая пробелы, пунктуацию и ошибки.
   - НЕ исправляйте и не нормализуйте текст.
   - 'Opinion' может идти перед или после 'Aspect'; извлекайте полные 'Aspect' и 'Opinion', независимо от порядка в предложении.
   - 'Opinion' ДОЛЖНО быть полным, включая все прилагательные, отрицания и модификаторы.
4. 'Category' ДОЛЖЕН быть одним из следующих значений: [{CATEGORIES}].
5. 'Valence' и 'Arousal' ДОЛЖНЫ быть числами от 1.00 до 9.00 с точностью до двух знаков после запятой.
6. Ваш ответ должен содержать *только* JSON-список.
Теперь выполните задачу для следующего отзыва:
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|im_start|>user
{instruction}

Отзыв: "{text}"
<|im_end|>
<|im_start|>assistant
{answer_json}
<|im_end|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% ukr_restaurant (Qwen)  <-- INCLUDED
% =========================================================
\textbf{ukr\_restaurant} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
Ти є високоточним інструментом аспектно-орієнтованого аналізу тональності.
Твоє завдання — витягнути всі релевантні чотирики (Aspect–Category–Opinion–Valence–Arousal) з поданого тексту відгуку.

Правила:
1. Відповідь має бути єдиним валідним JSON-масивом об’єктів.
2. Кожен об’єкт відповідає одній парі Aspect–Opinion, що виражає одну окрему оцінку.
3. Кожен об’єкт повинен містити рівно такі ключі: "Aspect", "Category", "Opinion", "Valence", "Arousal".
4. "Aspect" і "Opinion" повинні бути точними підрядками з тексту відгуку — копіюй символ у символ, без змін, нормалізації чи перефразування.
5. "Opinion" має включати всі прикметники, заперечення та підсилювачі, що формують емоційну оцінку аспекту.
6. "Category" повинна бути рівно одним значенням зі списку дозволених категорій: [{CATEGORIES}]. Жодні інші значення заборонені.
7. "Valence" і "Arousal" — дійсні числа від 1.00 до 9.00 включно, обов’язково з двома десятковими знаками. Valence: 1.00 — вкрай негативна, 9.00 — вкрай позитивна оцінка. Arousal: 1.00 — низька емоційна інтенсивність, 9.00 — дуже висока інтенсивність.
8. Якщо у відгуку немає жодної релевантної пари Aspect–Opinion, поверни порожній JSON-масив [].
9. Відповідь повинна містити лише JSON-масив — без пояснень, коментарів або будь-якого додаткового тексту.

Ось текст відгуку:
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|im_start|>user
{instruction}

Текст відгуку: "{text}"
<|im_end|>
<|im_start|>assistant
{answer_json}
<|im_end|>
\end{Prompt}
\end{minipage}
\\
\midrule

% =========================================================
% tat_restaurant (Qwen)  <-- INCLUDED
% =========================================================
\textbf{tat\_restaurant} &
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
Син — татар телендәге күзәтү текстларыннан аспект-дүртлекләрне чыгару өчен махсуслашкан система.
Түбәндәге кагыйдәләрне төгәл үтә:
1) Җавап БАРЫ тик дөрес JSON-массив булырга тиеш, башка бернинди текст язма.
2) Һәр элементта мәҗбүри кырлар: "Aspect","Category","Opinion","Valence","Arousal".
3) "Aspect" һәм "Opinion" тексттан үзгәртүсез күчерелә.
4) "Aspect" һәм "Opinion" теләсә нинди тәртиптә очрый ала, ләкин текстта мөмкин булган ҺӘР аспект–фикер парын аерым дүртлек итеп чыгару мәҗбүри.
5) "Opinion" барлык сыйфатларны, көчәйткечләрне һәм кире формаларны тулысынча эченә ала.
6) "Category" түбәндәгеләрнең берсе генә булырга тиеш: [{CATEGORIES}].
7) "Valence" һәм "Arousal" 1.00–9.00 диапазонында, ике дөңгеләк санга кадәр күрсәтелә.

Күзәтү тексты:
\end{Prompt}
\end{minipage}
&
\begin{minipage}[t]{\linewidth}
\begin{Prompt}
<|im_start|>user
{instruction}

Текст бәяләмәсе "{text}"
<|im_end|>
<|im_start|>assistant
{answer_json}
<|im_end|>
\end{Prompt}
\end{minipage}
\\
\label{tab:prompts-by-lang-domain}

\end{longtable}

\end{document}