1. 需求背景

单词学习教练的招聘分为两轮面试,一轮面试是对候选人的英语口语发音,单词词汇量的测试(使用语音评分服务以及自研的词汇量评测方案);二轮面试是对候选人的教师职业素养能力的测试,分为自我介绍和职业素养开放性问答两个环节。

进入二面,会先播放一个单词学习教练的工作内容介绍视频,播放完毕进入自我介绍环节:

  1. 页面展示题目“请做一个自我介绍吧。“,并语音播放题目;
  2. 候选人点击录音按钮,开始作答,系统开始录音,并展示2 分钟的倒计时;
  3. 用户点击作答完成,或者倒计时结束,进入下一个环节;

职业素养问答环节:

  1. 职业素养题目分为 4 道题,候选人每回答完成一道题,就进入下一道题;
  2. 4 道题目作答完成,展示面试结果;
  3. 如果面试未通过,可以重新面试,一共两次机会;

2. 技术方案

考虑到成本与用户体验之间的平衡;决定采用语音转文本 + 大语言模型评判的方式来完成二面面试的核心评判逻辑;考虑到代码的可扩展性和维护成本,采用策略模式+模版方法设计模式来组织代码逻辑;

1. 核心评判逻辑时序图

sequenceDiagram
    actor User
    participant Frontend
    participant Backend
    participant Database
    participant AliyunASR
    participant LLM

    User->>Frontend: 点击录音按钮开始答题
    Frontend->>User: 开始录音
    User->>Frontend: 点击完成按钮
    Frontend->>Frontend: 生成MP3音频文件
    Frontend->>Backend: 提交答案(含MP3)

    par
    Backend->>Database: 创建/更新答案记录(状态:已回答)
    Backend->>AliyunASR: 提交音频进行语音识别
    AliyunASR-->>Backend: 返回识别文本结果
    Backend->>Database: 更新答案记录(保存识别文本)
    Backend->>LLM: 提交问题及答案文本请求评判
    LLM-->>Backend: 返回评判结果
    Backend->>Database: 更新答案记录(状态:评判完成,保存结果)
    end    
    
    Backend-->>Frontend: 返回下一题
    Frontend-->>User: 显示下一题

2. 代码具体实现

1. 面试题评判策略类

classDiagram
    %% 问题评判策略接口
    class IQuestionDetermineStrategy {
        <<interface>>
        determine(AnswerDto) AnswerFeedbackDto
    }
    
    %% 具体实现类
    %% 职业技能题评判策略实现
    class ProfessionalSkillsDetermineStrategy {
        +determine(AnswerDto) AnswerFeedbackDto
    }

    %% 职业素养题评判策略实现
    class ProfessionalQualityDetermineStrategy {
        +determine(AnswerDto) AnswerFeedbackDto
    }
    
    
    %% 情景测试题评判策略实现
    class SituationTestDetermineStrategy {
        +determine(AnswerDto) AnswerFeedbackDto
    }
    
    %% 关系定义
    IQuestionDetermineStrategy <|.. ProfessionalSkillsDetermineStrategy
    IQuestionDetermineStrategy <|.. ProfessionalQualityDetermineStrategy
    IQuestionDetermineStrategy <|.. SituationTestDetermineStrategy

2. 具体面试题类型评判处理的模板方法

classDiagram

    %% 抽象类
    class AbstractVoiceAnswerProcessor {
        <<abstract>>
        +audioToText(AnswerDto) void
        +aiDetermine(AnswerDto) void
    }

    %% 自我介绍题目处理
    class SelfIntroductionProcessor {
        +audioToText(AnswerDto) void
        +aiDetermine(AnswerDto) void
    }

    %% 职业素养题目处理
    class ProfessionalQualityProcessor {
        +audioToText(AnswerDto) void
        +aiDetermine(AnswerDto) void
    }

    %% 情景测试题目处理
    class SituationTestProcessor {
        +audioToText(AnswerDto) void
        +aiDetermine(AnswerDto) void
    }

    %% 运营话术测试题目处理
    class OperationTestProcessor {
        +audioToText(AnswerDto) void
        +aiDetermine(AnswerDto) void
    }

    AbstractVoiceAnswerProcessor <|-- SelfIntroductionProcessor
    AbstractVoiceAnswerProcessor <|-- ProfessionalQualityProcessor
    AbstractVoiceAnswerProcessor <|-- SituationTestProcessor
    AbstractVoiceAnswerProcessor <|-- OperationTestProcessor

4. ai评判核心方法

aiDetermine()方法实际上是将具体题目的回答的文本提交到dify部署的agent做评判,返回的结果更新到数据库表。

1.如果指定模型返回的格式为json,偶尔模型返回的格式会不正确,所以这里和模型交互要增加重试机制。

2.agent的提示词参考 AI招聘提示词示例

参考

  1. 阿里云Paraformer录音文件识别Java SDK
  2. AI招聘提示词示例