一、对话模型(Chat Model)简介
1、对话模型(Chat Model)
对话模型(Chat Model)接收一系列消息(Message)作为输入,与模型 LLM 服务进行交互,并接收返回的聊天消息(Chat Message)作为输出。
相比于普通的程序输入,模型的输入与输出消息(Message)支持纯字符文本,还支持包括语音、图片、视频等作为输入输出。
同时,在 Spring AI Alibaba 中,消息中还支持包含不同的角色,帮助底层模型区分来自模型、用户和系统指令等的不同消息。
Spring AI Alibaba 复用了 Spring AI 抽象的 Model API,并与通义系列大模型服务进行适配(如通义千问、通义万相等),目前支持纯文本聊天、文生图、文生语音、语音转文本等。
以下是框架定义的几个核心 API:
- ChatModel,文本聊天交互模型,支持纯文本格式作为输入,并将模型的输出以格式化文本形式返回。
- ImageModel,接收用户文本输入,并将模型生成的图片作为输出返回。
- AudioModel,接收用户文本输入,并将模型合成的语音作为输出返回。
Spring AI Alibaba 支持以上 Model 抽象与通义系列模型的适配,并通过 spring-ai-alibaba-starter AutoConfiguration 自动初始化了默认实例,因此我们可以在应用程序中直接注入 ChatModel、ImageModel 等 bean,当然在需要的时候也可以自定义 Model 实例。
2、Chat Model
ChatModel API 让应用开发者可以非常方便的与 AI 模型进行文本交互,它抽象了应用与模型交互的过程,包括使用 Prompt 作为输入,使用 ChatResponse 作为输出等。
ChatModel 的工作原理是接收 Prompt 或部分对话作为输入,将输入发送给后端大模型,模型根据其训练数据和对自然语言的理解生成对话响应,应用程序可以将响应呈现给用户或用于进一步处理。
二、ChatModel使用
Spring AI Alibaba对话模型(Chat Model):https://java2ai.com/docs/1.0.0-M5.1/tutorials/chat-model/
1、编写 Controller接口
在普通 Controller Bean 中注入 ChatModel 实例,实现下面几个功能:
- 简单调用
- 流式调用
- 自定义 LLMs ChatOptions 参数调用。
- 查看 ChatResponse信息,打印token的信息。
@Slf4j
@RestController
@RequestMapping("/dashscope/chat-model")
public class DashScopeChatModelController {
private static final String DEFAULT_PROMPT = "你好,介绍下你自己!";
private final ChatModel dashScopeChatModel;
/**
* 使用如下的方式自动注入 ChatModel
*
* @param chatModel
*/
public DashScopeChatModelController(ChatModel chatModel) {
this.dashScopeChatModel = chatModel;
}
/**
* 最简单调用方式,没有任何 LLMs 参数注入。
*/
@GetMapping("/simple/chat")
public String simpleChat(String userInputPrompt) {
if (StringUtils.isBlank(userInputPrompt)) {
userInputPrompt = DEFAULT_PROMPT;
}
String aiOutput = dashScopeChatModel.call(
new Prompt(
userInputPrompt,
DashScopeChatOptions.builder()
// 指定使用的模型,默认使用 qwen-plus 模型
.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel())
.build()
)
)
.getResult()
.getOutput()
.getText();
log.info("\n simpleChat --> userInputPrompt ={}, \n aiOutput = {}", userInputPrompt, aiOutput);
return aiOutput;
}
/**
* Stream 流式调用。
* 可以使大模型的输出信息实现打字机效果。
*/
@GetMapping("/stream/chat")
public Flux<String> streamChat(HttpServletResponse response, String userInputPrompt) {
if (StringUtils.isBlank(userInputPrompt)) {
userInputPrompt = DEFAULT_PROMPT;
}
// 避免接口返回乱码
response.setCharacterEncoding("UTF-8");
log.info("\n streamChat --> userInputPrompt ={},", userInputPrompt);
Flux<ChatResponse> stream = dashScopeChatModel.stream(
new Prompt(userInputPrompt,
DashScopeChatOptions.builder()
// 指定使用的模型,默认使用 qwen-plus 模型
.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel())
.build()
)
);
Flux<String> flux = stream.map(chatResponse -> chatResponse.getResult().getOutput().getText());
return flux;
}
/**
* 使用编程方式自定义 LLMs ChatOptions 参数,
* {@link com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions}
* 优先级高于在 application.yml 中配置的 LLMs 参数!
*/
@GetMapping("/customOptions/chat")
public String customOptionsChat(String userInputPrompt) {
if (StringUtils.isBlank(userInputPrompt)) {
userInputPrompt = DEFAULT_PROMPT;
}
// 自定义 LLMs ChatOptions 参数
DashScopeChatOptions customOptions = DashScopeChatOptions.builder()
// 指定使用 qwen-turbo 模型
.withModel(DashScopeApi.ChatModel.QWEN_TURBO.getModel())
.withTopP(0.7)
.withTopK(50)
.withTemperature(0.8)
.build();
//return dashScopeChatModel.call(new Prompt(userInputPrompt, customOptions)).getResult().getOutput().getText();
/**
* AI 模型的响应是一种由ChatResponse类型定义的丰富结构。
* 它包含响应生成相关的元数据,同时它还可以包含多个子响应(称为Generation),每个子响应都有自己的元数据。
* 元数据包括用于创建响应的令牌(token)数量信息(在英文中,每个令牌大约为一个单词的 3/4),了解令牌信息很重要,因为 AI 模型根据每个请求使用的令牌数量收费。
*
*/
ChatResponse chatResponse = dashScopeChatModel.call(new Prompt(userInputPrompt, customOptions));
Usage usage = chatResponse.getMetadata().getUsage();
Integer totalTokens = usage.getTotalTokens();
log.info("\n customOptionsChat --> chatResponse = {}", usage);
String aiOutput = chatResponse.getResult().getOutput().getText();
log.info("\n customOptionsChat --> userInputPrompt ={}, totalTokens ={} \n aiOutput = {}", userInputPrompt, totalTokens, aiOutput);
return aiOutput;
}
}
自定义 LLMs ChatOptions 参数调用,完整输出内容如下:
在人工智能(AI)时代,技术的发展日新月异,作为Java开发者,需要主动适应和拥抱变化,以保持竞争力。以下是一些关键的建议和方向:
---
### 1. **理解AI与Java的关系**
- **Java与AI的结合**:虽然Java不是专门为AI设计的语言,但它在构建大规模分布式系统、后端服务和企业级应用方面表现出色。因此,许多AI项目可能会使用Java作为后端或基础设施的一部分。
- **AI框架与工具**:熟悉一些基于Java的AI框架,例如:
- **DL4J (Deeplearning4j)**:一个用于深度学习的Java库。
- **Weka**:一个机器学习库,适合数据挖掘任务。
- **Apache Mahout**:一个专注于机器学习的分布式计算框架。
---
### 2. **提升数据科学能力**
- AI的核心是数据驱动的决策,因此掌握数据分析、数据处理和机器学习的基础知识至关重要。
- 学习相关技能:
- 数据清洗与预处理。
- 统计学基础。
- 常见的机器学习算法(如回归、分类、聚类等)。
- 深度学习的基本概念。
---
### 3. **扩展技术栈**
- **云平台**:随着AI项目的复杂性增加,云平台成为不可或缺的一部分。学习如何使用AWS、Azure或Google Cloud等平台来部署和管理AI模型。
- **容器化与微服务**:熟悉Docker、Kubernetes等技术,以便更好地支持AI系统的可扩展性和可靠性。
- **大数据技术**:AI通常需要处理海量数据,因此熟悉Hadoop、Spark等大数据技术非常重要。
---
### 4. **关注新兴领域**
- **边缘计算**:AI模型正在向设备端迁移(例如IoT设备),学习如何在嵌入式系统中运行Java代码。
- **自动化与DevOps**:AI项目需要高效的开发和运维流程,掌握CI/CD工具链(如Jenkins、GitLab CI)以及自动化测试技术。
- **区块链与AI结合**:探索区块链技术如何增强AI的信任机制和数据隐私保护。
---
### 5. **学习新语言与工具**
- 虽然Java仍然是主流语言之一,但为了应对AI领域的多样化需求,可以适当学习其他语言和技术:
- Python:AI社区中最受欢迎的语言,拥有丰富的库(如TensorFlow、PyTorch)。
- Kotlin:与Java无缝兼容,且语法更简洁。
- JavaScript:如果涉及前端AI应用(如WebGL、TensorFlow.js)。
---
### 6. **培养软技能**
- **沟通能力**:AI项目通常需要跨部门协作,良好的沟通能力有助于推动项目成功。
- **创新思维**:尝试将AI技术与传统Java应用相结合,创造新的业务价值。
- **终身学习**:技术更新迅速,保持好奇心和学习热情是长期发展的关键。
---
### 7. **参与开源社区**
- 参与Java或AI相关的开源项目,不仅可以积累经验,还能扩大人脉圈。
- GitHub是一个很好的起点,搜索与Java或AI相关的开源项目并贡献代码。
---
### 总结
AI时代对Java开发者既是挑战也是机遇。通过不断提升技术能力、扩展视野,并保持开放的心态,Java开发者完全可以在AI领域找到自己的定位。无论是继续深耕Java生态,还是结合AI技术开拓新方向,关键是紧跟趋势,持续学习和实践。
如果你有具体的方向或问题,欢迎进一步讨论!
– 求知若饥,虚心若愚。