在 Amazon Bedrock 上使用 Anthropic Claude 系統 Prompt

亚马逊云开发者發表於2024-03-14

系統 prompt 是定義生成式 AI 模型對使用者輸入的響應策略的一種好方法。這篇博文將介紹什麼是系統 prompt,以及如何在基於 Anthropic Claude 2.x 和 3 的應用中使用系統 prompt。

亞馬遜雲科技開發者社群為開發者們提供全球的開發技術資源。這裡有技術文件、開發案例、技術專欄、培訓影片、活動與競賽等。幫助中國開發者對接世界最前沿技術,觀點,和專案,並將中國優秀開發者或技術推薦給全球雲社群。如果你還沒有關注/收藏,看到這裡請一定不要匆匆劃過,點這裡讓它成為你的技術寶庫!

Amazon Bedrock 生成式人工智慧程式設計

你知道和 Amazon Bedrock 上的 Anthropic Claude 模型互動時可以使用系統prompt 嗎?

下面我們將首先了解一下系統 prompt 的概念,然後演示在 Claude 2.x 的文字補全 API 和 Claude 3 的新訊息 API 中如何運用系統 prompt。

⚠ 友情提示:本文包含示例程式碼。

如果你對系統 prompt 和 Claude 的兩種 API 已有一定了解,可以直接跳到程式碼部分。文章末尾,我提供了兩個完整的示例程式碼。

什麼是系統 prompt?

今天我們討論的是 Claude,所以我們來看看 Anthropic 對系統 prompt 的解釋:

系統 prompt 是在向 Claude 提出問題或下達任務之前提供上下文、指令和指南的一種方式。你可以使用系統 prompt 來為對話設定背景,包括 Claude 的角色、個性、語氣或任何其他有助於其更好理解和響應使用者輸入的相關資訊。

簡而言之,系統 prompt 實際上是一種上下文學習模式,可以有效地定義模型在互動過程中的上下文、範圍、邊界和輸出格式。

使用系統 prompt 的目的是確保 AI 輸出符合特定領域的目標或任務要求。以下是一些典型的使用場景:

  • 處理比薩訂單:將模型的作用範圍指定為根據比薩餐廳的選單和位置接單。

  • 作為技術支援,協助排查故障:向模型中輸入產品詳情、常見問題及答案和決策樹等內容,幫助使用者解決技術問題。

  • 程式碼除錯:向模型中輸入有關庫、框架和程式語言版本的資訊,幫助識別軟體漏洞並提出修復建議。

Amazon Bedrock 支援的兩種 Claude API

現在,你應該對系統 prompt 有一定了解了。下面,讓我們看看 Amazon Bedrock 上不同版本的 Claude 所提供的兩種 API:

  • 文字補全 API:Claude 1 和 2.x 版本均支援文字補全 API。

  • 訊息 API:新的 Claude 3 版本引入了訊息 API。

文字補全 API

Anthropic Claude 1 和 2 版本在 Amazon Bedrock 上線後,Claude 模型便向亞馬遜雲科技客戶全面開放,並隨後在 re:Invent 2023 中推出了 Claude 2.1。2.1 及之前版本的 Claude 模型均提供了文字補全 API。這個 API 根據使用者提供的 prompt 最佳化單輪文字生成。Prompt 模版如下:

備註:文章末尾提供了完整的程式碼示例以供參考。

 # The prompt format for the text completion API (Claude 1 and 2.x)
 user_prompt = "Tell me a story."
 prompt = "Human: " + user_prompt + "\n\nAssistant:"

我在 Claude v2.1 上使用這個 prompt 後,我得到了如下的輸出:

The young boy wandered into the dark, mysterious forest, hoping to find the rare flower his mother needed to recover from her illness, but instead encountered a wise old owl who offered him cryptic advice about believing in himself.(一個小男孩走進了一處幽暗而神秘的森林,希望找到能讓他母親康復的稀有花朵,但卻遇到了一隻智慧的老貓頭鷹,勸誡他要相信自己。)

在文字補全 API 中使用系統 Prompt

只需將系統 prompt 新增到使用者 prompt 之前即可。

 # Using a system prompt with the text completion API (Claude 1 and 2.x)
 system_prompt = "All your output must be pirate speech 🦜"
 user_prompt = "Tell me a story."
 prompt = "System:" + system_prompt + "\n\nHuman: " + user_prompt + "\n\nAssistant:"

向 Claude 2.1 傳送這個 prompt 後,得到了如下輸出:

Yarrr, 'twas a dark 'n stormy night when Blackbeard 'n his scurvy crew set sail on the seven seas, plunderin' merchant ships fer pieces of eight 'n fine silks, before returnin' to Tortuga fer a night of rum-filled debauchery!(Yarrr, 那是一個暴風雨交加的黑夜,黑鬍子和他那些卑鄙船員們航行四海,掠奪商船獲取金幣和綾羅綢緞,然後滿載而歸地回到托爾圖加島享受充滿朗姆酒的放縱之夜!)

