Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -3,11 +3,12 @@ import gradio as gr
|
|
| 3 |
import numpy as np
|
| 4 |
import re
|
| 5 |
import traceback
|
|
|
|
| 6 |
|
| 7 |
-
# ======== 1. 初始化 OpenAI ========
|
| 8 |
-
client = OpenAI(api_key="OPENAIAPIKEY")
|
| 9 |
|
| 10 |
-
# ======== 2. 專業領域
|
| 11 |
PROFESSIONS = {
|
| 12 |
"程式設計": "你是一位資深程式設計師,回答必須專業、詳細,附上程式範例與步驟。",
|
| 13 |
"行銷": "你是一位行銷專家,回答必須專業、詳細,提供可執行行銷策略與步驟。",
|
|
@@ -53,7 +54,6 @@ def detect_profession(user_input: str) -> str:
|
|
| 53 |
print("Embedding 呼叫錯誤:", traceback.format_exc())
|
| 54 |
return "你是一個專業顧問,回答必須專業、詳細、可操作。"
|
| 55 |
|
| 56 |
-
# 計算餘弦相似度
|
| 57 |
scores = {}
|
| 58 |
for field, emb in profession_embeddings.items():
|
| 59 |
if np.linalg.norm(text_vector)==0 or np.linalg.norm(emb)==0:
|
|
@@ -68,11 +68,8 @@ def professional_agent(user_input, state):
|
|
| 68 |
user_input = safe_utf8(user_input)
|
| 69 |
|
| 70 |
if state.get("profession_prompt") is None:
|
| 71 |
-
# 第一次輸入,判斷職業
|
| 72 |
profession_prompt = detect_profession(user_input)
|
| 73 |
state["profession_prompt"] = profession_prompt
|
| 74 |
-
|
| 75 |
-
# 抽取問題部分
|
| 76 |
question = re.sub(r"我是.*?(,|,)", "", user_input)
|
| 77 |
if not question.strip():
|
| 78 |
answer = "✅ 已設定你的專業領域,請提出問題。"
|
|
@@ -81,7 +78,6 @@ def professional_agent(user_input, state):
|
|
| 81 |
else:
|
| 82 |
user_input = question
|
| 83 |
|
| 84 |
-
# 構造對話
|
| 85 |
messages = [{"role": "system", "content": state["profession_prompt"]}]
|
| 86 |
for h in state["chat_history"]:
|
| 87 |
messages.append({"role": "user", "content": h[0]})
|
|
@@ -96,12 +92,10 @@ def professional_agent(user_input, state):
|
|
| 96 |
)
|
| 97 |
answer = safe_utf8(response.choices[0].message.content)
|
| 98 |
except Exception as e:
|
| 99 |
-
# 捕獲完整 traceback,顯示在 Chatbot
|
| 100 |
tb = traceback.format_exc()
|
| 101 |
print(tb)
|
| 102 |
answer = f"⚠️ 發生錯誤: {str(e)}\n詳情請看後端 logs"
|
| 103 |
|
| 104 |
-
# 儲存歷史訊息
|
| 105 |
state["chat_history"].append([user_input, answer])
|
| 106 |
if len(state["chat_history"]) > 10:
|
| 107 |
state["chat_history"] = state["chat_history"][-10:]
|
|
@@ -113,7 +107,7 @@ with gr.Blocks() as demo:
|
|
| 113 |
gr.Markdown("## 🧑💼 全職業專業 AI 顧問")
|
| 114 |
gr.Markdown("第一次輸入可以同時輸入職業 + 問題,例如:我是會計師,我想知道台灣稅務分析")
|
| 115 |
|
| 116 |
-
chatbot = gr.Chatbot()
|
| 117 |
msg = gr.Textbox(label="輸入訊息")
|
| 118 |
state = gr.State({"chat_history": [], "profession_prompt": None})
|
| 119 |
|
|
|
|
| 3 |
import numpy as np
|
| 4 |
import re
|
| 5 |
import traceback
|
| 6 |
+
import os
|
| 7 |
|
| 8 |
+
# ======== 1. 初始化 OpenAI (使用 HF Secret Key) ========
|
| 9 |
+
client = OpenAI(api_key=os.environ.get("OPENAIAPIKEY"))
|
| 10 |
|
| 11 |
+
# ======== 2. 專業領域 ========
|
| 12 |
PROFESSIONS = {
|
| 13 |
"程式設計": "你是一位資深程式設計師,回答必須專業、詳細,附上程式範例與步驟。",
|
| 14 |
"行銷": "你是一位行銷專家,回答必須專業、詳細,提供可執行行銷策略與步驟。",
|
|
|
|
| 54 |
print("Embedding 呼叫錯誤:", traceback.format_exc())
|
| 55 |
return "你是一個專業顧問,回答必須專業、詳細、可操作。"
|
| 56 |
|
|
|
|
| 57 |
scores = {}
|
| 58 |
for field, emb in profession_embeddings.items():
|
| 59 |
if np.linalg.norm(text_vector)==0 or np.linalg.norm(emb)==0:
|
|
|
|
| 68 |
user_input = safe_utf8(user_input)
|
| 69 |
|
| 70 |
if state.get("profession_prompt") is None:
|
|
|
|
| 71 |
profession_prompt = detect_profession(user_input)
|
| 72 |
state["profession_prompt"] = profession_prompt
|
|
|
|
|
|
|
| 73 |
question = re.sub(r"我是.*?(,|,)", "", user_input)
|
| 74 |
if not question.strip():
|
| 75 |
answer = "✅ 已設定你的專業領域,請提出問題。"
|
|
|
|
| 78 |
else:
|
| 79 |
user_input = question
|
| 80 |
|
|
|
|
| 81 |
messages = [{"role": "system", "content": state["profession_prompt"]}]
|
| 82 |
for h in state["chat_history"]:
|
| 83 |
messages.append({"role": "user", "content": h[0]})
|
|
|
|
| 92 |
)
|
| 93 |
answer = safe_utf8(response.choices[0].message.content)
|
| 94 |
except Exception as e:
|
|
|
|
| 95 |
tb = traceback.format_exc()
|
| 96 |
print(tb)
|
| 97 |
answer = f"⚠️ 發生錯誤: {str(e)}\n詳情請看後端 logs"
|
| 98 |
|
|
|
|
| 99 |
state["chat_history"].append([user_input, answer])
|
| 100 |
if len(state["chat_history"]) > 10:
|
| 101 |
state["chat_history"] = state["chat_history"][-10:]
|
|
|
|
| 107 |
gr.Markdown("## 🧑💼 全職業專業 AI 顧問")
|
| 108 |
gr.Markdown("第一次輸入可以同時輸入職業 + 問題,例如:我是會計師,我想知道台灣稅務分析")
|
| 109 |
|
| 110 |
+
chatbot = gr.Chatbot(type="messages") # 設定 type='messages' 避免 tuple 警告
|
| 111 |
msg = gr.Textbox(label="輸入訊息")
|
| 112 |
state = gr.State({"chat_history": [], "profession_prompt": None})
|
| 113 |
|