LangChain4j 入門(二)

LangChain 整合 SpringBoot

下述代碼均使用 阿里云百煉平臺 提供的模型。

創建項目,引入依賴

  1. 通過 IDEA 創建 SpringBoot 項目,并引入 Spring Web 依賴,SpringBoot 推薦使用 3.x 版本。

    在這里插入圖片描述
  2. 引入 LangChain4j 和 WebFlux 依賴
<!--阿里云 DashScope API(通義大模型)的 Spring Boot Starter 依賴-->
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId><version>1.0.0-beta2</version>
</dependency>
<!--LangChain4j 的核心庫-->
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>1.0.0-beta2</version>
</dependency>
<!--Spring WebFlux 依賴-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

案例一 — 普通對話

該示例為整體返回,即等待模型回復完成后,一起進行返回。

  1. 配置 yaml
langchain4j:community:dashscope:chat-model:api-key: 個人 api-keymodel-name: qwen-max
  1. 創建 ChatController,并編寫相關接口
@RestController
@RequestMapping("/chat")
public class ChatController {@Autowiredprivate ChatLanguageModel chatLanguageModel;@RequestMapping("/test1")public String test1(@RequestParam(defaultValue = "你好") String message) {String response = chatLanguageModel.chat(message);return response;}
}
  1. 測試接口響應

瀏覽器中訪問:http://localhost:8080/chat/test1?message=你好,你是誰,如果有響應類似下述內容,則說明成功。
在這里插入圖片描述

案例二 — 流式對話

上述示例用戶體驗并不好,本示例采用流式返回

  1. 配置 yaml
langchain4j:community:dashscope:streaming-chat-model:model-name: qwen-maxapi-key: 個人 api-key
  1. 編寫相關接口
@Autowired
private StreamingChatLanguageModel streamingChatLanguageModel;// 指定 produces,否則會出現亂碼情況
@RequestMapping(value = "/test2", produces = "text/stream;charset=UTF-8")
public Flux<String> test2(@RequestParam(defaultValue = "你好") String message) {Flux<String> flux = Flux.create(sink -> {streamingChatLanguageModel.chat(message, new StreamingChatResponseHandler() {@Overridepublic void onPartialResponse(String partialResponse) {sink.next(partialResponse);}@Overridepublic void onCompleteResponse(ChatResponse completeResponse) {sink.complete();}@Overridepublic void onError(Throwable error) {sink.error(error);}});});return flux;
}
  1. 測試接口響應

瀏覽器中訪問:http://localhost:8080/chat/test2?message=你好,你是誰,如果有響應類似下述內容,則說明成功。

本案例與案例一的區別為輸出方式不同,一種是整體輸出,一種是流式輸出。

在這里插入圖片描述

案例三 — 圖片生成

百煉平臺提供500張圖片的免費額度用于學習。
本案例采用同步的方式獲取圖片,也可以按照官方文檔采用異步方式進行圖片獲取。

  1. 配置yaml
gen-img:api-key: 個人 api-keymodel-name: wanx2.1-t2i-turbo
  1. 配置 WanxImageModel,編寫相關接口
@Configuration
public class AIConfig {@Value("${gen-img.api-key}")private String genImgApiKey;@Value("${gen-img.model-name}")private String genImgModelName;@Bean/*** 圖片繪制模型*/public WanxImageModel wanxImageModel() {return WanxImageModel.builder().apiKey(genImgApiKey).modelName(genImgModelName).build();}
}
@Autowired
private WanxImageModel wanxImageModel;@RequestMapping("/test3")
public String test3(@RequestParam(defaultValue = "午后的公園") String message) {Response<Image> generate = wanxImageModel.generate(message);// 具體返回結構可查看官方定義,這里只獲取圖片的 urlreturn generate.content().url().toString();
}
  1. 測試接口響應

在瀏覽器中輸入:http://localhost:8080/chat/test3?message=雨后的公園
下圖中返回數據為生成圖片的 url,使用瀏覽器訪問該 url,可以在瀏覽器中下載生成后的圖片。
在這里插入圖片描述
生成的圖片如下:
在這里插入圖片描述

案例四 — 記憶對話

  1. 配置 AiService 相關對象
