1. LangChain4j 之入門(簡單易學)

一:前言

??????? 什么是LangChain?而LangChain4j又是什么?不知道的朋友,可以看我一下兩篇文章

1分鐘了解LangChain是什么??| 1分鐘了解LangChain4j是什么??LangChain4j是LangChain的Java版本,幫助開發者很容易的接入大模型的框架。讓Java也能捉住大模型的風口。


二:前置知識

??????? 當我們想要用什么功能的時候,就使用對應的模型來創建對象,進行使用。LangChain4j提供了如下幾種模型來使用。

模型

  • ChatLanguageModel:表示具有聊天界面的語言模型。
  • ImageModel:文本到圖像生成器模型。文生圖模型,一般我們會把生成圖片的提示詞輸入給chatGpt,讓它幫我們優化一下這個提示詞,然后拿著優化的提示詞用ModerationModel敏感字檢查,檢查通過后,拿著這個優化的提示詞,輸入給ImageModel 模型
  • StreamingLanguageModel:表示一種語言模型,該模型具有簡單的文本界面(與聊天界面相對),并且每次可以流式傳輸一個令牌響應。(可以做到打字機流式響應)
  • ModerationModel:表示可以調節文本的模型,判斷輸入的文字是否有敏感詞。
  • EmbeddingModel:表示可以將給定文本轉換為嵌入(文本的向量表示)的模型
  • ScoringModel:能夠根據查詢對文本進行評分的模型。在針對同一查詢對多個文本進行評分時,用于識別最相關的文本。評分模型可以用于重新排名的目的。

消息類型

  • UserMessage 用戶發送給大模型的消息

????????表示來自用戶(通常是應用程序的最終用戶)的消息。根據模型支持的模式(文本、圖像、音頻、視頻等),用戶消息可以包含單個文本(字符串)或多個內容(可以是TextContent或ImageContent)。在未來,內容類型列表將擴展以允許更多的模式(例如音頻、視頻等)。用戶消息還可以包含用戶的名稱。請注意,并非所有模型都支持UserMessage中的名稱。

  • AiMessage? 大模型響應給用戶的消息

????????表示來自AI(語言模型)的響應消息。消息可以包含文本響應或執行一個/多個工具的請求。在工具執行的情況下,對該消息的響應應該是一個/多個ToolExecutionResultMessage。

  • SystemMessage? 發送給大模型配置的消息

????????表示系統消息,通常由開發人員定義。這種類型的信息通常提供有關AI行動的指示,例如其行為或響應風格。

  • ToolExecutionResultMessage 工具執行的結果消息

????????表示響應ToolExecutionRequest的工具執行的結果。ToolExecutionRequests來自于之前的AiMessage.toolExecutionRequests()。

?

LangChain4j暫時所支持的大模型,如下:

ProviderStreamingToolsImage InputsLocalNative
Amazon Bedrock?????
Anthropic?????
Azure OpenAI?????
ChatGLM?????
DashScope?????
Google Vertex AI Gemini?????
Google Vertex AI PaLM 2?????
Hugging Face?????
Jlama?????
LocalAI?????
Mistral AI?????
Ollama?????
OpenAI???Compatible with: Groq, Ollama, LM Studio, GPT4All, etc.?
Qianfan?????
Cloudflare Workers AI?????
Zhipu AI?????

三:案例實踐

引入Maven依賴,現在我們使用LangChain4j最新的版本 0.32.0,暫時引入的模型有openAi和智普Ai的依賴。如果用其他的大模型,引入相應的依賴就可以。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gorgor</groupId><artifactId>ai-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><langchain4j.version>0.32.0</langchain4j.version><jackson.version>2.16.1</jackson.version></properties><dependencies><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>${langchain4j.version}</version></dependency><!-- open Ai --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>${langchain4j.version}</version></dependency><!-- 智普 Ai  --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-zhipu-ai</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>org.tinylog</groupId><artifactId>tinylog-impl</artifactId><version>2.6.2</version></dependency><dependency><groupId>org.tinylog</groupId><artifactId>slf4j-tinylog</artifactId><version>2.6.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies>
</project>

案例一:普通聊天

??????? 普通聊天的話,我們只需要創建ChatLanguageModel(如有不懂,可以看上面的前置知識中的解釋)對象就可以,

1. 使用openAi

?? 此時我們需要登錄 openai的官網 https://openai.com/,注冊賬號,點擊API login進行登錄,然后在里面找到apikey,需要我們用手機號碼注冊一個apikey,但openai封掉了亞洲很多節點,所以亞洲的手機號可能都注冊不了apikey,需要用其他國家地區的,?但LangChain4j有提供了openAi的demo的apikey,我們可以用demo這個apikey就可以去調openAi大模型。但這個key限制也很多,比如文生圖等等就用不了。

