springboot集成langchain4j實現票務助手實戰

前言

看此篇的前置知識為langchain4j整合springboot,以及springboot集成langchain4j記憶對話。

Function-Calls介紹

  • langchain4j 中的 Function Calls(函數調用)是一種讓大語言模型(LLM)與外部工具(如 API、代碼執行器等)交互的機制。通過這種機制,LLM 可以根據上下文動態調用開發者預定義的函數,從而擴展其能力邊界,解決純文本生成無法處理的復雜任務(如數學計算、實時數據查詢、業務邏輯處理等)。
  • 對于基礎大模型來說,他只具備通用信息,他的參數都是拿公網進行訓練,并且有一定的時間延遲,無法得知一些具體業務數據和實時數據,這些數據往往被各軟件系統存儲在自己數據庫中:
  • 比如我現在開發一個智能票務助手我現在跟AI說需要退票,AI怎么做到呢?就需要讓AI調用我們自己系統的退票業務方法,進行數據庫操作。
  • 那這些都可以通過function-call進行完成,更多的用于實現類似智能客服場景,因為客服需要幫用戶解決業務問題(就需要調用業務方法)。

Function-Calls流程

比如: 現在當用戶問的是“kizzo頁面訪問量有多少”,大模型需要從程序內部獲取
1.問大模型 “頁面訪問量有多少”
2.大模型在識別到你的問題是:“kizzo頁面訪問量有多少”
3.大模型提取“訪問量”
4.調用 pageViewCount方法
5.通過返回的結果再結合上下文再次請求大模型
6.響應“Kizzo頁面的訪問量目前有1000次。”

用戶 應用langchain4j 大模型 頁面訪問量有多少? 調用記憶接口,輸入message"頁面訪問量有多少?" 提取關鍵字"訪問量”并調用pageViewCount方法" 返回1000 組織語言,返回"Kizzo頁面的訪問量目前有1000次。" Kizzo頁面的訪問量目前有1000次。 用戶 應用langchain4j 大模型

Function-Calls代碼實現

  1. 加入回調
