由簡入繁提示如何讓大型語言模型實現複雜推理?

由簡入繁提示如何讓大型語言模型實現複雜推理?

引言

如果語言模型能像人類一樣,用循序漸進的方式解決複雜問題呢?在大語言模型(LLM)領域,由簡入繁提示策略提供了一個有前景的解決方案。本文參考論文《由簡入繁提示實現大型語言模型的複雜推理》,探討這種創新方法如何增強 LLM 的推理能力。透過將複雜任務分解成可管理的子問題,由簡入繁提示引導 LLM 從簡單到複雜循序漸進。

什麼是由簡入繁提示?

由簡入繁提示是論文《由簡入繁提示實現大型語言模型的複雜推理》中提出的一種創新策略,旨在增強大型語言模型(LLM)的推理能力。該方法幫助 LLM 處理複雜問題,將其分解成一系列更簡單、更易管理的子問題。這個過程包含兩個主要階段:

  1. 分解: 將複雜問題分解為一串較簡單的子問題。此階段使用固定的範例來展示分解過程,接著是待分解的具體問題。
  2. 子問題求解: 然後提示模型依序求解這些子問題,每個子問題的解答都借助先前已求解的子問題答案。此階段包含如何求解子問題的範例、先前已回答的子問題及其解答列表,以及下一個要處理的問題。

提示的建構方式引導模型從問題最簡單的部分逐步推進到最複雜的部分,故得名「由簡入繁」。

為什麼需要由簡入繁提示?

由簡入繁提示的需求源於現有提示技術(特別是思維鏈提示)的限制。

思維鏈提示是一種鼓勵大型語言模型逐步闡述其推理過程的方法,類似於人類思考問題的方式。該方法要求模型明確說出從理解問題到得出最終答案的每一個邏輯步驟。透過將問題分解為一系列中間推理步驟,模型提供了透明且可驗證的解題路徑。

雖然思維鏈提示在許多自然語言推理任務上展現了顯著的效能提升,但當需要泛化到比提示中提供的範例更複雜的問題時,它往往力不從心。

由簡入繁提示如何實現 LLM 的複雜推理?

論文中的實驗設計可按以下步驟分解:

確定研究目標

目標是讓大型語言模型能夠執行比訓練範例更困難的複雜推理任務。

選擇任務

研究人員選擇了代表不同推理類型的任務,包括符號操作、組合泛化和數學推理。

任務1:符號操作(尾字母串接任務):

  • 問題: 給定一個單詞列表,輸出每個單詞最後一個字母的串接。
  • 範例: 對於輸入「think, machine, learning」,正確輸出為「keg」。
  • 由簡入繁提示流程:
  • 分解問題:將列表分解為連續的子列表(「think」、「think, machine」、「think, machine, learning」)。
  • 求解子問題:串接每個子列表中單詞的最後一個字母(「think」給出「k」、「machine」給出「e」、「learning」給出「g」)。
  • 組合解答:利用子問題的解答建構最終答案(「k」+「e」=「ke」,再「ke」+「g」=「keg」)。

任務2:組合泛化(SCAN 基準):

  • 問題: 將自然語言指令映射為動作序列。挑戰在於泛化到比訓練時更長的動作序列。
  • 範例: 指令「look opposite right thrice after walk」應翻譯為動作序列「TURN RIGHT, TURN RIGHT, LOOK, WALK」。
  • 由簡入繁提示流程:
  • 分解指令:將複雜指令分解為較簡單的部分(「look opposite right thrice」和「walk」)。
  • 映射為動作:將每個部分翻譯為動作(「look opposite right thrice」重複三次變成「TURN RIGHT, TURN RIGHT, LOOK」,「walk」保持「WALK」)。
  • 組合動作:依序執行動作形成最終序列。

任務3:數學推理(GSM8K 和 DROP 資料集):

  • 問題: 解決可能需要多步推理的數學文字題。
  • 範例:「Elsa 有 5 個蘋果。Anna 比 Elsa 多 2 個蘋果。她們一共有多少個蘋果?」
  • 由簡入繁提示流程:
  • 分解問題:識別子問題(Anna 有多少蘋果?她們一共有多少蘋果?)。
  • 求解子問題:計算 Anna 的蘋果(5 + 2 = 7),再計算總數(5 + 7 = 12)。
  • 最終答案:得出 Elsa 和 Anna 共有 12 個蘋果。

