提示工程的品質直接影響大語言模型(LLM)的輸出結果。良好的提示工程能引導模型生成更準確、更符合預期的內容。本文從指定輸出格式開始,逐步探討評估和提升提示工程品質的關鍵技術,並提供實用的程式碼範例和操作。開發者需要理解如何明確指定輸出格式,例如 JSON,以確保輸出的可靠性和一致性,避免在整合到生產環境時出現錯誤。同時,選擇合適的評估方法,例如標準化評測或特定任務評估,對於衡量提示工程的有效性至關重要。

在實際應用中,我們可以使用 OpenAI API 進行提示測試,並將結果儲存於 CSV 檔案中,以便後續分析和評估。透過 Python 程式碼,我們可以輕鬆地執行多輪測試,並收集模型的回應。此外,結合使用者反饋,例如 thumbs-up/thumbs-down 評分系統,可以進一步提升提示工程的品質。值得注意的是,自動化評估和人工評估各有優劣,在實際應用中, often 需要將兩者結合起來,才能獲得最佳的評估結果。

指定輸出格式的重要性

在與AI模型互動時,明確指定輸出格式是至關重要的。AI模型具有高度的靈活性,可以根據輸入生成多種不同格式的輸出。然而,這種靈活性也可能導致輸出格式的不一致,從而在實際應用中造成錯誤或解析困難。因此,透過明確指示AI模型所需的輸出格式,可以有效提高輸出的可靠性和可用性。

為何需要指定格式

AI模型的輸出格式可能會因輸入提示的不同而有所變化。例如,同一個提示可能在一種情況下傳回一個編號列表,而在另一種情況下傳回一個逗號分隔的列表。這種變化在大多數一次性使用的場景中可能不是大問題,但在將AI工具整合到生產軟體中時,輸出格式的變化可能會導致各種錯誤。

如何指定格式

  1. 文字生成模型:對於文字生成模型,輸出JSON格式通常是一個好的選擇,因為JSON是API回應的通用格式,便於解析和錯誤檢測。此外,JSON格式也便於用於渲染前端HTML。

    [
      {
        "Product description": "A home milkshake maker.",
        "Product names": ["HomeShaker", "Fit Shaker", "QuickShake", "Shake Maker"]
      },
      {
        "Product description": "A watch that can tell accurate time in space.",
        "Product names": ["AstroTime", "SpaceGuard", "Orbit-Accurate", "EliptoTime"]
      }
    ]
    

    當需要將輸出格式指定為JSON時,應確保提示中提供的範例也是JSON格式,並且保持JSON的不完整狀態,以引導模型完成它。

    [
      {
        "Product description": "A pair of shoes that can fit any foot size.",
        "Product names": ["FlexFit Footwear", "OneSize Step", "Adapt-a-Shoe", "Universal Walker"]
      }
    ]
    

    這種方式可以確保輸出的JSON是完整的,並且可以透過JSON解析器(如Python的json函式庫)進行解析,從而檢測輸出是否正確。

  2. 影像生成模型:對於影像生成模型,格式的指定同樣重要。影像的格式可以從常見的庫存照片、插圖到特殊的格式,如行車記錄儀影片或Minecraft中的影像。

    business meeting of four people watching on MacBook on top of table, in Minecraft
    

    此類別提示指定了所需的影像格式(在本例中為Minecraft風格的影像),從而生成符合特定格式的影像。

    影像格式範例

    此圖示展示瞭如何在Minecraft中呈現一個商務會議的場景。

      graph LR;
        A[商務會議] --> B[Minecraft 環境];
        B --> C[四人會議];
        C --> D[觀看 MacBook];
    

    圖表翻譯: 此圖表展示瞭如何在Minecraft環境中呈現一個四人商務會議的場景,會議參與者正在觀看一台放在桌子上的MacBook。

處理格式衝突

在某些情況下,指定的格式可能與提示的其他方面發生衝突。例如,如果提供了一張庫存照片作為基礎影像,則生成的影像可能會是庫存照片和指定格式的混合物。在這種情況下,可能需要移除或調整提示中的某些元素,以確保輸出的格式符合要求。

與給予指示的關係

指定格式和給予指示(即第一原則)之間存在一定的重疊。指定格式關注的是輸出的型別(如JSON或庫存照片格式),而給予指示則關注的是輸出的風格(如以Steve Jobs的風格命名產品或以梵谷風格繪製影像)。當格式和風格之間發生衝突時,通常需要根據最終結果的重要性來解決衝突。

