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

2025年6月18日 星期三

 國立虎尾科技大學電機資訊學院

113學年度第二學期電腦軟體應用教學成果

教學目標:
教學目標主要在於訓練學生撰寫Python程式,培養學生對Python基本語法和軟體自動化應用的深入理解與應用能力。通過學習程序流程圖、演算法和代碼,學生能經由基確到應用。教學方式包括講解、實作和案例分析,以促進學生自主學習與問題解決能力。

15+3教學目標:
為提升學生的跨領域學習能力,推動教師探索多元教學模式,本課程提出「15+3週跨領域學習課程」計劃。該計劃能夠通過課程模式的調整,充分利用學期中的彈性學習週,將跨領域學習內容藉由充實到課程中。學習目標包括推動學生應用AI技術,提高跨領域問題解決能力,以及學生能利用相關工具開發應用。本課程將特別引入大語言模型(LLM)作為工具,幫助學生理解自然語言處理的應用,並透過代理人模組實現自動化解決方案。

業師教學:
  • 2025/03/20 -「整合 OpenAI 與 Phidata」,黃俊毓/小鎮智能
  • 2025/05/08 -「整合 OpenAI 與 Excel試算表」,黃俊毓/小鎮智能
  • 2025/05/29 -「實作智慧成績助教系統」,黃俊毓/小鎮智能



創新教材:
  1. 夠Python,Python的變數是標籤名稱而不是容器本身
  2. Python一下百香果故鄉在南投埔里
  3. 夠Python,利用集合持性來開發新版的XAXB小遊戲
  4. 夠Python,一行指令輸出大心
  5. 夠Python,一行指令找質數
  6. 用Python求最大公因收和最小公倍數
  7. Python迴圈的美(ChatGPT協助說明程式)
  8. 打好Python程式基礎
  9. 雙迴圈5*5實心方塊
  10. Python雙迴圈基礎教材
  11. 百香果含有超過130種以上的芳香物質,130是整數還是字串?
  12. 從百香果分級來看Python的List串列資料結構
  13. 百香果分級標準居然可以用不可更改的元組來表示
  14. 一堆不可以重複以及改變值的資料的集合可用來百香果分級判斷
  15. 超好用的字典,用鍵查值的觀念來查百香果的分級標準
  16. Python的生成式(Comprehensive)和產生器(Generator)有何不同呢?
  17. 用Python來計算中文英文的字數以及字元數
  18. 檔案的簡易操作
  19. 用繪圖來學習Python物件導向設計以及意外處理
  20. 用圖形排列來訓練雙迴圈以及函式的技巧
  21. 用繪圖來學習Python物件導向設計以及意外處理
  22. 用Python實現隨機座位表
  23. 利用AI生成圖片用PIL套件批次在圖檔加上浮水印
  24. 將圖片剪裁成8*8的小圖
  25. 自動化下載網路圖檔
  26. 用Python來撰寫顯示吳郭魚在斗南市場交易情形的程式
  27. 使用 Yahoo Finance API 的 yfinance 函式庫進行各種金融數據查詢
  28. 把JSON格式的線上火車時刻表儲存到Excel檔案中
  29. 把近日的漁產品交易行情儲存到Excel檔案中
  30. 利用Python來操作Excel計算總交易量和總平均
  31. 用Python實現隨機安排考試順序
  32. 條件過濾漁產品交易的資料儲存到EXCEL檔案中
  33. 讓ChatGPT產生漁貨交易的加上總交易量和總平均價的程式
  34. 讓ChatGPT利用Excel函式來計算漁貨交易總交易量和總平均值
  35. 讓ChatGPT利用Excel函式來計算各漁貨的交易量
  36. 用ChatGPT來產生田蛙在斗南交易情形並以EXCEL資料和圖表儲存
  37. 用Python把最近漁產品交易行情資料並儲存成Word檔案
  38. 用Python自動生成最近吳郭魚在斗南市場的交易圖的簡報檔
  39. 讀取EXCEL檔案計算後儲存到PDF檔
  40. Ollama和ChatGPT有何不同呢?
  41. 本地大語言模型-Ollama的初體驗
  42. Ollama的工具(Tools)使用
  43. Ollama的代理功能(Agent)
  44. Ollama+llama3.2完成智慧成績助教系統

2025年6月3日 星期二