設計提示策略

比較兩種主要提示策略:

  • 思維鏈提示: 提供展示逐步推理過程的範例給模型。

  • 由簡入繁提示: 這種新策略將複雜問題分解為較簡單的子問題,並依序求解,利用先前子問題的解答來幫助後續子問題的求解。

建立提示範例

研究人員為每種提示策略精心製作了展示如何處理任務的範例。對於由簡入繁提示,這包括問題分解和子問題求解的範例。

在模型中實施提示

然後將這些提示作為輸入提供給語言模型。對於由簡入繁提示,這包含兩個階段:

  • 分解階段: 要求模型將原始問題分解成一系列較簡單的子問題。
  • 子問題求解階段: 然後要求模型依序求解這些子問題,利用先前子問題的答案來輔助後續子問題的求解。

建構測試集

研究人員為每個任務創建了具有不同難度等級的測試集。

任務1:符號操作(尾字母串接任務):

  • 測試集包含不同長度的單詞列表,以測試模型串接每個單詞最後一個字母的能力。
  • 研究人員使用了 Wiktionary 中最常見的 10,000 個英語單詞,排除了粗俗詞語,最終得到 9,694 個單詞。
  • 對於每種所需列表大小(4 到 12 個單詞),他們生成了 500 個隨機序列。每個序列作為輸入,對應的輸出是單詞最後一個字母的序列。

任務2:組合泛化(SCAN 基準):

  • SCAN 基準包含需要映射為動作序列的自然語言指令。測試集挑戰模型從較短動作序列泛化到較長序列的能力。
  • 研究人員使用了 SCAN 資料集的現有分割,特別關注長度分割,其中包含比訓練集更長的動作序列。
  • 同時確保測試集涵蓋多種指令,以評估模型處理不同類型組合泛化的能力。

任務3:數學推理(GSM8K 和 DROP 資料集):

  • 對於數學推理,研究人員使用了 GSM8K 資料集中的文字題以及 DROP 資料集中的數值推理子集。
  • 測試集包含需要不同推理步驟數量的問題,使研究人員能夠評估模型從簡單到複雜問題的泛化能力。
  • 問題的選擇涵蓋了不同的難度等級,並確保部分問題需要的步驟比提示中展示的更多。

透過以這種方式建構測試集,研究人員能夠嚴格評估由簡入繁提示策略,並將其與不同推理任務中的標準提示技術進行比較。

進行實驗並收集結果

研究人員使用 GPT-3 模型(特別是 code-davinci-002 版本)在兩種提示策略下進行實驗,記錄模型在測試集上的準確率。

分析結果

研究人員比較了模型在使用不同提示策略下的表現。他們不僅關注總體準確率,還按解決問題所需的推理步驟數量細分結果。

錯誤分析

針對由簡入繁提示,研究人員進行了詳細的錯誤分析,以了解常見錯誤類型,例如問題分解不當或子問題求解錯誤。

由簡入繁提示能讓 LLM 表現提升多少?

論文《由簡入繁提示實現大型語言模型的複雜推理》展示了由簡入繁提示在各種任務上的有效性,並將其與思維鏈提示和標準提示方法的表現進行了比較。以下是論文中各任務的效能提升摘要:

符號操作(尾字母串接任務):

由簡入繁提示顯著優於思維鏈提示,尤其在單詞列表長度增加時。

對於長度從 4 到 12 個單詞的列表,使用 GPT-3 code-davinci-002 模型的由簡入繁提示準確率在 74.0% 到 94.0% 之間,遠高於思維鏈提示的 31.8% 到 84.2%。

組合泛化(SCAN 基準):

在長度分割條件下,使用僅 14 個範例的由簡入繁提示達到了 99.7% 的準確率,這是一個非常出色的結果,因為訓練在整個資料集(超過 15,000 個範例)上的專用神經符號模型往往也難以勝任此任務。

相比之下,相同模型下的思維鏈提示在長度分割條件下僅得到 16.2% 的準確率。

數學推理(GSM8K 和 DROP 資料集):