提供範例的重要性

除了指定格式外,提供範例是提高AI模型輸出品質的另一個關鍵因素。範例可以幫助模型理解所需的輸出格式和風格,從而生成更準確、更符合預期的結果。

為何需要提供範例

提供範例可以顯著提高AI模型的表現,特別是在需要特定輸出格式或風格的任務中。研究表明,即使提供一個範例(稱為one-shot learning),也可以顯著提高模型的準確性。

如何提供範例

  1. 選擇多樣且具有代表性的範例:選擇能夠代表所需輸出格式和風格的範例。

    [
      {
        "Product description": "A home milkshake maker.",
        "Product names": ["HomeShaker", "Fit Shaker", "QuickShake", "Shake Maker"]
      },
      {
        "Product description": "A watch that can tell accurate time in space.",
        "Product names": ["AstroTime", "SpaceGuard", "Orbit-Accurate", "EliptoTime"]
      }
    ]
    

    在這個範例中,提供了兩個產品描述和對應的產品名稱列表,展示了所需的JSON格式。

  2. 確保範例的多樣性:範例應涵蓋不同的場景和情況,以幫助模型更好地理解所需的輸出。

    # 不同格式的範例
    - JSON格式
    - 庫存照片
    - Minecraft風格影像
    

    程式碼範例與解析

    import json
    
    # 定義產品描述和名稱
    product_description = "A pair of shoes that can fit any foot size."
    product_names = ["FlexFit Footwear", "OneSize Step", "Adapt-a-Shoe", "Universal Walker"]
    
    # 組織成JSON格式
    output_json = [
      {
        "Product description": product_description,
        "Product names": product_names
      }
    ]
    
    # 輸出JSON
    print(json.dumps(output_json, indent=2))
    

    內容解密:

    1. 匯入必要的函式庫:使用import json匯入Python的JSON處理函式庫。
    2. 定義變數:定義了product_descriptionproduct_names兩個變數,分別代表產品描述和產品名稱列表。
    3. 組織JSON資料:將產品描述和名稱列表組織成一個字典,並放入列表中,形成所需的JSON結構。
    4. 輸出JSON:使用json.dumps()將Python物件轉換為JSON格式的字串,並透過indent=2引數進行格式化輸出,使其更易讀。

隨著AI技術的不斷進步,未來將會有更多的方法來指定輸出格式和提供範例,從而進一步提高AI模型的表現和可用性。開發者應持續關注最新的研究和技術發展,以充分利用這些進步來改進自己的應用和服務。

參考資料

  • W3Schools JSON介紹:https://www.w3schools.com/js/js_json_intro.asp
  • GPT-3論文:“Language Models are Few-Shot Learners”

最終,透過結合明確的格式指定和具有代表性的範例,可以顯著提高AI模型的輸出品質,從而在各種應用場景中實作更高效、更可靠的自動化處理。

提升提示工程品質的四大關鍵技術

在前一章中,我們探討了提示工程的五大原則,其中「提供範例」是提升大語言模型(LLM)輸出品質的重要方法。然而,提供範例只是第一步,如何評估和最佳化提示工程的品質才是關鍵所在。本章將探討評估提示工程品質的方法,並介紹如何使用程式碼實作自動化評估。

1. 為什麼需要評估品質?

在實際應用中,我們往往需要重複使用相同的提示(prompt)來完成多項任務,或是將提示工程整合到生產環境中的應用程式中。在這種情況下,單純依靠「盲目提示」(blind prompting)已經無法滿足需求。所謂「盲目提示」,是指沒有反饋迴路來評估輸出結果的品質,只能透過反覆執行提示並觀察結果來進行調整。

為了提高提示工程的可靠性和穩定性,我們需要建立一套評估機制,來衡量輸出結果的品質。

2. 常見的評估方法

目前,評估大語言模型(LLM)的表現主要依賴於兩種方法:

  1. 標準化評測(Evals):這是一種學術界常用的評估方法,透過一套標準化的問題和預先定義的評分標準來測試模型的表現。不同的模型在不同型別的任務中表現各異,因此在更換模型時,原本運作良好的提示(prompt)可能需要重新調整。

  2. 特定任務評估:針對特定任務,如生成影像或撰寫科學論文,需要更為客製化的評估方法。例如,在影像生成任務中,可以透過比較生成影像與原始影像的相似度來評估品質。

