项目实训的第三周工作集中于websocket服务器的开发以及大模型的接入。
在大模型接入方面:因采用internLM,在私有服务器上调用大模型需使用官方提供的途径,通过ssh建立端口映射来连接。通过将本地23333端口设置转发,实现后端调用大模型。大模型的api使用http post协议。在InvokeModelRequest的构造函数中封装了参数。
@Service
public class AIServiceImpl implements AIService {
private static String MODEL_BASE_URL;
@Value("${modelConnection.requestBaseUrl}")
public void setModelBaseUrl(String url){MODEL_BASE_URL = url;}
@Override
public String invokeModel(User user, List<Dialog> dialogs) {
InvokeModelRequest request = new InvokeModelRequest(user, dialogs);
// 创建httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
String temp = MODEL_BASE_URL;
//创建请求对象
HttpPost httpPost = new HttpPost( MODEL_BASE_URL + "/v1/chat/completions");
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
StringEntity entity = null;
try {
entity = new StringEntity(jsonObject.toString());
} catch (UnsupportedEncodingException e) {
return e.toString();
}
//指定请求编码方式
entity.setContentEncoding("utf-8");
//数据格式
entity.setContentType("application/json");
httpPost.setEntity(entity);
//发送请求
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpPost);
} catch (IOException e) {
return e.toString();
}
//解析返回结果
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity entity1 = response.getEntity();
String body = null;
try {
body = EntityUtils.toString(entity1);
} catch (IOException e) {
return e.toString();
}
if(statusCode != 200){
return "出现错误:" + statusCode + " body: " + body;
}
//关闭资源
try {
response.close();
httpClient.close();
} catch (IOException e) {
return e.toString();
}
String result = body.substring(body.lastIndexOf("\"content\":") + 11, body.indexOf('\"', body.lastIndexOf("\"content\":") + 11));
return result;
}
}
在Websocket服务端的实现方面,主要是由另一位队友负责,在他完成开发后,我进行了代码复核,并对逻辑进行了部分补充,并接入了大模型。
总的来说,本周对后端基础功能进行了收尾,业务流程的开发已经结束,会在后面进入集中测试与前后端联调阶段。