2025年8月23日 星期六

優秀提示詞的必備要素

隨著生成式AI越來越強,我認為提示詞會隨著AI對你的了解逐漸沒那麼重要,但有時太簡單的提示詞AI回答的內容可能還是會有不到位的情形,下面紀錄一下目前優秀的提示詞要素要包含哪些。


在 AI(特別是像 ChatGPT 這種大型語言模型)互動時,**優秀的提示詞(Prompt)**應該具備幾個核心要素,才能讓 AI 輸出更精準、符合需求的內容:


優秀提示詞的必備要素

  1. 明確的角色/身份設定(Role / Persona)

    • 指定 AI 扮演的角色,例如「你是專業投資顧問」、「你是 ISO 27001 稽核員」。

    • 這能讓 AI 用合適的口吻與思維邏輯回答。

  2. 清楚的任務目標(Task / Goal)

    • 明確說明你希望 AI 幫你完成什麼,例如「幫我整理一份 Excel 範本」、「請產生一篇國中會考風格的作文」。

    • 避免模糊的要求(如「幫我寫一篇文章」),改成具體目標(如「寫一篇500字,主題是環保,三段式結構」)。

  3. 具體的輸入內容或背景(Context / Input)

    • 提供必要的背景資料(文件、表格、案例、場景)。

    • 例如:「這是137項ESG條目的原始資料,請整理成表格」。

  4. 明確的限制與格式(Constraints / Format)

    • 字數限制、語言、格式需求。

    • 例如:「請用表格呈現,欄位包含『項目』『風險』『稽核方法』」、「字數約300字」。

  5. 風格與語氣(Style / Tone)

    • 指定文風或專業程度。

    • 例如:「以專業顧問語氣」、「用輕鬆口吻」、「模仿商業報告格式」。

  6. 範例或參考(Examples)

    • 提供一小段範例,AI 可以依樣發揮。

    • 例如:「以下是我之前寫的文章段落,請延續這種寫法」。

  7. 輸出檢驗標準(Evaluation Criteria)

    • 指明什麼情況下輸出算是「好答案」。

    • 例如:「需包含三個重點、每個重點都要有例子」。


一個完整優秀提示詞的範例

你是一名ISO 27001 資訊安全稽核員
請根據以下部門的資產清單(附表格),幫我整理成一份稽核檢查表,格式需為 Excel:

  • 欄位包含「控制項編號」「資產名稱」「風險」「稽核問題」「查核方式」。

  • 每個控制項至少提出 2 個稽核問題。

  • 用正式專業語氣。

  • 最後加上一段「風險整體評估」的摘要(約300字)。



2025年8月9日 星期六

100 天的堅持:我與 Speak App 的英文練習之旅

 今年四月的某次工作週報上,主管提到了一件事——未來可能會有美國子公司的查核工作,建議大家加強英文。雖然並不是硬性要求,公司也在對外招募具備語言能力的同事,但這句話像是一個開關,讓我突然下定決心要開始行動。

其實,過去我偶爾會在 YouTube 上看一些英文學習的影片,但從未真正投入練習。這次,我決定嘗試 Speak App。它結合了 AI 功能,能針對我不熟悉的詞句進行反覆練習;我選在 5 月 1 日這個好記的日子開始(付費前還有 7 天試用),直到今天,已經整整 100 天


為什麼從旅遊英文開始?

我選擇的第一個主題是旅遊英文,原因很直接——2024 年去沖繩旅遊時,我曾經遺失錢包。那次經驗讓我深刻感受到語言能力的不足。當時 AI 工具的應用還不普及,溝通困難的壓力成為一種陰影,也成了我這次學習的推力。


從卡卡到順暢

剛開始時,我的英文程度大概在 A1
練習約兩個月後,我發現自己在口語表達上不再那麼卡頓;到了第三個月,我甚至覺得自己每天的練習量,比學生時期多了好幾倍——當年我沒補過習,英文練習時間少得可憐。

