LangChain4j 搭配 Kotlin:以協程、流式交互賦能語言模型開發

Kotlin 支持 | LangChain4j

Kotlin 是一種面向 JVM(及其他平臺)的靜態類型語言,能夠實現簡潔優雅的代碼,并與 Java 庫無縫互操作。

LangChain4j 利用 Kotlin 擴展和類型安全構建器來增強 Java API,為其增添特定于 Kotlin 的便利功能,從而允許用戶為現有的 Java 類擴展額外的功能,以滿足 Kotlin 的特定需求。

注意

LangChain4j 并不要求將 Kotlin 庫作為運行時依賴,但卻 enables 用戶利用 Kotlin 的協程能力來實現非阻塞執行,進而提升性能和效率。

如果你想使用數據類,那么請確保你的類路徑中包含 Jackson 模塊 Kotlin。對于 Maven 而言,需添加運行時依賴:

<dependency><groupId>com.fasterxml.jackson.module</groupId><artifactId>jackson-module-kotlin</artifactId><version>[LATEST_VERSION]</version><scope>runtime</scope>
</dependency>

ChatLanguageModel 擴展

以下 Kotlin 代碼展示了如何利用協程和掛起函數以及類型安全構建器與 LangChain4j 中的 ChatLanguageModel 進行交互:

val model = OpenAiChatModel.builder().apiKey("YOUR_API_KEY")// 在此處添加更多配置參數 ....build()CoroutineScope(Dispatchers.IO).launch {val response = model.chat {messages += systemMessage("You are a helpful assistant") // 將系統消息添加到消息列表中messages += userMessage("Hello!") // 將用戶消息添加到消息列表中parameters { // 配置參數temperature = 0.7 // 設置溫度參數}}println(response.aiMessage().text()) // 打印出模型的回復文本
}

交互過程采用 Kotlin 的 協程 異步進行:

  • CoroutineScope(Dispatchers.IO).launch :在 IO 調度程序上執行該進程,這對于如網絡或文件 I/O 等阻塞任務進行了優化。通過這種方式,可確保調用線程不會被阻塞,從而維持響應性。
  • model.chat 是一個掛起函數,它使用構建器塊來構建聊天請求。這種方法減少了樣板代碼,使代碼更具可讀性和可維護性。

對于高級場景,為了支持自定義 ChatRequestParameters,類型安全構建函數接受自定義構建器:

fun <B : DefaultChatRequestParameters.Builder<*>> parameters(builder: B = DefaultChatRequestParameters.builder() as B,configurer: ChatRequestParametersBuilder<B>.() -> Unit
)

示例用法如下:

model.chat {messages += systemMessage("You are a helpful assistant") // 將系統消息添加到消息列表中messages += userMessage("Hello!") // 將用戶消息添加到消息列表中parameters(OpenAiChatRequestParameters.builder()) { // 配置自定義參數構建器temperature = 0.7 // DefaultChatRequestParameters.Builder 的屬性builder.seed(42) // OpenAiChatRequestParameters.Builder 的屬性}
}

流式使用場景

StreamingChatLanguageModel 擴展為需要在生成響應時逐步處理的場景提供了功能支持。這對于需要實時反饋的應用(如聊天界面、實時編輯器或具有流式逐令牌交互的系統)尤為實用。

借助 Kotlin 協程,chatFlow 擴展函數將語言模型的流式響應轉換為結構化的、可取消的 Flow 序列,從而實現與協程友好的非阻塞式處理。

以下是利用 chatFlow 實現完整交互的示例:

val flow = model.chatFlow { // 與非流式場景類似messages += userMessage("Can you explain how streaming works?") // 將用戶消息添加到消息列表中parameters { // 配置聊天請求參數temperature = 0.7 // 設置溫度參數maxOutputTokens = 42 // 設置最大輸出令牌數}
}runBlocking { // 必須在協程上下文中運行flow.collect { reply -> // 收集流式響應when (reply) {is StreamingChatLanguageModelReply.PartialResponse -> { // 部分響應print(reply.partialResponse) // 實時輸出部分結果}is StreamingChatLanguageModelReply.CompleteResponse -> { // 完整響應println("\nComplete: ${reply.response.aiMessage().text()}") // 輸出完整響應文本}is StreamingChatLanguageModelReply.Error -> { // 錯誤情況println("Error occurred: ${reply.cause.message}") // 輸出錯誤信息}}}
}