ChatLanguageModel model = OpenAiChatModel.builder().apiKey("demo").build();String answer = model.generate("你好,你是誰?");System.out.println(answer);

?2. 使用智普Ai

???????? 因為openAi是國外的,有很多限制,所以下面的案例都會用智普Ai來做,智普Ai是由清華大學計算機系知識工程實驗室的技術成果轉化而來。官網:智譜AI開放平臺 ,注冊登錄,并獲取apikey,大家可以充一塊錢去玩玩,一塊錢可以玩很久。

  ChatLanguageModel chatModel = ZhipuAiChatModel.builder().apiKey("智普apikey").build();String answer = chatModel.generate("你好,你是誰?");System.out.println(answer);

?

案例二:打字機流式響應

在前面的例子中,當我們通過ChatLanguageModel的generate()方法向大模型提問時,ChatLanguageModel一次性給了整段響應結果,而不是一個字一個字打字機式的回答,不過我們可以使用OpenAiStreamingChatModel來實現打字機效果,代碼如下:

 StreamingChatLanguageModel model = ZhipuAiStreamingChatModel.builder().apiKey("智普apikey").build();model.generate("你好,你是誰?", new StreamingResponseHandler<AiMessage>() {@Overridepublic void onNext(String token) {System.out.println(token);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}}@Overridepublic void onError(Throwable error) {System.out.println(error);}});

案例三: 檢測是否存在敏感內容

?ModerationModel能夠校驗輸入中是否存在敏感內容。在智普Ai中沒找到提供這個敏感內容檢測的api,所有下面案例用openai寫。

ModerationModel moderationModel = OpenAiModerationModel.withApiKey("demo");
Response<Moderation> response = moderationModel.moderate("我要殺了你");
System.out.println(response.content().flaggedText());

案例四:文生圖

ImageModel可以根據提示詞來生成圖片,一般我們會把生成圖片的提示詞輸入給chatGpt,讓它幫我們優化一下這個提示詞,然后拿著優化的提示詞用ModerationModel敏感字檢查,檢查通過后,拿著這個優化的提示詞,輸入給ImageModel 模型

   ImageModel imageModel = ZhipuAiImageModel.builder().apiKey("智普apikey").build();Response<Image> response = imageModel.generate("小貓");System.out.println(response.content().url());

?案例五:獲取當前時間

? 對于大模型而言,他們訓練的數據都是之前時間的數據, 如果你問他"今天是幾號?",可能他會懵逼,回答補上來.此時就要用到LangChain4j的Tools工具,而在Spring Ai中不叫Tools,而是Function call.

執行流程: 先請求智普Ai大模型 --->得到執行工具請求-->執行本地工具->再次通過請求問題,執行工具請求和執行工具結果,去調用智普Ai大模型,得到最終的接口. 執行了本地工具后,不是得到結果了嗎?為什么還需要調大模型, 是因為執行工具后的結果只是幾月幾號,而不像人回復那樣,所以重新調了一次.

        ChatLanguageModel chatModel = ZhipuAiChatModel.builder().apiKey("智普apikey").build();ToolSpecification currentTime = ToolSpecification.builder().name("currentTime").description("currentTime").build();// givenUserMessage userMessage = userMessage("今天是幾號?");List<ToolSpecification> toolSpecifications = singletonList(currentTime);// when//執行工具響應(請求),大模型回調工具Response<AiMessage> response = chatModel.generate(singletonList(userMessage), toolSpecifications);// thenAiMessage aiMessage = response.content();ToolExecutionRequest toolExecutionRequest = aiMessage.toolExecutionRequests().get(0);// given//執行工具結果ToolExecutionResultMessage toolExecutionResultMessage = from(toolExecutionRequest, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));// 請求問題(userMessage) | 執行工具響應(aiMessage) | 執行工具結果(toolExecutionResultMessage)List<ChatMessage> messages = asList(userMessage, aiMessage, toolExecutionResultMessage);// when//最終結果Response<AiMessage> secondResponse = chatModel.generate(messages);System.out.println(secondResponse.content().text());

?

四: LangChain4j和SpringBoot整合

??????? 本來是想對接智普Ai的,但好像沒看到智普Ai跟springboot整合的maven包, 但百度的qianfan就有. 下面用openai整個springboot.