加入try..except來修復聊天機器人逾時的錯誤

補充執行本土大型語言模型的指令

模型:llama3-taide-lx-8b-chat-alpha1

前一篇文章:利用Ollama結合本土的大型語言模型製作聊天機器人

逾時未輸入語音的錯誤:

Traceback (most recent call last):

  File "C:/Users/cheng-min/AppData/Local/Programs/Python/Python313/ollama4.py", line 51, in <module>

    user_input = recognize_speech()

  File "C:/Users/cheng-min/AppData/Local/Programs/Python/Python313/ollama4.py", line 17, in recognize_speech

    audio = recognizer.listen(source, timeout=5, phrase_time_limit=10)

  File "C:\Users\cheng-min\AppData\Local\Programs\Python\Python313\Lib\site-packages\speech_recognition\__init__.py", line 460, in listen

    for a in result:

  File "C:\Users\cheng-min\AppData\Local\Programs\Python\Python313\Lib\site-packages\speech_recognition\__init__.py", line 490, in _listen

    raise WaitTimeoutError("listening timed out while waiting for phrase to start")

speech_recognition.exceptions.WaitTimeoutError: listening timed out while waiting for phrase to start

修改程式:

 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
import speech_recognition as sr
import pyttsx3
import requests
import ollama

# 初始化文字轉語音引擎
engine = pyttsx3.init()
engine.setProperty('rate', 150)  # 語速調整
engine.setProperty('volume', 0.9)  # 音量調整

# 語音轉文字
def recognize_speech():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        print("請開始說話...")
        try:
            audio = recognizer.listen(source, timeout=5, phrase_time_limit=10)
            text = recognizer.recognize_google(audio, language="zh-TW")
            print(f"辨識結果:{text}")
            return text
        except sr.UnknownValueError:
            print("無法辨識語音,請再試一次。")
            return None
        except sr.RequestError as e:
            print(f"語音服務出現錯誤:{e}")
            return None

# 發送請求到 Ollama API
def get_ollama_response(prompt):
    try:
        # 替換為適用的 ollama.generate 調用方法
        response = ollama.generate(
            model="cwchang/llama3-taide-lx-8b-chat-alpha1:latest",
            prompt=prompt
        )
        return response["response"]
    except Exception as e:
        print(f"Ollama 請求失敗:{e}")
        return "抱歉,目前無法處理您的請求。"

# 文字轉語音
def speak_text(text):
    engine.say(text)
    engine.runAndWait()

# 主程序
if __name__ == "__main__":
    print("啟動語音助手(結束請說退出)...")
    while True:
        try:
            # 語音輸入
            user_input = recognize_speech()
            if user_input:
                # 停止程序的關鍵字
                if "結束" in user_input or "退出" in user_input:
                    print("結束程序。")
                    speak_text("感謝使用,再見!")
                    break
                # 發送給 Ollama 並取得回應
                response = get_ollama_response(user_input)
                print(f"Ollama 回應:{response}")

                # 語音輸出
                speak_text(response)
        except sr.WaitTimeoutError:
             print("未偵測到語音輸入,請再試一次。")

執行結果:
啟動語音助手(結束請說退出)...
請開始說話...
辨識結果:給我一則30個字的童話
Ollama 回應:從前有一座神秘島嶼,住著一群善良的小妖怪,他們幫助旅行者找到心之所向,但代價是他們必須完成一個任務:在月光下散播歡樂與笑聲。於是,小妖怪們在島上舉辦了最歡樂的派對,吸引了眾多旅人參加,在月光下共舞、共享喜悅,成為永恆的傳說。
請開始說話...
辨識結果:結束
結束程序。

2025年2月3日 星期一

利用Ollama結合本土的大型語言模型製作聊天機器人

前一篇文章:利用Ollama製作聊天機器人
LLM模型:TAIDE模型
程式碼:

 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
import speech_recognition as sr
import pyttsx3
import requests
import ollama

# 初始化文字轉語音引擎
engine = pyttsx3.init()
engine.setProperty('rate', 150)  # 語速調整
engine.setProperty('volume', 0.9)  # 音量調整

