過(guò)去的兩三個(gè)月里,在開(kāi)發(fā)基于大語(yǔ)言模型的軟件時(shí),也一直在思考如何設(shè)計(jì)一個(gè)大模型優(yōu)先架構(gòu)。而隨著越來(lái)越多的團(tuán)隊(duì)加入到這場(chǎng)競(jìng)賽里,我們會(huì)發(fā)現(xiàn):基于大語(yǔ)言模型的軟件架構(gòu)與過(guò)去的不同之處,諸如于:我們需要新一代的 API。
我暫時(shí)將這一代 API 稱(chēng)為:語(yǔ)言接口/語(yǔ)言 API(大概會(huì)有大佬來(lái)發(fā)起新的名稱(chēng)),原因是:自然語(yǔ)言只是人機(jī)的接口,DSL 是 AI 與機(jī)器的接口、機(jī)器與機(jī)器的接口。
所以,在這篇文章里,我將繼續(xù)總結(jié)一些內(nèi)外部看到的經(jīng)驗(yàn),以及構(gòu)建 ArchGuard Co-mate 架構(gòu)時(shí)的一些思考。
模式:自然語(yǔ)言即 DSL
意圖:使用自然語(yǔ)言作為領(lǐng)域特定語(yǔ)言(DSL)來(lái)描述系統(tǒng)的需求和期望,通過(guò)正則表達(dá)式等工具從自然語(yǔ)言中提取關(guān)鍵信息,以指導(dǎo)系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā)。
適用場(chǎng)景:以自然語(yǔ)言作為溝通媒介
示例:在我們習(xí)慣了大模型的能力之后,也開(kāi)始接受了自然語(yǔ)言作為一種 API。與我們一般熟悉的 API 相比,自然語(yǔ)言作為 API 應(yīng)該稱(chēng)為 DSL(Domain-Specific Language,領(lǐng)域特定語(yǔ)言)。
舉一個(gè)簡(jiǎn)單的例子,諸如于我們前面提到的用戶故事,其標(biāo)準(zhǔn)形式是:?作為一個(gè)<用戶角色>,?我想要<完成活動(dòng)>,?以便于<實(shí)現(xiàn)價(jià)值>
?。隨后,我們就可以對(duì)其運(yùn)行特殊處理(諸如于高亮):
**作為一個(gè)**購(gòu)買(mǎi)商品的用戶,**我希望**能夠退貨,**以便于**在不滿意或商品存在問(wèn)題的情況下獲得處理。
隨后,我們可以讓 LLM(大語(yǔ)言模型) 生成正則表達(dá)式,以校驗(yàn)返回結(jié)果是否符合要求:
用戶角色:?
購(gòu)買(mǎi)了商品的用戶
完成活動(dòng):?
退貨
實(shí)現(xiàn)價(jià)值:?
在不滿意或商品存在問(wèn)題的情況下獲得處理
并作為下一代的輸入,如將一句話的需求,編寫(xiě)成更詳細(xì)的 AC(Acceptance Criteria,驗(yàn)收條件)。這種方式可以使用自然語(yǔ)言來(lái)描述系統(tǒng)需求,從而提高開(kāi)發(fā)效率和準(zhǔn)確性。
模式:實(shí)時(shí)文本流 DSL
意圖:通過(guò)逐步、流式的方式返回結(jié)果,提高大語(yǔ)言模型的用戶體驗(yàn)。
適用場(chǎng)景:當(dāng)需要大量處理數(shù)據(jù)的任務(wù)時(shí),一次性返回所有結(jié)果會(huì)非常耗時(shí),影響用戶體驗(yàn)。此時(shí)可以采用流式返回結(jié)果的方式,即模型逐步返回結(jié)果,讓用戶可以及時(shí)查看部分結(jié)果。
示例:在需要大語(yǔ)言模型返回復(fù)雜的結(jié)果時(shí),如果我們期待它一次性返回所有的結(jié)果時(shí),它總是非常的緩慢。在這時(shí),采用傳統(tǒng)的 JSON、Yaml 等格式,必然非常緩慢的,對(duì)于用戶的體驗(yàn)非常差 —— 一個(gè)返回結(jié)果平均要幾十秒。而除了在模型側(cè)提升性能、本地減少請(qǐng)求,還可以構(gòu)建能處理流式返回的 DSL。
這也是為什么我們覺(jué)得傳統(tǒng)的 JSON 無(wú)法滿足的原因,在返回正常的結(jié)果前可能解析失敗,并且你返回的 JSON 可能不是完整的。
在這時(shí),我們需要服務(wù)端支持處理 streaming response,并需要前端來(lái)處理。如在商業(yè)畫(huà)布的場(chǎng)景下,就可以根據(jù)不同的一級(jí) LIST 處理結(jié)果,并實(shí)時(shí)呈現(xiàn)給用戶:
- 客戶細(xì)分
- 目標(biāo)市場(chǎng):企業(yè)客戶
- 客戶類(lèi)別:中小型企業(yè),初創(chuàng)企業(yè),創(chuàng)業(yè)公司,大型企業(yè)
- 客戶需求:專(zhuān)業(yè)技術(shù)服務(wù),包括但不限于IT咨詢,軟件開(kāi)發(fā),網(wǎng)絡(luò)安全,數(shù)據(jù)分析等
- 價(jià)值主張
...
除此,根據(jù)不同的場(chǎng)景,我們可以返回不同的格式,如 markdown 表格、CSV、JSONP 等也能作為返回格式。
模式:DSL 引導(dǎo)的功能生成
意圖:使用DSL和LLM結(jié)合的方式,以生成具有更好邏輯性和準(zhǔn)確性的文本。
適用場(chǎng)景:適用于需要根據(jù)規(guī)范和約束生成具有邏輯性和準(zhǔn)確性的大量文本的各種場(chǎng)景,例如軟件開(kāi)發(fā)、自然語(yǔ)言處理、數(shù)據(jù)分析和教育培訓(xùn)等領(lǐng)域。
示例:如我們所知,大模型(LLM)在生成文本時(shí)隨機(jī)性太高,充滿大量的不確定性。而由于,LLM 具備很好的邏輯推理能力,因此我們結(jié)合了 DSL 與 LLM 的強(qiáng)項(xiàng),讓它來(lái)編排 DSL 中的功能。
所以,在 Co-mate 里,我們?cè)O(shè)計(jì)了一套 DSL,以讓 LLM 根據(jù)不同的場(chǎng)景填空和編寫(xiě) DSL,如根據(jù)基礎(chǔ)的規(guī)范來(lái)生成 DSL:
foundation {
layered {
layer("application") {
pattern(".*\\.application") { name shouldBe endWiths("DTO", "Request", "Response") }
}
...
dependency {
"application" dependedOn "domain"
...
}
}
}
在這里的 layered 是指系統(tǒng)的分層架構(gòu),layer 則是分層的定義,dependency 則定義分層間的依賴(lài)關(guān)系。最后,交由我們的系統(tǒng)來(lái)處理這個(gè) DSL。
DSL 引導(dǎo)的功能生成是一種結(jié)合了領(lǐng)域特定語(yǔ)言(DSL)和大模型語(yǔ)言模型(LLM)的文本生成模式,通過(guò) DSL 提供的規(guī)范和約束,以增強(qiáng) LLM 生成文本的邏輯性和準(zhǔn)確性。
模式:語(yǔ)言顯式化重試
意圖:提高大語(yǔ)言模型生成結(jié)果的準(zhǔn)確性,并保持歷史消息,以便進(jìn)行對(duì)話記錄和可視化。
適用場(chǎng)景:由于大語(yǔ)言模型的不確定性,生成的結(jié)果往往不夠準(zhǔn)確。此時(shí)可以采用顯式化重試的方式,通過(guò)告知模型結(jié)果錯(cuò)誤并讓其重新生成,從而提高結(jié)果準(zhǔn)確性。
示例:眾所周知,由 LLM 生成的有確定性要求的結(jié)果,總會(huì)出現(xiàn)一定的錯(cuò)誤。諸如于,我在使用 ChatGPT 生成 PlantUML 時(shí),只有 80% 的結(jié)果是可正確編譯的。通常來(lái)說(shuō),在這種時(shí)候會(huì)有多種不同的方式可以實(shí)現(xiàn):
重新發(fā)送請(qǐng)求,以 GPT 再次生成。
告知 GPT 錯(cuò)了,讓他重新生成。
從結(jié)果來(lái)看,兩種模式的差異并不大。不過(guò),第二種方式需要保持歷史消息,所以會(huì)多消耗幾個(gè) token。
盡管從實(shí)踐來(lái)看,第一種方式更為簡(jiǎn)單,但是方式二提供了一種更顯式化的設(shè)計(jì)。
模式:動(dòng)態(tài)代理調(diào)用
意圖:支持動(dòng)態(tài)代理調(diào)用其他服務(wù)的API或函數(shù),并根據(jù)用戶的輸入進(jìn)行匹配和響應(yīng)。
適用場(chǎng)景:需要?jiǎng)討B(tài)處理用戶輸入并調(diào)用相應(yīng)功能的系統(tǒng),以及需要將自然語(yǔ)言與函數(shù)或服務(wù)進(jìn)行匹配和轉(zhuǎn)換的系統(tǒng)。它為開(kāi)發(fā)人員提供了一種靈活和可擴(kuò)展的方式來(lái)處理不同的輸入,并根據(jù)需求調(diào)用相應(yīng)的API或函數(shù)。
示例 1:LangChain Agents 采用的便是類(lèi)似的機(jī)制,它負(fù)責(zé)動(dòng)態(tài)代理調(diào)用其他服務(wù)的API,比如精確計(jì)算、實(shí)際的業(yè)務(wù)數(shù)據(jù) API 等。由內(nèi)部提供的一系列問(wèn)題模板來(lái)構(gòu)建這個(gè)過(guò)程:
...
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
...
示例 2:OpenAI 提供的 Function calling,可以檢測(cè)何時(shí)需要調(diào)用函數(shù)(取決于用戶的輸入)并使用符合函數(shù)簽名(signature)的 JSON 進(jìn)行響應(yīng)。這樣一來(lái),開(kāi)發(fā)人員更可靠地從模型中獲取結(jié)構(gòu)化數(shù)據(jù)。諸如于官方示例里的:?send_email(to:?string,?body:?string)
,便是可以直接由用戶的輸入轉(zhuǎn)換過(guò)來(lái)的。而在自然語(yǔ)言與函數(shù)之前,我們需要設(shè)計(jì)一個(gè)的方式來(lái)進(jìn)行匹配。
示例 3:在 ArchGuard Co-mate 中,我們也構(gòu)建了類(lèi)似的方式,其緣由是架構(gòu)治理是一個(gè)復(fù)雜的問(wèn)題,我們確定用戶的輸入并不一定在系統(tǒng)之中。因此,我們希望提供兩種方式:
反射 + 抽象的方式可調(diào)用的函數(shù),來(lái)匹配用戶的輸入。
提供關(guān)鍵的模型信息, 讓 LLM 進(jìn)行分析。
所以,我們?cè)O(shè)計(jì)的是 DynamicContext 的方式,以及對(duì)應(yīng)的 DyFunction 來(lái)實(shí)現(xiàn)這種方式的支持。
模式:本地函數(shù)動(dòng)態(tài)代理
意圖:旨在結(jié)合本地運(yùn)行的 NLP 工具對(duì)用戶輸入的文本進(jìn)行分析,并根據(jù)分析結(jié)果動(dòng)態(tài)匹配對(duì)應(yīng)的函數(shù)進(jìn)行調(diào)用。
適用場(chǎng)景:根據(jù)用戶輸入的文本內(nèi)容動(dòng)態(tài)匹配并調(diào)用相應(yīng)函數(shù)的系統(tǒng),通過(guò)本地文本分析工具結(jié)合語(yǔ)義分析實(shí)現(xiàn)準(zhǔn)確的函數(shù)匹配。它提供了靈活和可擴(kuò)展的方式來(lái)處理不同的文本輸入,并自動(dòng)選擇適當(dāng)?shù)暮瘮?shù)進(jìn)行處理。
示例:在 Co-mate 中,我們?cè)诒镜匾肓?SentenceTransformer 來(lái)處理用戶的輸入,優(yōu)在本地分析、匹配用戶的輸入,并處理。當(dāng)匹配到結(jié)果后直接調(diào)用本地的函數(shù),當(dāng)匹配不到結(jié)果時(shí)調(diào)用遠(yuǎn)端的處理函數(shù)來(lái)處理。
小結(jié)
由 ChatGPT 總結(jié)什么是語(yǔ)言 API:
語(yǔ)言 API 是一種使用自然語(yǔ)言作為領(lǐng)域特定語(yǔ)言(DSL)或與系統(tǒng)進(jìn)行交互的接口。它通過(guò)解析、處理和分析自然語(yǔ)言,以指導(dǎo)系統(tǒng)的設(shè)計(jì)、開(kāi)發(fā)和執(zhí)行。它的設(shè)計(jì)目的是提高開(kāi)發(fā)效率、準(zhǔn)確性和用戶體驗(yàn),使開(kāi)發(fā)人員能夠使用自然語(yǔ)言描述系統(tǒng)需求、執(zhí)行任務(wù)并獲取系統(tǒng)生成的結(jié)果。
由 Notion 總結(jié)本文:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-494111.html
本文介紹了五種模式,包括實(shí)時(shí)文本流 DSL、DSL 引導(dǎo)的功能生成、語(yǔ)言顯式化重試、動(dòng)態(tài)代理調(diào)用和本地函數(shù)動(dòng)態(tài)代理,以提高大語(yǔ)言模型的用戶體驗(yàn)和準(zhǔn)確性。這些模式適用于不同的場(chǎng)景,如需要大量處理數(shù)據(jù)的任務(wù)、需要生成具有邏輯性和準(zhǔn)確性的大量文本的各種場(chǎng)景、需要?jiǎng)討B(tài)處理用戶輸入并調(diào)用相應(yīng)功能的系統(tǒng)、需要將自然語(yǔ)言與函數(shù)或服務(wù)進(jìn)行匹配和轉(zhuǎn)換的系統(tǒng)等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494111.html
到了這里,關(guān)于語(yǔ)言接口:探索大模型優(yōu)先架構(gòu)的新一代 API 設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!