阿里云官网有很多有优秀的产品,我学校在做课设时用到过OSS对象存储、阿里云服务器、模型服务、短信服务、DNS等
这里主要介绍一下我使用的模型服务过程。
最终效果
实现过程
一、获取Apikey
大家首先要在阿里云官网注册账号,进入官网主页后,点击搜索‘模型服务灵积‘
在搜索结构中,点击‘产品控制台’
进入控制台后,点击API-KEY管理,创建自己的API-KEY,会生成一个API-KEY,我们必须要保存好!
注意创建后一定要保存好!!!
如果创建失败,大家可以自己去网上找一更详细的教程,我这里只是简单介绍一下。有志者,事竟成!!
二、学习文档开发
在控制台页面点击模型广场,这里有针对很多领域训练的模型,大家可以选择合适的模型开发。我这选择的是通义千问
可以看到这里有两种调用通义千问的方式(OpenAi兼容和DashScope)
我们要想通过OpenAi或DashScope调用的话,首先要获取API-KEY和配置环境变量(可选)。获取API-KEY我们在第一步已经完成,至于配置环境变量,大家可以选择性配置,这样做其实就是确保API-KEY的安全(我这里就没有配置了,直接在项目中使用)。然后还需安装SDK
我们点击安装SDK,然后会跳转到以下界面
大家可以看到Java SDK信息,我们可以先点击以下链接,查找到最新的SDK版本,复制到项目中
https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java
我们再次点击左侧的导航栏,点击‘模型调用’选择‘通义千问’
往下滑找到‘DashScope’,选择流式输出,点击Java
可以看到有示例代码、响应格式、请求体等(大家以后可以参考这些更深刻的完善自己的项目)。
三、简单实践
接下来我们分析一下示例代码,从中学习调用大模型的具体过程,最后简单实践测试一下。
我们先看main方法
public static void main(String[] args) {
try {
//生成式对象,封装了调用大模型接口,底层使用的是OkHttp库管理
Generation gen = new Generation();
//Message这是一个对话消息实体,包括角色和信息,这里是用户角色提问
Message userMsg = Message.builder().role(Role.USER.getValue()).content("你是谁?").build();
//将生成式对象和对话消息传入streamCallWithMessage,调用大模型
streamCallWithMessage(gen, userMsg);
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
logger.error("An exception occurred: {}", e.getMessage());
}
System.exit(0);
}
Generation·这个对象并未在阿里云上找到详情说明,但我们通过查看源码,发现有很多类似于OkHttp中call方法,所以猜测它是封装了okhttp库的请求类。我们可以查看方法调用链,发现它最终使用的是OkHttp3,所以基本确定它就是封装好的调用大模型的请求类,我们只需配置好信息,然后使用它封装的方法即可完成调用。
我们再看streamCallWithMessage方法
public static void streamCallWithMessage(Generation gen, Message userMsg) throws Exception {
//将对话消息实体传入buildGenerationParam方法获取参数对象
GenerationParam param = buildGenerationParam(userMsg);
//调用生成式对象中call方法,完成大模型调用,结果保存在result中
Flowable<GenerationResult> result = gen.streamCall(param);
//我们服务器与阿里大模型服务之间也采用了sse,所以大模型服务会将已经回答消息流式推送我们的服务器
result.blockingForEach(message -> handleGenerationResult(message));
}
result.blockingForEach这个方法会监听阿里大模型服务推送过来的消息,只要有新的消息就会调用handleGenerationResult方法,将大模型回答的消息打印出来
private static void handleGenerationResult(GenerationResult message) {
System.out.println(JsonUtils.toJson(message));
}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":1,"total_tokens":12},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"我是"}}]}}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":2,"total_tokens":13},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"通"}}]}}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":3,"total_tokens":14},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"义"}}]}}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":8,"total_tokens":19},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"千问,由阿里"}}]}}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":16,"total_tokens":27},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"云开发的AI助手。我被"}}]}}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":24,"total_tokens":35},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"设计用来回答各种问题、提供信息"}}]}}
{"requestId":"xxx","usage":{"input_tokens":11,"output_tokens":32,"total_tokens":43},"output":{"choices":[{"finish_reason":"null","message":{"role":"assistant","content":"和与用户进行对话。有什么我可以"}}]}}
{"requ