maven依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gorgor</groupId><artifactId>ai-demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.1</version></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><langchain4j.version>0.32.0</langchain4j.version><jackson.version>2.16.1</jackson.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>${langchain4j.version}</version></dependency><!-- open Ai --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>${langchain4j.version}</version></dependency><!-- 智普 Ai  --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-zhipu-ai</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies>
</project>

application.yml 配置文件

langchain4j:open-ai:chat-model:api-key: demo

代碼:

@RestController
public class Demo {@Autowiredprivate ChatLanguageModel chatLanguageModel;@GetMapping("testSpringboot")public String  testSpringboot(String name){return chatLanguageModel.generate(name);}
}

?

?

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

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

相關文章

提升結構安全性:應變計在現代建筑中的應用

在現代建筑領域&#xff0c;隨著工程技術的不斷進步&#xff0c;對結構安全性的要求也日益提高。作為一種關鍵的工程儀器儀表&#xff0c;應變計在提升結構安全性方面發揮著不可替代的作用。本文將深入探討應變計在現代建筑中的應用&#xff0c;以及它如何助力工程師們實時監測…

權力之望怎么注冊賬號創建角色 權利之網角色賬號注冊教程

權力之望是一款全新的大型MMORPG游戲&#xff0c;擁有9把獨特武器和56種職業組合&#xff0c;并搭配了超炫酷的戰斗畫面&#xff0c;全程采用低俯視角游戲&#xff0c;讓玩家能體驗到更強的操作感和爽快感。這款游戲主打高養成自由度玩家可以自由更換武器進行戰斗&#xff0c;還…

前端面試題30(閉包和作用域鏈的關系)

閉包和作用域鏈在JavaScript中是緊密相關的兩個概念&#xff0c;理解它們之間的關系對于深入掌握JavaScript的執行機制至關重要。 作用域鏈 作用域鏈是一個鏈接列表&#xff0c;它包含了當前執行上下文的所有父級執行上下文的變量對象。每當函數被調用時&#xff0c;JavaScri…

零基礎也能成為產品冊設計高手

?在當今數字化時代&#xff0c;產品冊設計已成為企業營銷的重要手段之一。過去&#xff0c;人們認為只有專業人士才能設計出精美的產品冊&#xff0c;然而&#xff0c;隨著設計工具的普及和在線學習資源的豐富&#xff0c;零基礎的你也能成為產品冊設計高手。本文將帶你走進這…

MindsDB:一個利用企業數據構建 AI 的平臺

MindsDB作為一個開源項目&#xff0c;它旨在將機器學習模型無縫集成到現有的數據庫系統中&#xff0c;為用戶提供實時的數據預測能力。這個項目的創新之處在于&#xff0c;它能夠以簡單、直觀的方式讓開發者和非技術人員都能夠利用AI進行數據分析和預測。 它是根據企業數據庫定…

航空航天單位保密網文件導出管理難點在哪里?如何解決?

航空航天單位的重要性不言而喻&#xff0c;它們在國家安全、科技進步、經濟發展以及國際合作等多個領域都扮演著至關重要的角色。為了保護工作內容中的重要數據&#xff0c;遵守保密規定&#xff0c;對涉密人員、保密要害部門單位、涉密載體、涉密信息傳輸和涉密活動進行嚴格管…

glide加載mp4 源碼堆棧調用核心代碼分析

load 數據走的httpurlfetcher 的loaddata 從MultiLoader 調用而來 load到inputstream流后的處理 核心 圖片是glide 首先創建解釋器的時候 加了videodecoder 然后這里會從流中加載對應幀的圖片保存在手機cache目錄中 將這個file 作為bitmap傳遞 然后加載 private static final…

MySQL物理備份與恢復工具XtraBackend使用總結

文章目錄 1.描述2.安裝3.使用3.1 備份源數據庫3.2 恢復到目標數據庫3.2.1 恢復目錄3.2.2 解壓文件3.2.3 應用日志3.2.4 復制數據 4.使用總結4.1 備份4.2 恢復4.3 例子 1.描述 借助Percona XtraBackup工具實現MySQL的物理備份與恢復&#xff0c;相當于將整個MySQL進行了復制&am…

Django+vue自動化測試平臺(25)-- 自動化測試之封裝APscheduler定時任務框架

APscheduler簡介 APscheduler全稱Advanced Python Scheduler&#xff0c;作用為在指定的時間規則執行指定的作業&#xff0c;其是基于Quartz的一個Python定時任務框架&#xff0c;實現了Quartz的所有功能&#xff0c;使用起來十分方便。提供了基于日期、固定時間間隔以及cront…

2.5 C#視覺程序開發實例1----CamManager實現模擬相機采集圖片

