為何選擇Spring AI Alibaba開發智慧客服平臺?

公众号-JavaEdge發表於2024-11-09

0 前言

本文來看如何使用Spring AI Alibaba構建Agent應用。

1 需求

智慧客服平臺,可幫助使用者完成機票預定、問題解答、機票改簽、取消等動作,具體要求:

  • 基於 AI 大模型與使用者對話,理解使用者自然語言表達的需求
  • 支援多輪連續對話,能在上下文中理解使用者意圖
  • 理解機票操作相關的術語與規範並嚴格遵守,如航空法規、退改簽規則等
  • 在必要時可呼叫工具輔助完成任務

2 技術架構

2.1 接入AI大模型

不過是用 Spring Boot 開發普通 Java 應用,要能持續接收使用者提問,解決機票相關問題,叫它Agent應用是因為這應用可與 AI 互動,由 AI 幫助應用理解使用者問題併為使用者做決策,簡化分解後的架構:

2.2 利用RAG增加機票退改簽規則

應用由 AI 模型理解使用者問題,決策下一步動作、驅動業務流程。但任一通用大模型都能解決機票相關問題嗎?依賴模型的決策是可靠的嗎?如有使用者提出機票改簽的訴求,模型一定能很好理解使用者意圖,沒疑問。但:

  • 它咋知當前使用者符不符合退票規則?畢竟每個航空公司改簽規則都不同
  • 它咋知改簽手續費的規定?在這樣一個可能帶來經濟糾紛、法律風險的應用場景下,AI模型必須要知道改簽規則的所有細節,並逐條確認使用者資訊複合規則後,才能最終作出是否改簽的決策

顯然,單純依賴 AI 模型本身不能滿足需求,就要用到RAG模式。透過 RAG 將機票退改簽相關領域知識輸入給應用和 AI 模型,讓 AI 結合這些規則與要求輔助決策,增加 RAG 後的架構:

有了RAG,應用才真正成為智慧化的機票問題專家,就像一個經公司業務培訓的客服代表,既能人性化與使用者對話,又能根據規則引導使用者行為。

2.3 使用Function Calling執行業務動作

AI Agent可幫應用理解使用者需求並決策,但沒法代替應用完成決策執行,決策執行還是要由應用自己完成,這點和傳統應用無區別,不論智慧化的還是預先編排好的應用,都是要由應用本身去呼叫函式修改資料庫記錄實現資料持久化。

透過 Spring AI 框架,可將模型的決策轉換為對某個具體函式的呼叫,從而完成機票的最終改簽或者退票動作,將使用者資料寫入資料庫,即Function Calling模式。

2.4 使用 Chat Memory 增加多輪對話能力

大模型是無狀態的,它看到的只有當前這輪對話的內容。因此若要支援多輪對話效果,需應用每次都將之前對話上下文保留,並與最新問題一併作為 prompt 傳送給模型。這時,我們可以利用 Spring AI Alibaba 提供的內建 Conversation Memory 支援,方便的維護對話上下文。

至此,讓我們總結在這個智慧客服平臺應用使用到的

3 Spring AI Alibaba 核心能力

  1. 基本模型對話能力,透過 Chat Model API 與通義模型互動
  2. Prompt 管理能力
  3. Chat Memory 聊天記憶,支援多輪對話
  4. RAG、Vector Store,機票預定、改簽、退票等相關規則

4 使用 ChatClient 完成編碼

Spring AI Alibaba 不止提供了以上原子能力抽象,還提供了高階 “智慧體” API 抽象 ChatClient,讓我們可以非常方便的使用流式 Fluent API 把多個元件組裝起來,成為一個AI Agent。

具體使用:

this.chatClient = modelBuilder
        .defaultSystem("""
            您是“Funnair”航空公司的客戶聊天支援代理。請以友好、樂於助人且愉快的方式來回復。
             您正在透過線上聊天系統與客戶互動。
             在提供有關預訂或取消預訂的資訊之前,您必須始終
             從使用者處獲取以下資訊:預訂號、客戶姓名。
             在詢問使用者之前,請檢查訊息歷史記錄以獲取此資訊。
             在更改預訂之前,您必須確保條款允許這樣做。
             如果更改需要收費,您必須在繼續之前徵得使用者同意。
             使用提供的功能獲取預訂詳細資訊、更改預訂和取消預訂。
             如果需要,可以呼叫相應函式呼叫完成輔助動作。
             請講中文。
             今天的日期是 {current_date}.
          """)
        .defaultAdvisors(
            new PromptChatMemoryAdvisor(chatMemory), // Chat Memory
            new VectorStoreChatMemoryAdvisor(vectorStore)),
            new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()), // RAG
            new LoggingAdvisor())
        .defaultFunctions("getBookingDetails", "changeBooking", "cancelBooking") // FUNCTION CALLING

        .build();

這樣ChatClient就為我們遮蔽了所有與大模型互動的細節,只需要把ChatClient注入常規的 Spring Bean 就可以為我們的機票應用加入智慧化能力了。

5 執行效果

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。

各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統效能最佳化
  • 活動&券等營銷中臺建設
  • 交易平臺及資料中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
  • LLM Agent應用開發
  • 區塊鏈應用開發
  • 大資料開發挖掘經驗
  • 推薦系統專案

目前主攻市級軟體專案設計、構建服務全社會的應用系統。

參考:

  • 程式設計嚴選網

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章