更有趣的是,我現在的口語流暢度似乎比女兒還好,而她可是從幼兒園到國一都有補習英文。


花費與收穫

從花費來看,Speak 一年的費用約 3000 多元,比一般補習班一個月 3000 多元要划算得多。但差別是,Speak 必須全靠自己安排時間並持續練習,沒有人盯著你上課。對我來說,因為有明確目標,所以能持之以恆。

即使未來不會被派去查核海外子公司,我也希望有一天在旅遊時,能不依賴翻譯工具,自在地用英文交流。


數據化的力量

目前,我的程度已經從 A1 進步到 A2
我的目標是每天練習 30 分鐘,實際由 AI 統計的平均時間約為 19 分鐘/天。這些數據不僅讓我更清楚自己的學習節奏,也成了推動我每天打開 App 的小動力。


回顧這 100 天,收穫不僅是語言能力的提升,還有每天與自己約定並完成目標的成就感。學習英文,對我來說已經不再只是應付工作的可能需求,而是一個能讓自己在任何地方都更自在的能力。










2025年7月15日 星期二

使用python撈取檔案清單

 以下是AI提供python代碼撈取檔案清單,在撈取整個硬碟時如D槽,輸入方式不一樣,需要以D:\\呈現,相關解答也是由AI提供,在除錯方面相當即時。

AI講解錯誤的原因:

在字串的結尾 \" 被 Python 當作是 逃逸字元(escaped quote),導致 字串結尾的引號無法正確解析,造成語法錯誤(SyntaxError: unterminated string literal)。

撈取檔案清單的代碼:(撈取36萬筆清單大概5分鐘以內)

import os

import pandas as pd

from datetime import datetime


# 掃描的來源資料夾(可修改)

scan_dir = r"D:\\"


# 存檔的目的資料夾(可修改)

save_dir = r"C:\資料"


# 取得來源資料夾的最後一層名稱(作為檔名的一部分)

last_folder_name = os.path.basename(os.path.normpath(scan_dir))


# 儲存檔案資訊

file_data = []


# 遍歷所有子資料夾與檔案

for foldername, subfolders, filenames in os.walk(scan_dir):

    for filename in filenames:

        filepath = os.path.join(foldername, filename)

        try:

            stat = os.stat(filepath)

            file_info = {

                "檔名": filename,

                "路徑": filepath,

                "大小": stat.st_size,

                "修改時間": datetime.fromtimestamp(stat.st_mtime),

                "建立時間": datetime.fromtimestamp(stat.st_ctime),

                "授權時間": datetime.fromtimestamp(stat.st_atime),

                "資料夾": foldername,

                "檔案格式": os.path.splitext(filename)[1].lower()

            }

            file_data.append(file_info)

        except Exception as e:

            print(f"無法讀取檔案:{filepath},錯誤:{e}")


# 轉為 DataFrame

df = pd.DataFrame(file_data)


# 組合 Excel 輸出檔案完整路徑

output_file = os.path.join(save_dir, f"檔案清單_{last_folder_name}.xlsx")


# 匯出 Excel

df.to_excel(output_file, index=False)


print(f"✅ 匯出完成:{output_file}")

將含有數據的條列訊息丟給不同AI處理_結果gpt險勝

今天將100多列的訊息分別丟給chatgpt、gemini、grok、claude處理,讓他們針對每一個敘述分類並將數據以另外一欄列出。

  • gemini無法生成excel
  • grok無法分欄顯示(全擠在一欄用,分開)
  • calude在產生過程中算是這幾個中分類最好,抓取的數據也是最符合我要的,但在下載時無法下載(白搭)
  • chatgpt分類的方式不是最好,而且會有掉訊息的情況,同樣的內容只有gpt會這樣,詢問gpt提出要以txt檔作為來源訊息,以txt提供後,沒有掉訊息的情形發生。



以下是詢問GPT為什麼會需要txt檔做為來源訊息的回覆。