// 定義聊天助手接口
public interface MyAssistant {String chat(String message);TokenStream stream(String message);
}@Bean
public MyAssistant assistant(ChatLanguageModel qwenChatModel, StreamingChatLanguageModel qwenStreamingChatModel) {MyAssistant assistant = AiServices.builder(MyAssistant.class).chatLanguageModel(qwenChatModel).streamingChatLanguageModel(qwenStreamingChatModel).chatMemory(MessageWindowChatMemory.withMaxMessages(20))// 自定義對話存儲方式
//                .chatMemoryProvider(memoryId -> MessageWindowChatMemory
//                        .builder()
//                        .chatMemoryStore(new ChatMemoryStore() {
//                            @Override
//                            public List<ChatMessage> getMessages(Object memoryId) {
//                                return null;
//                            }
//
//                            @Override
//                            public void updateMessages(Object memoryId, List<ChatMessage> messages) {
//
//                            }
//
//                            @Override
//                            public void deleteMessages(Object memoryId) {
//
//                            }
//                        }
//                ).build()).build();return assistant;
}
  1. 編寫接口,采用流式返回
@Autowired
private AIConfig.MyAssistant assistant;@RequestMapping(value = "/test4", produces = "text/stream;charset=UTF-8")
public Flux<String> test4(@RequestParam(defaultValue = "你好") String message) {TokenStream stream = assistant.stream(message);return Flux.create(sink -> {stream.onPartialResponse(sink::next).onCompleteResponse(c -> sink.complete()).onError(sink::error).start();});
}
  1. 測試接口響應
    1. 直接進行詢問
      在這里插入圖片描述

    2. 通過接口給模型寫入記憶在這里插入圖片描述

    3. 根據寫入記憶,進行對話
      在這里插入圖片描述

上述聊天信息默認存儲在內存中,程序重啟后會丟失記憶,可以重寫被注釋掉的內容,將信息存儲到 mysql、redis等存儲容器中。

案例五 — 記憶對話,數據隔離

上述案例中,所有的問答都是混合到一起的,即 A 對模型輸入的信息,B 也可以讀取到,本案例將通過 memoryId 對記憶數據進行隔離。

  1. 配置 AiService 相關對象
public interface MyAssistantIsolate {String chat(@MemoryId String memoryId, @UserMessage String message);TokenStream stream(@MemoryId String memoryId, @UserMessage String message);
}@Bean
public MyAssistantIsolate myAssistantMemory(ChatLanguageModel qwenChatModel, StreamingChatLanguageModel qwenStreamingChatModel) {ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(20)// 自定義對話存儲方式
//                .chatMemoryStore(new ChatMemoryStore() {
//                    @Override
//                    public List<ChatMessage> getMessages(Object memoryId) {
//                        return null;
//                    }
//
//                    @Override
//                    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
//
//                    }
//
//                    @Override
//                    public void deleteMessages(Object memoryId) {
//
//                    }
//                }).build();MyAssistantIsolate assistant = AiServices.builder(MyAssistantIsolate.class).chatLanguageModel(qwenChatModel).streamingChatLanguageModel(qwenStreamingChatModel).chatMemoryProvider(chatMemoryProvider).build();return assistant;
}
  1. 編寫接口
@Autowired
private AIConfig.MyAssistantIsolate myAssistantIsolate;@RequestMapping(value = "/test5", produces = "text/stream;charset=UTF-8")
// 通過不同的 memoryId 對記憶進行分割,memoryId 可以使用 userId 或 uuid
public Flux<String> test5(String memoryId, String message) {TokenStream stream = myAssistantIsolate.stream(memoryId, message);return Flux.create(sink -> {stream.onPartialResponse(sink::next).onCompleteResponse(c -> sink.complete()).onError(sink::error).start();});
}
  1. 測試接口響應
    1. 給 memoryId = 1,設置記憶信息
      在這里插入圖片描述
    2. 通過 memoryId = 1,查詢記憶信息
      在這里插入圖片描述
    3. 通過 memoryId = 2,查詢記憶信息
      在這里插入圖片描述

上述內容為 LangChain4j 整合 SpringBoot 的基本示例。

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

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

相關文章

3.30學習總結 Java包裝類+高精度算法+查找算法

