iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
做專案真的很容易一頭熱,往下鑽就忘了重新審視整體情況。

開始前,重新檢視一下目前進度。

https://ithelp.ithome.com.tw/upload/images/20250925/20168437J97uw0PXBE.png

功能設計

  • 初始化牌庫:從 S3 讀取檔案,載入完整的 78 張卡牌資訊。
  • 洗牌:隨機打亂牌庫。
  • 抽牌:抽出指定數量的牌,並需要標註出正位/逆位。
  • 解讀:將問題和抽好的牌送到 Bedrock 進行解讀。

目前已經完成了
✓ 從 S3 讀取塔羅牌資料
✓ 洗牌
✓ 串接 Bedrock

接下來要做的就是把每個完成的步驟串接起來,調整成需要的功能。


檔案準備

https://ithelp.ithome.com.tw/upload/images/20251006/20168437aD0354NffY.png
S3 中準備好了塔羅牌的文字檔(tarot.json),格式如下:

{
  "id": "塔羅牌的ID",
  "name_zh": "中文名稱",
  "upright_meta": { "keywords": ["正位關鍵詞"] },
  "reversed_meta": { "keywords": ["逆位關鍵詞"] },
  "story": "牌面敘述及故事背景"
}

另外也準備了 system_prompt,用來設定占卜師的個性、解牌邏輯和對應語氣。


準備塔羅牌 ID 清單:cards.py

https://ithelp.ithome.com.tw/upload/images/20251006/20168437gD3e0gwMci.png


撰寫程式碼

# For Local Test
if __name__ == "__main__":
    """
    本地端測試入口。
    AWS Lambda 會呼叫 lambda_handler,但開發階段可直接執行 main 以測試程式邏輯。
    """

    # 初始化 S3 Service
    s3_service  = S3Service()
    
    # 取得完整的塔羅牌 ID 清單
    deck = tarot_deck.copy()
    
    # 從 S3 讀取完整塔羅牌資訊
    info = s3_service.read_s3_file(bucket, key)
    
    # 為塔羅牌建立索引,方便搜尋
    # read_s3_file() 會回傳 JSON 字串,所以用 json.loads() 把字串轉成 list
    tarot_by_id = {o['id']: o for o in json.loads(info)}
    
    # 檢查是否 78 張牌都能正確讀取塔羅牌資訊
    missing = [c['id'] for c in tarot_deck if c['id'] not in tarot_by_id]
    if missing:
        raise ValueError(f"找不到塔羅牌: {missing}")
    print(f"驗證通過,共 {len(tarot_deck)} 張牌,每張皆有對應資料")

執行結果

https://ithelp.ithome.com.tw/upload/images/20251006/20168437EamisidrTB.png


為什麼要另外放一個 cards.py

直接把塔羅牌資料整合進程式不是更方便?

能不能整,當然可以。
但在實務上這麼做,很可能會讓後續維護變得麻煩。

  • 如果完整的牌意直接放進專案
    雖然可以省掉讀取 S3 的步驟,但未來如果要更新牌面資訊,就算程式邏輯完全沒有改動,還是需要重新佈署。
  • 如果完全依賴 S3
    會讓洗牌、抽牌等純運算邏輯和解讀邏輯混在一起。
    把「要運算的卡片列表」與「解讀用的詳細資料」分開,反而能讓程式更乾淨。

這樣的分層,就像把「資料層」與「邏輯層」拆開一樣,
未來若要更換占卜素材或擴充牌義,也能更容易測試和維護。

除了分離資料與邏輯外,這樣的架構也能讓 Lambda 更輕量。
每次部署時只需要上傳主要程式碼,不必重新打包龐大的資料檔案。
將塔羅牌的資料存在 S3,還能讓它變成共用的素材,就算要擴充更多服務或功能,也能很方便的直接讀取,保證資料的泛用和一致性。


上一篇
Day 21. 遊樂場玩夠了還是要進實戰
下一篇
Day 23. 占卜師初登場
系列文
科學的盡頭是玄學?AI占卜小助手與知識庫驗證23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言