「AI 智慧客服回饋分析」詳解

這個案例的重點,在於如何將 AI 模型應用於批次處理結構化資料集。我們將學習讀取外部 CSV 檔案,並透過迴圈逐一將每一筆資料交由 AI 進行分析。這份清單整理了該 Colab 筆記本中最核心的 Python 元件。

1. 載入數據

  • files.upload(): 執行這行程式碼時,Colab 會在您的瀏覽器中跳出一個檔案上傳的對話視窗,讓您可以從本機電腦選擇要上傳的檔案
  • uploaded = ...: 當您選擇檔案並完成上傳後,files.upload() 會回傳一個 Python 字典 (dictionary),裡面包含了您上傳的檔案資訊(檔名作為 key,檔案內容作為 value)。這個字典會被存放在 uploaded 這個變數中。
  • try: ... except Exception as e: ...:這是一個錯誤處理的結構。
    • try:: 程式會嘗試執行 try 區塊內的所有程式碼。
    • except Exception as e:: 如果在 try 的過程中,發生任何錯誤(例如,上傳的檔案不是 CSV 格式、檔案已損毀等),程式不會因此崩潰,而是會跳到 except 區塊,執行裡面的程式碼來處理這個例外狀況。
  • file_name = next(iter(uploaded)):因為 uploaded 是一個字典,我們需要從中取出檔名。
    • iter(uploaded) 會建立一個字典鍵(也就是檔名)的迭代器。
    • next(...) 則會從這個迭代器中取出第一個項目。由於我們一次只上傳一個檔案,所以這樣就能成功取得該檔案的檔名。
如果使用本地端的編輯器執行Python腳本(例如Spyder,VSCode),只要設定好工作目錄,就可以直接使用pandas read_csv() 方法載入數據集。upload()是用在當你使用colab環境時。

2. Pandas DataFrame 的核心操作

核心概念: Pandas 是 Python 進行資料分析的基石。在這個案例中,DataFrame (資料表) 是我們處理所有資料的主要結構。

本案例應用重點:

  • pd.read_csv(): 從上傳的 CSV 檔案中讀取資料,並將其載入為一個 DataFrame。
  • df.iterrows(): 這是遍歷 (loop through) DataFrame 每一列 (row) 的標準方法,讓我們可以逐一取得每一筆顧客的回饋文字。
  • df['new_column'] = '': 學習如何新增一個空的欄位,用來準備存放 AI 分析完的結果。
  • df.at[index, 'column'] = value: 在迴圈中,使用 .at[] 精準地將 AI 的分析結果(例如 ‘產品品質’)填入到特定儲存格中。
  • df.head() / display(df): 快速預覽資料表的前幾筆內容,檢查資料是否正確讀取。
  • df['topic'].value_counts() : 是 pandas 中的語法,通常用來統計某個 DataFrame 列(在這裡是 topic 這個欄位)中每個獨特值(unique value)的頻率,也就是計算每個類別在該行中出現的次數。

3. 自訂函式 (def) 與 try/except 錯誤處理

核心概念: 我們將呼叫 AI 的重複性工作,封裝成一個名為 analyze_feedback 的函式。同時,在函式內部使用 try/except 來確保程式的穩健性。

本案例應用重點:

  • 模組化: 將 AI 分析的邏輯寫在函式裡,讓主程式的 for 迴圈看起來更簡潔,且易於維護。
  • 錯誤捕捉: 網路連線或 API 呼叫隨時可能失敗。try/except 確保即使某一筆資料分析失敗,程式也能繼續執行下一筆,而不是直接中斷,這在處理大量資料時至關重要。

4. for 迴圈與 Pandas 的整合應用

核心概念: for 迴圈是本案例實現「自動化」分析的關鍵。它讓我們能夠對 DataFrame 中的每一筆資料,重複執行相同的 AI 分析流程。

本案例應用重點:

if 'df' in locals(): 是 Python 中用來檢查變數 df 是否已經在當前的局部變數範圍中定義過的一條語句。

# for 迴圈遍歷 DataFrame 的每一列
# index 是每一列的索引,row 則是包含該列所有資料的物件
for index, row in df.iterrows():
    # 從 row 中取出 'customer_feedback' 欄位的文字
    feedback = row['customer_feedback']
    
    # 呼叫 AI 分析函式 (見上一點)
    analysis_result = analyze_feedback(feedback)
    
    # 將分析結果存回 DataFrame
    df.at[index, 'topic'] = analysis_result.get('topic')

5. Google Gemini API 與 JSON 解析

核心概念: 這是將原始文字轉化為結構化數據的核心步驟。

本案例應用重點:

  • generation_config: 在初始化模型時,我們透過 generation_config=...response_mime_type="application/json",明確要求 Gemini 模型必須回傳 JSON 格式,確保了輸出的穩定性。
  • json.loads(): 由於 AI 回傳的是 JSON 格式的「字串」,我們需要使用 json.loads() 這個標準函式庫,將其轉換為 Python 中可以操作的字典 (dict)。
  • 列表 (list) 檢查: 程式碼中包含了 isinstance(result, list) 的判斷,用來處理 AI 可能回傳 [{...}] (列表包字典) 的情況,這是確保程式穩健性的細節。

6. Google data_table

not df['topic'].empty:檢查 dftopic 這一列是否為空(即檢查 topic 列是否包含任何資料)。

from google.colab import data_table

  • 這行代碼從 google.colab 模組中導入 data_table 模組。
  • google.colab 是 Google Colab 提供的一個 Python 庫,允許你在 Colab 筆記本環境中使用不同的功能和工具。
  • data_table 是 Google Colab 提供的一個工具,專門用來改進在 Colab 中顯示 pandas DataFrame 的外觀和交互性。

    data_table.enable_dataframe_formatter()

    • 這行代碼啟用了 data_table 中的 DataFrame 格式化功能。
    • 一旦啟用,DataFrame 會以更美觀和交互式的方式顯示,通常會包括以下功能:
      • 支援排序:你可以點擊表頭來根據列排序數據。
      • 支援篩選:可以快速篩選表格中的數據。
      • 更清晰的視覺效果:比 pandas 的基本顯示方式更具可讀性。

    7. time 模組與 API 存取頻率控制

    核心概念: time 模組提供了與時間相關的功能。

    本案例應用重點:

    • time.sleep(1): 在 for 迴圈的每一次迭代結束時,讓程式暫停 1 秒。這是為了避免在極短時間內對 AI API 發動過於頻繁的請求,許多 API 都有速率限制 (Rate Limiting),適當的延遲是撰寫爬蟲或自動化腳本的良好習慣。