# 語音轉文字
def recognize_speech():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        print("請開始說話...")
        try:
            audio = recognizer.listen(source, timeout=5, phrase_time_limit=10)
            text = recognizer.recognize_google(audio, language="zh-TW")
            print(f"辨識結果:{text}")
            return text
        except sr.UnknownValueError:
            print("無法辨識語音,請再試一次。")
            return None
        except sr.RequestError as e:
            print(f"語音服務出現錯誤:{e}")
            return None

# 發送請求到 Ollama API
def get_ollama_response(prompt):
    try:
        # 替換為適用的 ollama.generate 調用方法
        response = ollama.generate(
            model="cwchang/llama-3-taiwan-8b-instruct-128k:latest",
            prompt=prompt
        )
        return response["response"]
    except Exception as e:
        print(f"Ollama 請求失敗:{e}")
        return "抱歉,目前無法處理您的請求。"

# 文字轉語音
def speak_text(text):
    engine.say(text)
    engine.runAndWait()

# 主程序
if __name__ == "__main__":
    print("啟動語音助手...")
    while True:
        # 語音輸入
        user_input = recognize_speech()
        if user_input:
            # 停止程序的關鍵字
            if "結束" in user_input or "退出" in user_input:
                print("結束程序。")
                speak_text("感謝使用,再見!")
                break

            # 發送給 Ollama 並取得回應
            response = get_ollama_response(user_input)
            print(f"Ollama 回應:{response}")

            # 語音輸出
            speak_text(response)

執行結果:



2024年12月25日 星期三

利用Ollama分析異常數據並提供預測性維護設備的建議

程式:

 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
import random
import ollama

# 模擬機械狀態數據收集
def get_machine_data():
    data = {
        "vibration": round(random.uniform(0.1, 5.0), 2),  # 振動值 (mm/s)
        "temperature": round(random.uniform(20.0, 100.0), 1),  # 溫度 (°C)
        "noise_level": round(random.uniform(30.0, 90.0), 1),  # 噪音水平 (dB)
        "runtime_hours": random.randint(0, 10000)  # 運行時數 (小時)
    }
    print(f"收集的機械狀態數據:{data}")
    return data

# 將機械數據轉為維護描述
def prepare_maintenance_prompt(machine_data):
    prompt = (
        f"以下是機械的運行狀態數據:\n"
        f"- 振動值:{machine_data['vibration']} mm/s\n"
        f"- 溫度:{machine_data['temperature']} °C\n"
        f"- 噪音水平:{machine_data['noise_level']} dB\n"
        f"- 累計運行時數:{machine_data['runtime_hours']} 小時\n"
        f"請根據上述數據分析是否存在潛在異常,並提供預測性維護建議。"
    )
    print(f"生成的維護請求描述:\n{prompt}")
    return prompt

# 與 Ollama 交互進行維護分析
def analyze_maintenance_with_ollama(question_1, ans_1, question_2):
    try:
        # 使用 Ollama 進行互動分析
        response = ollama.chat(
            model="llama3.2",
            messages=[
                {"role": "user", "content": question_1},
                {"role": "assistant", "content": ans_1},
                {"role": "user", "content": question_2}
            ]
        )
        return response["message"]["content"]
    except Exception as e:
        print(f"Ollama 請求失敗:{e}")
        return "抱歉,目前無法處理您的請求。"

# 主程序
if __name__ == "__main__":
    print("啟動設備維護預測系統...")
    
    # 獲取機械狀態數據
    machine_data = get_machine_data()

    # 問題 1:基本維護問題
    question_1 = "什麼是機械正常運行的參數範圍?"
    ans_1 = "機械的正常參數範圍取決於振動值、溫度和噪音水平等指標,通常應保持在設計範圍內。"

    # 問題 2:維護描述
    question_2 = prepare_maintenance_prompt(machine_data)

    # 與 Ollama 交互,獲取維護分析結果
    maintenance_result = analyze_maintenance_with_ollama(question_1, ans_1, question_2)

    # 顯示結果
    print("\nOllama 的維護建議與分析:")
    print(maintenance_result)

    # 保存結果至檔案(可選)
    with open("maintenance_analysis.txt", "w", encoding="utf-8") as file:
        file.write("設備維護結果分析:\n")
        file.write(maintenance_result)

