ChatGLM 接口调用与异步任务开发
背景介绍
在数字人面试官项目中,为了实现对面试结果的智能分析,我们集成了 ChatGLM 模型。本文将详细介绍如何在项目中集成 ChatGLM 接口,并通过异步任务处理提高系统的性能和响应速度。
ChatGLM 接口集成
在项目中,我们通过
ChatGLMTask 类来调用 ChatGLM 接口。首先,我们需要拼接提示词和面试回答内容,然后构建 HTTP 请求发送到 ChatGLM 接口。
// ai-interviewer-dev/api/src/main/java/com/itzixi/ChatGLMTask.java
@Async
public void display(SubmitAnswerBO submitAnswerBO) {
log.info("开始异步AI智能分析...");
// 拼接提示词与回答内容
String jobId = submitAnswerBO.getJobId();
Job job = jobService.getDetail(jobId);
String prompt = job.getPrompt();
List<AnswerBO> answerList = submitAnswerBO.getQuestionAnswerList();
String content = "";
for (AnswerBO answer : answerList) {
content += "提问:" + answer.getQuestion() + "\n";
content += "正确答案:" + answer.getReferenceAnswer() + "\n";
content += "回答内容:" + answer.getAnswerContent() + "\n\n";
}
String submitContent = prompt + "\n\n" + content;
// 构建 HTTP 请求
Request request = new Request.Builder()
.url(apiUrl)
.header("Authorization", GLMTokenUtils.generateToken())
.header("Content-Type", JSON_CONTENT_TYPE)
.header("User-Agent", DEFAULT_USER_AGENT)
.header("Accept", SSE_CONTENT_TYPE)
.post(RequestBody.create(MediaType.parse("application/json"), generateBodyString(submitContent)))
.build();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(connectTimeout, TimeUnit.SECONDS)
.writeTimeout(writeTimeout, TimeUnit.SECONDS)
.readTimeout(readTimeout, TimeUnit.SECONDS)
.build();
RealEventSource realEventSource = getRealEventSource(
content,
submitAnswerBO.getCandidateId(),
job.getJobName(),
submitAnswerBO.getTotalSeconds(),
request);
realEventSource.connect(okHttpClient);
}
异步任务处理
为了避免阻塞主线程,我们使用 Spring 的
@Async 注解将 display 方法标记为异步任务。这样,当调用该方法时,会在新的线程中执行,不会影响主线程的正常运行。
// ai-interviewer-dev/api/src/main/java/com/itzixi/ChatGLMTask.java
@Async
public void display(SubmitAnswerBO submitAnswerBO) {
// 方法体
}
事件监听与结果处理
在
getRealEventSource 方法中,我们实例化了 RealEventSource 并注册了 EventSourceListener 来监听 ChatGLM 接口的响应事件。当接收到 finish 事件时,我们将分析结果保存到数据库中。
// ai-interviewer-dev/api/src/main/java/com/itzixi/ChatGLMTask.java
private RealEventSource getRealEventSource(String answerContent, String candidateId, String jobName,Integer takeTime, Request request) {
RealEventSource realEventSource = new RealEventSource(request, new EventSourceListener() {
String finalResult = "";
@Override
public void onEvent(EventSource eventSource, @Nullable String id, @Nullable String type, String data) {
GLMResponseV3 response = JsonUtils.jsonToPojo(data, GLMResponseV3.class);
String result = response.getData();
finalResult += result;
if (EventType.finish.key.equals(type)) {
InterviewRecord record = new InterviewRecord();
record.setCandidateId(candidateId);
record.setTakeTime(takeTime);
record.setJobName(jobName);
record.setAnswerContent(answerContent);
record.setResult(finalResult);
record.setCreateTime(LocalDateTime.now());
record.setUpdatedTime(LocalDateTime.now());
interviewRecordService.save(record);
}
}
// 其他事件处理方法
});
return realEventSource;
}
总结
通过集成 ChatGLM 接口并使用异步任务处理,我们实现了数字人面试官项目中的智能分析功能,提高了系统的性能和响应速度。在实际应用中,我们还需要注意异常处理和资源管理,确保系统的稳定性和可靠性。

浙公网安备 33010602011771号