顯示具有 Llama 標籤的文章。 顯示所有文章
顯示具有 Llama 標籤的文章。 顯示所有文章

2025年6月1日 星期日

Ollama+llama3.2完成智慧成績助教系統

本程式是由小鎮智能黃俊毓提供的程式碼改編而成,並經由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.執行結果:


2024年7月29日 星期一

透過 Ollama 本地部署 Llama 3.1 大型語言模型服務

開源模型的好處是讓企業得以根據需求用公司內部資料來建置模型,而不受封閉模型供應商的限制。

Llama 是 Meta 釋出的開源模型,Meta 於 7/23 釋出了 Llama 3.1 其亮點 405B (4,050 億參數) 是 Meta 迄今為止最強大的模型, 趁前兩天颱風假的空檔利用 Ollama + Llama 3.1 來架設一個私有的大型語言模型服務( LLM Model )。

Ollama 是一個開源軟體,使用者可以在自己的硬體上執行大型語言模型服務。選用 Ollama 是因為其架設容易且支援的模型總類很多,官方有提供 Windows, Apple, Linux OS 的安裝程式,可用短短的幾分鐘就可以在自己的個人電腦上架設完成大型語言模型服務。