iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
AI & Data

不只是反覆 TRY AGAIN,煉金師懂得調配試煉的秘方。系列 第 21

煉金師的時間魔法 - Prompt Caching 讓 AI 不用每次都重新思考

  • 分享至 

  • xImage
  •  

當 AI 開始記住你的點單

昨天我們聊到 AI 的速度問題:TTFT (首個字元回應時間) 和 TPS (每秒生成字數) 就像餐廳的上菜速度和出餐效率。今天要聊的,是一個讓 AI 「瞬間變快」的魔法技巧。

想像你每天早上都去同一家咖啡廳,點同樣的「大杯熱拿鐵,半糖,加燕麥奶」。
第一種咖啡師:每次都要聽你完整說明,然後重新確認每個細節

「請問要什麼尺寸?」
「要熱的還是冰的?」
「糖度呢?」
「需要換植物奶嗎?」

第二種咖啡師:一看到你就開始準備

「老樣子?」
「好的,馬上來!」

這兩種咖啡師的差別,就是「有沒有記憶」。而在 AI 的世界裡,這種記憶就叫做「Prompt Caching」(提示快取)。

為什麼 AI 需要快取?

還記得我們在 Day 6-9 談過的 Context Engineering 嗎?我們學會了如何設計完整的上下文,包括系統指令、角色設定、範例、知識庫等等。但這裡有個殘酷的事實:
每次你問 AI 一個新問題,它都要重新「閱讀」一遍所有的上下文。
想像你是一位煉金師,每天早上開工時都要:

  • 重新整理工作檯 (系統提示)
  • 重新閱讀配方手冊 (角色設定和指令)
  • 重新檢視過去的實驗記錄 (對話歷史)
  • 重新翻閱參考資料 (RAG 檢索的文件)

即使這些東西昨天就看過了,今天還是要從頭來一遍。這不是很荒謬嗎?

Prompt Caching 的魔法原理

Prompt Caching 就像是給 AI 裝上「短期記憶」,讓它能記住最近處理過的上下文。
傳統方式 (沒有快取):
第一次請求:

系統提示 (5000 tokens) + 知識庫文件 (20000 tokens) + 使用者問題 (50 tokens)
→ AI 需要處理 25050 tokens

第二次請求 (1分鐘後):
系統提示 (5000 tokens) + 知識庫文件 (20000 tokens) + 新問題 (50 tokens)  
→ AI 又要重新處理 25050 tokens

使用快取:

第一次請求:
系統提示 (5000 tokens) + 知識庫文件 (20000 tokens) + 使用者問題 (50 tokens)
→ AI 處理 25050 tokens,並快取前 25000 tokens

第二次請求 (1分鐘後):
[從快取讀取 25000 tokens] + 新問題 (50 tokens)
→ AI 只需要處理 50 個新 tokens!

這就像是咖啡師記住了你的「老樣子」,不用每次都重新確認一遍。


等等的文章以 Anthropic 的 Claude 為例,可以參考這篇文章 https://docs.claude.com/en/docs/build-with-claude/prompt-caching

Claude Prompt Caching 的技術規格

在深入講解之前,讓我們先了解 Claude 快取的具體規格:

Claude 的快取會保留 5 分鐘

足夠應對連續對話 (使用者通常不會等超過 5 分鐘才問下一個問題)
不會佔用過多系統資源 (不像永久快取會消耗大量記憶體)
適合大多數實際應用場景

就像咖啡師的短期記憶,如果你超過 5 分鐘沒回來,他就會忘記你剛才點了什麼。

這設定可以調整,最多調整為一小時

最小快取單位

這是很多人忽略的關鍵細節:
Claude 3.5 Sonnet 和 Claude 3 Opus:最小 1024 tokens
Claude 3.5 Haiku:最小 2048 tokens
這意味著如果你的系統提示只有 500 tokens,快取根本不會生效!就像咖啡師不會為了「一杯美式」這麼簡單的訂單特別記住你,因為說一次也很快。

快取的經濟學

快取寫入 (Cache Write):基礎輸入價格 × 1.25
第一次建立快取時需付的費用
比正常輸入貴 25%

