阿里百炼大模型
官网地址:https://www.aliyun.com/product/bailian
什么是大模型服务平台百炼
大模型服务平台百炼是一站式的企业专属大模型生产平台,基于通义基础大模型,提供企业专属大模型开发和应用的整套工具链。
- 面向对象:企业、开发者及ISV的技术人员。
- 核心能力:支持开箱即用的应用调用,大模型训练微调和一站式在线灵活部署。
- 服务形式:通过API服务输出给客户,方便客户进行集成和使用专属大模型能力。
- 应用编排:支持客户打通自己的业务能力API,使得客户可以将专属大模型能力集成到自己的业务链路中。
- 工具多样:系统内置插件能力,支持Python解释器、夸克搜索、图片生成、计算器等,更方便客户一键使用;同时也可以通过自定义插件实现工具能力更加便捷。
大模型对接
业务功能
1、 主要是将我们的获取题目的逻辑以及针对用户答案打分的逻辑交给大模型来做
2、扩展原有的引擎
3、增加 http 工具进行对接,编写模型脚本
核心代码
依赖引用
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.0.3</version>
</dependency>
输出响应
private static InterviewSubmitReq.Submit buildInterviewScore(InterviewSubmitReq.Submit submit) {
long start = System.currentTimeMillis();
Map<String, Object> reqMap = new HashMap<>();
JSONObject jsonData = new JSONObject();
jsonData.put("model", "qwen1.5-110b-chat");
JSONObject input = new JSONObject();
JSONObject message2 = new JSONObject();
message2.put("role", "user");
String keyword = String.format("题目:%s,答案:%s", submit.getSubjectName(), submit.getUserAnswer());
String subject = String.format("根据题目和答案 %s ;评一个分数0-5分及参考答案并按照数据结{\"userScore\":\"用户分数\",\"subjectAnswer\":\"参考答案\"}构返json数据", keyword);
log.info("buildInterview {}", subject);
message2.put("content", subject);
input.put("messages", new JSONObject[]{message2});
jsonData.put("input", input);
jsonData.put("parameters", new JSONObject());
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Authorization", "Bearer " + apiKey);
headerMap.put("Content-Type", "application/json");
headerMap.put("X-DashScope-SSE", "enable");
String url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation";
String body = HttpUtils.executePost(url, jsonData.toJSONString(), headerMap);
// 输出响应结果
int index = body.lastIndexOf("data:");
String substring = body.substring(index + 5, body.length() - 1);
JSONObject jsonObject = JSONObject.parseObject(substring);
String text = jsonObject.getJSONObject("output").getString("text");
int jsonIndex = text.lastIndexOf("```json");
String json = text.substring(jsonIndex + 7, text.lastIndexOf("```"));
InterviewSubmitReq.Submit interviews = JSONObject.parseObject(json, InterviewSubmitReq.Submit.class);
interviews.setLabelName(submit.getLabelName());
interviews.setSubjectName(submit.getSubjectName());
interviews.setUserAnswer(submit.getUserAnswer());
log.info("cost {} data:{}", System.currentTimeMillis() - start, JSON.toJSONString(interviews));
return interviews;
}
private static InterviewQuestionVO.Interview buildInterview(String keyword) {
long start = System.currentTimeMillis();
JSONObject jsonData = new JSONObject();
jsonData.put("model", "qwen1.5-110b-chat");
JSONObject input = new JSONObject();
JSONObject message2 = new JSONObject();
message2.put("role", "user");
String subject = String.format("根据以下关键字生成1道面试题和标签 %s 并按照数据结{\"labelName\":\"分类名称\",\"subjectName\":\"题目\"}构返json数据", keyword);
log.info("buildInterview {}", subject);
message2.put("content", subject);
input.put("messages", new JSONObject[]{message2});
jsonData.put("input", input);
jsonData.put("parameters", new JSONObject());
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Authorization", "Bearer " + apiKey);
headerMap.put("Content-Type", "application/json");
headerMap.put("X-DashScope-SSE", "enable");
String url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation";
String body = HttpUtils.executePost(url, jsonData.toJSONString(), headerMap);
// 输出响应结果
int index = body.lastIndexOf("data:");
String substring = body.substring(index + 5, body.length() - 1);
JSONObject jsonObject = JSONObject.parseObject(substring);
String text = jsonObject.getJSONObject("output").getString("text");
int jsonIndex = text.lastIndexOf("```json");
String json = text.substring(jsonIndex + 7, text.lastIndexOf("```"));
InterviewQuestionVO.Interview interviews = JSONObject.parseObject(json, InterviewQuestionVO.Interview.class);
log.info("cost {} data:{}", System.currentTimeMillis() - start, JSON.toJSONString(interviews));
return interviews;
}
Http Utils 类
@Slf4j
public class HttpUtils {
private HttpUtils() {
}
/**
* HttpClient 对象
*/
private static CloseableHttpClient httpClient = null;
/**
* CookieStore 对象
*/
private static CookieStore cookieStore = null;
/**
* Basic Auth 管理对象
**/
private static BasicCredentialsProvider basicCredentialsProvider = null;
/**
* HttpClient初始化
**/
static {
// 注册访问协议相关的 Socket 工厂
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
// Http 连接池
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);
poolingHttpClientConnectionManager.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(15, TimeUnit.SECONDS)
.setTcpNoDelay(true).build()
);
// 整个连接池最大连接数
poolingHttpClientConnectionManager.setMaxTotal(1000);
// 每路由最大连接数,默认值是2
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(200);
poolingHttpClientConnectionManager.setValidateAfterInactivity(TimeValue.ofSeconds(15));
// Http 请求配置
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000, TimeUnit.MILLISECONDS)
.setResponseTimeout(5000, TimeUnit.MILLISECONDS)
.setConnectionRequestTimeout(5000, TimeUnit.MILLISECONDS)
.build();
// 设置 Cookie
cookieStore = new BasicCookieStore();
// 设置 Basic Auth 对象
basicCredentialsProvider = new BasicCredentialsProvider();
// 创建监听器,在 JVM 停止或重启时,关闭连接池释放掉连接
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
log.info("HttpClientUtil.beginClose!");
httpClient.close();
log.info("HttpClientUtil.close");
} catch (IOException e) {
log.error("HttpClientUtil.close.error:{}", e.getMessage(), e);
}
}));
// 创建 HttpClient 对象
httpClient = HttpClients.custom()
// 设置 Cookie
.setDefaultCookieStore(cookieStore)
// 设置 Basic Auth
.setDefaultCredentialsProvider(basicCredentialsProvider)
// 设置 HttpClient 请求参数
.setDefaultRequestConfig(requestConfig)
// 设置连接池
.setConnectionManager(poolingHttpClientConnectionManager)
// 设置定时清理连接池中过期的连接
.evictExpiredConnections()
.evictIdleConnections(TimeValue.ofSeconds(15))
.setRetryStrategy(new DefaultHttpRequestRetryStrategy(2, TimeValue.ofSeconds(1L)))
.build();
}
/**
* 获取 Httpclient 对象
*/
public static CloseableHttpClient getHttpclient() {
return httpClient;
}
/**
* 获取 CookieStore 对象
*/
public static CookieStore getCookieStore() {
return cookieStore;
}
/**
* 获取 BasicCredentialsProvider 对象
*/
public static BasicCredentialsProvider getBasicCredentialsProvider() {
return basicCredentialsProvider;
}
/**
* Http get 请求
*/
public static String httpGet(String uri) {
if (StringUtils.isBlank(uri)) {
throw new NullPointerException("HttpClientUtil.uri.notEmpty!");
}
String result = "";
CloseableHttpResponse response = null;
try {
// 创建 HttpGet 对象
HttpGet httpGet = new HttpGet(uri);
// 执行 Http Get 请求
response = HttpUtils.getHttpclient().execute(httpGet);
// 输出响应内容
if (response.getEntity() != null) {
result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
}
// 销毁流
EntityUtils.consume(response.getEntity());
} catch (IOException | ParseException e) {
log.error("HttpClientUtil.httpGet.error:{},uri:{}", e.getMessage(), uri, e);
} finally {
// 释放资源
if (response != null) {
try {
response.close();
} catch (IOException e) {
log.error("HttpClientUtil.httpGet.close.error:{}", e.getMessage(), e);
}
}
}
return result;
}
/**
* Http get 请求
*/
public static String httpGet(String uri, Map<String, String> cookieMap, Map<String, String> headMap) {
if (StringUtils.isBlank(uri)) {
throw new NullPointerException("HttpClientUtil.uri.notEmpty!");
}
String result = "";
CloseableHttpResponse response = null;
try {
// 创建 HttpGet 对象
HttpGet httpGet = new HttpGet(uri);
//增加cookie
if (MapUtils.isNotEmpty(cookieMap)) {
String cookie = cookieMap.entrySet().stream()
.map(n -> {
try {
return n.getKey() + "=" + URLEncoder.encode(n.getValue(), "UTF-8");
} catch (UnsupportedEncodingException e) {
log.error("HttpClientUtil.httpGet.encode.error!:{}", e.getMessage(), e);
}
return null;
}).collect(Collectors.joining(";"));
if (StringUtils.isNotBlank(cookie)) {
httpGet.addHeader("Cookie", cookie);
}
}
//增加head
if (MapUtils.isNotEmpty(headMap)) {
for (String key : headMap.keySet()) {
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(headMap.get(key))) {
httpGet.addHeader(key, headMap.get(key));
}
}
}
// 执行 Http Get 请求
CloseableHttpClient httpclient = HttpUtils.getHttpclient();
response = httpclient.execute(httpGet);
// 输出响应内容
if (response.getEntity() != null) {
result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
}
// 销毁流
EntityUtils.consume(response.getEntity());
} catch (IOException | ParseException e) {
log.error("HttpClientUtil.httpGet.error:{},uri:{}", e.getMessage(), uri, e);
} finally {
// 释放资源
if (response != null) {
try {
response.close();
} catch (IOException e) {
log.error("HttpClientUtil.httpGet.close.error:{}", e.getMessage(), e);
}
}
}
return result;
}
Http Post Json 表单请求
/**
* Http Post Json 表单请求示例
*/
@SneakyThrows
public static void httpPostJson(String uri, Map<String, Object> reqArgs, Consumer<InputStream> reponseInputStream) {
CloseableHttpResponse response = null;
InputStream inputStream = null;
try {
if (StringUtils.isBlank(uri)) {
throw new NullPointerException("HttpClientUtil.httpPostJson.uri.notEmpty!");
}
// 创建 HttpPost 对象
HttpPost httpPost = new HttpPost(uri);
StringEntity stringEntity = null;
if (null != reqArgs && 0 != reqArgs.size()) {
// 将请求对象通过 fastjson 中方法转换为 Json 字符串,并创建字符串实体对象
stringEntity = new StringEntity(JSON.toJSONString(reqArgs), StandardCharsets.UTF_8);
// 设置 HttpPost 请求参数
httpPost.setEntity(stringEntity);
}
// 设置 Content-Type
httpPost.addHeader("Content-Type", ContentType.APPLICATION_JSON);
// 执行 Http Post 请求
response = HttpUtils.getHttpclient().execute(httpPost);
// 输出响应内容
if (response.getEntity() != null) {
inputStream = response.getEntity().getContent();
if (null != inputStream) {
log.info("HttpClientUtil.httpPostJson.response.getEntity.getContent.inputStream size:{}", null != inputStream ? inputStream.available() : 0);
reponseInputStream.accept(inputStream);
} else {
log.error("HttpClientUtil.httpPostJson.response.getEntity.getContent.inputStream is null,response.code:{}", response.getCode());
}
}
// 销毁流
if (null != reqArgs && 0 != reqArgs.size() && null != stringEntity) {
EntityUtils.consume(stringEntity);
}
EntityUtils.consume(response.getEntity());
} catch (Exception e) {
log.error("HttpClientUtil.httpPostJson.error:{}", e.getMessage(), e);
throw e;
} finally {
// 释放资源
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log.error("HttpClientUtil.httpPostJson.inputstream.close.error:{}", e.getMessage(), e);
}
}
if (response != null) {
try {
response.close();
} catch (IOException e) {
log.error("HttpClientUtil.httpPostJson.response.close.error:{}", e.getMessage(), e);
}
}
}
}
/**
* post 请求
*/
public static String executePost(String url, String reqArgs,
Map<String, String> headerMap) {
String result = null;
HttpPost httpPost = new HttpPost(url);
StringEntity stringEntity = new StringEntity(reqArgs, ContentType.create("application/json", "utf-8"));
httpPost.setEntity(stringEntity);
if (MapUtils.isNotEmpty(headerMap)) {
headerMap.forEach((key, val) -> {
httpPost.setHeader(key, val);
});
}
try {
CloseableHttpResponse response = HttpUtils.getHttpclient().execute(httpPost);
if (response.getCode() == HttpStatus.SC_OK || response.getCode() == HttpStatus.SC_CREATED) {
result = getStreamAsString(response.getEntity().getContent(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private static String getStreamAsString(InputStream stream, String charset) throws IOException {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset), 8192);
StringWriter writer = new StringWriter();
char[] chars = new char[8192];
int count = 0;
while ((count = reader.read(chars)) > 0) {
writer.write(chars, 0, count);
}
return writer.toString();
} finally {
if (stream != null) {
stream.close();
}
}
}
}