作者:豐陽露,單位:中國移動智慧家庭運營中心
隨著大語言模型的日益成熟,基于模型生成內(nèi)容的AI原生互聯(lián)網(wǎng)應(yīng)用也在蓬勃發(fā)展。然而,我們也需要意識到,大模型本身的輸出往往難以直接應(yīng)用于工程實踐。為了讓大模型的應(yīng)用真正落地,我們需要在保證輸出質(zhì)量的同時,也要注意格式化結(jié)果,使其更易于被軟件系統(tǒng)使用。
本文試圖從輸出格式化的角度,為大語言模型應(yīng)用提供一些格式對齊方法。我們將討論輸出結(jié)果的可預(yù)測性、一致性等問題,以及可能的解決方案。此外,本文中的所有例子以智慧家庭運營中心安全大模型為例,同時參考了LangChain實現(xiàn)的部分常見的格式化輸出提示的用法。
Part 01●??輸出列表/集合?●
列表和集合是程序中最常見也最重要的數(shù)據(jù)結(jié)構(gòu)之一,會在許多場合被廣泛應(yīng)用,因此讓大型語言模型能夠穩(wěn)定輸出列表,將在多種情況下發(fā)揮重要作用。
例如,我們希望語言模型能輸出中國省份的名稱列表,以提供后續(xù)程序調(diào)用使用。要實現(xiàn)這一目標(biāo),我們需要如何具體操作呢?
如果我們直覺性地構(gòu)造提示詞,可能會這樣提示:
或者這樣:
上述格式都不易于后續(xù)程序處理使用。那么,我們應(yīng)該如何構(gòu)造提示,才能讓大型語言模型穩(wěn)定輸出List格式呢?經(jīng)過反復(fù)試驗,我們發(fā)現(xiàn)正確的方法是:
請隨機列出10個中國的省級行政區(qū)。你的回答應(yīng)該是一個逗號分隔值的列表,不帶任何其他描述信息,例如:[A, B, C] , 以'```json'開頭,并以'```'結(jié)尾。
通過這種方式,我們就可以直接加載該JSON格式進(jìn)行后續(xù)處理。
同理,輸出集合的提示可以這樣構(gòu)造:
請隨機列出10個中國的省級行政區(qū)。你的回答應(yīng)該是一個逗號分隔值的無重復(fù)元素的集合,不帶任何其他描述信息,例如:{'甲', '乙', '丙'} ,以'```json'開頭,并以'```'結(jié)尾。
Part 02●??輸出標(biāo)準(zhǔn)化時間日期?●
當(dāng)需要按時間或日期對數(shù)據(jù)進(jìn)行篩選或查詢時,讓大型語言模型輸出標(biāo)準(zhǔn)化的時間日期格式尤為重要。以想獲取中國移動的成立時間為例,我們可能會直覺地這樣操作:
但是,上述回復(fù)雖提供了正確信息,但日期格式不標(biāo)準(zhǔn),不便機器讀取處理。為獲得標(biāo)準(zhǔn)化日期,我們應(yīng)該這樣提示:
請回答用戶的問題:
中國移動的成立時間?
編寫一個與以下模式匹配的日期時間字符串:'%Y-%m-%d',例如:1970-08-09,此外不要輸出任何描述信息。
通過明確要求“標(biāo)準(zhǔn)日期格式”,模型便可生成可機器解析的結(jié)果。
在需要定量時間信息的場景下,提示語言模型輸出標(biāo)準(zhǔn)化時間日期,可顯著提升后續(xù)自動化處理效率。
Part 03●?輸出結(jié)構(gòu)化字典?●
結(jié)構(gòu)化字典是我們在傳統(tǒng)應(yīng)用中交換數(shù)據(jù)最常用的格式之一,key-value結(jié)構(gòu)便于程序根據(jù)key獲取相應(yīng)的value,也是代碼與語言模型交互的主流方式。而對于某些復(fù)雜結(jié)構(gòu),想讓語言模型穩(wěn)定輸出對齊的結(jié)果較為困難,這凸顯了提示工程的重要性。
仍以前面獲取中國省份信息為例,如果我們想通過語言模型獲得某省名稱、省會、面積、人口、區(qū)號等結(jié)構(gòu)化字典,需要如何操作呢?
借鑒前面的經(jīng)驗,我們可以這樣提示:
雖然基本實現(xiàn)了按照要求的輸出,但是該實現(xiàn)方式存在沒有明確指定字段名稱和類型的問題。在某些復(fù)雜場景下,字段之間可能未能正確對齊,從而導(dǎo)致程序執(zhí)行錯誤。結(jié)合我們的經(jīng)驗,參考類似Langchain的實現(xiàn),一個更具魯棒性的方法是明確指定字段名稱和值類型,以避免上述問題:
請隨機輸出中國一個省份的信息,包括
名稱:該省的名稱
省會:該省的省會名稱
人口:該省的人工數(shù)
面積:該省的面積,以平方公里為單位
區(qū)號:該省的區(qū)號
輸出應(yīng)該是按以下模式格式化的標(biāo)記代碼片段,包括開頭和結(jié)尾的" ```json"和"```",此外不要包含任何描述性信息。
```json
{
"名稱": string // 省份名稱
"省會": string // 省會名稱
"人口": int// 該省的人口
"面積": float// 該省的面積,浮點數(shù)表示,不要帶單位
"區(qū)號": string // 該省的區(qū)號
}
```
Part 04●?輸出結(jié)構(gòu)化字典的列表?●
顯然,構(gòu)建單個字典是相對容易的。然而,當(dāng)需要構(gòu)建多個字典時,應(yīng)該如何實現(xiàn)呢?遺憾的是,在LangChain中并沒有提供這種結(jié)構(gòu)的實現(xiàn)方法,而在實際應(yīng)用場景中,通常會頻繁遇到這種需求。
我們繼續(xù)以之前的例子為例,假設(shè)我們需要列出三個省份的信息,應(yīng)該如何操作呢?
在開發(fā)威脅情報IOC提取工具過程中,我們總結(jié)出一套可靠的提示模板。只需按照以下方式輸入即可:
請隨機輸出中國3個省份的信息,他們均包含
名稱:該省的名稱
省會:該省的省會名稱
人口:該省的人工數(shù)
面積:該省的面積,以平方公里為單位
區(qū)號:該省的區(qū)號
輸出應(yīng)該是按以下模式格式化的標(biāo)記代碼片段,包括開頭和結(jié)尾的"```json"和"```",此外不要包含任何描述性信息。
{
"省份": array // 包含各個身份信息的列表
[
{
"名稱": string // 省份名稱
"省會": string // 省會名稱
"人口": int// 該省的人口
"面積": float// 該省的面積,浮點數(shù)表示,不要帶單位
"區(qū)號": string // 該省的區(qū)號
}
]
Part 05●?輸出結(jié)構(gòu)化字典?●
在大語言模型應(yīng)用開發(fā)過程中,我們發(fā)現(xiàn)模型直接的自由生成輸出,很難滿足工程化的需求。為了發(fā)揮模型的最大價值,提示工程變得尤為關(guān)鍵。經(jīng)過實踐探索,我們歸納出了以下輸出格式化的方法論:
1.使用列表、表格等結(jié)構(gòu)化格式,組織模型輸出,提高可讀性。
2.在輸出中添加必要的標(biāo)題、標(biāo)記,清晰表示內(nèi)容結(jié)構(gòu)。
3.支持多級別的內(nèi)容格式,如嵌套列表等。
4.兼顧格式的一致性,美觀度等全局因素。
5.輸出支持直接轉(zhuǎn)換為HTML、Markdown等結(jié)構(gòu)化格式。
當(dāng)前大模型能力仍有限,優(yōu)化提示非常必要。以上格式化輸出經(jīng)驗來自開發(fā)IOC提取工具的實踐,基本滿足了工程需求。希望這些簡單的方法論,能對各位開發(fā)者有一定參考價值。