3. LangChain4j + 低阶 和 高阶 API的详细说明
3. LangChain4j + 低阶 和 高阶 API的详细说明
@
LangChain4j + 低阶 和 高阶 API的详细说明
https://docs.langchain4j.dev/get-started/


https://docs.langchain4j.dev/tutorials/chat-and-language-models/

LLM 目前有两种 API 类型:

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


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

ChatModel 接口如下的默认实现的方法:

ChatModel提供的--种极其简便的方法:如下:

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 高阶



low level 低阶 API 的使用


导入相关的依赖:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--langchain4j-open-ai 基础-->
<!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
从最简单的开始方式是从 OpenAI 集成开始https://docs.langchain4j.dev/get-started -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
<!--langchain4j 高阶-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
配置对应大模型的配置类。

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
*/
@Configuration
public 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 是一样的

启动测试:

大模型中的Token VS Web开发中的Token
大模型当中的 Token

Web 开发中的 Token


// 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;
}
}

ChatMessage 其实就是一个 prompt ,就是被大模型封装了一层,让其更好的被大模型读取识别而已。

运行测试:

high level 高阶 API 的详细使用

翻译:

AI Service 的高阶 API 的使用:
具体的编码步骤如下:https://docs.langchain4j.dev/tutorials/ai-services/#simplest-ai-service


- 定义 AI Service 接口:
我们知道,按照Java开发一般习惯,有接口就要有实现类 比如接口ChatAssistant,就会有实现类ChatAssistantImpl现在用高阶api- AIServics不用你自己写 impl实现类,交给langchain4j给你搞定。(接口名是随意的,你只要见名之意即可)

package com.rainbowsea.langchain4j02lowhighapi.service;
/**
* 我们知道,按照Java开发一般习惯,有接口就要有实现类
* 比如接口ChatAssistant,就会有实现类ChatAssistantImpl
* 现在用高阶api-AIServics不用你自己写impl实现类,交给langchain4j给你搞定
* <p>
* 本次配置用的是langchain4j原生整合,没有引入sprinboot,不需要接口头上配置@AiService注解标签
*/
public interface ChatAssistant {
String chat(String prompt);
}
LLMConfig类配置当中配置调用大模型的三件套(大模型的 Key,大模型 name,大模型的 url)

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
*/
@Configuration
public 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()方法就好创建好我们自定义的接口实现类。

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
*/
@Configuration
public 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

- 最后编写对于业务的 Controller 类。直接调用我们的接口类,因为该接口的实现类已经被我们通过调用
AiServices.create()方法就好创建好我们自定义的接口实现类。同时我们也将其加入@Bean加入到了 IOC 容器当中管理了,所以可以直接,通过@Resource注解注入。

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
@Slf4j
public class HighApiController
{
@Resource
private ChatAssistant chatAssistant;
@GetMapping(value = "/highapi/highapi")
public String highApi(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatAssistant.chat(prompt);
}
}
运行测试:

最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
3. LangChain4j + 低阶 和 高阶 API的详细说明的更多相关文章
- 高阶组件&&高阶函数(一)
antd里面的form表单方面,遇到一个高阶函数,以及高阶组件,于是看了一下这方面内容,前辈们的文章写得也非常详细,这里就稍微kobe一下 高阶函数与高阶组件 高阶函数: 高阶函数,是一种特别的函数, ...
- [SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解
目录 1.前言 2.ZMQ 块的类型 3.ZMQ 块的使用 4.DEMO 4.1 同一台电脑上的两个流程图 4.2 不同电脑上的两个流程图 4.3 作为 REQ/REP 服务器的 Python 程序 ...
- react_结合 redux - 高阶函数 - 高阶组件 - 前端、后台项目打包运行
Redux 独立的集中式状态管理 js 库 - 参见 My Git 不是 react 库,可以与 angular.vue 配合使用,通常和 react 用 yarn add redux import ...
- 高阶函数&&高阶组件(二)
高阶组件总共分为两大类 代理方式 操纵prop 访问ref(不推荐) 抽取状态 包装组件 继承方式 操纵生命周期 操纵prop 代理方式之 操纵prop 删除prop import React fro ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- Python---12函数式编程------12.1高阶函数
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- javascript设计模式学习之三—闭包和高阶函数
一.闭包 闭包某种程度上就是函数的内部函数,可以引用外部函数的局部变量.当外部函数退出后,如果内部函数依旧能被访问到,那么内部函数所引用的外部函数的局部变量就也没有消失,该局部变量的生存周期就被延续. ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- Haskell学习-高阶函数
原文地址:Haskell学习-高阶函数 高阶函数(higher-order function)就是指可以操作函数的函数,即函数可以作为参数,也可以作为返回结果.有了这两个特性,haskell可以实现许 ...
随机推荐
- HyperMesh模型导入与几何清理
2.1 CAD 模型导入与修复 HyperMesh 支持多种主流 CAD 格式模型文件,同时针对模型在软件之间导入导出过程中可能出现数据丢失的问题提供了多种修复工具. CAD 模型导入与修复可进行: ...
- [abc313 h/ex] Group Photo
Ex - Group Photo 很牛的题 设\(A_0=A_{n+1}=INF\),那么对于每个\(B_i\)有\(B_i>\min(A_{i-1},A_i)\),所以考虑设\(C_i\)表示 ...
- BZOJ2720 [Violet 5] 列队春游 题解
Problem 对于一个数列 \(S\),\(S_0= \infty\),设对于 \(S_i\),\(S_{a_i}\) 是 \(S_i\) 之前第一个大于等于 \(S_i\) 的数.给定 \(S\) ...
- matlab绘图中set函数的使用汇总
Matlab 绘图中set函数使用汇总 % 设置标题字体大小,字型 set(get(gca,'title'),'FontSize',10,'FontName','宋体'); % 设置X坐标标题字体大小 ...
- 解决Xamarin.Android 软键盘弹出挡住Edittext的问题
Window.SetSoftInputMode(SoftInput.AdjustPan);
- vs 代码格式化
解决方案 ctrl + A: ctrl + K + F; 参考链接 (博客园大牛)[https://www.cnblogs.com/chenmingjun/p/8119029.html]
- lingo 练习 二
简介 练习测试 KeyPoints: 条件过滤的应用,循环乘法的应用 EX1.求sets中前几个数的和 model: data: N=6; enddata sets: number/1..N/:x; ...
- 试用完几十款ETL工具后的经验总结,ETL工具用这三款就足够了
1.ETL选型前言 市面上ETL工具国内外加起来估计得有30种之多,其中近20款工具都花时间试用过,现在把试用后总结出来的经验分享一下,目前很多企业在选择ETL工具时不知道怎么选择适合自己的工具也不可 ...
- Product-Marketing-Online: 在线营销: 如何优化 Amazon的 广告投放 以提高 ROI(投资产出滤)?
如何优化亚马逊广告以提高ROI? 2025-01-06 10:07 在竞争激烈的Amazon.com亚马逊市场,优化广告以提高ROI是商家的关键任务. 以下是一些实用的策略: 一.精准的关键词研究与选 ...
- SciTech-BigDataAIML-LLM-Transformer Series- transformer-explainer
transformer-explainer: https://github.com/poloclub/transformer-explainer

