混合推理,也稱為神經符號人工智慧,是一種將機器學習和符號推理相結合的人工智慧,旨在實現互補,彌補前者的不足,如可靠性、可重複性和透明度的不足。
該專案的主要思想是透過簡單但引人注目的例子展示混合推理,特別是如何將 LLM 與規則引擎相結合,允許在不同的業務領域中實現聊天機器人,這些聊天機器人既方便使用者使用,又能夠以嚴格的方式應用該特定領域的業務規則,而不會產生任何幻覺。
如果沒有控制,力量就毫無意義
如今,使用 ChatGPT 等 LLM 系統可以做的事情簡直令人難以置信。我必須承認,我無法停止驚訝,有時甚至會從座位上跳起來想:“我沒想到人工智慧也能做到這一點!”。這裡有點誤導的是,我們現在所說的和傾向於認同的人工智慧實際上是深度學習,它只是所有可用人工智慧技術的一個子集。
換句話說,深度學習只是整個 AI 故事的一小部分。此外,在很多情況下,你最不希望的是感到驚訝。當你的銀行拒絕向你發放抵押貸款時,你不會想跳起來,因為你沒有任何人類可以理解或可追蹤的理由,而只是因為 LLM 說不。甚至銀行也可能只願意向那些在其嚴格、明確且無可置疑的業務規則下被視為可行的申請人發放抵押貸款。
本質上,訓練有素的深度學習模型所提供的能力和靈活性幾乎是無限的,但正如許多學術論文所討論的那樣,鑑於其統計性質,它們並不完全可靠,並且幻覺等重大缺陷是不可避免的。
實際上,至少在應用程式的某些部分,您經常需要的是更受限制且絕對可預測的控制,以使其與您的業務領域保持一致並完美地遵守其規則。
結合 LLM 靈活性和規則引擎可預測性
鑑於這些前提,為什麼不將深度學習和符號推理等兩個非常不同且互補的 AI 分支混合在一起呢?繼續以抵押貸款為例,這將使我們有機會實施一款應用程式,該應用程式具有銀行嚴格的業務規則所要求的企業嚴謹性,但可以以最人性化的方式進行查詢。
該專案的目標是展示Quarkus如何在其Drools 和LangChain4j 擴充套件的幫助下輕鬆整合這兩種技術並將它們結合起來實現這個抵押貸款示例和其他有趣的用例。
安裝並整合本地 LLM 引擎
LangChain4j 在底層 LLM 之上提供了一個抽象,因此您可以在不同的實現之間切換,例如整合 ChatGPT,而只需進行很少的配置更改。為了擁有一個獨立的應用程式,不依賴於任何外部服務,當前配置在本地執行的InstructLab伺服器上使用。
InstructLab API 與 OpenAI 的 API 完全相容,因此要整合它,您可以使用擴充套件quarkus-langchain4j-openai並在 Quarkusapplication.properties檔案中對其進行配置,如下所示:
# Configure openai server to use Merlinite 7B model |
抵押貸款示例
正如預期的那樣,這個第一個也是最簡單的例子結合了 Drools 和 LLM,目的是讓我們的使用者以最順暢和最不結構化的方式與銀行聊天機器人進行互動,但在做出有關授予抵押貸款的決定時仍然應用銀行冷冰冰、不靈活的業務規則。
實際上,實施的規則要求非常基本,只要有足夠的收入,當然還要成年,所以當我們輸入類似
馬里奧是弗斯科家的長子,出生於 1974 年 3 月 18 日。現在他是一名軟體工程師,年薪 25 萬美元。 |
聊天機器人溫柔地回答
可以,馬里奧-弗斯科可以獲得抵押貸款 |
瞭解這裡幕後發生的事情很有趣。
該應用程式透過 langchain4j 整合,要求 LLM 從輸入訊息中提取抵押貸款申請人的相關資料。
{<font>"model":"mistral","prompt":"Extract information about a person from {\"message\":\"Mario the firstborn of the Fusco family is born the 18th day of March 1974 Nowadays he works as software engineer and earns a quarter million a year\"}. When income is null, it is set to 0. The response must contain only the JSON with person's data and without any other sentence.\nYou must answer strictly in the following JSON format: {\n\"firstName\": (type: string),\n\"lastName\": (type: string),\n\"birthDate\": (type: date string (2023-12-31)),\n\"income\": (type: integer),\n}","options":{"temperature":0.1,"num_predict":128,"top_p":0.9,"top_k":40},"stream":false} |
根據請求,LLM 回覆了包含這些資料的 JSON
{"firstName": "Mario", "lastName": "Fusco", "birthDate": "1974-03-18", "income": 250000}
這些內容會被 LangChain4j 自動轉換為類的例項Person。此時,可以直接將此Person物件插入 Drools 會話,並讓其根據該會話評估銀行業務規則。
該解決方案的另一個好處(在類似情況下也很可能要求)是規則引擎是一種完全透明且可追蹤的人工智慧形式,因此如果你寫了類似這樣的內容:
馬里奧-弗斯科的女兒索菲亞出生於 2011 年 9 月 26 日。她是一個非常聰明的學生。 |
系統不僅正確地拒絕授予抵押貸款,而且還解釋了拒絕的原因。
不能向索菲亞-弗斯科發放抵押貸款,因為[索菲亞-弗斯科太小,索菲亞-弗斯科的收入太低]。 |
密碼生成器示例
生成一個強大但容易記住的密碼是一項非常常見的任務,我們在瀏覽網際網路時不時會被要求執行這項任務,那麼為什麼不利用 LLM 的創造力來完成這項任務呢?
實際上,在這種情況下,我們不需要完全可靠的 LLM。相反,如果它能比平時更有創意,那就更重要了。為此,我們可以提高 LLM 溫度,這是一個影響語言模型輸出的引數,決定輸出是更隨機、更有創意還是更可預測。溫度越高,機率就越低,即輸出越有創意。
由於 Quarkus 整合,這可以輕鬆實現定義 a second and hotter LLM model並配置密碼生成器configuring the password generator to use it來 使用它。
透過這種方式,我們可以例如要求 LLM 生成一個與 相關的隨機單詞,football然後它可以回覆goalkeeper。
不幸的是,我們幾乎從來不被允許使用這麼簡單的單詞作為密碼。實際上,密碼應該遵循一些簡單的規則,例如具有一定的長度,並且至少包含一個大寫字母、一個數字、一個符號和一個在滿月之夜被殺死的黑麵包師的血液。
有了這些前提,自然就可以用 Drools 對這些規則進行編碼,讓規則引擎為您應用這些規則,將 LLM 最初建議的單詞轉化為更安全的 G0alk&&p。
航空公司聊天機器人示例
在這個例子中,業務規則很簡單:每延誤一分鐘,客戶可獲得 2 美元的退款(如果航班延誤至少一小時),如果是老年客戶(年齡超過 65 歲),則可以獲得 10% 的退款。
然而,規則引擎不僅用於計算最終退款金額,還用於定義另一組實現狀態機的規則。該狀態機的目的是引導我們的聊天機器人完成資料採集的不同階段,為當前階段選擇正確的資料提取器。從本質上講,我們的聊天機器人的架構可以用這種方式直觀地總結出來。