你可以查看這個測試作為示例。

編譯器兼容性

在 Kotlin 中定義工具時,為確保 Kotlin 編譯配置保留 Java 反射在方法參數上的元數據,需要將 javaParameters 設置為 true。這一設置對于在工具規范中保持正確的參數名稱是必需的。

當使用 Gradle 時,可以通過以下配置實現:

kotlin {compilerOptions {javaParameters = true}
}

相關示例

  • 點擊 👉使用langchain4j開發的開源項目🔥

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

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

相關文章

正大模型視角下的市場結構判斷邏輯

正大模型視角下的市場結構判斷邏輯 在多數交易策略中&#xff0c;結構識別往往先于方向判斷。以正大的數據研判風格為例&#xff0c;其核心邏輯是&#xff1a;價格行為不能孤立解讀&#xff0c;必須結合時間與成交效率來判斷當前結構的有效性。 例如&#xff0c;一個上漲過程&…

Django 入門實戰:從環境搭建到構建你的第一個 Web 應用

Django 入門實戰&#xff1a;從環境搭建到構建你的第一個 Web 應用 恭喜你選擇 Django 作為你學習 Python Web 開發的起點&#xff01;Django 是一個強大、成熟且功能齊全的框架&#xff0c;非常適合構建中大型的 Web 應用程序。本篇將通過一個簡單的例子&#xff0c;帶你走完…

Unity 打包后 無陰影 陰影不顯示

在項目設置里面->質量 這里面顯示的是打包之后的質量 PS:注意運行質量 點擊左鍵選擇運行質量,這倆不一致就會導致,運行有陰影但是打包出來的平臺沒有陰影,原因就在這. 質量等級選擇好之后 往下滑,在這里打開陰影,如果距離過遠不顯示陰影,就增加陰影距離.

python——面向對象編程

一、編程思想 面向過程編程&#xff08;典型&#xff1a;c語言&#xff09;&#xff1a;是一種以過程為中心的編程思想。它強調流程化、線性化、步驟化的思考方式&#xff0c;實現思路就是函數。 面向對象編程&#xff1a;強調整體性和差異性。它將任何事物看做一個統一整個&…

宿主機和容器 ping 不通域名解決方法

目錄 一、問題描述 二、宿主機解決方法 三、容器解決辦法 一、問題描述 宿主機是Ubuntu&#xff0c;在宿主機上 ping 不通域名&#xff1a;xxxx.cn&#xff0c;但是個人電腦能 ping 通。 同時宿主機上的啟動的k8s容器也無法ping通。 二、宿主機解決方法 ①編輯文件&#xff…

windows作業job介紹

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、作業job是什么&#xff1f;二、使用步驟1.代碼示例 總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; winapi網站&#xff1a; h…

ESG跨境電商如何為國內的跨境電商企業打開國外的市場

現在不管是國內還是國外&#xff0c;做電商的企業都非常的多&#xff0c;那么既然有這么多大電商公司&#xff0c;就要有為這些電商公司提供服務的公司&#xff0c;這就是ESG&#xff0c;它是專門為跨境電商服務的公司&#xff0c;那么這家公司的主要業務是什么呢&#xff1f;它…

龍虎榜——20250425

指數依然在震蕩&#xff0c;等待方向選擇&#xff0c;整體量能不搞但個股紅多綠少。 2025年4月25日龍虎榜行業方向分析 一、核心主線方向 綠色電力&#xff08;政策驅動業績彈性&#xff09; ? 代表標的&#xff1a;華銀電力&#xff08;綠電運營&#xff09;、西昌電力&…

大數據學習(112)-HIVE中的窗口函數

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

【MySQL】MySQL索引與事務

目錄 前言 1. 索引 &#xff08;index&#xff09; 1.1 概念 1.2 作用 1.3 使用場景 1.4 索引的相關操作 查看索引 創建索引 刪除索引 2. 索引背后的數據結構 2.1 B樹 2.2 B&#xff0b;樹的特點 2.3 B&#xff0b;樹的優勢 3. 事務 3.1 為什么使用事務 3.2 事…