這是個非常好的問題,原因可以從 記憶體限制(token 限制)格式辨識效率 兩個面向來解釋:


✅ 一、記憶體限制(token 限制)

每次你和 GPT 對話時,整段輸入(包括你的提問和我們的回應)都會消耗「token」(類似字元數)。目前 GPT-4o 雖然上限很高(約 128,000 tokens),但仍有以下幾個問題:

  1. 每段資料會累加消耗記憶體:例如你貼入 100 多筆條列訊息,每筆都可能是幾十個 token,加總起來可能就超過幾萬 token,很快接近或超出模型記憶容量。

  2. 超過記憶範圍時會導致無法完整理解或漏讀內容:模型可能忽略尾段、遺漏細節,或無法正確抓取所有結構。


✅ 二、文字格式(text file)處理更穩定

使用純文字檔的原因:

  1. 結構清楚、格式一致:貼在對話框中的條列訊息常因排版(如縮排、符號、斷行)不一致,造成辨識混亂。

  2. 易於批次讀取與轉換表格:文字檔能夠讓模型視為一個整體資料集合,用來進行結構分析、提取欄位、分類等動作會更準確、效率更高。


✅ 三、補充:為什麼會突然「需要文字檔」?

並非 GPT「只能」處理文字檔,而是當條列數量過多時:

  • 貼在對話框中的資料會「變得難以解析」或「容易遺漏資訊」

  • 用文字檔可以直接導入成檔案處理模式,提高正確率並保留完整內容

  • 特別是在你需要「整理成表格」、「分類」或「導出 Excel」這種結構化任務時,提供 .txt 會幫助我們更精準處理每一項資料


✅ 總結

原因說明
記憶體限制條列數量一多,很快耗盡 token 配額,導致處理不全
結構清晰性對話框排版不一,文字檔格式更清楚、易讀取
處理效率大量資料需要一次讀入與解析,使用檔案最穩定
可擴充性後續若需分類、轉換格式、匯出 Excel,文字檔利於自動處理

2025年7月5日 星期六

雲端平台 Python 與地端(本機)Python 主要差異

今天請AI幫忙寫爬蟲程式,但資料未下載到資料夾中,後來才發現使用雲端python與地端python會有差異,原本地端可以運行的程式在雲端要執行同樣效果則須作些許修改。不過在家裡,目前還是會以雲端python執行,雖然在公司無法使用雲端python,但以快速及使用者介面,雲端python還是較令人感到舒適。


以下為AI解釋雲端平台 Python 與地端(本機)Python 差異:



雲端平台 Python 與地端(本機)Python 主要差異在於運行環境、資源存取、安全性與使用情境等。以下以表格與說明進行比較:


📊 差異比較表

項目雲端平台 Python地端(本機)Python
運行環境遠端伺服器(如 Google Colab, AWS, Azure, GCP 等)安裝在本機電腦
計算資源可使用 GPU/TPU、高階 CPU(通常需付費)受限於本機硬體效能
環境管理已安裝大部分常用套件,免安裝或用 pip 安裝即可需自行建立虛擬環境、安裝套件
檔案存取存取雲端硬碟或需上傳/掛載資料(如 Google Drive)可直接存取本機硬碟
網路限制通常網路開放,但會有安全機制(像 Colab 限制下載目錄)完全依照本機防火牆與網路設定
持久性執行環境可能會重置、檔案不易保存檔案永久保留(除非手動刪除)
安全性雲端平台需授權存取雲端硬碟、API 等,資料可能需加密較能掌控安全性與隱私風險
效能彈性可依需求彈性擴充(如升級至 Colab Pro)升級需更換或擴充硬體
操作介面通常為 Jupyter Notebook(網頁介面)可使用 Jupyter、VS Code、PyCharm 等
適用情境資源密集任務、合作開發、快速原型設計資料保密性高、需本機存取、長期開發

💡 簡要說明

