Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import openai
|
| 3 |
+
import os
|
| 4 |
+
|
| 5 |
+
openai.api_key = os.getenv("OPENAI_API_KEY")
|
| 6 |
+
|
| 7 |
+
# 10位哲學家與流派
|
| 8 |
+
PHILOSOPHERS = [
|
| 9 |
+
"蘇格拉底 (辯證法)",
|
| 10 |
+
"尼采 (權力意志)",
|
| 11 |
+
"老子 (道家思想)",
|
| 12 |
+
"阿蘭·狄波頓 (現代生活哲學)",
|
| 13 |
+
"康德 (義務倫理學)",
|
| 14 |
+
"西蒙娜·德·波伏娃 (女性主義)",
|
| 15 |
+
"卡繆 (荒謬主義)",
|
| 16 |
+
"馬克思 (批判理論)",
|
| 17 |
+
"維根斯坦 (語言哲學)",
|
| 18 |
+
"佛陀 (緣起觀)"
|
| 19 |
+
]
|
| 20 |
+
|
| 21 |
+
# 風格提示對應表
|
| 22 |
+
STYLE_MAPPING = {
|
| 23 |
+
"蘇格拉底 (辯證法)": "以連續提問解構概念,採用對話體與反詰法",
|
| 24 |
+
"尼采 (權力意志)": "使用宣言式語句與悖論,強調生命力的超越性",
|
| 25 |
+
"老子 (道家思想)": "運用自然意象與二元辯證,以簡約格言呈現",
|
| 26 |
+
"阿蘭·狄波頓 (現代生活哲學)": "結合當代生活案例與心理學洞察",
|
| 27 |
+
"康德 (義務倫理學)": "強調道德律令與義務,採用三段論證結構",
|
| 28 |
+
"西蒙娜·德·波伏娃 (女性主義)": "從社會建構角度分析,帶有存在主義色彩",
|
| 29 |
+
"卡繆 (荒謬主義)": "以文學隱喻探討存在困境,保持疏離筆調",
|
| 30 |
+
"馬克思 (批判理論)": "結合歷史唯物論與階級分析,帶革命呼籲",
|
| 31 |
+
"維根斯坦 (語言哲學)": "聚焦語言邊界與概念釐清,採用分析哲學方法",
|
| 32 |
+
"佛陀 (緣起觀)": "以因果鏈結解釋現象,包含禪宗公案元素"
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
def generate_philosophy(feeling, philosopher):
|
| 36 |
+
# 根據哲學家調整提示詞
|
| 37 |
+
base_prompt = f"""以{philosopher.split(' ')[0]}的核心思想為基礎,針對「{feeling}」心境,
|
| 38 |
+
1. 必須包含:{STYLE_MAPPING[philosopher]}
|
| 39 |
+
2. 創造一個原創比喻連結當代情境
|
| 40 |
+
3. 以100-200字寫成一段短文
|
| 41 |
+
4. 結尾提出一個開放式哲學問題
|
| 42 |
+
"""
|
| 43 |
+
# 流派專屬要求
|
| 44 |
+
if "尼采" in philosopher:
|
| 45 |
+
base_prompt += "5. 需使用至少一個希臘神話典故\n"
|
| 46 |
+
elif "維根斯坦" in philosopher:
|
| 47 |
+
base_prompt += "5. 需包含語言遊戲概念的例子\n"
|
| 48 |
+
elif "佛陀" in philosopher:
|
| 49 |
+
base_prompt += "5. 需融入四聖諦或緣起觀的元素\n"
|
| 50 |
+
elif "卡繆" in philosopher:
|
| 51 |
+
base_prompt += "5. 需帶有荒謬與反抗的氛圍\n"
|
| 52 |
+
elif "馬克思" in philosopher:
|
| 53 |
+
base_prompt += "5. 需提及社會階級或歷史變遷\n"
|
| 54 |
+
elif "西蒙娜·德·波伏娃" in philosopher:
|
| 55 |
+
base_prompt += "5. 需提及性別、自由或主體性\n"
|
| 56 |
+
|
| 57 |
+
response = openai.ChatCompletion.create(
|
| 58 |
+
model="gpt-4o",
|
| 59 |
+
messages=[{"role": "user", "content": base_prompt}],
|
| 60 |
+
temperature=0.7
|
| 61 |
+
)
|
| 62 |
+
return response.choices[0].message['content']
|
| 63 |
+
|
| 64 |
+
def generate_questions(text):
|
| 65 |
+
prompt = f"""根據以下文本,生成兩個引導深入思考的問題:
|
| 66 |
+
1. 第一個問題聚焦文本核心概念
|
| 67 |
+
2. 第二個問題聯繫日常生活
|
| 68 |
+
文本:{text}
|
| 69 |
+
"""
|
| 70 |
+
response = openai.ChatCompletion.create(
|
| 71 |
+
model="gpt-4o",
|
| 72 |
+
messages=[{"role": "user", "content": prompt}],
|
| 73 |
+
temperature=0.5
|
| 74 |
+
)
|
| 75 |
+
return response.choices[0].message['content']
|
| 76 |
+
|
| 77 |
+
def generate_all(feeling, philosopher):
|
| 78 |
+
philosophy_text = generate_philosophy(feeling, philosopher)
|
| 79 |
+
questions = generate_questions(philosophy_text)
|
| 80 |
+
return philosophy_text, questions
|
| 81 |
+
|
| 82 |
+
with gr.Blocks(theme=gr.themes.Soft(), title="每日哲學生成器") as demo:
|
| 83 |
+
gr.Markdown("## 🌄 今日哲學訂製工坊")
|
| 84 |
+
|
| 85 |
+
with gr.Row():
|
| 86 |
+
with gr.Column(scale=1):
|
| 87 |
+
# 區塊A:心情/主題
|
| 88 |
+
feeling = gr.Radio(
|
| 89 |
+
label="選擇當下心境或主題",
|
| 90 |
+
choices=["迷茫", "感恩", "焦慮", "渴望", "平靜", "自由", "時間", "人際關係", "孤獨", "希望"],
|
| 91 |
+
value="平靜"
|
| 92 |
+
)
|
| 93 |
+
# 區塊B:哲學風格
|
| 94 |
+
philosopher = gr.Dropdown(
|
| 95 |
+
label="選擇哲學風格",
|
| 96 |
+
choices=PHILOSOPHERS,
|
| 97 |
+
value="阿蘭·狄波頓 (現代生活哲學)"
|
| 98 |
+
)
|
| 99 |
+
generate_btn = gr.Button("生成今日哲學文本", variant="primary")
|
| 100 |
+
|
| 101 |
+
with gr.Column(scale=2):
|
| 102 |
+
# 區塊C:哲思顯示
|
| 103 |
+
output_text = gr.Markdown(
|
| 104 |
+
label="今日哲學",
|
| 105 |
+
value="點擊按鈕生成你的專屬哲學..."
|
| 106 |
+
)
|
| 107 |
+
# 區塊D:引導問題
|
| 108 |
+
questions = gr.Textbox(
|
| 109 |
+
label="引導思考問題",
|
| 110 |
+
placeholder="你的問題將顯示於此",
|
| 111 |
+
lines=3
|
| 112 |
+
)
|
| 113 |
+
|
| 114 |
+
generate_btn.click(
|
| 115 |
+
fn=generate_all,
|
| 116 |
+
inputs=[feeling, philosopher],
|
| 117 |
+
outputs=[output_text, questions]
|
| 118 |
+
)
|
| 119 |
+
|
| 120 |
+
with gr.Accordion("哲學流派簡介", open=False):
|
| 121 |
+
gr.Markdown("""
|
| 122 |
+
- **蘇格拉底 (辯證法)**:以對話與提問引導思辨。
|
| 123 |
+
- **尼采 (權力意志)**:強調生命力、批判傳統道德。
|
| 124 |
+
- **老子 (道家思想)**:順應自然、無為而治。
|
| 125 |
+
- **阿蘭·狄波頓 (現代生活哲學)**:貼近日常、關注心理與幸福。
|
| 126 |
+
- **康德 (義務倫理學)**:道德律令、理性義務。
|
| 127 |
+
- **西蒙娜·德·波伏娃 (女性主義)**:性別、自由與主體性。
|
| 128 |
+
- **卡繆 (荒謬主義)**:存在的荒謬與反抗精神。
|
| 129 |
+
- **馬克思 (批判理論)**:階級、歷史與社會批判。
|
| 130 |
+
- **維根斯坦 (語言哲學)**:語言界限、意義分析。
|
| 131 |
+
- **佛陀 (緣起觀)**:因緣、無常、內觀自省。
|
| 132 |
+
""")
|
| 133 |
+
|
| 134 |
+
if __name__ == "__main__":
|
| 135 |
+
demo.launch(debug=True)
|