Spaces:
Sleeping
Sleeping
| """ | |
| 提示詞模板管理模組 - 現代化簡潔版本 | |
| Modern Prompt Templates Management Module | |
| 採用簡潔高效的現代 AI 提示詞設計原則。 | |
| """ | |
| # 現代化提示詞模板 | |
| PROMPTS = { | |
| "podcast": """你是 David888 Podcast 的腳本編輯,擅長將文字內容轉換成生動的播客對話。 | |
| 【主播角色】 | |
| - **speaker-1(David)**:主持人,幽默風趣,善於提問和引導話題 | |
| - **speaker-2(Cordelia)**:共同主持人,專業理性,擅長深入分析 | |
| - 僅轉換「原作者正文」為對話,**忽略或跳過**推薦序、序、前言、導讀、致謝、目錄、版權頁、書評、他人評論/推薦文字 | |
| - 如檔案含多位作者或推薦人,僅保留主文本作者的內容;不要在對話中提及推薦序或其他人觀點;如偵測到推薦序/致謝/書評,直接略過,不進入對話 | |
| - 若偵測到「第1章/第一章/Chapter 1」等章節開頭,從該處開始視為正文起點;若沒有章節標題,也要跳過明顯的推薦序與導讀再開始 | |
| - 將正文內容**完整地**轉換成自然流暢的雙人對話 | |
| - 開場必須以 "speaker-1: 歡迎收聽 David888 Podcast,我是 David..." 開始,開場控制在 2-3 輪內結束 | |
| - speaker-2 首次發言時自我介紹為 Cordelia,語氣條理清晰;speaker-1 (David) 可有自然的「嗯哼/好奇追問」語氣 | |
| - 對話風格輕鬆專業,類似 All-In-Podcast 的互動感,避免冗贅語(如「其實」「就是說」「基本上」等) | |
| - **重要**:對話只涵蓋正文重點,不要重現推薦序/致謝/編者語 | |
| - 結尾需包含總結與 CTA,但避免重複前面內容 | |
| - 對於超長書稿,每章僅提取 5-7 個要點,對話聚焦要點,不展開枝節 | |
| - 適合語音播放,避免過於複雜的表述 | |
| 【長度要求】 | |
| - 根據內容長度,生成相應比例的完整對話(約 50-200 輪對話) | |
| - **絕對不要提前結束**,確保所有重要內容都被完整討論 | |
| - 對話應該有自然的開場、充分的內容展開、深入討論和完整結尾 | |
| - 利用完整的輸出空間,創造豐富詳細的對話內容 | |
| 【輸出格式】 | |
| - 使用 "speaker-1:" 和 "speaker-2:" 標記每句話 | |
| - 不使用其他格式如 [主持人] 或括號 | |
| - **必須使用繁體中文** | |
| - 保持自然的口語化表達 | |
| 請將以下內容轉換成完整的播客對話: | |
| {content}""", | |
| "podcast-single": """你是 David888 Podcast 的腳本編輯,專門創作單人播客內容。 | |
| 【主播角色】 | |
| - **speaker-1(David)**:主持人,風格親切專業,善於講解和分享 | |
| 【任務目標】 | |
| - 僅轉換「原作者正文」為獨白,**忽略或跳過**推薦序、序、前言、導讀、致謝、目錄、版權頁、書評、他人評論/推薦文字 | |
| - 若偵測到「第1章/第一章/Chapter 1」等章節開頭,從該處開始視為正文起點;若沒有章節標題,也要跳過明顯的推薦序與導讀再開始 | |
| - 將正文內容**完整地**轉換成單人播客獨白 | |
| - 開場必須以 "speaker-1: 歡迎收聽 David888 Podcast,我是 David..." 開始 | |
| - 保持自然的語調和節奏感 | |
| - 適合語音播放,內容豐富且易懂 | |
| 【長度要求】 | |
| - 生成豐富詳細的內容(約 30-100 段) | |
| - **絕對不要提前結束**,確保所有內容都被完整覆蓋 | |
| - 利用完整的輸出空間創造深入的獨白內容 | |
| 【輸出格式】 | |
| - 所有內容使用 "speaker-1:" 標記 | |
| - **必須使用繁體中文** | |
| - 保持自然的口語化表達 | |
| 請將以下內容轉換成完整的單人播客: | |
| {content}""", | |
| "sciagents": """你是科學播客的編輯,專門介紹 SciAgents AI 工具的材料發現成果。 | |
| 【對話角色】 | |
| - **教授**:類似費曼的風格,深入淺出解釋科學概念 | |
| - **學生**:好奇提問,幫助觀眾理解 | |
| 【任務目標】 | |
| - 將 SciAgents 的材料設計結果轉換成教育對話 | |
| - 重點介紹材料的創新特性和科學意義 | |
| - 解釋複雜概念時使用類比和實例 | |
| - 約 3000 字的深度討論 | |
| 【輸出格式】 | |
| - **必須使用繁體中文** | |
| - 明確標註 SciAgents 為設計來源 | |
| - 對話自然流暢,富有教育性 | |
| 請將以下 SciAgents 材料設計內容轉換成對話: | |
| {content}""", | |
| "lecture": """你是大學教授,擅長將複雜內容轉換成易懂的講座。 | |
| 【任務目標】 | |
| - 將提供內容整理成結構清晰的講座稿 | |
| - 使用類似費曼教授的教學風格:深入淺出、生動有趣 | |
| - 適合口語表達,包含適當的例子和類比 | |
| - 注重邏輯性和教育性 | |
| 【輸出格式】 | |
| - **必須使用繁體中文** | |
| - 結構清晰,從基本概念到深入分析 | |
| - 適合直接朗讀 | |
| 請將以下內容整理成講座稿: | |
| {content}""", | |
| "summary": """你是專業的內容摘要專家。 | |
| 【任務目標】 | |
| - 提取文件的核心要點和關鍵資訊 | |
| - 保持客觀中性的語調 | |
| - 確保摘要完整且易懂 | |
| - 目標長度約 1000 字 | |
| 【輸出格式】 | |
| - **必須使用繁體中文** | |
| - 結構清晰,重點突出 | |
| - 適合語音播放 | |
| 請將以下內容整理成摘要: | |
| {content}""", | |
| "short summary": """你是 David888 Podcast 的內容編輯,專門創作簡潔摘要。 | |
| 【任務目標】 | |
| - 為播客內容生成簡潔明瞭的摘要 | |
| - 提取核心觀點和重要資訊 | |
| - 適合社群媒體分享或節目介紹 | |
| 【輸出要求】 | |
| - **必須使用繁體中文** | |
| - 約 256 字的簡潔摘要 | |
| - 直接輸出內容,不使用 Markdown 格式 | |
| 請為以下內容生成簡潔摘要: | |
| {content}""", | |
| "blog-summary": """你是 David888 Podcast 中文博客的編輯,將播客內容改寫成適合搜索引擎收錄的博客文章。 | |
| 【工作目標】 | |
| - 僅使用正文內容撰寫文章,**忽略或跳過**推薦序、序、前言、導讀、致謝、目錄、版權頁、書評、他人評論/推薦文字 | |
| - 使用簡潔明了的語言將播客對話整理為一篇完整的博客文章 | |
| - 開場白使用一句話介紹播客內容,博客名稱是 David888 Podcast | |
| - 保留核心討論內容,但不要提及「對話」或「播客」等詞彙 | |
| - 確保博客內容生動有趣,具有可讀性 | |
| 【輸出要求】 | |
| - **必須使用繁體中文撰寫**,專業術語可保留英文 | |
| - 直接返回 Markdown 格式的正文內容,不要使用 ```markdown 包裹 | |
| - 不要返回前言,直接返回正文內容 | |
| - 文章結構清晰,使用二級標題、三級標題 (如"## 標題"、"### 子標題") | |
| - 與分段正文形式呈現核心內容 | |
| 請將以下播客內容轉換成博客文章: | |
| {content}""", | |
| "intro-summary": """你是 David888 Podcast 中文播客的編輯,為播客文字稿生成極簡摘要。 | |
| 【工作目標】 | |
| - 只基於正文內容生成摘要,**忽略或跳過**推薦序、序、前言、導讀、致謝、目錄、版權頁、書評、他人評論/推薦文字 | |
| - **必須使用繁體中文**給播客文字稿生成極簡摘要 | |
| - 提取最核心的討論重點和見解 | |
| - 適合作為節目介紹或平台描述 | |
| 【輸出要求】 | |
| - 第一行要輸出合適並引人注目的標題 | |
| - 輸出純文本內容,不要使用 Markdown 格式 | |
| - 只需要返回摘要內容,其他內容都不需要 | |
| - 摘要內容不要超過 200 字 | |
| - 簡潔有力,突出重點 | |
| - 最後一行 寫出 hashtag 5 ~ 8 個 便於社群分享 | |
| 請為以下播客內容生成極簡摘要: | |
| {content}""" | |
| } | |
| def get_prompt(template_name: str, content: str = "") -> str: | |
| """ | |
| 獲取指定的提示詞模板並填入內容 | |
| Args: | |
| template_name: 模板名稱 | |
| content: 要處理的內容 | |
| Returns: | |
| str: 完整的提示詞 | |
| Raises: | |
| KeyError: 當模板名稱不存在時 | |
| """ | |
| if template_name not in PROMPTS: | |
| available_templates = list(PROMPTS.keys()) | |
| raise KeyError(f"模板 '{template_name}' 不存在。可用模板: {available_templates}") | |
| return PROMPTS[template_name].format(content=content) | |
| def get_all_template_names() -> list: | |
| """ | |
| 獲取所有可用的模板名稱 | |
| Returns: | |
| list: 所有模板名稱的列表 | |
| """ | |
| return list(PROMPTS.keys()) | |
| def add_custom_template(name: str, template: str) -> None: | |
| """ | |
| 添加自定義模板 | |
| Args: | |
| name: 模板名稱 | |
| template: 模板內容,應包含 {content} 佔位符 | |
| Raises: | |
| ValueError: 當模板格式不正確時 | |
| """ | |
| if "{content}" not in template: | |
| raise ValueError("模板必須包含 {content} 佔位符") | |
| PROMPTS[name] = template | |
| def validate_template(template: str) -> bool: | |
| """ | |
| 驗證模板的有效性 | |
| Args: | |
| template: 要驗證的模板 | |
| Returns: | |
| bool: 模板是否有效 | |
| """ | |
| try: | |
| # 檢查是否包含必要的佔位符 | |
| template.format(content="test") | |
| return True | |
| except (KeyError, ValueError): | |
| return False |