iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0
考慮了很久,這個占卜到底要用在哪裡...

先前測試的占卜方式,是從生活中容易迷惘事情裡挑選一個主題,進行「過去、現在、未來」的三張牌占卜。
這類占卜通常圍繞在比較重大的議題上,解讀的方向也偏向長時間的影響。
雖然功能運作沒問題,但整體感覺好像...有點嚴肅。

然後就想起了最常見的每日星座運勢分析!

既然功能已經備齊,不如趁鐵人賽結束之前,再加上一個輕鬆有趣的小占卜!


準備每日占卜系統提示

你是一位深具靈性與洞察力的塔羅占卜師。
你熟悉大阿爾克納與小阿爾克納的象徵意涵,能夠從每張牌的能量與圖像中,看出今日的情緒流動與生活狀態。

這次的占卜主題是:「今日運勢」。
請依序解讀四個面向:愛情運、事業運、財運。
每個面向各對應一張牌,最後再根據解讀結果評估整體運勢。

占卜風格設定:
你是一位具有以下特質的占卜師:
1. 專業(Professional)
  說明每張牌的象徵、能量、與當下的意涵。
  點出正位與逆位的差別,以及這股能量今日的流向。
  
2. 溫柔引導(Gentle Guidance)
  不以提問的方式回應,而是以安定、理解的語氣描述今日的狀態。
  讓問卜者在閱讀時產生共鳴與覺察,而非被要求回答。

3. 同理(Empathy)
  理解今日情緒的起伏,語氣保持柔和與支持。
  即使出現挑戰,也提醒對方能量正在轉化,不需過度擔心。

4. 啟發(Inspiration)
  為每個面向給出一個具體的小建議或行動方向,
  幫助問卜者以更輕鬆的態度面對今天的能量。

輸出格式建議:
🔹 愛情運:列出該張牌及正/逆位
描述今日在情感、人際互動上的能量與建議。
🔹 事業運:列出該張牌及正/逆位
說明工作、學習、或行動方向上的狀態與提醒。
🔹 財運:列出該張牌及正/逆位
說明金錢、物質、與機會流動的能量。
🔹 整體運勢
綜合前三張牌的能量,指出今日整體的氛圍與重點。
🔹 今日訊息
以一句溫柔的話作結,可以是祝福、鼓勵、或小提醒。

加入程式碼邏輯

import json

from bedrock_service import BedrockService
from deck import DeckService
from s3_service import S3Service
from cards import tarot_deck

class DailyService:
    
    def __init__(self, bucket, key):
        # Service
        s3_service  = S3Service()
        self.deckService = DeckService()
        self.bedrock_service = BedrockService()
        # 塔羅牌
        self.deck = tarot_deck.copy()
        info = s3_service.read_s3_file(bucket, key)
        self.tarot_by_id = {o['id']: o for o in json.loads(info)}
        # 系統提示
        self.system_role = s3_service.read_s3_file(bucket, "daily_prompt.txt")
        
    def daily_tarot(self):
        self.deck = self.deckService.shuffle(self.deck)
        cards = self.deckService.draw_card(self.deck, 3) # 抽隨機三張
        # ===== 取得塔羅牌資訊 =====
        cards_info = self.__get_tarot_infos(cards)
        # 建構 prompt
        prompt = f"""
        請根據抽到的塔羅牌,為我解讀今日運勢:
        愛情:{cards_info[0]}
        事業:{cards_info[1]}
        財運:{cards_info[2]}
        """
        # 呼叫 Bedrock
        return self.bedrock_service.daily_tarot_reading(self.system_role, prompt)

    
    
    def __get_tarot_infos(self, cards):
        cards_info = []
        for i in range(3):
            card_info = self.tarot_by_id.get(cards[i]['id'])
            card = {
                'card_id': card_info['id'],
                'card_name': card_info['name_zh'],
                'story': card_info['story']
                }
            if cards[i]['position'] == '↑':
                card['position'] = 'upright'
                card['keyword'] = card_info['upright_meta']['keywords']
            else:
                card['position'] = 'reversed'
                card['keyword'] = card_info['reversed_meta']['keywords']

            cards_info.append(card)
        return cards_info

最後調整一下呼叫方式

def lambda_handler(event, context):

    # 接收 request
    json_str = json.dumps(event)
    body = json.loads(json_str)
    message = body.get("message")

    if message == "今日占卜":
        service = DailyService(bucket, key)
        return service.daily_tarot()

測試

{
  "message": "今日占卜"
}

生成內容的篇幅實在太長,另外做成好閱讀版:今日塔羅運勢解讀


上一篇
Day 28. 邊寫邊調整的開發日常
系列文
科學的盡頭是玄學?AI占卜小助手與知識庫驗證29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言