3. 簡單的評估實作:使用 Thumbs-up/Thumbs-down 評估系統

對於大多數應用場景,我們不需要過於複雜的評估機制。一個簡單的「大拇指向上/大拇指向下」(thumbs-up/thumbs-down)評分系統,足以為提示最佳化提供基本的反饋。以下是一個簡單的實作範例,使用 Jupyter Notebook 來記錄每次執行的結果,並將其儲存在試算表中進行進一步分析。

程式碼範例:設定 OpenAI API 及簡單評估系統

import os
import openai

# 設定 OpenAI API 金鑰
os.environ["OPENAI_API_KEY"] = "your_api_key_here"

# 初始化 OpenAI 客戶端
openai.api_key = os.getenv("OPENAI_API_KEY")

def generate_response(prompt):
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=50
    )
    return response.choices[0].text.strip()

# 定義提示
prompt = "Brainstorm a list of product names for a shoe that fits any foot size."

# 執行多次並記錄結果
results = []
for _ in range(5):
    response = generate_response(prompt)
    results.append(response)

# 將結果儲存到試算表
import pandas as pd

df = pd.DataFrame(results, columns=["Product Names"])
df.to_csv("product_names_results.csv", index=False)

內容解密:

這段程式碼展示瞭如何使用 OpenAI API 生成產品名稱,並將結果儲存在 CSV 檔案中。首先,我們設定了 OpenAI API 金鑰並初始化客戶端。接著,定義了一個 generate_response 函式,用於根據給定的提示生成回應。我們執行了多次生成任務,並將結果儲存在 results 列表中。最後,使用 pandas 函式庫將結果儲存到 CSV 檔案中,以便後續分析。

4. 自動化評估與人工評估的平衡

雖然自動化評估可以提高效率,但某些任務仍然需要人工評估。例如,在創意寫作或影像生成任務中,人類的判斷對於評估輸出結果的品質至關重要。因此,在實際應用中,我們通常會結合自動化評估和人工評估來獲得最佳結果。

5. 未來發展方向

隨著大語言模型(LLM)的快速發展,評估技術也在不斷進步。未來,我們可以期待更為先進的評估框架出現,例如使用更強大的模型(如 GPT-4)來評估較弱模型的輸出結果,從而提高評估的準確性和效率。

提示工程評估流程圖

  graph LR
    A[開始提示工程] --> B[生成輸出結果]
    B --> C[評估輸出品質]
    C -->|自動化評估|> D[使用標準化評測指標]
    C -->|人工評估|> E[人工審查輸出結果]
    D --> F[最佳化提示設計]
    E --> F
    F -->|重複迭代|> B

圖表翻譯:
此圖示展示了提示工程的評估流程。首先,我們開始提示工程並生成輸出結果。接著,評估輸出結果的品質,可以選擇自動化評估或人工評估。自動化評估使用標準化評測指標,而人工評估則由人工審查輸出結果。根據評估結果,我們最佳化提示設計並重複迭代,直到獲得滿意的輸出結果。

使用OpenAI API進行提示工程與品質評估的實作

在進行提示工程(Prompt Engineering)時,開發者需要對不同的提示(prompt)進行測試,以評估模型的回應品質。本文將介紹如何使用OpenAI API進行提示測試、回應評估,並將結果儲存於CSV檔案中。

設定OpenAI API金鑰

首先,您需要設定OpenAI API金鑰。有多種方法可以實作這一點:

  1. 環境變數:將API金鑰設為環境變數。
  2. 手動設定:在初始化模型時手動設定金鑰。
  3. 使用.env檔案:利用python-dotenv套件從.env檔案載入環境變數。

使用python-dotenv載入環境變數

from dotenv import load_dotenv
load_dotenv()  # 從.env檔案載入環境變數

設定OpenAI客戶端

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ['OPENAI_API_KEY'],  # 預設使用環境變數中的金鑰
)

定義提示與取得模型回應

定義測試提示

prompt_A = """產品描述:一雙可以適應任何腳尺的鞋子。
關鍵字:可適應、合適、全能合適。
產品名稱:"""

