結(jié)構(gòu)化設(shè)計(jì):用Markdown、XML和JSON設(shè)計(jì)生產(chǎn)級(jí)提示詞(二)

5 評(píng)論 2965 瀏覽 9 收藏 12 分鐘

在AI產(chǎn)品落地過(guò)程中,提示詞(Prompt)的質(zhì)量直接決定了模型輸出的效果。本文系統(tǒng)介紹了如何利用Markdown、XML和JSON三種結(jié)構(gòu)化格式,設(shè)計(jì)清晰、可維護(hù)、可擴(kuò)展的“生產(chǎn)級(jí)”提示詞。

為什么要撰寫結(jié)構(gòu)化提示詞?

當(dāng)提示詞變得復(fù)雜,包含多重指令、大量上下文和具體示例時(shí),一個(gè)扁平的、無(wú)結(jié)構(gòu)的文本塊會(huì)讓模型難以區(qū)分不同信息的優(yōu)先級(jí) 。就像給員工下達(dá)一個(gè)冗長(zhǎng)且毫無(wú)重點(diǎn)的口頭指令,很容易導(dǎo)致誤解和執(zhí)行偏差。

結(jié)構(gòu)化提示詞通過(guò)使用明確的分隔符、標(biāo)簽或語(yǔ)法,將提示詞分解為邏輯清晰的模塊。這帶來(lái)了幾個(gè)核心優(yōu)勢(shì):

  • 減少歧義:清晰地標(biāo)示出哪些是指令、哪些是上下文、哪些是用戶輸入,讓模型準(zhǔn)確理解每個(gè)部分的意圖 。
  • 提升指令遵循能力:當(dāng)任務(wù)被分解并結(jié)構(gòu)化呈現(xiàn)時(shí),模型能更好地按步驟執(zhí)行,輸出結(jié)果更符合預(yù)期 。
  • 增強(qiáng)可維護(hù)性:結(jié)構(gòu)化的提示詞更易于團(tuán)隊(duì)成員理解、修改和復(fù)用,降低了長(zhǎng)期維護(hù)的成本 。

結(jié)構(gòu)化格式為何有效:從模型訓(xùn)練原理理解

要理解為什么Markdown、XML和JSON等格式對(duì)LLM特別有效,我們需要回歸到模型訓(xùn)練的本質(zhì)。LLM是通過(guò)學(xué)習(xí)海量互聯(lián)網(wǎng)文本數(shù)據(jù)中的統(tǒng)計(jì)規(guī)律來(lái)工作的。這些訓(xùn)練數(shù)據(jù)中,有相當(dāng)大一部分本身就是高度結(jié)構(gòu)化的 。

  • 數(shù)據(jù)基礎(chǔ):互聯(lián)網(wǎng)充滿了用HTML和XML構(gòu)建的網(wǎng)頁(yè)、用Markdown編寫的論壇帖子和文檔、以及在API通信中廣泛使用的JSON數(shù)據(jù)。
  • 模式學(xué)習(xí):在訓(xùn)練過(guò)程中,模型已經(jīng)內(nèi)隱地學(xué)習(xí)到了這些結(jié)構(gòu)化標(biāo)記(如<h1>、<instruction>、”key”: “value”)所蘊(yùn)含的語(yǔ)義模式。例如,模型知道<h1>標(biāo)簽內(nèi)的文本通常是標(biāo)題,<example>標(biāo)簽內(nèi)的內(nèi)容是示例,而JSON的鍵值對(duì)結(jié)構(gòu)則代表了清晰的數(shù)據(jù)關(guān)系 。
  • 激活已知模式:因此,當(dāng)我們?cè)谔崾驹~中使用這些格式時(shí),我們并非在教模型一種新語(yǔ)言,而是在“激活”它早已熟知的模式。這使得我們的指令意圖能夠被更準(zhǔn)確地捕捉,其效果遠(yuǎn)勝于一段普通的自然語(yǔ)言描述。這就像與一個(gè)熟悉圖表的人交流時(shí),使用圖表會(huì)比純文字描述更高效。

Markdown:清晰易讀的首選

Markdown是一種輕量級(jí)標(biāo)記語(yǔ)言,因其簡(jiǎn)潔、直觀的語(yǔ)法而廣受歡迎,是聯(lián)系撰寫結(jié)構(gòu)化提示詞的入門選擇 。

優(yōu)勢(shì)

  • 高可讀性:使用#表示標(biāo)題,-或*表示列表,**text**表示加粗,使得提示詞的邏輯層次一目了然,無(wú)論是對(duì)人還是對(duì)AI都非常友好 。
  • 易于編寫和維護(hù):語(yǔ)法簡(jiǎn)單,無(wú)需復(fù)雜的工具即可編寫。
  • 提升指令遵循:研究和實(shí)踐表明,將指令格式化為項(xiàng)目符號(hào)列表(bullet points)能顯著提高LLM的指令遵循準(zhǔn)確率 。