快取讀取 (Cache Hit):基礎輸入價格 × 0.1
從快取讀取時的費用
只要正常輸入的 10%!

如何在 Claude 中啟用快取?

快取不是自動啟用的,你需要明確標記:

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "你是一位專業的法律顧問,專精於台灣公司法..."
        },
        {
            "type": "text", 
            "text": "以下是公司法的完整條文內容...",
            "cache_control": {"type": "ephemeral"}  # 這裡標記要快取
        }
    ],
    messages=[
        {
            "role": "user",
            "content": "請問公司登記需要什麼文件?"
        }
    ]
)

關鍵重點:
cache_control: {"type": "ephemeral"} 就是啟用快取的魔法咒語
快取會從這個標記點往前延伸到上一個標記點 (或開頭)
所以要把最不會變動的內容放在快取區塊中

多層快取:分層記憶的藝術

Claude 支援多個快取點,就像煉金師的多層材料櫃:

pythonsystem=[
    {
        "type": "text",
        "text": "系統指令...",
        "cache_control": {"type": "ephemeral"}  # 快取點 1
    },
    {
        "type": "text",
        "text": "產品目錄...",
        "cache_control": {"type": "ephemeral"}  # 快取點 2
    }
]

這個設計的巧妙之處在於:

快取點 1:系統指令幾乎不變 → 快取命中率 99%
快取點 2:產品目錄偶爾更新 → 快取命中率 90%

假想案例 - 法律文件分析平台

律師事務所的 AI 助手需要分析大量法律文件

需求:
每份文件 50-100 頁 (約 50000 tokens)
律師會針對同一份文件問 10-20 個問題
需要快速回應,不能讓律師等太久

class LegalDocumentAnalyzer:
    def __init__(self):
        self.client = anthropic.Anthropic()
        
    def analyze_document(self, document_text):
        # 建立帶快取的系統提示
        self.system_prompt = [
            {
                "type": "text",
                "text": "你是專業的法律文件分析師,專精於合約審查..."
            },
            {
                "type": "text",
                "text": f"待分析文件:\n{document_text}",
                "cache_control": {"type": "ephemeral"}  # 快取文件內容
            }
        ]
    
    def ask_question(self, question):
        response = self.client.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=2048,
            system=self.system_prompt,
            messages=[{"role": "user", "content": question}]
        )
        return response.content[0].text

# 使用範例
analyzer = LegalDocumentAnalyzer()
analyzer.analyze_document(long_legal_document)

# 第一個問題 (建立快取)
answer1 = analyzer.ask_question("這份合約的有效期限是?")  # 約 8 秒

# 後續問題 (使用快取)
answer2 = analyzer.ask_question("違約條款是什麼?")  # 約 1.5 秒
answer3 = analyzer.ask_question("有哪些特殊條件?")  # 約 1.5 秒

實際效益:

速度:第一個問題 8 秒,後續問題 1.5 秒 (提升 5.3 倍)
成本:每份文件 20 個問題,成本從 $0.60 降到 $0.15 (節省 75%)
體驗:律師不用每次都等 8 秒,工作效率大幅提升

如果是以下幾種服務會比較建議啟用快取功能:
多輪對話系統:系統指令固定,使用者會連續提問
文件分析工具:待分析文件不變,使用者會問多個問題
客服機器人:產品知識庫固定,高頻率使用


現在,你不只知道如何讓 AI 給出正確答案,更知道如何讓它快速回應。Prompt Caching 不只是一個技術優化,而是思維的轉變:從「讓 AI 做對」到「讓 AI 做得又快又好」

最好的魔法,是讓人感覺不到魔法的存在。當使用者覺得「這個 AI 好快、好聰明」時,他們看不到背後精心設計的快取策略、優化的提示結構、完善的記憶管理。但這正是我們的價值所在——用科學與藝術,打造出看似神奇實則精密的系統。


上一篇
別讓使用者等到花兒都謝了 - AI 速度的真相
系列文
不只是反覆 TRY AGAIN,煉金師懂得調配試煉的秘方。21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言