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 接口并使用异步任务处理,我们实现了数字人面试官项目中的智能分析功能,提高了系统的性能和响应速度。在实际应用中,我们还需要注意异常处理和资源管理,确保系统的稳定性和可靠性。
posted @ 2025-06-14 14:41  艾鑫4646  阅读(17)  评论(0)    收藏  举报