python21-循環小作業

課程&#xff1a;B站大學 記錄python學習&#xff0c;直到學會基本的爬蟲&#xff0c;使用python搭建接口自動化測試就算學會了&#xff0c;在進階webui自動化&#xff0c;app自動化 循環語句小作業 for-in作業斐波那契 for 固定數值計算素數字符統計數字序列range 函數 水仙花…

深度學習小記(包括pytorch 還有一些神經網絡架構)

這個是用來增加深度學習的知識面或者就是記錄一些常用的命令,會不斷的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor轉換為Image類型的 imgtoPIL(img) #利用save就可以保存下來 img.save("/opt/data/private/stable_si…

Neo4j 可觀測性最佳實踐

Neo4j 介紹 Neo4j 是一款領先的圖數據庫管理系統&#xff0c;采用圖數據模型來表示和存儲數據。它以節點、關系和屬性的形式組織數據&#xff0c;節點代表實體&#xff0c;關系表示節點間的連接&#xff0c;屬性則為節點和關系附加信息。Neo4j 使用 Cypher 查詢語言&#xff0…

算法訓練營第三十天 | 動態規劃 (三)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、01背包問題理論基礎&#xff08;一&#xff09;動態規劃五部曲確定dp數組以及下標的含義確定遞推公式初始化dp數組確定遍歷順序 二、01背包問題理論基礎&#…

玩機搞機基本常識-------小米OLED屏幕機型怎么設置為永不休眠_手機不息屏_保持亮屏功能 拒絕“燒屏” ?

前面在幫一位粉絲解決小米OLED機型在設置----鎖屏下沒有永不休眠的問題。在這里&#xff0c;大家要明白為什么有些小米機型有這個設置有的沒有的原因。區分OLED 屏幕和 LCD屏幕的不同。從根本上拒絕燒屏問題。 OLED 屏幕的一些優缺點&#x1f49d;&#x1f49d;&#x1f49d; …

PostgreSQL使用LIKE右模糊沒有走索引分析驗證

建表&數據初始化可參考PostgreSQL 分區表——范圍分區SQL實踐 背景&#xff1a; 給t_common_work_order_log的handle_user_name新建索引后&#xff0c;使用LIKE右模糊匹配查詢時&#xff0c;發現走的全表掃描 CREATE INDEX order_log_handle_user_name_index ON t_commo…

【vue】【element-plus】 el-date-picker使用cell-class-name進行標記,type=year不生效解決方法

typedete&#xff0c;自定義cell-class-name打標記效果如下&#xff1a; 相關代碼&#xff1a; <el-date-pickerv-model"date":clearable"false":editable"false":cell-class-name"cellClassName"type"date"format&quo…

《Learning Langchain》閱讀筆記8-RAG(4)在vector store中存儲embbdings

什么是 vector store&#xff1f; 與專門用于存儲結構化數據&#xff08;如 JSON 文檔或符合關系型數據庫模式的數據&#xff09;的傳統數據庫不同&#xff0c;vector stores處理的是非結構化數據&#xff0c;包括文本和圖像。像傳統數據庫一樣&#xff0c;vector stores也能執…

用api的方式調用本地下載好的大模型(以llama為例,不是ollama!!!)

目錄 1、創建虛擬環境2、激活虛擬環境3、安裝相關庫4、編寫腳本&#xff08;test.py&#xff09;調用腳本5、bash中測試通信完美結果 1、創建虛擬環境 conda create -n myenv python3.12 -y2、激活虛擬環境 conda activate myenv3、安裝相關庫 pip install vllm fastapi uvi…

算力網絡(CFN)在跨校聯合科研中的應用:安全性挑戰與聯邦調度實踐

引言&#xff1a;科研協作的算力困境 上海交通大學與麻省理工學院聯合開展的高能物理模擬實驗&#xff0c;因算力資源分配不均導致部分節點連續72小時處于空轉狀態。這個典型案例揭示了當前跨機構科研協作的痛點&#xff1a;?算力資源無法實現安全可信的細粒度共享?。算力網…