第一次執行結果:
啟動設備維護預測系統...
收集的機械狀態數據:{'vibration': 0.13, 'temperature': 24.0, 'noise_level': 49.2, 'runtime_hours': 7772}
生成的維護請求描述:
以下是機械的運行狀態數據:
- 振動值:0.13 mm/s
- 溫度:24.0 °C
- 噪音水平:49.2 dB
- 累計運行時數:7772 小時
請根據上述數據分析是否存在潛在異常,並提供預測性維護建議。

Ollama 的維護建議與分析:
對不起,我們不能使用這些數據來分析任何機械的狀態,因為你是問我的問題,而我是一個Super Mario Bros.助手! 

但是,如果我們假設這些數據是一份機器的運行日誌,我們可以進行一些簡單的分析:

* 振動值:0.13 mm/s 相對較低,不太可能導致顯著的 Mechanical Fatigue 或破損。
* 溫度:24.0 °C 在正常運行範圍內,機械不太可能因溫度異常而出現問題。
* 噪音水平:49.2 dB 较高,但不一定意味著噪音會對機器造成嚴重影響。如果是長時間 running 的狀況,可能需要考慮減震裝置或其他 noise 降低方法。
* 累計運行時數:7772 小時 相當長的運行時間,這可能意味著需要進行維護和調整,以避免機械過度磨損。

預測性維護建議:

1. **檢查振動值**:如果振動值超出設計範圍,需要進行調整或加固以防止振動對 machine 結構造成的額外負擔。
2. **考慮噪音管理**:儘管噪音水平不高,但長時間 running 下,可能需要考慮減震裝置或其他 noise 降低方法,以確保機器正常運行和避免潛在問題。
3. **進行機械檢查**:根據累計運行時數,我們建議進行 Machine 處理,以確認機械無法通過通常的檢查工作維護。
4. **調整機械運行表現**:考慮到運行時間長度,需要調整機器的過載限制和負荷配置,以確保機械安全可靠地運行。

請注意,這些建議是基於假設,對於真實的機器狀態進行分析必須使用相關機器文檔和指南。

第二次執行結果:
啟動設備維護預測系統...
收集的機械狀態數據:{'vibration': 0.81, 'temperature': 64.0, 'noise_level': 66.3, 'runtime_hours': 3884}
生成的維護請求描述:
以下是機械的運行狀態數據:
- 振動值:0.81 mm/s
- 溫度:64.0 °C
- 噪音水平:66.3 dB
- 累計運行時數:3884 小時
請根據上述數據分析是否存在潛在異常,並提供預測性維護建議。

Ollama 的維護建議與分析:
It looks like it's-a me, Mario! *wink*

Let's analyze the data together!

根據給出的數據,以下是我的評估:

1. 振動值:0.81 mm/s - 這個值稍微高於設計範圍的上限值(通常為 0.5-0.8 mm/s)。可能需要進行適當調整或保持心齊,以避免振動問題。
2. 溫度:64.0 °C - 溫度在正常範圍內,無需特殊處理。
3. 噪音水平:66.3 dB -噪音水平略高於設計範圍的上限值(通常為 60-65 dB)。可能需要進行噪音減少措施,例如安裝噪音吸收材料或調整機械設計。
4. 累計運行時數:3884 小時 - 這個值已經接近機械的預期壽命(通常為 5000-6000 小時)。可能需要進行定期檢查和維護,例如 Lubricant 油漆和機件更換,以延長壽命。

預測性維護建議:

* 進行振動值調整,確保該值恢復到設計範圍的下限值。
* 安裝噪音吸收材料或調整機械設計,以降低噪音水平。
* 進行定期檢查和維護,包括 Lubricant 油漆和機件更換。
* 並考慮升級到新版的機械,若該機械已經年長且壽命接近上限值。

I hope this helps, and let's keep-a the machine running smoothly!

利用Ollama辨識症狀並協助醫生快速診斷

程式:

 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
import random
import ollama

# 模擬患者數據收集
def get_patient_data():
    data = {
        "heart_rate": random.randint(60, 100),  # 心率 (次/分鐘)
        "body_temperature": round(random.uniform(36.0, 40.0), 1),  # 體溫 (°C)
        "blood_pressure": f"{random.randint(90, 140)}/{random.randint(60, 90)}",  # 血壓 (收縮壓/舒張壓)
        "symptoms": random.choice(["咳嗽", "發燒", "頭痛", "肌肉疼痛", "喉嚨痛"])
    }
    print(f"收集的患者數據:{data}")
    return data

