一:前言
??????? 什么是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暫時所支持的大模型,如下:
Provider | Streaming | Tools | Image Inputs | Local | Native |
---|---|---|---|---|---|
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);}
}
?
?