01、聊天與語言模型

一、簡單說明模型

LLM目前有兩種API提供

  • LanguageModel:接收一個a作為輸入并返回一個b作為輸出,這種是已經過時的
  • ChatLanguageModel:接收多個輸入,然后返回相應的輸出

ChatLanguaggeModel是LangChain4j中LLM交互低級API,它提供了最大的功能和靈活性。除此之外還有一個高級API(AIService)。

ChatLanguageModel還支持的模型有:

  • EmbeddingModel:把文本轉換為Embedding
  • ImageModel:用來生成和編輯圖片
  • ModerationModel:這個模型可以檢查文本中是否包含有害內容
  • ScoringModel:可以根據查詢對多段文本進行評分(排名),實際上就是用來確定每段文本與查詢的關聯性,這個對于RAG來說是非常有用的

二、ChatLanguageModel的API

ChatLanguageModel是一個接口,其定義如下:

public interface ChatLanguageModel {default String generate(String userMessage) {return generate(UserMessage.from(userMessage)).content().text();}default Response<AiMessage> generate(ChatMessage... messages) {return generate(asList(messages));}Response<AiMessage> generate(List<ChatMessage> messages);default Response<AiMessage> generate(List<ChatMessage> messages, List<ToolSpecification> toolSpecifications) {throw new IllegalArgumentException("Tools are currently not supported by this model");}default Response<AiMessage> generate(List<ChatMessage> messages, ToolSpecification toolSpecification) {throw new IllegalArgumentException("Tools are currently not supported by this model");}@Experimentaldefault ChatResponse chat(ChatRequest request) {throw new UnsupportedOperationException();}@Experimentaldefault Set<Capability> supportedCapabilities() {return emptySet();}
}

注意:現在我們看的是關于LangChain4j 0.36.2版本!!

三、關于ChatMessage

這個表示是一個聊天消息,當前有四種類型的聊天消息,每種消息的“來源”對應其中一種

  1. UserMessage:來自己于用戶的消息,這里指的用戶可以是應用使用的最終用戶或者是應用本身,它是相對于LLM大語言模型來說的
  2. AiMessage:由AI生成的消息,通常是為了響應
  3. ToolExecutionResultMessage:聊天過程中執行相關的工具(函數)的結果
  4. SystemMessage:來自己系統的消息,通常用來定義LLM在對話中的角色說明(指定AI應該如何表現以及以何種方式回答...)
  5. CustomMessage:可以包含任意屬性的自定義消息,這種消息不是所有的大模型語言都支持,只有支持它的才可以使用

使用多個ChatMessage

我們看到接口中方法定義為什么我們要使用多個ChatMessage?

注意:我們在于LLM進行聊天對話時,它本質上是無狀態的,它們是不會維護對話狀態的,如果要支持多論對話并且讓AI理解對話的上下文,那么就需要使用到多個ChatMessage。因為這個時候我們就需要把多論對話中的所有聊天消息告訴AI,讓它了解整個上下文的情況,從而達到一個有狀態的假象。

如下所示:

UserMessage firstUserMessage = UserMessage.from("你好,我叫鵬鵬");
AiMessage firstAiMessage = model.generate(firstUserMessage).content();
UserMessage secondUserMessage = UserMessage.from("我叫什么名字?");
AiMessage secondAiMessage = model.generate(firstUserMessage,firstAiMessage,SecondUserMessage).content();

向上面這樣手動去維護與管理這些消息是很麻煩的,實際的使用中我們會使用ChatMemory(先了解后續會說)

關于UserMessage

在UserMessage這個類中我們可以看到下面這個方法:

public static UserMessage userMessage(Content... contents) {return from(contents);
}

這個方法可以傳入多個Content,最終得到一個UserMessage對象

而Content是一個接口,它有如下一些實現(不同的實現可以傳入不同類型的內容)

  • TextContent
  • ImageContent
  • AudioContent
  • VideoContent
  • PdfFileContent

