企業平台

Vertex AI 上的 Claude 實戰功能:串流、輸出控制與內建工具

在 Vertex AI 上有四組功能最值得優先掌握:串流回應讓文字邊生成邊顯示,改善等待體驗;預填 assistant 訊息能指定回答的開頭與方向;搭配 stop sequences 可以拿到不含多餘說明的結構化資料;內建的 text editor 與 web search 工具則讓 Claude 能操作檔案、查詢網路並附上出處。
Vertex AI 上的 Claude 實戰功能:串流、輸出控制與內建工具:文章重點卡

Vertex AI 上的 Claude 實戰功能:串流、輸出控制與內建工具

環境接好、對話跑通之後,接下來是把體驗跟輸出品質做出來的部分。這一篇挑出投資報酬率最高的四組功能:串流回應預填 assistant 訊息stop sequences,以及 Claude 內建的兩個工具

它們的共同點是:程式碼改動都很小,但一個改善使用者的等待體驗,一個讓你精準控制輸出,最後一個直接幫 Claude 長出操作檔案與查網路的手腳。

你將學到什麼

串流回應

讓回應逐塊出現,使用者不再盯著轉圈圈。

預填與停止序列

控制 Claude 從哪裡開始說、說到哪裡停。

結構化資料

兩招合體,拿到不含多餘說明的純 JSON。

內建工具

text editor 與 web search 的開箱用法。

串流回應:別讓使用者乾等

一個回應可能要生成十幾二十秒,標準做法是等全部生成完才回傳,使用者只能盯著載入動畫。串流把這件事翻過來:Claude 一邊生成、一邊把文字分塊送回來,你的伺服器再即時轉發給前端,使用者看著回答逐字浮現。

MessageStartContentBlockDelta文字塊ContentBlockDelta文字塊MessageStop伺服器把每個文字塊即時轉發給前端顯示
一次請求、一連串事件:文字裝在一個個 ContentBlockDelta 裡陸續抵達。

事件有好幾種(MessageStart、ContentBlockStart、ContentBlockDelta、ContentBlockStop、MessageDelta、MessageStop),做文字顯示只要關心 ContentBlockDelta。與其自己解析事件,直接用 SDK 的簡化介面最省事:

with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        print(text, end="")

    final_message = stream.get_final_message()

text_stream 會自動濾掉雜訊、只吐文字;跑完之後 get_final_message 給你組裝好的完整訊息,拿去存資料庫或接回對話歷史都方便。留意每個文字塊不保證剛好一個字,可能是好幾個詞甚至一整句。實務上,前端通常透過 WebSocket 或 Server-Sent Events 接收這些文字塊。

預填 assistant 訊息:指定開頭

第二招是預填(prefill):在訊息清單最後放一則你先寫好開頭的 assistant 訊息。Claude 看到會認為「我已經開始回答了」,於是從你寫的開頭接著寫下去,不會重複那段文字。問「早餐喝茶還是咖啡好」,正常會得到兩邊都講的平衡回答;但預填一句開頭,走向就由你定了:

messages = []
add_user_message(messages, "Is tea or coffee better at breakfast?")
add_assistant_message(messages, "Coffee is better because")
answer = chat(messages)

換一句預填就換一個立場:想幫茶說話就預填茶的開頭,想要唱反調就預填「兩個都不怎麼樣,因為」。這是引導回答方向成本最低的一招。

Stop sequences:說到哪裡停

stop sequences 是一份字串清單:Claude 一旦生成其中任何一個字串,立刻停止並回傳到目前為止的內容。請它從 1 數到 10、停止序列設成 5,你就只會拿到 1 到 4:

add_user_message(messages, "Count from 1 to 10")
answer = chat(messages, stop_sequences=["5"])
# => "1, 2, 3, 4, "

停止字串可以寫得更精準:想去掉尾巴的逗號與空格,就把序列設成含逗號的完整片段。常見用途包括限制清單長度、在特定分隔符號停下、避免回應無限延伸。

兩招合體:拿到乾淨的結構化資料

要 Claude 生成 JSON 這類結構化資料時,它總想「順便解釋一下」,前後包一堆說明文字與 markdown 圍欄,使用者沒辦法按下複製就直接用。解法是把預填跟停止序列合體:預填一個 markdown 程式碼區塊的開頭,再把區塊結尾的三個反引號設成停止序列。

messages = []

add_user_message(messages, "Generate a very short event bridge rule as json")
add_assistant_message(messages, "```json")

text = chat(messages, stop_sequences=["```"])

Claude 看到預填,認定 JSON 區塊已經開了頭,直接寫內容;寫完想收尾補上三個反引號的瞬間,撞上停止序列,生成即停。你拿到的就是頭尾之間乾乾淨淨的 JSON,頂多 strip 掉幾個換行再解析驗證。這招對任何格式都有效:Python 程式碼、條列清單,原理相同。

內建工具:text editor 與 web search

Claude 還帶著兩個不用從零打造的內建工具。第一個是 text editor 工具:檢視檔案與目錄、看指定行數範圍、取代文字、建立新檔、插入內容、復原編輯,等於讓 Claude 具備動手改檔案的能力。

有個示範很有畫面:請 Claude 打開 main.py 摘要內容,它會自己用工具檢視檔案再回報;再請它寫一個把圓周率算到小數第五位的函式、順便建立 test.py 測試檔,它就一步一步檢視、改寫、建檔。要注意分工:工具的 schema 是 Claude 內建的,你只要附一個小小的 schema 存根,但實際執行檔案操作的函式要自己寫

Claude 知道怎麼提出請求,執行端在你手上,這也是安全邊界所在。各模型對應的工具版本字串,以 docs.anthropic.com 的官方文件為準。

第二個是 web search 工具,而且它更省事:連實作都不用寫,搜尋整段由 Claude 端自動完成。你只要在 tools 清單裡放一個 schema:

web_search_schema = {
    "type": "web_search_20250305",
    "name": "web_search",
    "max_uses": 5,
    "allowed_domains": ["nih.gov"]
}

max_uses 限制搜尋次數,因為 Claude 可能依初步結果追加搜尋;allowed_domains 把來源限定在你信任的網域,例如只查官方或學術網站,而不是隨便一篇部落格。回應裡除了文字,還帶著搜尋查詢、逐筆結果與引用位置,前端可以把來源清單與內文引用一起渲染出來,讓使用者能核對每一句話的出處。

收個尾四組功能各自解決一件事:串流買體驗、預填買方向、停止序列買格式、內建工具買能力。改動都不大,先從串流開始加,一項一項驗證上線。
參考出處本文取材自 Anthropic 官方 Claude Academy 免費課程「Claude with Google Cloud's Vertex AI」,由酒Ann 消化後以自己的視角重新編寫。想看英文原版課程,可到 Claude Academy 修習。

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

串流時怎麼拿到完整訊息?
用 SDK 的 stream 介面跑完 text_stream 之後,呼叫 get_final_message 就能取得組裝好的完整訊息物件,方便存進資料庫或接回對話歷史。
預填訊息是什麼?
在訊息清單最後放一則你寫好開頭的 assistant 訊息,Claude 會認為自己已經開始回答,直接從那個開頭接著寫下去,不會重複你寫的部分。
web search 工具要自己實作嗎?
不用。提供一個簡單的 schema 就能啟用,搜尋由 Claude 端自動完成,可用 max_uses 限制次數、用 allowed_domains 限定來源網域,回應還附引用。
text editor 工具也不用實作嗎?
schema 是內建的,但實際的檔案操作函式要自己寫:Claude 知道怎麼提出檔案操作請求,真正執行讀寫的程式碼在你手上。