提示工程是指編寫指令以從基礎模型(FMs)獲得期望響應的實踐。您可能需要花費幾個月的時間來實驗和迭代您的提示,遵循每個模型的最佳實踐,以達到所需的輸出。此外,這些提示是特定於模型和任務的,當它們與不同的基礎模型一起使用時,性能並不能保證。這一手動努力使得提示工程的過程可能會減慢您測試不同模型的能力。
今天,我們很高興地宣布在 Amazon Bedrock 上提供提示優化功能。通過這一功能,您現在可以通過一次 API 調用或在 Amazon Bedrock 控制台上點擊一個按鈕,優化您針對多種使用案例的提示。
在這篇文章中,我們將討論如何使用這一新功能開始,並通過一個示例用例來進行說明,此外還會討論一些性能基準。
解決方案概述
在撰寫時,Amazon Bedrock 的提示優化支持 Anthropic 的 Claude 3 Haiku、Claude 3 Sonnet、Claude 3 Opus 和 Claude-3.5-Sonnet 模型,Meta 的 Llama 3 70B 和 Llama 3.1 70B 模型,Mistral 的大型模型以及 Amazon 的 Titan Text Premier 模型。提示優化可以顯著改善生成式 AI 任務的性能。我們進行了一些針對多種任務的示例性能基準,並進行了討論。
在接下來的幾個部分中,我們將展示如何使用提示優化功能。對於我們的使用案例,我們希望優化一個查看通話或聊天記錄並對下一步最佳行動進行分類的提示。
使用自動提示優化
要開始使用此功能,請完成以下步驟:
在 Amazon Bedrock 控制台上,選擇導航窗格中的提示管理。
選擇創建提示。
輸入提示的名稱和可選描述,然後選擇創建。
對於用戶消息,輸入您想要優化的提示模板。
例如,我們希望優化一個查看通話或聊天記錄並將下一步最佳行動分類為以下之一的提示:
等待客戶輸入
分配代理
升級
以下截圖顯示我們的提示在提示生成器中的樣子。
在配置面板中,對於生成式 AI 資源,選擇模型並選擇您偏好的模型。對於本示例,我們使用 Anthropic 的 Claude 3.5 Sonnet。
選擇優化。
彈出窗口顯示您的提示正在被優化。
當優化完成後,您應該能夠看到原始提示和優化提示的並排視圖,針對您的使用案例。
向您的測試變量(在這種情況下為記錄)添加值,然後選擇運行。
然後,您可以看到模型以所需格式輸出的結果。
在這個例子中,我們可以看到,提示更加明確,對如何處理提供的原始記錄有清晰的指示。這導致正確的分類,以所需的輸出格式。一旦提示經過優化,可以通過創建一個版本來部署到應用程序中,該版本創建其配置的快照。可以存儲多個版本,以便在不同的用例提示配置之間切換。請參見提示管理以獲取有關提示版本控制和部署的更多詳細信息。
性能基準
我們在幾個開源數據集上運行了提示優化功能。我們很高興分享在幾個重要且常見的用例中看到的改進,這些是我們看到客戶使用的:
摘要(XSUM)
基於 RAG 的對話延續(DSTC)
函數調用(GLAIVE)
為了測量相對於基準提示的性能改進,我們對摘要用例使用 ROUGE-2 F1,對對話延續用例使用 HELM-F1,對函數調用使用 HELM-F1 和 JSON 匹配。我們在摘要用例上看到了 18% 的性能改進,在對話完成上看到了 8%,在函數調用基準上看到了 22% 的性能改進。以下表格包含詳細結果。
使用案例
原始提示
優化提示
性能改進
摘要
首先,請閱讀以下文章。{context} 現在,您能為它寫一個極短的摘要嗎?
<task>您的任務是提供一個簡明的 1-2 句話摘要,捕捉給定文本的主要觀點或關鍵信息。</task><context>{context}</context><instructions>請仔細閱讀所提供的文本,徹底理解其內容。然後,用您自己的話生成一個簡短的摘要,這個摘要應該比原始文本短得多,同時仍然保留核心思想和重要細節。摘要應該簡潔而有信息量,以 1-2 句話捕捉文本的本質。</instructions><result_format>摘要:[在此寫下您的 1-2 句話摘要]</result_format>
18.04%
對話延續
可用的函數:{available_functions}函數調用示例:輸入:函數:[{“name”: “calculate_area”, “description”: “計算形狀的面積”, “parameters”: {“type”: “object”, “properties”: {“shape”: {“type”: “string”, “description”: “形狀的類型(例如:矩形、三角形、圓形)”}, “dimensions”: {“type”: “object”, “properties”: {“length”: {“type”: “number”, “description”: “形狀的長度”}, “width”: {“type”: “number”, “description”: “形狀的寬度”}, “base”: {“type”: “number”, “description”: “形狀的基底”}, “height”: {“type”: “number”, “description”: “形狀的高度”}, “radius”: {“type”: “number”, “description”: “形狀的半徑”}}}}, “required”: [“shape”, “dimensions”]}}]對話歷史:用戶:您能計算長度為 5 和寬度為 3 的矩形的面積嗎?輸出:{“name”: “calculate_area”, “arguments”: {“shape”: “rectangle”, “dimensions”: {“length”: 5, “width”: 3}}}輸入:函數:[{“name”: “search_books”, “description”: “根據標題或作者搜索書籍”, “parameters”: {“type”: “object”, “properties”: {“search_query”: {“type”: “string”, “description”: “要搜索的標題或作者”}}, “required”: [“search_query”]}}]對話歷史:用戶:我在找 J.K. 羅琳的書。您能幫我找到它們嗎?輸出:{“name”: “search_books”, “arguments”: {“search_query”: “J.K. Rowling”}}輸入:函數:[{“name”: “calculate_age”, “description”: “根據出生日期計算年齡”, “parameters”: {“type”: “object”, “properties”: {“birthdate”: {“type”: “string”, “format”: “date”, “description”: “出生日期”}}, “required”: [“birthdate”]}}]對話歷史:用戶:嗨,我的出生日期是 1990-05-15。您能告訴我我今天幾歲嗎?輸出:{“name”: “calculate_age”, “arguments”: {“birthdate”: “1990-05-15”}}當前聊天歷史:{conversation_history}對最後一條消息做出響應。如果需要,調用函數。
任務:通過調用適當的函數來響應用戶在給定對話中的消息(如果需要)。
指令:1. 審查可用函數列表:<available_functions>{available_functions}</available_functions>
2. 研究如何調用這些函數的示例:<fewshot_examples>
<example>H:<context>函數:[{“name”: “calculate_area”, “description”: “計算形狀的面積”, “parameters”: {“type”: “object”, “properties”: {“shape”: {“type”: “string”, “description”: “形狀的類型(例如:矩形、三角形、圓形)”}, “dimensions”: {“type”: “object”, “properties”: {“length”: {“type”: “number”, “description”: “形狀的長度”}, “width”: {“type”: “number”, “description”: “形狀的寬度”}, “base”: {“type”: “number”, “description”: “形狀的基底”}, “height”: {“type”: “number”, “description”: “形狀的高度”}, “radius”: {“type”: “number”, “description”: “形狀的半徑”}}}}, “required”: [“shape”, “dimensions”]}}]</context><question>用戶:您能計算長度為 5 和寬度為 3 的矩形的面積嗎?</question>A:<output>{“name”: “calculate_area”, “arguments”: {“shape”: “rectangle”, “dimensions”: {“length”: 5, “width”: 3}}}</output></example>
<example>H:<context>函數:[{“name”: “search_books”, “description”: “根據標題或作者搜索書籍”, “parameters”: {“type”: “object”, “properties”: {“search_query”: {“type”: “string”, “description”: “要搜索的標題或作者”}}, “required”: [“search_query”]}}]</context><question>用戶:我在找 J.K. 羅琳的書。您能幫我找到它們嗎?</question>A:<output>{“name”: “search_books”, “arguments”: {“search_query”: “J.K. Rowling”}}</output></example>
<example>H:<context>函數:[{“name”: “calculate_age”, “description”: “根據出生日期計算年齡”, “parameters”: {“type”: “object”, “properties”: {“birthdate”: {“type”: “string”, “format”: “date”, “description”: “出生日期”}}, “required”: [“birthdate”]}}]</context><question>用戶:嗨,我的出生日期是 1990-05-15。您能告訴我我今天幾歲嗎?</question>A:<output>{“name”: “calculate_age”, “arguments”: {“birthdate”: “1990-05-15”}}</output></example>
</fewshot_examples>
3. 仔細閱讀當前的對話歷史:<conversation_history>{conversation_history}</conversation_history>
4. 分析用戶的最後一條消息,確定是否需要調用任何可用函數來提供適當的響應。
5. 如果需要函數調用,請按照示例中演示的格式調用相關函數,並提供所需的參數。
6. 如果不需要函數調用,則直接響應用戶的消息。
7. 您的響應應簡潔、相關並針對對話的具體上下文進行定制。
8. 將您的最終響應包含在 <response></response> 標籤中,無需任何額外的開場白或解釋。
在這些指令後立即提供您的響應,按照指定格式。
8.23%
函數調用
## 檢索的知識片段
領域:餐廳 實體:THE COPPER KETTLE 評論:我的朋友馬克帶我去銅壺慶祝我的晉升。我決定犒勞自己吃牧羊人派。味道沒有我想的那麼濃郁,質地也只是流動的,但服務員很棒,我喜歡從露台上看到的景色。等到溫布頓時,我也許會回來試試草莓和奶油..重點:味道沒有我想的那麼濃郁,質地也只是流動的,但服務員很棒,我喜歡從露台上看到的景色。
領域:餐廳 實體:THE COPPER KETTLE 評論:上週,我的同事和我訪問了提供英國菜的 THE COPPER KETTLE。我們從餐廳裡面享受了美麗的景色。氛圍令人愉快,餐廳位於一個不錯的地區。然而,食物平平,份量也很少。重點:我們從餐廳裡面享受了美麗的景色。
## 對話
用戶:你好,我在找一家英國餐廳吃早餐。
代理:有幾家英國餐廳可供選擇。您更喜歡中等還是昂貴的價格範圍?
用戶:請中等價格範圍。
代理:有五家餐廳符合您的標準。四家在市中心區域,一家在西部。您更喜歡哪個地區?
用戶:我想要市中心區域。
代理:怎麼樣,考慮一下 The Copper Kettle?
用戶:他們提供好的視野嗎?
代理:
根據來自檢索增強生成(RAG)系統的上述信息,對用戶的問題做出適當的回答。
<task_description>您是一個先進的問答系統,利用檢索增強生成(RAG)系統的信息來為用戶查詢提供準確和相關的響應。</task_description><instructions>1. 仔細審查提供的上下文信息:<context>領域:餐廳 實體:THE COPPER KETTLE 評論:我的朋友馬克帶我去銅壺慶祝我的晉升。我決定犒勞自己吃牧羊人派。味道沒有我想的那麼濃郁,質地也只是流動的,但服務員很棒,我喜歡從露台上看到的景色。等到溫布頓時,我也許會回來試試草莓和奶油..重點:味道沒有我想的那麼濃郁,質地也只是流動的,但服務員很棒,我喜歡從露台上看到的景色。領域:餐廳 實體:THE COPPER KETTLE 評論:上週,我的同事和我訪問了提供英國菜的 THE COPPER KETTLE。我們從餐廳裡面享受了美麗的景色。氛圍令人愉快,餐廳位於一個不錯的地區。然而,食物平平,份量也很少。重點:我們從餐廳裡面享受了美麗的景色。</context>2. 分析用戶的問題:<question>用戶:你好,我在找一家英國餐廳吃早餐。代理:有幾家英國餐廳可供選擇。您更喜歡中等還是昂貴的價格範圍?用戶:請中等價格範圍。代理:有五家餐廳符合您的標準。四家在市中心區域,一家在西部。您更喜歡哪個地區?用戶:我想要市中心區域。代理:怎麼樣,考慮一下 The Copper Kettle?用戶:他們提供好的視野嗎?
代理:</question>
3. 利用上下文信息和您的知識生成簡潔準確的答案,以回應用戶的問題。
4. 確保您的回答直接針對具體查詢,同時包含上下文中的相關細節。
5. 以清晰易懂的方式提供您的答案,無需多餘的開場白或解釋。</instructions>
<output_format>答案:[在此插入您的簡潔答案]</output_format>
<example>上下文:埃菲爾鐵塔是位於法國巴黎的鑄鐵格子塔。它以其設計和建造的工程師古斯塔夫·埃菲爾的名字命名。它於 1887 年至 1889 年間建造,作為 1889 年世界博覽會的中心,最初遭到了法國一些領先藝術家和知識分子對其設計的批評,但它已成為法國的全球文化象徵和世界上最具識別性的建築之一。
問題:埃菲爾鐵塔是什麼?
答案:埃菲爾鐵塔是位於法國巴黎的鑄鐵格子塔,以其設計者古斯塔夫·埃菲爾的名字命名,並作為 1889 年世界博覽會的中心建造。
</example>
22.03%
在不同任務中的持續改進突顯了提示優化在提升各種自然語言處理(NLP)任務的提示性能方面的穩健性和有效性。這顯示了提示優化可以節省大量時間和精力,同時通過測試使用優化提示的模型來實現更好的結果,並實施每個模型的最佳實踐。
結論
Amazon Bedrock 上的提示優化使您能夠輕鬆提升提示在多種使用案例中的性能,僅需一次 API 調用或在 Amazon Bedrock 控制台上點擊幾下。對於摘要、對話延續和函數調用等任務的開源基準上顯示的顯著改進強調了這一新功能在顯著簡化提示工程過程中的能力。Amazon Bedrock 上的提示優化使您能夠輕鬆測試多個不同的模型以滿足您的生成式 AI 應用程序需求,並遵循每個模型的最佳提示工程實踐。減少的手動努力將大大加速您組織中生成式 AI 應用程序的開發。
我們鼓勵您嘗試將提示優化應用於您自己的使用案例,並隨時向我們反饋和合作。
關於作者
Shreyas Subramanian 是一位首席數據科學家,通過使用生成式 AI 和深度學習幫助客戶解決他們的商業挑戰,利用 AWS 服務。Shreyas 具有大型優化和機器學習的背景,並在利用機器學習和增強學習加速優化任務方面具有經驗。
Chris Pecora 是 Amazon Web Services 的生成式 AI 數據科學家。他熱衷於構建創新的產品和解決方案,同時專注於以客戶為中心的科學。在不進行實驗和跟進生成式 AI 最新動態的時候,他喜歡與孩子們共度時光。
Zhengyuan Shen 是 Amazon Bedrock 的應用科學家,專注於基礎模型和複雜任務的機器學習建模,包括自然語言和結構化數據理解。他熱衷於利用創新的機器學習解決方案來增強產品或服務,從而通過科學和工程的無縫結合來簡化客戶的生活。在工作之外,他喜歡運動和烹飪。
Shipra Kanoria 是 AWS 的首席產品經理。她熱衷於幫助客戶利用機器學習和人工智能的力量解決他們最複雜的問題。在加入 AWS 之前,Shipra 在亞馬遜 Alexa 工作了四年多,推出了許多與生產力相關的功能。