萨瑞饨 发表于 2025-8-29 18:52:54

3. LangChain4j + 低阶 和 高阶 API的详细说明

3. LangChain4j + 低阶 和 高阶 API的详细说明

@
目录

[*]3. LangChain4j + 低阶 和 高阶 API的详细说明
[*]LangChain4j + 低阶 和 高阶 API的详细说明

[*]LangChain4j在两个抽象层(低阶 / 高阶)提供不同的 api

[*]low level 低阶
[*]high level 高阶

[*]low level 低阶 API 的使用

[*]大模型中的Token VS Web开发中的Token

[*]high level 高阶 API 的详细使用

[*]最后:

LangChain4j + 低阶 和 高阶 API的详细说明

https://docs.langchain4j.dev/get-started/
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823593-1291703291.png
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823708-195462746.png
https://docs.langchain4j.dev/tutorials/chat-and-language-models/
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823529-1332790799.png
LLM 目前有两种 API 类型:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823552-1057016089.png

[*]LanguageModel。它们的 API 非常简单 - 接受 String 作为输入并返回 String 作为输出。 这种 API 现在正在被聊天 API(第二种 API 类型)所取代。
[*]ChatModel。这些接受多个 ChatMessage 作为输入并返回单个 AiMessage 作为输出。 ChatMessage 通常包含文本,但某些 LLM 也支持其他模态(例如,图像、音频等)。 这类聊天模型的例子包括 OpenAI 的 gpt-4o-mini 和 Google 的 gemini-1.5-pro。
LangChain4j 不会再扩展对 LanguageModel 的支持, 因此在所有新功能中,我们将使用 ChatModel API。
ChatModel 是 LangChain4j 中与 LLM 交互的低级 API,提供最大的能力和灵活性。 还有一个高级 API(AI 服务),我们将在介绍完基础知识后再讨论。
除了 ChatModel 和 LanguageModel 外,LangChain4j 还支持以下类型的模型:

[*]EmbeddingModel - 这种模型可以将文本转换为 Embedding。
[*]ImageModel - 这种模型可以生成和编辑 Image。
[*]ModerationModel - 这种模型可以检查文本是否包含有害内容。
[*]ScoringModel - 这种模型可以对查询的多个文本片段进行评分(或排名), 本质上确定每个文本片段与查询的相关性。这对 RAG 很有用。 这些将在后面介绍。
现在,让我们仔细看看 ChatModel API。
public interface ChatModel {    String chat(String userMessage);      ...}如您所见,有一个简单的   chat   方法,它接受   String   作为输入并返回   String   作为输出,类似于   LanguageModel    。 这只是一个便捷方法,让您可以快速轻松地进行试验,而无需将   String   包装在   UserMessage   中。

LangChain4j在两个抽象层(低阶 / 高阶)提供不同的 api

https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823588-276246995.png

[*]https://docs.langchain4j.dev/intro
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823894-1504077482.png


[*]LangChain4j 在两个抽象层次上运行:
- 低层次。在这个层次上,您拥有最大的自由度和访问所有低级组件的权限,如 ChatModel,、UserMessage、AiMessage、EmbeddingStore、Embedding 等。 这些是您的 LLM 驱动应用程序的"原语"。 您可以完全控制如何组合它们,但需要编写更多的粘合代码。
- 高层次。在这个层次上,您使用高级 API(如 AI 服务)与 LLM 交互, 它隐藏了所有复杂性和样板代码。 您仍然可以灵活地调整和微调行为,但是以声明式方式完成。
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823561-49951373.png
low level 低阶

https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823848-1019024026.png
ChatModel 接口如下的默认实现的方法:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823497-1599087215.png
ChatModel提供的--种极其简便的方法:如下:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823904-224256204.png
default String chat(String userMessage) {    ChatRequest chatRequest = ChatRequest.builder()            .messages(UserMessage.from(userMessage))            .build();    ChatResponse chatResponse = chat(chatRequest);    return chatResponse.aiMessage().text();} @GetMapping(value = "/langchain4j/hello")public String hello(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt){    String result = chatModel.chat(prompt);    System.out.println("通过langchain4j调用模型返回结果:\n"+result);    return result;} high level 高阶

https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823521-1700373479.png
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823556-1561671219.png
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823845-2004969788.png
low level 低阶 API 的使用

https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823543-1029465508.png
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823586-1500377827.png
导入相关的依赖:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823529-1465511542.png
                        org.springframework.boot            spring-boot-starter-web                                          dev.langchain4j            langchain4j-open-ai                                    dev.langchain4j            langchain4j                            junit            junit            3.8.1            test            配置对应大模型的配置类。
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823531-1833144194.png
package com.rainbowsea.langchain4j02lowhighapi.config;import dev.langchain4j.model.chat.ChatModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Date 2025-05-27 22:04 * @Description: 知识出处 https://docs.langchain4j.dev/get-started */@Configurationpublic class LLMConfig{    @Bean(name = "qwen")    public ChatModel chatModelQwen()    {      return OpenAiChatModel.builder()                .apiKey(System.getenv("aliQwen_api"))                .modelName("qwen-plus")                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")                .build();    }    /**   * @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/   */    @Bean(name = "deepseek")// 可以在根据@Resoure(name = "deepseek") 导入不同的实体类    public ChatModel chatModelDeepSeek()    {      return                OpenAiChatModel.builder()                        .apiKey(System.getenv("deepseek_api"))                        .modelName("deepseek-chat")                        //.modelName("deepseek-reasoner")                        .baseUrl("https://api.deepseek.com/v1")                        .build();    }}编写 Controller ,如下,其实就是跟我们编写的第一个连接大模型的 Hello World 是一样的
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823680-1777682522.png
启动测试:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823520-844280977.png
大模型中的Token VS Web开发中的Token