@Service
@Slf4j
public class ToolsService {@Tool("kizzo頁面訪問量有多少")public Integer pageViewCount(@P("訪問量") String pv){//todo 此處可以查詢數據庫或rpc方法log.info("pv:{}", pv);// 結果return 1000;}
}

ToolsService配置為了一個bean
@Tool 用于告訴AI什么對話調用這個方法
@P(“訪問量")用于告訴AI,調用方法的時候需要提取對話中的什么信息,這里提取的是訪問量

  1. 在AiConfig中的助手對象增加Function-Calls Tools
    @Beanpublic Assistant assistant(ChatLanguageModel chatLanguageModel, StreamingChatLanguageModel streamingChatLanguageModel, ToolsService toolsService){// 最多存儲多少聊天記錄ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);// 為Assistant動態代理對象chat ---> 對話內容存儲ChatMemoryi ---> 聊天記錄ChatMemory取出來 ---->放入到當前對話中Assistant assistant = AiServices.builder(Assistant.class).tools(toolsService).chatLanguageModel(chatLanguageModel).streamingChatLanguageModel(streamingChatLanguageModel).chatMemory(chatMemory).build();return assistant;}

再次調用后結果如下:
在這里插入圖片描述

預設角色(系統消息SystemMessage)

基礎大模型是沒有目的性的,你聊什么給什么,但是如果我們開發的事一個智能票務助手,我需要他以一個票務助手的角色跟我對話, 并且在我跟他說”退票”的時候, 讓大模型一定要告訴我“車次”和“姓名"這樣我才能去調用業務方法(假設有一個業務方法,需要根據車子和姓名才能查詢具體車票),進行退票。
在langchain4j中實現也非常簡單

  • @SystemMessage 系統消息,一般做一些預設角色的提示詞,設置大模型的基本職責
  • 可以通過{{current date}} 傳入參數,因為預設詞中的文本可能需要實時變化
  • @V(“current date”),通過@V傳入{{}中的參數
  • 一旦參數不止一個,就需要通過@UserMessage設置用戶信息

代碼實現:

  1. 在AiConfig中的助手對象重載一個stream流輸出方法,用@SystemMessage預設提示詞角色
        @SystemMessage("""您是“xx”航空公司的客戶聊天支持代理。請以友好、樂于助人且愉快的方式來回復。您正在通過在線聊天系統與客戶互動。在提供有關預訂或取消預訂的信息之前,您必須始終從用戶處獲取以下信息:預訂號、客戶姓名。請講中文。今天的日期是 {{current_date}}.""")TokenStream stream(@UserMessage String message, @V("current_date") String currentDate);
  1. 在ToolsService中新增一個tool
    @Tool("退票")public String cancelBooking(@P("地區") String bookingNumber,@P("姓名") String name){//todo 業務方法,退票數據庫操作log.info("bookingNumber:{},name:{}", bookingNumber,name);// 結果return "退票成功";}
  1. Controller中新增一個接口調用
    // 預設角色記憶流對話@RequestMapping(value = "/system_message_chat_stream",produces = "text/stream;charset=UTF8")public Flux<String> systemMessageStreamChat(@RequestParam(defaultValue="我是誰") String message) {TokenStream stream = assistant.stream(message, LocalDate.now().toString());return Flux.create(sink ->  {stream.onPartialResponse(s -> sink.next(s)).onCompleteResponse(c -> sink.complete()).onError(sink::error).start();});}

結果如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80993.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL-數據庫分布式XA事務

準備 innodb存儲引擎開啟支持分布式事務 set global innodb_support_axonMySQL數據庫XA事務的SQL語法如下&#xff1a; XA {START| BEGIN} xid {JOIN | RESUME} XA END xid {SUSPEND [ FOR MIGRATE]} XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER 完…

SAP 運維-冷門問題解決辦法

1.SAP Fiori幫助菜單鏈接如何配置&#xff1f; 答&#xff1a; 執行事務代碼HELP_CONFIG&#xff0c;選擇對應的Fiori部署模式&#xff0c;配置幫助菜單下的URL鏈接。 檢查配置的幫助菜單&#xff0c;執行事務代碼/N//UI2/FLP_CUS_CONF 或者SR13進行查看配置狀態與修改。

新型智慧園區技術架構深度解析:數字孿生與零碳科技的融合實踐

&#x1f3ed;在杭州亞運村零碳園區&#xff0c;光伏板與氫燃料大巴構成的能源網絡&#xff0c;正通過數字孿生技術實現智能調度。這不僅是格力電器與龍源電力在新能源領域的創新實踐&#xff0c;更是智慧園區4.0時代的標桿案例。當AI算法開始接管能源調度&#xff0c;當BIM建模…

Java轉Go日記(三十六):簡單的分布式

1.1.1. 簡單的分布式server 目前分布式系統已經很流行了&#xff0c;一些開源框架也被廣泛應用&#xff0c;如dubbo、Motan等。對于一個分布式服務&#xff0c;最基本的一項功能就是服務的注冊和發現&#xff0c;而利用zk的EPHEMERAL節點則可以很方便的實現該功能。EPHEMERAL節…

機器學習筆記——特征工程

大家好&#xff0c;這里是好評筆記&#xff0c;公主號&#xff1a;Goodnote&#xff0c;專欄文章私信限時Free。本筆記介紹機器學習中常見的特征工程方法、正則化方法和簡要介紹強化學習。 文章目錄 特征工程&#xff08;Fzeature Engineering&#xff09;1. 特征提取&#xff…

在 Ubuntu 20.04.6 LTS 中將 SCons 從 3.1.2 升級到 4.9.1

在 Ubuntu 20.04.6 LTS 中將 SCons 從 3.1.2 升級到 4.9.1&#xff0c;可以通過以下步驟完成&#xff1a; 方法 1&#xff1a;使用 pip 安裝&#xff08;推薦&#xff09; 步驟 1&#xff1a;卸載舊版本 SCons # 如果通過 apt 安裝的舊版本&#xff0c;先卸載 sudo apt remov…

LeetCode熱題100--234.回文鏈表--簡單

1. 題目 給你一個單鏈表的頭節點 head &#xff0c;請你判斷該鏈表是否為回文鏈表。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,2,1] 輸出&#xff1a;true 示例 2&#xff1a; 輸入&#xf…

【markdown】介紹如何在markdown中繪制流程圖

在 Markdown 中編寫流程圖主要通過 ??Mermaid 語法??實現&#xff08;多數平臺如 GitHub、VS Code、Typora 已原生支持&#xff09;。以下是詳細方法&#xff1a; 1. 基礎流程圖?? 語法結構 用 mermaid 包裹代碼塊&#xff0c;指定方向后定義節點和連接線&#xff1a…

Java中使用自定義序列化器:自動添加View字段的實現與應用

Java 中 BigDecimal 序列化器:自動添加 View 返回字段的實現與應用 在 Java 開發過程中,數據的序列化與反序列化是非常重要的環節。當我們處理數值類型數據,特別是BigDecimal類型時,有時需要在序列化輸出中添加額外的視圖字段,以滿足前端展示或者特定業務需求。本文將通過…

Java類一文分解:JavaBean,工具類,測試類的深度剖析

解鎖Java類的神秘面紗&#xff1a;從JavaBean到測試類的深度剖析 前言一、JavaBean 類&#xff1a;數據的守護者&#xff08;一&#xff09;JavaBean 類是什么&#xff08;二&#xff09;JavaBean 類的特征&#xff08;三&#xff09;JavaBean 類的使用場景&#xff08;四&…

機器學習-- 線性回歸、邏輯回歸

線性回歸 線性回歸是一種統計方法,用于發現變量之間的關系。在機器學習背景下,線性回歸可找出特征(Feature)與標簽(Lable)之間的關系。 例如,假設我們想要根據汽車的重量預測汽車的每加侖汽油行駛里程(mpg),并且我們有以下數據集: 線性回歸方程 Linear regressi…

Lua再學習

因為實習的項目用到了Lua&#xff0c;所以再來深入學習一下 函數 函數的的多返回值 Lua中的函數可以實現多返回值&#xff0c;實現方法是再return后列出要返回的值的列表&#xff0c;返回值也可以通過變量接收到&#xff0c;變量不夠也不會影響接收對應位置的返回值 Lua中傳…

TCP協議十大核心特性深度解析:構建可靠傳輸的基石

TCP&#xff08;傳輸控制協議&#xff09;作為互聯網的"交通指揮官"&#xff0c;承載著全球80%以上的網絡流量。本文將深入解析TCP協議的十大核心特性&#xff0c;通過原理剖析、流程圖解和實戰案例&#xff0c;揭示其如何實現高效可靠的數據傳輸。 一、面向連接的可…

基于 Spring Boot 瑞吉外賣系統開發(十三)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;十三&#xff09; 查詢套餐 在查詢套餐信息時包含套餐的分類名&#xff0c;分類名稱在category表中&#xff0c;因此這里需要進行兩表關聯查詢。 自定義SQL如下&#xff1a; select s.* ,c.name as category_name from setmeal…

華為IP(6)

VLAN聚合 VLAN聚合產生的技術背景 在一般是三層交換機中&#xff0c;通常采用一個VLAN接口的方式實現廣播域之間的互通&#xff0c;這在某些情況下導致了IP地址的浪費 因為一個VLAN對應的子網中&#xff0c;子網號、子網廣播地址、子網網關地址不能用作VLAN內的主機IP地址&a…

深度解析IP靜態的工作原理,IP靜態的應用場景又哪些?

一、什么是IP靜態&#xff1f; 當我們談到“IP靜態”時&#xff0c;大家可能首先想到的是與“動態IP”相對的概念。確實如此&#xff0c;靜態IP是一種固定分配的IP地址&#xff0c;也就是說&#xff0c;在特定時間內&#xff0c;分配給你的IP地址不會有所更改——無論你完成多…

docker(四)使用篇一:docker 鏡像倉庫

前文我們已經介紹了 docker 并安裝了 docker&#xff0c;下面我們將正式步入使用環節&#xff0c;本章是第一個使用教學&#xff1a;docker 鏡像倉庫。 一、什么是鏡像倉庫 所謂鏡像倉庫&#xff0c;其實就是負責存儲、管理和分發鏡像的倉庫&#xff0c;并且建立了倉庫的索引…

單片機開發軟件

目錄 純編碼 vscode Ardunio Keil 1. 集成化開發環境&#xff08;IDE&#xff09; 2. 多架構芯片支持 3. 高效的代碼生成與優化 4. 強大的調試與仿真功能 5. 豐富的庫函數與生態系統 6. 教育與企業級適用性 典型應用場景 半編碼半圖形化 STM32CUBEIED 1. 圖形化配置…

【虛幻引擎】UE5獨立游戲開發全流程(商業級架構)

本套課程我將會講解一下知識 1.虛幻引擎的常用功能節點、模塊包含但不限于動畫模塊、UI模塊、AI模塊、碰撞模塊、傷害模塊、背包模塊、準心模塊、武器模塊、可拾取物品模塊、死亡等模塊。 2.整個游戲的設計思路&#xff08;游戲架構&#xff09;&#xff0c;本套教程講解了如…

ABP-Book Store Application中文講解 - Part 2: The Book List Page

本章用于介紹如何創建Book List Page。 TBD 1. 匯總 ABP-Book Store Application中文講解-匯總-CSDN博客 2. 前一章 ABP-Book Store Application中文講解 - Part 1: Creating the Server Side 項目之間的引用關系。 目錄 1. 多語言配置 1.1 zh-Hans.json 1.2 en.jso…