通過這些不同的Content我們就可以把不同類型的內容轉為UserMessage,然后傳給LLM,如下所示:

UserMessage userMessage = UserMessage.from(TextContent.from("請描述下面的圖片信息"),ImageContent.from("https://ex.com/myCat.png")
);
Response<AiMessage> response = model.generate(userMessage);
TextContent

它是最為簡單的一種,就是把一個普通的文本轉為一個字符串

UserMessage.from(TextContent.from("Hello")) 與 UserMessage.from("Hello")這兩者沒有任何區別。

一次可以向UserMessage當中提供一個或多個TextContent

UserMessage userMessage = UserMessage.from(TextContext.from("Hello"),TextContext.from("你好啊!"));
ImageContent

根據不同的LLM提供商,ImageContent可以從URL地址或者Base64的二進制數據來提供ImageContent

如下所示,使用Base64的二進數據來提供ImageContent

byte[] imageBytes = readBytes("D:\\myImage\\hi.png");
String imgData = Base64.getEncoder().encodeToString(imageBytes);
ImageContent imageContent = ImageContent.from(imgData,"image/png");
UserMessage userMessage = UserMessage.from(imageContent);
AudioContent

它類似于ImageContent,它表示的是音頻內容

VideoContent

它類似于ImageContent,它表示的是視頻內容

PdfFileContent

它類似于ImageContent,表示的是PDF文件的二進制內容

四、實踐示例

POM依賴

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-dashscope-spring-boot-starter</artifactId><!-- 添加排除項 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency>
</dependencies>

其中SpringBoot指定版本為:3.3.5,langchain4j指定版本為0.36.2

yml配置

langchain4j:dashscope:chat-model:api-key: sk-09a****************3686d6c4cfb#model-name: deepseek-v3model-name: qwen-max-latestchat:systemMessage: 你是普京,接下來以普京的語氣來進行對話

其中aipkey是在阿里百煉平臺申請的aipkey,這里要使用時需要替換為自已申請好的apikey

主啟動

@SpringBootApplication
public class ChatApplication {public static void main(String[] args) {SpringApplication.run(ChatApplication.class, args);}
}

controller

@Slf4j
@RestController
@RequestMapping("/chat")
public class ChatController {// 注入聊天大語言模型@Resourceprivate ChatLanguageModel chatLanguageModel;@Value("${chat.systemMessage}")private String systemMessage;@GetMapping("/simple")public String chat(@RequestParam("message") String message) {UserMessage userMessage = UserMessage.from(message);Response<AiMessage> generate = chatLanguageModel.generate(userMessage);log.info("generate: {}", generate);return generate.content().text();}@GetMapping("/sys/simple")public String chatSys(@RequestParam("message") String message) {Response<AiMessage> aiResponse;UserMessage userMessage = UserMessage.from(message);if (systemMessage != null && !systemMessage.isEmpty()) {SystemMessage systemMessage = SystemMessage.from(this.systemMessage);aiResponse = chatLanguageModel.generate(List.of(systemMessage, userMessage));} else {aiResponse = chatLanguageModel.generate(userMessage);}if (aiResponse == null) {return "大模型未返回任何內容~~~";}log.info("generate: {}", aiResponse);return aiResponse.content().text();}
}

這其中有兩個不同的請求,一個是簡單的聊天請求,另一個是我們指定了特定的SystemMessage的請求。

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

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

相關文章

SQL的DCL,DDL,DML和DQL分別是什么

SQL&#xff08;Structured Query Language&#xff09;包括以下四種主要語言類別&#xff0c;分別用于不同的數據庫操作&#xff1a; 1. DCL&#xff08;Data Control Language&#xff0c;數據控制語言&#xff09; 用于控制數據庫訪問權限和安全。 常見命令&#xff1a; …

spring boot maven一欄引入本地包