大模型当中的 Token
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823739-862499833.png
Web 开发中的 Token
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823552-1386138380.png
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823504-81177234.png
// http://localhost:9002/lowapi/api02    @GetMapping(value = "/lowapi/api02")    public String api02(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)    {      ChatResponse chatResponse = chatModelDeepSeek.chat(UserMessage.from(prompt));      String result = chatResponse.aiMessage().text();      System.out.println("通过langchain4j调用模型返回结果:"+result);      TokenUsage tokenUsage = chatResponse.tokenUsage();      System.out.println("本次调用消耗Token:"+tokenUsage);      result = result +"\t\n"+ tokenUsage;      return result;    }}https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823490-591793891.png
ChatMessage 其实就是一个 prompt ,就是被大模型封装了一层,让其更好的被大模型读取识别而已。
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203824122-660811273.png
运行测试:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203825225-2052705057.png
high level 高阶 API 的详细使用


[*]https://docs.langchain4j.dev/tutorials/ai-services/
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823549-1451459133.png
翻译:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823591-672647952.png
AI Service 的高阶 API 的使用:
具体的编码步骤如下:https://docs.langchain4j.dev/tutorials/ai-services/#simplest-ai-service
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823585-113779660.png
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823532-112791979.png

[*]定义 AI Service 接口:
我们知道,按照Java开发一般习惯,有接口就要有实现类 比如接口ChatAssistant,就会有实现类ChatAssistantImpl现在用高阶api- AIServics不用你自己写 impl实现类,交给langchain4j给你搞定。(接口名是随意的,你只要见名之意即可)
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823511-1893460952.png
package com.rainbowsea.langchain4j02lowhighapi.service;/** * 我们知道,按照Java开发一般习惯,有接口就要有实现类 * 比如接口ChatAssistant,就会有实现类ChatAssistantImpl * 现在用高阶api-AIServics不用你自己写impl实现类,交给langchain4j给你搞定 *
* 本次配置用的是langchain4j原生整合,没有引入sprinboot,不需要接口头上配置@AiService注解标签 */public interface ChatAssistant {    String chat(String prompt);}LLMConfig类配置当中配置调用大模型的三件套(大模型的 Key,大模型 name,大模型的 url)
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823524-778393741.png
import com.rainbowsea.langchain4j02lowhighapi.service.ChatAssistant;import dev.langchain4j.model.chat.ChatModel;import dev.langchain4j.model.openai.OpenAiChatModel;import dev.langchain4j.service.AiServices;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Date 2025-05-27 22:04 * @Description: 知识出处 https://docs.langchain4j.dev/get-started */@Configurationpublic class LLMConfig{    @Bean(name = "qwen")    public ChatModel chatModelQwen()    {      return OpenAiChatModel.builder()                .apiKey(System.getenv("aliQwen_api"))                .modelName("qwen-plus")                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")                .build();    }}
[*]对我们自我编写的 AI Service 的接口类,配置器实现类的配置(配置指明那个大模型实现我们这个接口类),配置好后,调用 AiServices.create()方法就好创建好我们自定义的接口实现类。
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823533-2100685972.png
import com.rainbowsea.langchain4j02lowhighapi.service.ChatAssistant;import dev.langchain4j.model.chat.ChatModel;import dev.langchain4j.model.openai.OpenAiChatModel;import dev.langchain4j.service.AiServices;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Date 2025-05-27 22:04 * @Description: 知识出处 https://docs.langchain4j.dev/get-started */@Configurationpublic class LLMConfig{    @Bean(name = "qwen")    public ChatModel chatModelQwen()    {      return OpenAiChatModel.builder()                .apiKey(System.getenv("aliQwen_api"))                .modelName("qwen-plus")                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")                .build();    }    // High-Api https://docs.langchain4j.dev/tutorials/ai-services#simplest-ai-service    @Bean    public ChatAssistant chatAssistant(@Qualifier("qwen") ChatModel chatModelQwen)    {      return AiServices.create(ChatAssistant.class, chatModelQwen);    }}AlService是如何工作的
https://docs.langchain4j.dev/tutorials/ai-services/#how-does-it-work
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203824291-1284054559.png

[*]最后编写对于业务的 Controller 类。直接调用我们的接口类,因为该接口的实现类已经被我们通过调用 AiServices.create()方法就好创建好我们自定义的接口实现类。同时我们也将其加入 @Bean加入到了 IOC 容器当中管理了,所以可以直接,通过 @Resource 注解注入。
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823492-1705134941.png
package com.rainbowsea.langchain4j02lowhighapi.controller;import com.rainbowsea.langchain4j02lowhighapi.service.ChatAssistant;import jakarta.annotation.Resource;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/** */@RestController@Slf4jpublic class HighApiController{    @Resource    private ChatAssistant chatAssistant;    @GetMapping(value = "/highapi/highapi")    public String highApi(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)    {      return chatAssistant.chat(prompt);    }}运行测试:
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203823847-1175225603.png
最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
https://img2024.cnblogs.com/blog/3084824/202508/3084824-20250829203824682-1934141213.gif

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 3. LangChain4j + 低阶 和 高阶 API的详细说明