prompt_B = """產品描述:家用奶昔製造機。
關鍵字:快速、健康、緊湊。
產品名稱:HomeShaker、Fit Shaker、QuickShake、Shake Maker
產品描述:可以在太空中準確顯示時間的手錶。
關鍵字:太空人、太空強化、橢圓軌道
產品名稱:AstroTime、SpaceGuard、Orbit-Accurate、EliptoTime。
產品描述:一雙可以適應任何腳尺的鞋子。
關鍵字:可適應、合適、全能合適。
產品名稱:"""

test_prompts = [prompt_A, prompt_B]

取得模型回應的函式

def get_response(prompt):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "你是一個有幫助的助手。"},
            {"role": "user", "content": prompt}
        ]
    )
    return response.choices[0].message.content

執行測試並儲存結果

執行多輪測試並儲存回應

responses = []
num_tests = 5
for idx, prompt in enumerate(test_prompts):
    var_name = chr(ord('A') + idx)  # 將索引轉換為字母
    for i in range(num_tests):
        response = get_response(prompt)
        data = {
            "variant": var_name,
            "prompt": prompt,
            "response": response
        }
        responses.append(data)

df = pd.DataFrame(responses)
df.to_csv("responses.csv", index=False)
print(df)

輸出結果分析

從輸出結果可以觀察到,prompt_A(零樣本學習)傾向於輸出編號列表,而prompt_B(少樣本學習)則傾向於輸出逗號分隔的名單。

評估回應品質

載入回應資料並隨機排序

import pandas as pd
import ipywidgets as widgets
from IPython.display import display

df = pd.read_csv("responses.csv")
df = df.sample(frac=1).reset_index(drop=True)  # 隨機排序
df['feedback'] = pd.Series(dtype='str')  # 新增反饋欄位

定義按鈕回饋函式

response_index = 0

def on_button_clicked(b):
    global response_index
    user_feedback = 1 if b.description == "\U0001F44D" else 0  # 將按鈕反饋轉換為1或0
    df.at[response_index, 'feedback'] = user_feedback
    response_index += 1
    if response_index < len(df):
        update_response()
    else:
        df.to_csv("results.csv", index=False)
        print("A/B測試完成。結果如下:")
        summary_df = df.groupby('variant').agg(
            count=('feedback', 'count'),
            score=('feedback', 'mean')).reset_index()
        # 顯示摘要結果

顯示互動介面

# 建立按鈕並顯示
button_thumbs_up = widgets.Button(description="\U0001F44D")
button_thumbs_down = widgets.Button(description="\U0001F44E")

button_thumbs_up.on_click(on_button_clicked)
button_thumbs_down.on_click(on_button_clicked)

display(button_thumbs_up)
display(button_thumbs_down)

未來改進方向

  1. 擴充套件測試範圍:增加更多提示變體和測試輪數,以獲得更全面的評估結果。
  2. 最佳化回饋機制:改進使用者反饋介面,使其更直觀易用。
  3. 深入分析結果:對收集到的回饋資料進行更深入的分析,以找出不同提示之間的顯著差異。

透過持續最佳化和改進,您可以進一步提升提示工程的有效性,從而更好地利用大語言模型的能力。

內容解密:

本段程式碼展示瞭如何使用OpenAI API進行提示工程測試。首先,我們定義了兩個不同的提示(prompt_Aprompt_B),並使用get_response函式取得模型的回應。接著,我們將多輪測試的結果儲存於DataFrame中,並匯出為CSV檔案。最後,我們載入回應資料,隨機排序後進行使用者反饋評估,並將結果儲存於新的CSV檔案中。

這個過程展示瞭如何系統性地評估不同提示對模型回應品質的影響,並為進一步的提示最佳化提供了基礎。

圖表說明

  graph LR
    A[開始] --> B[定義提示]
    B --> C[取得模型回應]
    C --> D[儲存回應結果]
    D --> E[載入回應資料]
    E --> F[隨機排序]
    F --> G[使用者反饋評估]
    G --> H[儲存評估結果]

圖表翻譯: 此圖表展示了使用OpenAI API進行提示工程測試的流程。首先,定義測試用的提示(Prompt)。接著,透過API取得模型的回應(Response)。將多輪測試的結果儲存後,載入回應資料並進行隨機排序,以便進行盲測評估。最後,使用者對模型的回應進行反饋評估,並將結果儲存於新的檔案中。這個流程有助於系統性地評估不同提示對模型回應品質的影響。