包裝類&#xff1a; 基本數據類型對應的引用數據類型。 基本數據類型&#xff1a;在內存中記錄的是真實的值。 八種包裝類的父類都是Object類。 對象之間不能直接進行計算。 JDK5之后可以把int和integer看成一個東西&#xff0c;因為會進行內部優化。自動裝箱和自動拆箱。 …

centos 7 LVM管理命令

物理卷&#xff08;PV&#xff09;管理命令 pvcreate&#xff1a;用于將物理磁盤分區或整個磁盤創建為物理卷。 示例&#xff1a;sudo pvcreate /dev/sdb1 解釋&#xff1a;將 /dev/sdb1 分區創建為物理卷。 pvdisplay&#xff1a;顯示物理卷的詳細信息&#xff0c;如大小、所屬…

借助FastAdmin和uniapp,高效搭建AI智能平臺

在數字化辦公時代&#xff0c;效率與協作是企業發展的核心競爭力。傳統的辦公工具雖然功能豐富&#xff0c;但在面對復雜多變的團隊協作需求時&#xff0c;往往顯得力不從心。為了解決這一痛點&#xff0c;我們推出了一款全新的辦公AI平臺&#xff0c;它不僅能夠滿足文字和語音…

項目上傳github——SSH連接配置文檔

1. 檢查是否已有 SSH 密鑰 打開終端&#xff0c;檢查是否已經存在 SSH 密鑰對&#xff1a; ls ~/.ssh如果你看到類似 id_rsa 和 id_rsa.pub 的文件&#xff0c;說明你已經有 SSH 密鑰。否則&#xff0c;繼續下一步。 2. 生成 SSH 密鑰 如果你沒有 SSH 密鑰&#xff0c;使用…

傳奇類網游頁游2.5D游戲場景地圖素材Eagle庫 沙漠沙海隔壁

傳奇類網游頁游2.5D游戲場景地圖素材Eagle庫 沙漠沙海隔壁 鏈接: https://pan.baidu.com/s/1GY8N-KEkHBGEbS7uxrE4Dg 提取碼: yrs8 備用下載地址&#xff1a;http://pan.1234f.com:5212/s/rLzIp 電子資料文檔&#xff1a;https://www.1234f.com/sj/GitHub/sucai/20250327/1323…

通過TIM+DMA Burst 實現STM32輸出變頻且不同脈沖數量的PWM波形

Burst介紹&#xff1a; DMA控制器可以生成單次傳輸或增量突發傳輸&#xff0c;傳輸的節拍數為4、8或16。 為了確保數據一致性&#xff0c;構成突發傳輸的每組傳輸都是不可分割的&#xff1a;AHB傳輸被鎖定&#xff0c;AHB總線矩陣的仲裁器在突發傳輸序列期間不會撤銷DMA主設備…

鴻蒙學習手冊(HarmonyOSNext_API16)_數據持久化③:關系型數據庫

概述 關系型數據庫&#xff1a;像“Excel表格聯合作戰”的管家 關系型數據庫就像一個超級智能的表格管理系統&#xff0c;專門處理數據之間有復雜關聯的情況。比如學生和成績、訂單和商品、用戶和評論——這些數據像蜘蛛網一樣相互連接&#xff0c;用鍵值數據庫的“獨立抽屜”…

Windows 11 VS Code C/C++ 開發環境搭建——一種盡量“綠色”的方法

我的電腦是Windows 11 系統&#xff0c;安裝了Visual Studio Code&#xff0c;在上面搭建C/C開發環境&#xff0c;當然&#xff0c;這需要用到MinGW之流了。作為一個綠色愛好者&#xff08;帽子除外&#xff09;&#xff0c;我也盡量綠色地架設這樣一個環境…… 第一步&#x…

mysql-分區和性能

mysql自身只支持表的橫向分區。 常聽到開發人員說“”對表做個分區“&#xff0c;然后數據的查詢就會快了。這是真的嗎&#xff1f;實際上可能跟根本感覺不到查詢速度的提升&#xff0c;甚至會發現查詢速度急劇下降。因此&#xff0c;在合理使用分區之前&#xff0c;必須了解分…

DeepSeek協助優化-GTX750Ti文物顯卡0.65秒卷完400MB float 音頻512階時域FIR