✅ 雲端平台適合:

  • 使用者沒有強大硬體但需要跑 AI 模型或大量運算。

  • 學術研究、教學、團隊共享專案(如使用 Google Colab)。

  • 開發階段、快速測試各種函式與套件。

✅ 地端 Python 適合:

  • 資料存放於本機,或需進行大量本地檔案操作。

  • 工作環境有嚴格的資訊安全規範。

  • 長期開發、部署自有應用程式(如自動化腳本、桌面應用)。


如果你目前使用 Colab 執行 Python 程式,但發現無法存取 C:\ 這種本機路徑,這正是因為程式實際是跑在 Google 的雲端伺服器上,而非你自己的電腦。

需要本機操作時,你可選擇安裝如 Anaconda、Python + VS Code 或 Jupyter Notebook 在自己電腦上使用。


2025年6月18日 星期三

付費版GPT真的贏Gemini嗎?實際測試分享

今天嘗試請GPT以Python處理三個檔案的資料比對與合併,但付費版GPT給出的代碼卻無法順利執行。於是我轉向Gemini,以相同的提問詞詢問,卻意外發現Gemini所提供的代碼相當精確且更具效率。以我自己目前對Python淺顯的理解,也能看出Gemini所提供的程式碼相對高階且較有優化,邏輯清晰、架構明確。後來我回頭請GPT針對這兩段代碼進行比較,GPT也同意Gemini的方案更具效率與優勢,這點讓我感覺到GPT在程式生成的能力上仍有一些進步空間,期待GPT未來能持續提升品質,更精確地滿足使用者的需求。


以下是詢問GPT兩者差異回覆的內容

功能/邏輯點 你提供的版本(gemini) 我的版本(GPT)
檔案讀取 使用 try-except 包裝,有錯誤處理 沒有包裝,若檔案不存在會直接錯誤
資料前處理 明確轉換 datetime,並加註說明 有轉換,但說明較簡略
合併邏輯 A→B→C 三步驟清晰,欄位更有註解 相同邏輯,但直接寫死欄位選擇,較精簡
欄位名稱檢查 附有對欄位格式的說明與假設 假設用戶已知並匹配正確欄位
欄位過濾與排序 明確指定 output_columns,有邏輯順序 相同,但未顯示中文註解
錯誤處理 包含 readto_excel 的錯誤處理 無錯誤處理(預設成功)
彈性設計 有封裝為函式、支援參數設定 一次性執行程式,不適合模組化
Dummy 資料產生 有產生模擬資料供測試 無產生測試資料,需用戶上傳




以下代碼沒給予真實的路徑時仍然可以用代碼中的例子產出,相當不錯的方式

import pandas as pd