2.5 C#視覺程序開發實例1----CamManager實現模擬相機采集圖片 1 目標效果視頻 CamManager 2 CamManager讀取本地文件時序 3 BD_Vision_Utility添加代碼 3.0 導入鏈接庫 BD_OperatorSets.dllSystem.Windows.Forms.dllOpencvSharp 3.1 導入VisionParam中創建的文件Util_FileO…

安防監控/視頻匯聚平臺EasyCVR設備錄像回看請求播放時間和實際時間對不上,是什么原因?

安防監控EasyCVR視頻匯聚平臺可提供多協議&#xff08;RTSP/RTMP/國標GB28181/GAT1400/海康Ehome/大華/海康/宇視等SDK&#xff09;的設備接入、音視頻采集、視頻轉碼、處理、分發等服務&#xff0c;系統具備實時監控、云端錄像、回看、告警、平臺級聯以及多視頻流格式分發等視…

旅游計劃定制小程序網頁模板源碼

手機在線旅游定制服務&#xff0c;定制旅游出行app小程序模板。包含&#xff1a;定制介紹、定制表單填寫、我的訂單等。 旅游計劃定制小程序網頁模板源碼

C++ STL 文件系統用法介紹

目錄 一. 獲取當前工作目錄 二:設置和讀取文件寫入時間 三:獲取文件目錄大小 四:獲取文件類型信息 一. 獲取當前工作目錄 #include <filesystem> #include <iostream> #include <fstream> namespace fs = std::filesystem;int main() {std::cout &l…

交換機接口三種模式Access、Trunk、Hybrid

交換機接口的三種模式 1.access接口模式&#xff08;接入鏈路&#xff0c;接入模式&#xff09; 接收數據&#xff1a;當接收到一個無標記幀的時候&#xff0c;打上自己的PVid并接受&#xff08;就是自己的vlan標簽&#xff09;。當接收到一個有標記幀的時候&#xff0c;對比…

swiftui中NavigationStack布局navigationBarTitleDisplayMode作用,以及內容頂部空白區域解決辦法

寫了一個小demo用于學習NavigationStack和toolbar/ToolbarItem知識&#xff0c;但是在寫一個瀑布流布局的時候&#xff0c;設置了頂部的toolbar&#xff0c;然后內容區域的頂部出現了一大片空白區域&#xff0c;這樣的效果并不是很美觀很好看&#xff0c;所以就想著研究解決一下…

科普文:一文搞懂SpringBoot(狂神說Java)

1、Hello,World&#xff01; 1.1、SpringBoot簡介 回顧什么是Spring Spring是一個開源框架&#xff0c;2003 年興起的一個輕量級的Java 開發框架&#xff0c;作者&#xff1a;Rod Johnson 。 Spring是為了解決企業級應用開發的復雜性而創建的&#xff0c;簡化開發。 Spring是…

clickhouse學習筆記(五)SQL操作

目錄 一、增 二、刪改 三、查詢以及各種子句 1、with子句 a、表達式為常量 b、表達式為函數調用 c、表達式為子查詢 2、from子句 3、array join子句 a、INNER ARRAY JOIN b、LEFT ARRAY JOIN c、數組的一些函數 groupArray groupUniqArray arrayFlatten splitBy…

Java 如何在volatile內部調用接口

在Java中&#xff0c;volatile 關鍵字通常用于確保變量的可見性和有序性&#xff0c;而不是用來修飾接口或方法調用的。volatile 修飾的變量會被立即同步到主存&#xff0c;并且在每次訪問時都會從主存中重新讀取&#xff0c;而不是從緩存中讀取。這意味著對volatile變量的修改…

2005-2023年各省居民人均消費支出、城鎮居民人均消費支出、農村居民人均消費支出數據(無缺失)

2005-2023年各省居民人均消費支出、城鎮居民人均消費支出、農村居民人均消費支出數據&#xff08;無缺失&#xff09; 1、時間&#xff1a;2005-2023年 2、來源&#xff1a;國家統計局、統計年鑒 3、范圍&#xff1a;31省 4、指標&#xff1a;全體居民人均消費支出、城鎮居…

探索 Linux 的 /etc/hosts 文件:基礎知識與實用指南

探索 Linux 的 /etc/hosts 文件&#xff1a;基礎知識與實用指南 在 Linux 和 Unix 系統中&#xff0c;/etc/hosts 文件扮演著一個至關重要的角色。它是系統的本地 DNS&#xff08;域名系統&#xff09;解析器&#xff0c;負責將主機名映射到 IP 地址。在網絡和系統管理中&…