文章目錄 1. 學習目的2. 階段成果2.1 NVVP 性能探查2.2 測試編譯環境2.3 測試樣例 3 學習過程3.1 提問DeepSeek3.2 最終代碼 4. 體會 1. 學習目的 最近在學習cuda&#xff0c;準備給我的taskBus SDR添加CUDA的模塊支持&#xff0c;以便可以用PC機壓榨山寨 B210那56M的帶寬。 因…

RabbitMQ高級特性--TTL和死信隊列

目錄 1.TTL 1.1設置消息的TTL 1.1.1配置交換機&隊列 1.1.2發送消息 1.1.3運行程序觀察結果 1.2設置隊列的TTL 1.2.1配置隊列和交換機的綁定關系 1.2.2發送消息 1.2.3運行程序觀察結果 1.3兩者區別 2.死信隊列 2.1 聲名隊列和交換機 2.2正常隊列綁定死信交換機 …

【JavaEE】UDP數據報套接字編程

目錄 網絡編程基礎 基本概念 發送端和接收端 請求和響應 客戶端和服務端 常見的客戶端服務端模型 Socket套接字 TCP/UDP特點 Java數據報套接字通信模型(UDP通信) UDP數據報套接字編程 DatagramSocket 1.類定義 2.構造方法 3.核心方法 4.特性說明 DatagramPacke…

Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 實現項目接口文檔管理

在現代企業級應用開發中&#xff0c;前后端分離已成為主流模式&#xff0c;前端負責界面呈現&#xff0c;后端專注提供 RESTful API 接口。然而&#xff0c;接口文檔的編寫和維護往往是開發過程中的痛點。Spring Boot 3.4.3 結合 SpringDoc 2 和 Swagger 3&#xff0c;為開發者…

構建大語言模型應用:數據準備(第二部分)

本專欄通過檢索增強生成&#xff08;RAG&#xff09;應用的視角來學習大語言模型&#xff08;LLM&#xff09;。 本系列文章 簡介數據準備&#xff08;本文&#xff09;句子轉換器向量數據庫搜索與檢索大語言模型開源檢索增強生成評估大語言模型服務高級檢索增強生成 RAG 如上…

Linux 隨機數據生成

目錄 一. /dev/urandom1.1 dd 命令1.2 head命令1.3 隨機字母 二. openssl 命令三. yes命令 一. /dev/urandom ?/dev/urandom 是 Linux 和 Unix 系統中的一個特殊文件&#xff0c;它是一個偽隨機數生成器&#xff0c;用于提供高吞吐量的隨機數據。 1.1 dd 命令 bs1M count10…

項目如何安裝本地tgz包并配置局部registry

一、判斷包來源是否正確 1. 檢查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步驟&#xff1a; 1. 全局配置 如果你希望對所有項目生效&#xff0c;可以將這行配置添加到全局.npmr…

QCustomPlot入門

QCustomPlot 是一個基于 Qt 的 C++ 繪圖庫,專注于高效、美觀的 2D 數據可視化。進入QCustomPlot下載頁,下載最新的完整包(包含:源碼、文檔、示例)。 一、核心架構設計 1. 分層架構模型 層級主要組件職責說明用戶接口層QCustomPlot 類提供頂層API,管理所有子組件邏輯控制…

C語言快速入門-C語言基礎知識

這個c語言入門&#xff0c;目標人群是有代碼基礎的&#xff0c;例如你之前學過javaSE&#xff0c;看此文章可能是更有幫助&#xff0c;會讓你快速掌握他們之間的差異&#xff0c;文章內容大部分都是泛談&#xff0c;詳細的部分我會在之后時間發布&#xff0c;我也在慢慢學習&am…

【商城實戰(91)】安全審計與日志管理:為電商平臺筑牢安全防線

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…

信息安全工程師第 1 章

《信息安全工程師教程(第2版)》第一章 一、網絡信息安全基本概念與重要性 網絡信息安全定義 狹義:保障信息系統的機密性(C)、完整性(I)、可用性(A)——CIA三性。廣義:涵蓋國家安全、經濟安全、社會安全等的“大安全”。法律依據:《網絡安全法》定義網絡安全為防范攻…