案例:使用Markdown重構(gòu)一個(gè)復(fù)雜的寫作任務(wù)

重構(gòu)前(非結(jié)構(gòu)化提示詞):

我需要你寫一個(gè)關(guān)于宇航員發(fā)現(xiàn)新行星的短篇故事。故事里要有一個(gè)會(huì)說(shuō)話的外星人,一場(chǎng)太空戰(zhàn)斗,以及一個(gè)結(jié)局反轉(zhuǎn),揭示這一切都只是一個(gè)游戲。請(qǐng)把故事控制在500字以內(nèi)。

這個(gè)提示詞將所有要求混雜在一起,模型需要自行梳理。

重構(gòu)后(使用Markdown的結(jié)構(gòu)化提示詞):

通過(guò)使用Markdown的標(biāo)題和列表,我們將任務(wù)、角色、情節(jié)和約束條件清晰地分離開來(lái),極大地降低了模型的理解難度,從而能夠生成更符合要求的高質(zhì)量?jī)?nèi)容 。

用XML重構(gòu)提示詞:實(shí)現(xiàn)語(yǔ)義結(jié)構(gòu)化

XML(Extensible Markup Language)作為一種設(shè)計(jì)用于傳輸和存儲(chǔ)數(shù)據(jù)的標(biāo)記語(yǔ)言,核心優(yōu)勢(shì)在于自描述性和層次化結(jié)構(gòu)。

優(yōu)勢(shì):

  • 語(yǔ)義清晰:XML的標(biāo)簽結(jié)構(gòu)讓AI能夠更好地理解不同部分的作用和重要性。相比于純文本,XML提供了明確的語(yǔ)義邊界。
  • 層次分明:復(fù)雜的提示詞往往包含多個(gè)層次的信息,XML的嵌套結(jié)構(gòu)完美契合這一需求。
  • 易于解析:現(xiàn)代AI模型對(duì)XML格式有很好的理解能力,能夠準(zhǔn)確識(shí)別和處理結(jié)構(gòu)化信息。

如何用XML撰寫提示詞

XML 指令使用“標(biāo)簽”進(jìn)行組織,每個(gè)指令部分都用一個(gè)開放標(biāo)簽(例如,<agentinstructions>)和一個(gè)相應(yīng)的閉合標(biāo)簽(</agentinstructions>)包裹起來(lái)。閉合標(biāo)簽在名稱前包含一個(gè)正斜杠。

這種結(jié)構(gòu)類似于打包搬家時(shí)的箱子,主標(biāo)簽是最大的箱子,而像“角色”、“目標(biāo)”和“任務(wù)”這樣的子部分則是嵌套在其中的較小的箱子。這種分層方法允許清晰的組織和模塊化,人類和 AI 都能輕松閱讀和處理。

基本結(jié)構(gòu)設(shè)計(jì)原則:

  • 使用語(yǔ)義化的標(biāo)簽名稱
  • 保持層次結(jié)構(gòu)的邏輯性
  • 將不同類型的信息分離到不同標(biāo)簽中
  • 使用屬性來(lái)添加元數(shù)據(jù)

建議在撰寫時(shí)通過(guò)縮進(jìn)嵌套標(biāo)簽來(lái)保持結(jié)構(gòu)化外觀。

JSON:連接AI與外部工具

JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,在提示詞工程中,它主要用于實(shí)現(xiàn)一個(gè)強(qiáng)大的功能:函數(shù)調(diào)用(FunctionCalling)。

什么是函數(shù)調(diào)用? 函數(shù)調(diào)用是一種讓LLM與外部工具或API進(jìn)行交互的能力 。

當(dāng)用戶的請(qǐng)求需要模型自身知識(shí)庫(kù)之外的信息時(shí),如實(shí)時(shí)天氣、公司內(nèi)部數(shù)據(jù)庫(kù)數(shù)據(jù)、執(zhí)行某個(gè)軟件操作。模型不會(huì)直接回答,而是會(huì)生成一個(gè)特定格式的JSON對(duì)象。這個(gè)JSON對(duì)象精確地描述了需要調(diào)用哪個(gè)函數(shù),以及需要傳遞什么參數(shù) 。

通過(guò)在提示詞中明確要求LLM生成符合特定JSONSchema的輸出,能夠解決系統(tǒng)集成的“最后一公里“難題。