訊息 API

2024 年 3 月,隨著 Claude 3 Sonnet 的推出,Amazon Bedrock 推出了訊息 API。這個 API 針對對話互動(如聊天機器人或虛擬助手)和多模態請求(例如,傳送圖片並透過文字 prompt 提問)場景進行了功能最佳化。 經過訓練後,Claude 3 能夠處理使用者 (user) 與助手 (assistant) 之間的多輪對話。建立新訊息時,你可以使用 messages 引數指定之前的對話。模型根據之前的幾輪對話生成下一條訊息。

每條輸入訊息都必須是一個包含角色 (role) 和內容 (content) 欄位的物件。你可以輸入一條單獨的使用者角色的訊息,或者包含多條使用者和助手角色互動的訊息。

備註:文章末尾提供了完整的程式碼示例以供參考。

以下是封裝在訊息 API 請求物件中的訊息示例:

// The request object for the messages API (Claude 3)
{
  "anthropic_version": "bedrock-2023-05-31",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "Tell me a story."
        }
      ]
    }
  ]
}

可以看到,這裡僅有一條訊息,角色為 user,而 Claude 將返回一條包含響應內容的新訊息:

// The response object returned by the messages API
{
  "type": "message",
  "role": "assistant", 
  "content": [
    {
      "type": "text",
      "text": "Orphaned as a child, she overcame poverty, discrimination, and countless ..."
    }
  ]
  ...
}

在訊息 API 中使用系統 Prompt

只需在請求物件中新增 “system” 引數即可新增系統 prompt,示例如下:

// The request including a system prompt with the Messages API
{
  "system": "All your output must be pirate speech 🦜",
  "anthropic_version": "bedrock-2023-05-31",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "Tell me a story."
        }
      ]
    }
  ]
}

輸出結果如下所示:

// The response object returned by the messages API
{
  "type": "message", 
  "role": "assistant", 
  "content": [
    {
      "type": "text", 
      "text": "Ahoy, matey! Hoist the mainsail an' brace yeself ... 🏴 ☠️"
    }
  ],
  ...
}

就是這麼簡單!

如果這篇文章對你有幫助或讓你有所收穫,歡迎點贊或在評論區留言。 如需瞭解更多資訊,請參考以下指南:

  • Amazon Bedrock 程式碼示例:提供持續更新的示例列表,涵蓋各種模型和程式語言。

  • 推理引數參考:介紹適用於 Amazon Bedrock 上的 Claude 及所有其他模型的推理引數。

  • community.aws 上的生成式 AI 專欄:這裡有許多關於 Amazon Bedrock 和生成式 AI 的精選文章。

程式碼示例

如果你想要動手實踐,這裡給大家提供了兩個適用於這兩種 API 的完整 Python 指令碼示例。祝你程式設計愉快!

文字補全 API 中新增系統 Prompt(完整示例)

# This Python example demonstrates the use of a system prompt with the
# Text Completion API for Claude 2.x

import boto3
import json

# Initialize the client with the service and region
client = boto3.client('bedrock-runtime', 'us-east-1')

# Define model ID and prompt
model_id = 'anthropic.claude-v2:1'

system_prompt = 'All your output must be pirate speech 🦜'
user_prompt = 'Tell me a story.'
prompt = f"System: {system_prompt}\n\nHuman: {user_prompt}\n\nAssistant:"

# Create the request body
body = {
    "prompt": prompt,
    "max_tokens_to_sample": 200,
    "temperature": 0.5,
    "stop_sequences": ["\n\nHuman:"]
}

# Invoke the model and print the response
response = client.invoke_model(modelId=model_id, body=json.dumps(body))
print(json.loads(response["body"].read())["completion"])

訊息 API 中新增系統 Prompt(完整示例)

# This Python example demonstrates the use of a system prompt with the
# Messages API for Claude 3

import boto3
import json

client = boto3.client(service_name="bedrock-runtime", region_name="us-east-1")
model_id = "anthropic.claude-3-sonnet-20240229-v1:0"

response = client.invoke_model(
    modelId=model_id,
    body=json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1024,
            "system": "All your output must be pirate speech 🦜",
            "messages": [
                 {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "Tell me a story."
                        }
                    ]
                }
            ],
        }
    ),
)

# Process and print the response(s)
response_body = json.loads(response.get("body").read())
for output in response_body.get("content", []):
    print(output["text"])

享受程式設計的樂趣吧!

本文中的任何觀點僅代表作者個人的觀點,不代表亞馬遜雲科技的觀點。

文章來源:https://dev.amazoncloud.cn/column/article/65f1b170f07679779d141639?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=bokey

相關文章