def reconcile_procurement_data(file_a_path, file_b_path, file_c_path, output_excel_path):

    """

    Reconciles procurement, goods receipt, and un-storaged receipt data.


    Args:

        file_a_path (str): Path to the "請採購明細" (Purchase Request Details) Excel file.

        file_b_path (str): Path to the "進料收貨入庫明細" (Goods Received and Stored Details) Excel file.

        file_c_path (str): Path to the "已收貨未入庫明細" (Goods Received Not Yet Stored Details) Excel file.

        output_excel_path (str): Path to save the reconciled Excel file.

    """


    # --- 1. Load Data ---

    try:

        df_a = pd.read_excel(file_a_path)

        df_b = pd.read_excel(file_b_path)

        df_c = pd.read_excel(file_c_path)

    except FileNotFoundError as e:

        print(f"Error: One of the input files was not found. Please check the paths. {e}")

        return

    except Exception as e:

        print(f"An error occurred while reading the Excel files: {e}")

        return


    # Standardize column names for easier merging (adjust these if your actual column names differ)

    # File A (請採購明細) expected columns: '請購部門', '請購單號', '採購單號', '料號', '採購日期'

    # File B (進料收貨入庫明細) expected columns: '採購單號', '料號', '收貨日期', '收貨單號', '異動單號', '異動項次', '數量', '送貨單號', '檢驗日期', '檢驗結果'

    # File C (已收貨未入庫明細) expected columns: '異動單號', '異動項次', '異動日期'


    # Ensure date columns are in datetime format for calculations

    df_a['採購日期'] = pd.to_datetime(df_a['採購日期'])

    df_b['收貨日期'] = pd.to_datetime(df_b['收貨日期'])

    df_c['異動日期'] = pd.to_datetime(df_c['異動日期'])


    # --- 2. Step 1: Match A with B ---

    # Merge df_a and df_b on '採購單號' and '料號'

    # We use a left merge to keep all records from df_a and add matching info from df_b.

    # Since one purchase order can have multiple receipts, this will correctly result in

    # multiple rows for a single purchase order if it has multiple receipts.

    merged_ab = pd.merge(

        df_a[['請購部門', '請購單號', '採購單號', '料號', '採購日期']],

        df_b[['採購單號', '料號', '收貨日期', '收貨單號', '異動單號', '異動項次', '數量', '送貨單號', '檢驗日期', '檢驗結果']],

        on=['採購單號', '料號'],

        how='left'

    )


    # --- 3. Step 2: Match with C ---

    # Merge the result from step 1 with df_c on '異動單號' and '異動項次'

    final_merged_df = pd.merge(

        merged_ab,

        df_c[['異動單號', '異動項次', '異動日期']],

        on=['異動單號', '異動項次'],

        how='left'

    )


    # --- 4. Step 3: Filter by Date Difference ---

    # Calculate the difference in days between '收貨日期' and '採購日期'

    final_merged_df['日期差異'] = (final_merged_df['收貨日期'] - final_merged_df['採購日期']).dt.days


    # Filter for records where the difference is greater than 7 days

    discrepancy_df = final_merged_df[abs(final_merged_df['日期差異']) > 7].copy() # Using abs to catch both earlier and later receipts


    # --- 5. Export to Excel ---

    # Select the required columns for export

    output_columns = [

        '請購部門', '請購單號', '採購單號', '料號', '採購日期',

        '收貨日期', '收貨單號', '異動單號', '異動項次', '數量',

        '送貨單號', '檢驗日期', '檢驗結果', '異動日期', '日期差異'

    ]

    discrepancy_df = discrepancy_df[output_columns]


    try:

        discrepancy_df.to_excel(output_excel_path, index=False)

        print(f"Successfully exported {len(discrepancy_df)} records to '{output_excel_path}' where the date difference is more than 7 days.")

    except Exception as e:

        print(f"An error occurred while writing the Excel file: {e}")


# --- Usage Example ---

