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