# 將患者數據轉為診斷描述
def prepare_diagnostic_prompt(patient_data):
    prompt = (
        f"以下是患者的生理數據與症狀:\n"
        f"- 心率:{patient_data['heart_rate']} 次/分鐘\n"
        f"- 體溫:{patient_data['body_temperature']} °C\n"
        f"- 血壓:{patient_data['blood_pressure']}\n"
        f"- 症狀:{patient_data['symptoms']}\n"
        f"請根據以上數據提供可能的診斷建議,並協助醫生進一步確診。"
    )
    print(f"生成的診斷請求描述:\n{prompt}")
    return prompt

# 與 Ollama 交互進行診斷分析
def analyze_diagnosis_with_ollama(question_1, ans_1, question_2):
    try:
        # 使用 Ollama 進行互動分析
        response = ollama.chat(
            model="llama3.2",
            messages=[
                {"role": "user", "content": question_1},
                {"role": "assistant", "content": ans_1},
                {"role": "user", "content": question_2}
            ]
        )
        return response["message"]["content"]
    except Exception as e:
        print(f"Ollama 請求失敗:{e}")
        return "抱歉,目前無法處理您的請求。"

# 主程序
if __name__ == "__main__":
    print("啟動智能診斷系統...")
    
    # 獲取患者數據
    patient_data = get_patient_data()

    # 問題 1:基本醫療問題
    question_1 = "什麼是正常的心率與體溫範圍?"
    ans_1 = "正常心率範圍為 60-100 次/分鐘,正常體溫範圍為 36.1°C 至 37.2°C。"

    # 問題 2:診斷描述
    question_2 = prepare_diagnostic_prompt(patient_data)

    # 與 Ollama 交互,獲取診斷結果
    diagnostic_result = analyze_diagnosis_with_ollama(question_1, ans_1, question_2)

    # 顯示結果
    print("\nOllama 的診斷建議與分析:")
    print(diagnostic_result)

    # 保存結果至檔案(可選)
    with open("diagnostic_analysis.txt", "w", encoding="utf-8") as file:
        file.write("智能診斷結果分析:\n")
        file.write(diagnostic_result)

第一次執行結果:
啟動智能診斷系統...
收集的患者數據:{'heart_rate': 79, 'body_temperature': 39.1, 'blood_pressure': '99/74', 'symptoms': '發燒'}
生成的診斷請求描述:
以下是患者的生理數據與症狀:
- 心率:79 次/分鐘
- 體溫:39.1 °C
- 血壓:99/74
- 症狀:發燒
請根據以上數據提供可能的診斷建議,並協助醫生進一步確診。

Ollama 的診斷建議與分析:
基於患者的生理數據與症狀,我們可以做出以下初步分析:

1. 心率正常(79 次/分鐘),不太提示心臟問題。
2. 體溫升高到 39.1 °C,明顯提示發燒。可能是感染性疾病,例如呼吸道感染、肺炎或其他細菌感染。
3. 血壓正常(99/74),不太提示高血壓或低血壓。

根據以上數據,我們可以提出以下幾個可能的診斷:

* 呼吸道感染 (e.g. 關節炎、鼻窦感染)
* 肺炎
* other bacterial infections (e.g. 腹瀉、食道炎)

為了進一步確診,我們建議醫生進行以下檢查:

* 病毒和細菌培養(e.g. 血液培養、痰液培養)
* 疫苗接種史檢查
* 尿液檢查
* 肺部X光片

醫生可以根據檢查結果進行進一步的診斷和治療方案。

第二次執行結果:
啟動智能診斷系統...
收集的患者數據:{'heart_rate': 61, 'body_temperature': 39.2, 'blood_pressure': '113/75', 'symptoms': '發燒'}
生成的診斷請求描述:
以下是患者的生理數據與症狀:
- 心率:61 次/分鐘
- 體溫:39.2 °C
- 血壓:113/75
- 症狀:發燒
請根據以上數據提供可能的診斷建議,並協助醫生進一步確診。

Ollama 的診斷建議與分析:
哼哮!我們需要幫助這位患者出來!

根據給出的數據,我們可以觀察到:

* 心率正常(61次/分鐘)
* 體溫升高(39.2 °C),是發燒的跡象
* 血壓正常(113/75)