在 GSM8K 資料集上,由簡入繁提示比思維鏈提示略有提升,總體準確率為 62.39%,而思維鏈提示為 60.87%。

然而,對於需要至少 5 個步驟解決的問題,由簡入繁提示顯示出顯著提升,準確率為 45.23%,而思維鏈提示為 39.07%。

在 DROP 資料集上,由簡入繁提示以大幅差距超越思維鏈提示,在非足球和足球子集上的準確率分別為 82.45% 和 74.77%,而思維鏈提示僅為 58.78% 和 59.56%。

這些結果表明,由簡入繁提示在需要模型從簡單範例泛化到更複雜問題的任務中特別有效。將複雜問題分解為一系列較簡單的子問題並依序求解的策略,使得模型在不同推理任務中都能獲得更高的準確率。

如何將由簡入繁提示整合到自己的 LLM 中?

基於論文作者提出的方法,我們為您提供以下逐步指南:

步驟 1:獲取 LLM API

首先,您需要有權存取一個可用於任務的 LLM。Novita AI LLM API 為開發人員提供了許多經濟高效的 LLM 選項,包括 Llama3–8b、Llama3–70b、Mythomax-13b 等。

以下是使用 Novita AI LLM API 進行聊天補全 API 呼叫的範例:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    # Get the Novita AI API Key by referring: https://novita.ai/get-started/Quick_Start.html#_3-create-an-api-key
    api_key="<YOUR Novita AI API Key>",
)

model = "Nous-Hermes-2-Mixtral-8x7B-DPO"
stream = True # or False
max_tokens = 512

chat_completion_res = client.chat.completions.create(
    model=model,
    messages=[
        {
            "role": "system",
            "content": "Act like you are a helpful assistant.",
        },
        {
            "role": "user",
            "content": "Hi there!",
        }
    ],
    stream=stream,
    max_tokens=max_tokens,
 )

if stream:
    for chunk in chat_completion_res:
        print(chunk.choices[0].delta.content or "", end="")
else:
    print(chat_completion_res.choices[0].message.content)

步驟 2:準備分解提示

建立一組提示範例,展示如何將複雜問題分解為一系列較簡單的子問題。範例應展示分解的結構,但無需包含子問題的具體內容。

步驟 3:準備子問題求解提示

建立一組提示範例,展示如何求解各個子問題。這些範例應展示逐步建構解答的過程,並使用先前已求解子問題的結果。

步驟 4:實作由簡入繁提示演算法

由簡入繁提示演算法的關鍵步驟:
a. 將原始問題傳遞給分解提示,獲得子問題列表。
b. 對於每個子問題,建構一個包含先前子問題解答(如果有的話)和當前子問題的提示,傳遞給 LLM 以獲得解答。
c. 組合子問題的解答,得到原始問題的最終解答。

步驟 5:整合到您的應用程式中

將由簡入繁提示演算法整合到應用程式的工作流程中。這可能涉及預處理輸入、建構提示、呼叫 LLM API 以及後處理輸出。

步驟 6:評估和迭代

在各種任務和問題難度上測試實作。分析錯誤,並根據需要改進提示設計或提示演算法。

以下是由 LLM 建立的高層級範例,您可能需要根據具體使用案例和 LLM 進行調整。

import openai

# Set the Novita AI API key
openai.api_key = "<YOUR Novita AI API Key>"
openai.base_url = "https://api.novita.ai/v3/openai"

def decomp_prompt(original_problem):
    """
    Generates a prompt to decompose the original problem into a series of subproblems.

    Args:
        original_problem (str): The original problem to be decomposed.

    Returns:
        str: The prompt for decomposing the problem.
    """
    return f"""
    Please decompose the following problem into a series of subproblems that can be solved step-by-step:
    {original_problem}
    
    Subproblems:
    {{{decomp_steps}}}
    """

def solve_prompt(prev_solutions, subproblem):
    """
    Generates a prompt to solve a specific subproblem, given the previously solved subproblems.

    Args:
        prev_solutions (str): The previously solved subproblems.
        subproblem (str): The subproblem to be solved.

    Returns:
        str: The prompt for solving the subproblem.
    """
    return f"""
    Given the following previously solved subproblems:
    {prev_solutions}
    
    Please solve the following subproblem:
    {subproblem}
    """

