iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
自我挑戰組

和AI學習gcp - 建立對話代理系列 第 11

Day11 Data Ingestion Pipeline

  • 分享至 

  • xImage
  •  

有了day10爬蟲取得的資料後 我們要為查詢做準備, 爬蟲取得的資料格式是JSON檔, 而我們的使用情境會是針對口語問題作出回答, 我們需要把現有的資料內容向量化, 方便之後查詢時可以進行向量比對得知最符合問題的答案

第一件事是定義 Ingestion Job 的輸入與輸出。
輸入面,我們會把 Cloud Storage 的 raw JSON 視為唯一來源,Job 每次執行時要知道要處理哪些檔案、是全量還是增量、是否限制單次處理數量。
輸出面,Job 要產出可追蹤的執行結果,例如本次讀了幾個檔案、成功寫入幾筆文件、產生幾個 chunk、呼叫了幾次 embedding、跳過了幾筆既有資料、有哪些錯誤。
這些資訊不是附加品,而是未來排錯和成本控制的核心。

這裡的全量是指不管資料是否存在都進行覆蓋, 也就是打掉重做, 增量則是判斷是要增加資料或是對既有資料進行修改

第二件事是定義資料表 DDL。
我們會把資料拆成文件層、切片層、向量層三層結構。文件層保存來源與語意主體,切片層保存可檢索文字與順序,向量層保存 embedding 與模型版本。這樣做的好處是清楚、可查、可維護,日後你要改 chunk 策略或升級 embedding 模型,也不會把整個資料庫設計打爛。今天要完成的不是只有欄位清單,而是明確定義主鍵、唯一鍵、外鍵與必要索引,確保查詢與重跑都能穩定。
DDL(data definition language) 是用來定義和修改資料的schema, 通常包含 建立,刪除, 修改, 清空

第三件事是定義增量規則。
這會直接決定你後續費用與效率。我們會採用內容雜湊去重,讓同一份內容不會重複向量化;同時保留來源檔案與時間戳,讓你知道每筆資料從哪裡來、何時進來。增量規則會包含三個判斷:文件是否已存在、chunk 是否已存在、向量是否已存在。只要其中任一層已存在且內容未變,就跳過重算。這樣你每天更新資料時,成本會接近只支付新增內容,而不是反覆全量重建。

今天這些任務完成後會有一個可持續運作的基礎:
資料能進、能查、能重建、能控成本。下一步再接 Cloud Run Job 實作與實際驗證時,風險和不確定性會少非常多。

本日實作

今天新增一個 /ingestion 的資料夾, 裡面定義向量化,增量的cloud run job

https://ithelp.ithome.com.tw/upload/images/20260811/201543597Sd4zZEzOM.png

主要邏輯是在main.py 進行 GCS raw JSON 轉成 可檢索向量資料 的完整管線,且有做「增量與去重」,重跑不會無限重算

cd <project-root-path>

# 打包 crawler image(D10)
gcloud builds submit crawler \
  --tag gcr.io/chat-bot-484615/bank-crawler:latest

# 打包 ingestion/vectorize image(D11)
gcloud builds submit ingestion \
  --tag gcr.io/chat-bot-484615/bank-vectorize:latest

把爬蟲和塞資料的job打包上傳cloud run job

另外在cloudrun.tf 新增了 vectorize_job的job定義

以及在makefile中定義了 爬蟲 與塞資料的處發

make crawl-syncmake reindex

觸發兩次reindex就可以驗證增量的用途 不會讓重複的內容寫入sql資料庫

第一次觸發log

https://ithelp.ithome.com.tw/upload/images/20260811/20154359bObtOM8ODk.png

第二次觸發log 可以看到跑第二次時 沒有新增的document與chunks因為已經存在

https://ithelp.ithome.com.tw/upload/images/20260811/20154359h4azF4O2DA.png


上一篇
Day10 從網際網路到雲端存儲 — 實作「隱身」爬蟲 Job
下一篇
Day12 :Metadata 分類設計
系列文
和AI學習gcp - 建立對話代理14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言