Amity123 commited on
Commit
f530aed
·
verified ·
1 Parent(s): 6d6999d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -42
app.py CHANGED
@@ -1,57 +1,92 @@
1
  import openai
2
  import gradio as gr
 
3
 
4
- # ====== 1. 設定 OpenAI API Key ======
5
- openai.api_key = "OpenAIAPIKEY"
6
 
7
- # ====== 2. 定義專業職業提示字典 ======
8
- PROFESSIONS_PROMPT = {
9
- "程式設計師": "你是一位資深程式設計師,回答必須專業、詳細、附上程式範例與步驟。",
10
- "行銷專家": "你是一位行銷專家,回答必須專業、詳細、提供可執行行銷策略與步驟。",
11
- "律師": "你是一位律師,回答問題必須專業、法律依據明確、可操作建議清楚。",
12
- "醫師": "你是一位醫師,回答問題必須專業、以健康與安全為前提、提供可操作建議。",
13
- "設計師": "你是一位設計師,回答必須專業、詳細、提供設計步驟與案例。"
 
14
  }
15
 
16
- # ====== 3. AI Agent 核心函數 ======
17
- def professional_agent(user_input, profession, chat_history=[]):
18
- """
19
- user_input: 使用者輸入文字
20
- profession: 選擇的職業
21
- chat_history: 多輪對話歷史
22
- """
23
- # 系統提示
24
- system_prompt = PROFESSION_PROMPT.get(profession, "你是一個高度專業的 AI 顧問,回答必須專業、詳細、可操作。")
25
-
26
- # 构造對話訊息
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  messages = [{"role": "system", "content": system_prompt}]
 
28
  for h in chat_history:
29
  messages.append({"role": "user", "content": h[0]})
30
  messages.append({"role": "assistant", "content": h[1]})
 
31
  messages.append({"role": "user", "content": user_input})
32
-
33
- # 呼叫 OpenAI GPT API
34
- response = openai.ChatCompletion.create(
35
- model="gpt-4",
36
- messages=messages,
37
- temperature=0.2 # 低溫更專業保守
38
- )
39
-
40
- answer = response.choices[0].message['content']
 
 
41
  chat_history.append((user_input, answer))
 
 
 
42
  return answer, chat_history
43
 
44
- # ====== 4. Gradio 介面 ======
45
- def chat_interface(user_input, profession, chat_history):
46
- answer, chat_history = professional_agent(user_input, profession, chat_history)
47
- return answer, chat_history
48
-
49
- iface = gr.ChatInterface(
50
- fn=chat_interface,
51
- title="全職業專業 AI 顧問",
52
- description="選擇職業領域後,請問任何問題,AI 會給你詳細、專業、可操作的回答。",
53
- theme="default"
54
- )
 
 
 
 
 
55
 
56
- # ====== 5. 啟動網頁 ======
57
- iface.launch()
 
1
  import openai
2
  import gradio as gr
3
+ import numpy as np
4
 
5
+ openai.api_key = "你的OPENAI_API_KEY"
 
6
 
7
+ # ============ 1. 定義主要專業領域 ============ #
8
+ PROFESSIONS = {
9
+ "程式設計": "你是一位資深程式設計師,回答必須專業、詳細,附上程式範例與步驟。",
10
+ "行銷": "你是一位行銷專家,回答必須專業、詳細,提供可執行行銷策略與步驟。",
11
+ "法律": "你是一位律師,回答必須專業、法律依據明確、可操作建議清楚。",
12
+ "醫療": "你是一位醫師,回答必須專業、以健康與安全為前提,提供可操作建議。",
13
+ "財務": "你是一位財務顧問,回答必須專業、符合台灣會計與稅務法規,提供可執行建議。",
14
+ "設計": "你是一位設計師,回答必須專業、詳細,提供設計步驟與案例。"
15
  }
16
 
17
+ # ============ 2. 預先建立職業向量庫 ============ #
18
+ def get_embedding(text, model="text-embedding-3-small"):
19
+ result = openai.Embedding.create(
20
+ input=text,
21
+ model=model
22
+ )
23
+ return np.array(result["data"][0]["embedding"])
24
+
25
+ profession_embeddings = {field: get_embedding(field) for field in PROFESSIONS.keys()}
26
+
27
+ # ============ 3. NLP 判斷最接近職業 ============ #
28
+ def detect_profession(detail: str) -> str:
29
+ if not detail.strip():
30
+ return "你是一個專業顧問,回答必須專業、詳細、可操作。"
31
+
32
+ detail_emb = get_embedding(detail)
33
+
34
+ # 計算 cosine similarity
35
+ scores = {}
36
+ for field, emb in profession_embeddings.items():
37
+ scores[field] = np.dot(detail_emb, emb) / (np.linalg.norm(detail_emb) * np.linalg.norm(emb))
38
+
39
+ best_field = max(scores, key=scores.get)
40
+ return PROFESSIONS[best_field]
41
+
42
+ # ============ 4. AI Agent 回答 ============ #
43
+ def professional_agent(user_input, main_field, detail, chat_history=[]):
44
+ # 如果使用者選了主領域,優先用主領域
45
+ if main_field:
46
+ system_prompt = PROFESSIONS.get(main_field, "你是一個專業顧問,回答必須專業、詳細、可操作。")
47
+ else:
48
+ # 否則 NLP 自動判斷
49
+ system_prompt = detect_profession(detail)
50
+
51
  messages = [{"role": "system", "content": system_prompt}]
52
+
53
  for h in chat_history:
54
  messages.append({"role": "user", "content": h[0]})
55
  messages.append({"role": "assistant", "content": h[1]})
56
+
57
  messages.append({"role": "user", "content": user_input})
58
+
59
+ try:
60
+ response = openai.ChatCompletion.create(
61
+ model="gpt-4",
62
+ messages=messages,
63
+ temperature=0.2
64
+ )
65
+ answer = response.choices[0].message["content"]
66
+ except Exception as e:
67
+ answer = f"發生錯誤: {str(e)}"
68
+
69
  chat_history.append((user_input, answer))
70
+ if len(chat_history) > 10:
71
+ chat_history = chat_history[-10:]
72
+
73
  return answer, chat_history
74
 
75
+ # ============ 5. Gradio 介面 ============ #
76
+ with gr.Blocks() as demo:
77
+ gr.Markdown("## 🧑‍💼 全職業專業 AI 顧問 (NLP 智能判斷)")
78
+
79
+ with gr.Row():
80
+ main_field = gr.Dropdown(["", *list(PROFESSIONS.keys())], label="主要領域 (可選)", value="")
81
+ detail = gr.Textbox(label="細部說明 (例如: 會計師、骨科醫師、前端工程師)")
82
+
83
+ chatbot = gr.Chatbot()
84
+ msg = gr.Textbox(label="輸入你的問題")
85
+ state = gr.State([])
86
+
87
+ def chat(user_input, main_field, detail, chat_history):
88
+ return professional_agent(user_input, main_field, detail, chat_history)
89
+
90
+ msg.submit(chat, [msg, main_field, detail, state], [chatbot, state])
91
 
92
+ demo.launch(server_name="0.0.0.0", server_port=7860)