核心優(yōu)勢(shì)

  • 可靠的機(jī)器解析:應(yīng)用后端可以直接將LLM返回的JSON字符串反序列化為對(duì)象或數(shù)據(jù)結(jié)構(gòu),無(wú)需任何脆弱的文本解析邏輯。這讓AI的輸出變得像調(diào)用一個(gè)傳統(tǒng)的、確定性的API一樣可靠。
  • 無(wú)縫的系統(tǒng)集成:結(jié)構(gòu)化的JSON輸出可以直接用于填充數(shù)據(jù)庫(kù)、調(diào)用其他API、驅(qū)動(dòng)前端UI渲染,或作為復(fù)雜工作流(Agentic Workflows)中下一步的輸入。
  • 精確的數(shù)據(jù)結(jié)構(gòu)定義:定義JSON Schema本身也是在向模型施加一種強(qiáng)大的邏輯約束,迫使其思考如何將分析結(jié)果填充到預(yù)設(shè)的字段中,這反過(guò)來(lái)也提升了輸出內(nèi)容的質(zhì)量和完整性。
  • 示例數(shù)據(jù)提供:通過(guò)JSON格式的示例,模型能夠更好地理解期望的輸出格式。

工作流程

  1. 定義工具:在提示詞中,使用JSON Schema的格式向模型描述可用的外部函數(shù)(工具),包括函數(shù)名、功能描述和參數(shù)列表。
  2. 模型決策:模型分析用戶輸入,判斷是否需要調(diào)用某個(gè)已定義的函數(shù)來(lái)回答問(wèn)題。
  3. 生成JSON:如果需要,模型會(huì)輸出一個(gè)包含函數(shù)名和參數(shù)的JSON對(duì)象。
  4. 應(yīng)用執(zhí)行:你的應(yīng)用程序代碼接收到這個(gè)JSON,解析它,并實(shí)際執(zhí)行相應(yīng)的API調(diào)用或函數(shù)。
  5. 返回結(jié)果:將函數(shù)執(zhí)行的結(jié)果返回給模型。
  6. 最終回復(fù):模型基于函數(shù)返回的結(jié)果,生成最終的自然語(yǔ)言回復(fù)給用戶。

案例:通過(guò)JSON實(shí)現(xiàn)工具調(diào)用

第一步:向模型描述工具,一般在提示詞中我們會(huì)提供一個(gè)工具列表。

說(shuō)明這個(gè)工具是:

  • 用來(lái)干什么的
  • 需要調(diào)用這個(gè)工具的用戶輸入長(zhǎng)什么樣
  • 以及成功調(diào)用這個(gè)工具需要用到哪些字段

第二步:用戶提問(wèn) 用戶輸入:“張三的電話號(hào)碼和郵箱是什么”

第三步:模型生成JSON(函數(shù)調(diào)用)

模型不會(huì)直接回答,而是會(huì)返回一個(gè)tool_calls對(duì)象,其中包含以下JSON :

說(shuō)明調(diào)用了人員查詢工具,輸入的字段為人名張三

第四步及之后: 應(yīng)用程序代碼會(huì)調(diào)用真實(shí)的API,并將返回的人員信息

如“張三,電話:13794785945,郵箱: zhangsan@123.com”,再喂給模型。

模型最后會(huì)根據(jù)返回信息生成對(duì)用戶的友好回復(fù):“張三的電話是13794785945,郵箱是 zhangsan@123.com”

對(duì)于產(chǎn)品經(jīng)理和業(yè)務(wù)人員來(lái)說(shuō),理解函數(shù)調(diào)用至關(guān)重要。

它意味著LLM不再是一個(gè)封閉的知識(shí)庫(kù),而是可以被授權(quán)訪問(wèn)和操作任何外部數(shù)據(jù)和系統(tǒng)的“智能中樞”,這極大地?cái)U(kuò)展了AI應(yīng)用的想象空間和商業(yè)價(jià)值 。

本文由 @Mrs.Data 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 要是能對(duì)比一下json格式和Markdown格式的效果優(yōu)劣就更好了

    來(lái)自上海 回復(fù)
    1. 嗯 其實(shí)感覺(jué)這兩種格式與其說(shuō)是優(yōu)劣,不如說(shuō)是有自己適合的場(chǎng)景,也可以融合使用

      來(lái)自北京 回復(fù)
    2. 我們內(nèi)部推廣ai工具的時(shí)候都用到了這兩種,在領(lǐng)導(dǎo)看來(lái)json格式會(huì)比Markdown格式書寫的更為精準(zhǔn),他說(shuō)的原理我也明白,但一直沒(méi)有很好的例子證明,你怎么看呢

      來(lái)自上海 回復(fù)
    3. json主要用于有嚴(yán)格輸出要求的場(chǎng)景,尤其是需要調(diào)用工具或者對(duì)接其他業(yè)務(wù)系統(tǒng)。個(gè)人感覺(jué)并不是所有場(chǎng)景都適合json, 如果只是普通的生成類任務(wù),完全可以不用json。 關(guān)于領(lǐng)導(dǎo)說(shuō)的json格式會(huì)比Markdown格式書寫的更為精準(zhǔn),因?yàn)椴皇呛芮宄銈兊木唧w場(chǎng)景,所以很難判斷。可以分別用這兩種格式寫兩版提示詞,然后對(duì)比效果看看。

      來(lái)自北京 回復(fù)
    4. 感謝反饋!我會(huì)繼續(xù)優(yōu)化噠

      來(lái)自北京 回復(fù)