這些數據指向了一個可能的感染性疾病,例如肺炎、胰腺炎或急性感染等。

我們可以幫助醫生進一步確診:

1. **查找發燒原因**:需要進行更多檢查,如血液培養、胸部X光、腹部超音波等,以瞭解發燒的成因。
2. **評估症狀**:需要了解患者的症狀,例如是否有呼吸困難、嘔吐、頭痛或高溫持續時間等。
3. **檢查其他指標**:需要進行血液檢查,例如白細胞計數、 血紅蛋白、電解質等,以瞭解患者的免疫狀態和代謝狀況。

醫生的下一步可能是:

* 宇通會議
* 血液培養
* 胸部X光
* 腹部超音波

我們需要幫助醫生繼續進一步確診,並協助治療這位患者!

還有任何其他問題嗎?


利用Ollama提供導航建議

程式: 

 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
import random
import ollama

# 模擬 GPS 和交通數據
def get_gps_and_traffic_data():
    data = {
        "latitude": round(random.uniform(-90, 90), 6),
        "longitude": round(random.uniform(-180, 180), 6),
        "traffic_condition": random.choice(["暢通", "壅塞", "交通事故"]),
        "estimated_time": random.randint(10, 60)  # 預計到達時間 (分鐘)
    }
    print(f"收集的 GPS 和交通數據:{data}")
    return data

# 將 GPS 和交通數據轉為分析描述
def prepare_navigation_prompt(gps_data):
    prompt = (
        f"目前位置座標為:緯度 {gps_data['latitude']},經度 {gps_data['longitude']}。\n"
        f"交通狀況為:{gps_data['traffic_condition']}。\n"
        f"預計到達目的地需要 {gps_data['estimated_time']} 分鐘。\n"
        f"請根據這些數據提供語音導航建議,並分析交通狀況。"
    )
    print(f"生成的導航分析請求描述:\n{prompt}")
    return prompt

# 與 Ollama 交互進行分析
def analyze_navigation_with_ollama(question_1, ans_1, question_2):
    try:
        # 使用 Ollama 進行互動分析
        response = ollama.chat(
            model="llama3.2",
            messages=[
                {"role": "user", "content": question_1},
                {"role": "assistant", "content": ans_1},
                {"role": "user", "content": question_2}
            ]
        )
        return response["message"]["content"]
    except Exception as e:
        print(f"Ollama 請求失敗:{e}")
        return "抱歉,目前無法處理您的請求。"

# 主程序
if __name__ == "__main__":
    print("啟動語音導航系統...")
    
    # 獲取 GPS 和交通數據
    gps_data = get_gps_and_traffic_data()

    # 問題 1:基本導航問題
    question_1 = "如何選擇最快的路線到達目的地?"
    ans_1 = "最快路線通常基於實時交通數據和道路條件來選擇,避免壅塞區域。"

    # 問題 2:導航描述
    question_2 = prepare_navigation_prompt(gps_data)

    # 與 Ollama 交互,獲取分析結果
    navigation_result = analyze_navigation_with_ollama(question_1, ans_1, question_2)

    # 顯示結果
    print("\nOllama 的導航建議與分析:")
    print(navigation_result)

    # 保存結果至檔案(可選)
    with open("navigation_analysis.txt", "w", encoding="utf-8") as file:
        file.write("語音導航與交通狀況分析結果:\n")
        file.write(navigation_result)

第一次執行結果:
啟動語音導航系統...
收集的 GPS 和交通數據:{'latitude': 33.55633, 'longitude': -99.02998, 'traffic_condition': '壅塞', 'estimated_time': 26}
生成的導航分析請求描述:
目前位置座標為:緯度 33.55633,經度 -99.02998。
交通狀況為:壅塞。
預計到達目的地需要 26 分鐘。
請根據這些數據提供語音導航建議,並分析交通狀況。

Ollama 的導航建議與分析:
( Mario 的聲音 )Ahahah!我是Mario,我可以幫助你找到最快的路線!

現在,讓我們看看目前的位置和交通狀況。你的目前位置是緯度 33.55633、經度 -99.02998,並且受到壅塞的影響。

由於壅塞,Traffic Patrol 必須建議你取一個不同的路線,減少行車時間。因此,我們將避開現在壅塞區域,改為一條新的路線。

預計行程時間是 26 分鐘,這個目標非常緊密!我們需要快走到達目的地!