def solve_problem(original_problem):
    """
    Solves the original problem using the Least-to-Most Prompting algorithm.

    Args:
        original_problem (str): The original problem to be solved.

    Returns:
        list: A list of solutions for the subproblems.
    """
    # Decompose the original problem into subproblems
    decomp_result = openai.Completion.create(
        engine="text-davinci-002",
        prompt=decomp_prompt(original_problem),
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.7,
    )
    decomp_steps = decomp_result.choices[0].text.strip()

    # Solve the subproblems one by one
    solutions = []
    for step in decomp_steps.split("\
"):
        step = step.strip()
        if step:
            solve_result = openai.Completion.create(
                engine="text-davinci-002",
                prompt=solve_prompt("\
".join(solutions), step),
                max_tokens=1024,
                n=1,
                stop=None,
                temperature=0.7,
            )
            solutions.append(solve_result.choices[0].text.strip())

    return solutions

# Example usage
original_problem = "Solve a complex math problem step-by-step."
solutions = solve_problem(original_problem)
print("\
".join(solutions))

由簡入繁提示有哪些限制?

領域特異性:

分解提示通常針對特定領域設計,可能無法很好地泛化到不同類型的問題。適用於數學文字題的提示,對常識推理問題或其他領域的問題可能無效。

領域內泛化挑戰:

即使在相同領域內,泛化分解過程也可能很困難。提示需要精心設計,以展示正確的分解方式,從而使模型達到最佳效能。

分解的複雜性:

某些複雜問題可能需要深刻理解如何將其分解為較簡單的子問題。設計能有效引導模型完成此過程的提示可能具有挑戰性。

順序依賴性:

由簡入繁提示生成的子問題通常相互依賴,需要按特定順序求解。這種順序要求使得提示過程比獨立子問題更複雜。

錯誤傳播:

如果模型在問題分解或子問題求解的早期階段出錯,該錯誤可能會傳播到後續步驟,導致最終解答不正確。

模型特定效能:

由簡入繁提示的效能可能因不同模型或相同模型的不同版本而異。某些模型可能更適合處理任務的迭代和遞迴特性。

提示工程:

由簡入繁提示的有效性可能高度依賴於提示工程的品質。創建能實現準確分解和解答生成的有效提示,需要仔細考量與專業知識。

可擴展性:

雖然由簡入繁提示可能有效,但由於在設計合適提示和可能出現錯誤傳播方面的難度增加,它可能無法很好地擴展到非常大或高度複雜的問題。

缺乏雙向互動:

作者認為,一般來說,提示可能不是教導 LLM 推理技能的最佳方法,因為它是一種單向溝通形式。更自然的進展可能是將提示演變為完全雙向的對話,允許即時回饋和更高效的學習。

結論

透過將複雜問題分解為較簡單的步驟並依序求解,採用由簡入繁提示的 LLM 不僅增強了推理能力,還在各種任務中展現了卓越的效能——從符號操作到組合泛化,再到數學推理。

然而,我們也必須正視伴隨此方法的挑戰。領域特異性、領域內泛化困難以及分解的複雜性都可能構成障礙。此外,子問題的順序依賴性與潛在的錯誤傳播,凸顯了仔細進行提示工程和考慮模型特定因素的必要性。

在我們持續探索 AI 發展新前沿之際,由簡入繁提示作為一項關鍵策略脫穎而出,它使 LLM 能夠以前所未有的準確性和效率應對複雜推理任務的挑戰,同時也推動了持續研究,以優化其在各種問題領域中的應用。

參考文獻

Zhou, D., Schärli, N., Hou, L., Wei, J., Scales, N., Wang, X., Schuurmans, D., Cui, C., Bousquet, O., & Chi, E. (2023). Least-to-Most Prompting Enables Complex Reasoning in Large Language Models. In Proceedings of the International Conference on Learning Representations.

Novita AI 是一個全端雲端平台,助力您的 AI 願景。憑藉無縫整合的 API、無伺服器運算和 GPU 加速,我們提供經濟高效的工具,讓您快速建置和擴展 AI 驅動的業務。告別基礎設施的煩惱,免費開始使用 — Novita AI 讓您的 AI 夢想成真。