1、在項目跟目錄下建立文件夾&#xff0c;比如libs 2、maven依賴 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.10</version><scope>system</scope>&l…

連續型隨機變量及其分布

連續型隨機變量 數學公式可以看作一門精確描述事物的語言&#xff0c;比語言尤其是漢語的模糊性精確多了&#xff01;離散型數據的處理可以通過枚舉和相加進行處理。而連續型數據則沒有辦法這樣處理。我們必須要通過函數和取值區間還有微積分計算。 &#xff3b;定義1&#x…

AI重構SEO關鍵詞優化路徑

內容概要 人工智能技術的深度應用正在推動SEO優化進入全新階段。傳統關鍵詞優化依賴人工經驗與靜態規則&#xff0c;存在效率瓶頸與策略滯后性缺陷。AI技術通過智能語義分析系統&#xff0c;能夠穿透表層詞匯限制&#xff0c;精準捕捉用戶搜索意圖的語義關聯網絡&#xff0c;結…

turnjs圖冊翻書效果

npm install https://github.com/igghera/turn.js.git //或者 npm install turn.js //import $ from "jquery"; //記得引入jquery import turn.js; // 引入 Turn.jsimport turn from "/utils/turn.min.js";// 引入 Turn.jsinitBook(length) {var that thi…

用PostgreSQL玩轉俄羅斯方塊:當SQL成為游戲引擎

當DBA開始摸魚2025年某深夜&#xff0c;一位不愿透露姓名的DBA為了在監控大屏上隱藏游戲行為&#xff0c;竟用SQL實現了俄羅斯方塊&#xff01;從此&#xff0c;SELECT成了方向鍵&#xff0c;UPDATE成了旋轉指令&#xff0c;DELETE成了消除大招。本文將揭秘這個瘋狂項目的技術內…

計算機網絡層超全解析:從IP協議到路由算法

&#x1f310; &#xff08;專業詳解生活化類比&#xff0c;邏輯一鏡到底&#xff09; &#x1f4d6; 網絡層的核心使命 核心任務&#xff1a;在不同網絡間為數據包選擇最佳路徑&#xff0c;實現端到端通信。 類比&#xff1a;快遞公司總部&#xff08;網絡層&#xff09;根據…

代碼隨想錄算法訓練營第38天 | 322. 零錢兌換 279.完全平方數 139.單詞拆分 背包問題總結

322. 零錢兌換 如果求組合數就是外層for循環遍歷物品&#xff0c;內層for遍歷背包。 如果求排列數就是外層for遍歷背包&#xff0c;內層for循環遍歷物品。 錢幣有順序和沒有順序都可以&#xff0c;都不影響錢幣的最小個數。 視頻講解&#xff1a;動態規劃之完全背包&#xff0…

關于網絡的一點知識(持續更新)

1、IP地址和子網掩碼、端口號: IP地址是設備在網絡上的地址,相當于一棟房子的門牌號。子網掩碼相當于房子所在的街道。同一條街道的房子間是通過街道直通的,主人可以互相拜訪。 舉個例子,如下圖所示。 說明:將兩臺設備的IP和子網掩碼轉化為二進制,然后將各自的IP地址和…

Idea中使用Git插件_合并當前分支到master分支_沖突解決_很簡單---Git工作筆記005

由于之前用svn習慣了,用的git少,其實在idea中使用git,解決沖突,合并分支,非常的簡單,一起來看一下吧. 一定要注意操作之前,一定要確保自己的分支代碼,都已經commit提交了,并且push到遠程了. 不要丟東西. 可以看到首先,在idea的左下角有個 git,點開以后 可以看到有顯示的分支…

[自動化] 【八爪魚】使用八爪魚實現CSDN文章自動閱讀腳本