(指引)請從目前位置的方向 Continue Towards South,避開壅塞區域,繞過Traffic Patrol。

新路線將會帶 you 到目的地的前幾十米。最後, Arrived at your destination !(指導完成)

在壅塞時機不錯!我們的時間預計還是可以完 成。如果你有時間,可以再來體驗一回,這個路線和壅塞區域的變化會有何不同呢?

第二次執行結果:
啟動語音導航系統...
收集的 GPS 和交通數據:{'latitude': 75.306921, 'longitude': -92.987766, 'traffic_condition': '交通事故', 'estimated_time': 35}
生成的導航分析請求描述:
目前位置座標為:緯度 75.306921,經度 -92.987766。
交通狀況為:交通事故。
預計到達目的地需要 35 分鐘。
請根據這些數據提供語音導航建議,並分析交通狀況。

Ollama 的導航建議與分析:
(深有神氣的 Mario聲音)

「咿!咿!我們的目標是在該點進行調查。先來看看當前的交通狀況... (延遲一下) Ah!Looks like there's a traffic accident going on. Better avoid that area for now.

首先,我們需要找到最快的路線。根據你的位置(緯度 75.306921,經度 -92.987766),我將計算出最佳路線。 (小 WAIT) OK!我有了!我們可以從這裡往西北方向走,接下來是通過一個小town,然後再進入高速公路。

但是,由於交通事故,我們需要避開那個地區,可能要花一些時間。預計到達目的地需要35分鐘,這是一個可行的時限。但是,我们還需要注意一下交通狀況,因為可能會有車禍、交通信號或其他問題出現。

因此,我們的建議是: (持續一秒,然後繼續) Continue on the current path, then turn north towards the town. Avoid the traffic accident area for now. Once we're through the town, we'll get back onto the highway and make our way to our destination.

讓我們一起努力, Mario 會幫你通過這個難关的!」

利用Ollama製作聊天機器人

 程式:

 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
import speech_recognition as sr
import pyttsx3
import requests
import ollama

# 初始化文字轉語音引擎
engine = pyttsx3.init()
engine.setProperty('rate', 150)  # 語速調整
engine.setProperty('volume', 0.9)  # 音量調整

# 語音轉文字
def recognize_speech():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        print("請開始說話...")
        try:
            audio = recognizer.listen(source, timeout=5, phrase_time_limit=10)
            text = recognizer.recognize_google(audio, language="zh-TW")
            print(f"辨識結果:{text}")
            return text
        except sr.UnknownValueError:
            print("無法辨識語音,請再試一次。")
            return None
        except sr.RequestError as e:
            print(f"語音服務出現錯誤:{e}")
            return None

# 發送請求到 Ollama API
def get_ollama_response(prompt):
    try:
        # 替換為適用的 ollama.generate 調用方法
        response = ollama.generate(
            model="llama3.2",
            prompt=prompt
        )
        return response["response"]
    except Exception as e:
        print(f"Ollama 請求失敗:{e}")
        return "抱歉,目前無法處理您的請求。"

# 文字轉語音
def speak_text(text):
    engine.say(text)
    engine.runAndWait()

# 主程序
if __name__ == "__main__":
    print("啟動語音助手...")
    while True:
        # 語音輸入
        user_input = recognize_speech()
        if user_input:
            # 停止程序的關鍵字
            if "結束" in user_input or "退出" in user_input:
                print("結束程序。")
                speak_text("感謝使用,再見!")
                break

            # 發送給 Ollama 並取得回應
            response = get_ollama_response(user_input)
            print(f"Ollama 回應:{response}")

            # 語音輸出
            speak_text(response)

第一次執行結果:
啟動語音助手...
請開始說話...
辨識結果:你是誰
Ollama 回應:我是超级马里奥! * Jumping pose *

在 Mushroom Kingdom 中,我是一名著名的冒险家,我的主要職業是拯救當地的王子,路易吉 khỏi大亨·考斯基的邪惡力量。

現在,我們可以開始工作了!您需要幫助我做什么呢?

第二次執行結果:
辨識結果:我想減肥
Ollama 回應:哇!呗呗!Mario這裡!

哦,減肥 eh?那我們就得發揮我的「 Super Mario」的精神來幫你打敗減肥目標吧!