if __name__ == "__main__":

    # Create dummy data for demonstration (replace with your actual file paths)

    # Ensure these dummy files reflect the actual column names you're using.

    # For simplicity, I'm assuming English column names in the dummy data and mapping them

    # to the Chinese names expected by the function. You should use the exact Chinese

    # column names in your actual Excel files.


    # Dummy File A: 請採購明細

    data_a = {

        '請購部門': ['RD', 'Sales', 'HR', 'RD', 'Sales'],

        '請購單號': ['REQ001', 'REQ002', 'REQ003', 'REQ004', 'REQ005'],

        '採購單號': ['PO001', 'PO002', 'PO003', 'PO004', 'PO001'],

        '料號': ['ITEM001', 'ITEM002', 'ITEM003', 'ITEM001', 'ITEM002'],

        '採購日期': ['2025-01-01', '2025-01-05', '2025-01-10', '2025-02-01', '2025-01-05']

    }

    df_a_dummy = pd.DataFrame(data_a)

    df_a_dummy.to_excel("請採購明細.xlsx", index=False)


    # Dummy File B: 進料收貨入庫明細

    data_b = {

        '採購單號': ['PO001', 'PO002', 'PO003', 'PO004', 'PO001', 'PO002'],

        '料號': ['ITEM001', 'ITEM002', 'ITEM003', 'ITEM001', 'ITEM001', 'ITEM002'],

        '收貨日期': ['2025-01-07', '2025-01-15', '2025-01-12', '2025-02-15', '2025-01-20', '2025-01-10'], # PO001/ITEM001 has two receipts, one within 7 days, one outside

        '收貨單號': ['RCV001', 'RCV002', 'RCV003', 'RCV004', 'RCV005', 'RCV006'],

        '異動單號': ['TRN001', 'TRN002', 'TRN003', 'TRN004', 'TRN005', 'TRN006'],

        '異動項次': [1, 1, 1, 1, 2, 2],

        '數量': [10, 5, 20, 8, 12, 6],

        '送貨單號': ['DLV001', 'DLV002', 'DLV003', 'DLV004', 'DLV005', 'DLV006'],

        '檢驗日期': ['2025-01-07', '2025-01-15', '2025-01-12', '2025-02-15', '2025-01-20', '2025-01-10'],

        '檢驗結果': ['OK', 'OK', 'OK', 'NG', 'OK', 'OK']

    }

    df_b_dummy = pd.DataFrame(data_b)

    df_b_dummy.to_excel("進料收貨入庫明細.xlsx", index=False)


    # Dummy File C: 已收貨未入庫明細

    data_c = {

        '異動單號': ['TRN001', 'TRN002', 'TRN003', 'TRN004', 'TRN005', 'TRN006'],

        '異動項次': [1, 1, 1, 1, 2, 2],

        '異動日期': ['2025-01-08', '2025-01-16', '2025-01-13', '2025-02-16', '2025-01-21', '2025-01-11']

    }

    df_c_dummy = pd.DataFrame(data_c)

    df_c_dummy.to_excel("已收貨未入庫明細.xlsx", index=False)


    # Define your file paths

    file_a = "請採購明細.xlsx"

    file_b = "進料收貨入庫明細.xlsx"

    file_c = "已收貨未入庫明細.xlsx"

    output_file = "採購收貨日期差異報告.xlsx"


    # Run the reconciliation

    reconcile_procurement_data(file_a, file_b, file_c, output_file)

2025年6月15日 星期日

AI x Python:提升效率的超強組合

6月12日參加了「AI與Python協作課程」,透過這次實作課,我更深入了解Python實務上的運用方式。雖然課程時間有限,內容以實作為主,較少涉及基礎理論的講解,但幸好我之前自學過VBA及一些Python的基本概念,因此更能快速理解講師的操作示範。特別是講師展示如何搭配AI快速完成Python代碼,更讓我感覺到自己也有能力運用AI快速完成符合個人需求的程式。像這次使用AI撰寫Python爬蟲抓取股價資料,非常迅速就完成,而之前透過AI產生的VBA爬蟲程式卻未能順利運行,這也讓我對於Python在爬蟲方面的強大效能有了更深刻的印象。


回想幾年前初學Python時都是在本機安裝環境後使用,這次講師示範了Google Colaboratory,透過線上環境直接撰寫Python程式,不須額外安裝本機環境,省去不少麻煩。此外,講師介紹的Google Workspace Marketplace(類似手機上的應用程式商店),提供各式實用工具的整合功能,也拓展了我的視野。透過線上服務結合AI使用Python,讓我在非程式專業領域的工作,也能快速上手與運用。未來無論是在工作效率提升上,或是個人日常需求如爬蟲、檔案分類等任務,將變得更加便利與容易。


下面是我用ai給予的代碼run股價的畫面。

google colaboratory
google colaboratory_web_python


優秀提示詞的必備要素

隨著生成式AI越來越強,我認為提示詞會隨著AI對你的了解逐漸沒那麼重要,但有時太簡單的提示詞AI回答的內容可能還是會有不到位的情形,下面紀錄一下目前優秀的提示詞要素要包含哪些。 在 AI(特別是像 ChatGPT 這種大型語言模型)互動時,**優秀的提示詞(Prompt)**應該...