本程式是由小鎮智能黃俊毓提供的程式碼改編而成,並經由ChatGPT協助除錯。
1.在ollama啟動llama3.2。
2.智慧成績助教系統的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | import ollama from openpyxl import Workbook, load_workbook import json import os # === Function Calling Schema === functions = [ { "type":"function", "function": { "name":"suggest_pass_adjustment", "description": "對於 59 分學生,詢問是否補到 60 分", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "學生姓名(name)" } }, "required": ["name"] } } }, { "type": "function", "function": { "name":"suggest_remedial_adjustment", "description": "對於低於 59 分學生,詢問是否補分,以及新分數", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "學生姓名(name)" }, "current_score": {"type": "integer"} }, "required": ["name", "current_score"] } } }, { "type": "function", "function": { "name":"suggest_edit_for_passed", "description": "詢問是否要修改分數大於60分,及格學生的分數", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "學生姓名(name)" }, "current_score": {"type": "integer"} }, "required": ["name", "current_score"] } } }, { "type": "function", "function": { "name":"suggest_apply_adjustment", "description": "將學生分數更新為指定的新分數", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "學生姓名(name)" }, "new_score": {"type": "integer"} }, "required": ["name", "new_score"] } } }, ] # === 初始化成績表(如不存在)=== filename = "grades.xlsx" if not os.path.exists(filename): wb = Workbook() ws = wb.active ws.title = "成績表" ws.append(["姓名", "分數"]) ws.append(["王小明", 59]) ws.append(["林小美", 73]) ws.append(["張大文", 45]) wb.save(filename) print(f"✅ 已建立初始成績檔:{filename}") else: print(f"📥 已載入成績檔:{filename}") # === GPT 對應的處理函式 === # 以下四個函式為 GPT 根據不同情況呼叫的處理邏輯 # 建議學生逐步閱讀與理解:輸入、邏輯、Excel 修改方式 def handle_pass_adjustment(row, name): ans = input(f"{name} 的分數是 59,是否補及格至 60?(Y/n):") if ans.lower() in ["y", "yes", ""]: row[1].value = 60 print(f"✅ {name} 已補及格(60 分)") return f"{name} 補及格至 60 分 建議多加強" else: print("🟡 未調整") return f"{name} 未補及格" def handle_remedial_adjustment(row, name, score): ans = input(f"{name} 的分數是 {score},是否補分?(Y/n):") if ans.lower() in ["y", "yes", ""]: try: new_score = int(input("👉 請輸入補分後的新分數:")) row[1].value = new_score print(f"✅ 已將 {name} 改為 {new_score} 分") return f"{name} 補分為 {new_score} 分 建議多加強" except: print("⚠️ 格式錯誤,略過") return f"{name} 補分輸入錯誤,未調整" else: print("🟡 未調整") return f"{name} 未補分" def handle_edit_for_passed(row, name, score): ans = input(f"{name} 成績為 {score} 分,是否要修改?(輸入新分數或按 Enter 跳過):") if ans.strip(): try: new_score = int(ans) row[1].value = new_score print(f"✅ 已將 {name} 改為 {new_score} 分") return f"{name} 改為 {new_score} 分" except: print("⚠️ 格式錯誤,略過") return f"{name} 修改輸入錯誤,未調整" else: print("✅ 保留原分數") return f"{name} 保留原分數 {score} 分" def handle_apply_adjustment(row, name, new_score): row[1].value = new_score print(f"✅ GPT 決定將 {name} 的分數改為 {new_score}") return f"{name} 的分數改為 {new_score}" # === 以下請同學補寫 main loop === # - 使用 for row in ws.iter_rows(min_row=2): 遍歷每位學生 # - 呼叫 GPT 的 chat.completions.create 傳入使用者輸入與 function schema # - 根據 GPT 回傳的 function_call.name 判斷要呼叫哪一個處理函式 # - 最後將分數儲存為 grades_final.xlsx # 提示:請將回傳的 arguments 用 json.loads(...) 解析後取出參數 wb = load_workbook(filename) ws = wb.active for row in ws.iter_rows(min_row=2): name = row[0].value score = row[1].value user_input = f"{name} 的分數是 {score}" response = ollama.chat( model="llama3.2", messages=[{"role": "user", "content": user_input}], tools=functions, ) if hasattr(response, "message") and hasattr(response.message, "tool_calls") and response.message.tool_calls: tool_call = response.message.tool_calls[0] func_name = tool_call['function']['name'] args = tool_call['function']['arguments'] if func_name == "suggest_pass_adjustment": result = handle_pass_adjustment(row, name) elif func_name == "suggest_remedial_adjustment": result = handle_remedial_adjustment(row, name, args['current_score']) elif func_name == "suggest_edit_for_passed": result = handle_edit_for_passed(row, name, args['current_score']) elif func_name == "suggest_apply_adjustment": result = handle_apply_adjustment(row, name, args['new_score']) else: result = "❌ 無對應函式" # 後續回應 follow_up = ollama.chat( model="llama3.2", messages=[ {"role": "user", "content": user_input}, response.message, {"role": "tool", "name": func_name, "content": result} ] ) print(f"💬 GPT 回覆:{follow_up.message['content']}") else: print("🤖 GPT 沒有呼叫任何函式") # === 儲存檔案 === final_name = "grades_final.xlsx" wb.save(final_name) print(f"\n🎉 所有成績處理完成,已儲存為 {final_name}") |
3.執行結果:
沒有留言:
張貼留言