在CSDN上&#xff0c;文章的閱讀量往往是衡量內容影響力的一個重要指標。為了測試自動化手段能否提高閱讀數&#xff0c;我嘗試使用網頁自動化工具來模擬人工閱讀某個ID的文章。 1. 網頁自動化的常見方案 談到網頁自動化&#xff0c;Selenium 是一個最常見的選擇。它可以通過…

Linux 系統性能優化高級全流程指南

Linux 系統性能優化高級全流程指南 一、系統基礎狀態捕獲 1. 系統信息建檔 除了原有的硬件、內核和存儲拓撲信息收集&#xff0c;還增加 CPU 緩存、網絡設備詳細信息等。 # 硬件信息 lscpu > /opt/tuning/lscpu.origin dmidecode -t memory > /opt/tuning/meminfo.or…

常?中間件漏洞--Tomcat

tomcat是?個開源?且免費的jsp服務器&#xff0c;默認端? : 8080&#xff0c;屬于輕量級應?服務器。它可以實現 JavaWeb程序的裝載&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系統必備的?款環境。 1.CVE-2017-12615 Tomcat put?法任意?件寫…

數據結構之棧(C語言)

數據結構之棧&#xff08;C語言&#xff09; 棧1 棧的概念與結構2 棧的初始化和銷毀2.1 棧的初始化2.2 棧的銷毀 3 入棧函數與出棧函數3.1 入棧函數3.2 出棧函數 4 取棧頂數據&#xff0c;獲取數據個數 和 判空函數4.1 取棧頂數據與獲取數據個數4.1.1 取棧頂數據4.1.2 獲取數據…

datawhale組隊學習--大語言模型—task4:Transformer架構及詳細配置

第五章 模型架構 在前述章節中已經對預訓練數據的準備流程&#xff08;第 4 章&#xff09;進行了介紹。本章主 要討論大語言模型的模型架構選擇&#xff0c;主要圍繞 Transformer 模型&#xff08;第 5.1 節&#xff09;、詳細 配置&#xff08;第 5.2 節&#xff09;、主流架…

BP神經網絡+NSGAII算法(保真)

BP神經網絡NSGAII算法 非常適合用來當作實驗驗證自己的結論&#xff0c;構建一個神經網絡模型&#xff0c;并使用NSGAII多目標優化算法來實現多領域的畢業論文的設計。僅僅使用簡單的matlab代碼就可以實現自己的多目標優化任務。 BP神經網絡算法 我的任務是預測三個變量的值…

MCU vs SoC

MCU&#xff08;Microcontroller Unit&#xff0c;單片機&#xff09;和SoC&#xff08;System on Chip&#xff0c;片上系統&#xff09;是兩種不同的芯片類型&#xff0c;盡管它們都實現了高度集成&#xff0c;但在設計目標、功能復雜性和應用場景上存在顯著差異。以下是兩者…

3.23學習總結

字符串 String java.lang,String 類代表字符串&#xff0c;Java程序中所有的字符串文字都為此類的對象 字符串的內容是不會發生改變的&#xff0c;它的對象在創建之后不能唄更改 字符串的內存模型 當使用雙引號直接賦值時&#xff0c;系統會檢查該字符串在串池中是否存在。 …

01測試分類

一、按照測試目標分類 1、界面測試 肉眼所看到的一切&#xff0c;都需要進行測試。如&#xff0c;按鈕的點擊&#xff1b;輸入框輸入文本&#xff1b;下拉框的選擇&#xff1b;其它的交互等。。。 前端開發在執行開發之前需要交互/設計的同學給出設計圖&#xff08;以圖片的…

【Git】用Git命令克隆一個遠程倉庫、修改倉庫中的文件,并將更改推送到遠程倉庫

git clone ssh://gitgithub.com:2222/Mermaid28/Groove.git # SSH地址cd rfnvtoolecho "# rfnvtool" > README.md git add README.mdgit commit -m "add README" git push -u origin master 這個一系列的 Git 命令涉及到克隆一個遠程倉庫、修改倉庫中…