首先,我們需要了解,減肥是一個長期的過程,所以要小心慢慢來。以下是幾點建議:

1. **運動**: 我們必須進行 Regular Exercise。想著在 Mushroom Kingdom 中的跑步和彈珠跳躍!你可以選擇任何你喜歡的運動方式。
2. **飽餐管理**: 我們要控制我們吃的量。就像如何準備合理的食物組成來幫助你的身體!減少膳食中的空癢和糖分 nhé!
3. **飲水**: 並且,喝很多水!你需要保持自己充盈的水分,而不過度限制!
4. **休息**: 時間也很重要。不要忽略 Rest Time,不然你會因為缺乏足夠睡眠而出現減肥阻礙。

**想一個目標!** 例如你想要減少多少斤?在一個特定的時間內完成這個過程吧?

讓我們在 Mushroom Kingdom 中一起努力,打敗減肥目標!你 Ready 哩?

第三次執行結果:
請開始說話...
辨識結果:我想減肥10公
Ollama 回應:你 想 膨脹 10 公斤嗎?不要怕,我Mario會幫你計畫一份合理的減肥計畫。

首先,我们需要知道,你目前的體重是多少?並且,請告訴我,你每天的正常進食量有多大?(例如,餐、餐後 snacks 等)

另外,我還有一些簡單的建議:

1. **運動**:你可以尝试一些適合你的運動方式,例如跑步、游泳、跳 Rope等。
2. **節食**:我們可以計畫出一個健康的吃食 plan,讓你能夠減少進食量和 calory 數量。
3. **生活方式改變**:你可以嘗試睡眠時間的延長,避免過度咖啡或酒精攝取等。

我們一步一步地進行减肥計畫吧!

你最好是告訴我,你目前的體重和進食量,我就能夠提供您個性化的減肥計畫!

第四次執行結果:
請開始說話...
辨識結果:70公斤每天吃三餐
Ollama 回應:That's-a a lot of food! As Mario, I'd say that's-a about right for a plumber like me after a long day of rescuing Princess Peach from Bowser!

You know, in the Mushroom Kingdom, we love our food. It's-a all about finding that perfect balance between power-ups and portability. After all, you never know when you'll need to jump into action and save the princess!

Here's-a some fun facts about eating habits:

* A typical Mario-sized meal would be around 2-3 times your recommended daily intake, maybe even more! That's-a why we need to make sure our meals are packed with nutrients to keep us jumping all day long.
* Power-ups like mushrooms and fire flowers can give you an extra boost of energy, but they're not meant for everyday snacking. Moderation is key!
* Let's-a not forget about the importance of snacks! A good pipe-side picnic or a Warp Pipe lunchbox can be just what you need to refuel during a busy day.

Remember, it's-a all about balance and making healthy choices that'll keep you jumping, stomping, and rescuing like a pro!

2024年12月14日 星期六

Ollama的聊天和生成功能

範例一、Ollama聊天

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import ollama

question_1 = "什麼是5 + 6?"

ans_1 = "5 + 6 是 11,這是基本運算,5加上6等於11。"

question_2 = "再加8後,答案會是多少呢?"

response = ollama.chat(
    model="llama3.2",
    messages=[
        {"role": "user", "content": question_1},
        {"role": "assistant", "content": ans_1},
        {"role": "user", "content": question_2}
    ]
)

print(response["message"]["role"])
print(response["message"]["content"])

第一次執行結果:
assistant
11 加 8 等於 19。

第一次執行結果:
assistant
如果我們再加8到11,那麼就變成19了。 

範例二、


所以,5 + 6 + 8 = 19

第二次執行結果:
assistant
如果我們再加8到11,那么結果就變成了19了。

範例二、Ollama生成
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import ollama

question_1 = "什麼是5 + 6?"

ans_1 = "5 + 6 是 11,這是基本運算,5加上6等於11。"

question_2 = "再加8後,答案會是多少呢?"

prompt = f"""<|user|>
{question_1}<|end|>
<|assistant|>
{ans_1}<|end|>
<|user|>
{question_2}<|end|>
<|assistant|>
"""

response = ollama.generate(
    model="llama3.2",
    prompt=prompt
)

print(response["response"])

第一次執行:
再加8後,11 + 8 = 19。

第二次執行:
11 + 8 = 19

第三次執行:
11 + 8 = 19