跳转至

智能面试官

用户与“智能面试官”的交互过程,主要围绕模拟面试服务展开,核心内容如下:

  1. 智能面试官介绍:智能面试官自称经验丰富、专业且洞察力强,具备深厚人力资源知识和多年招聘面试经验,熟悉各行业岗位需求与人才标准。其性格沉稳公正,面试时严谨认真又有亲和力,能营造良好面试氛围。
  2. 提供的服务
  3. 模拟面试:助力用户了解目标岗位的面试题型和考察重点。
  4. 锻炼表达能力:通过语音对话的方式帮助用户锻炼表达能力。
  5. 梳理回答要点:针对用户的回答给予专业评价并提供优化建议。

我们可以通过以下链接访问该智能体:https://www.coze.cn/store/agent/7483803147086184499?bot_id=true

image-20250327104049323

1.智能体构成

该智能体是以对话流的形式构成,对话流模式

image-20250320152748464

相较于工作流而言,对话流更适合处理对话场景下的交互逻辑。每个对话流都绑定了一个会话,运行时可以从此会话中读取历史消息,同时将本次运行对话流产生的消息记录在这个会话中,相当于一个拥有了记忆的工作流。

  • 如果需要搭建一个对话式的 AI 应用,例如 AI 助手、智能体客服等基于对话方式交互的 AI 应用,扣子推荐你使用对话流,对话流中的大模型可以读取会话上下文、管理会话,还可以搭建对话式的用户界面,发布到各种社交通讯软件中。
  • 如果需要搭建一个工具类的 AI 应用,批量处理数据、实现任务流程的自动化,可以选择工作流实现。

2.对话流构成

该智能体由对话流AI_interviewer_stable构成,如下图所示:

image-20250327105628421

接下来,我们依次介绍每个节点的作用:

2.1 用户提问

该部分获取用户输入后,首先调用大语言模型从对话历史提取当前面试问题并输出为 “interview_question”,接着再次调用大语言模型结合用户原话和当前面试问题,按规则判断提取用户意图相关的 “expected_position” 和 “intention_type”,最后通过 Python 代码接收处理这些输出参数,依据关键词对 “intention” 分类赋值后以字典形式返回供后续使用。

image-20250327110643939

以下是对各节点的说明:

  • 开始节点:获取用户输入

image-20250327111111589

  • 获取当前问题(大模型节点): 此节点调用大语言模型(豆包·Function call模型),从对话历史中获取当前的面试问题,并将其输出为“interview_question”。如果当前没有提出面试问题,则返回为空。通过设置温度为1、topP为0.7等参数来控制模型的生成效果,最大 tokens 设置为1024,以平衡生成的多样性和质量。同时开启对话历史功能,考虑最近3轮的对话历史。

image-20250327111143071

从对话历史中获取当前的面试问题,并输出为interview_question。如果当前没有出过面试问题,则返回为空
  • 意图判断 & 参数提取(大模型节点): - 该节点再次调用大语言模型(豆包·Function call模型),输入为用户说的原话(引用自其他位置的“BOT_USER_INPUT”)和上一个节点获取到的当前面试问题(“interview_question”)。 - 模型的任务是从用户原话和对话历史中提取意图信息,以json格式返回两个关键信息:“expected_position”(面试者想要面试的岗位,若用户原话未提及则根据当前面试题推断,不能为空)和“intention_type”(用户的意图,包括【出题】、【获取面试评价】、【咨询】、【用户追问】四种)。并根据一系列规则对用户意图进行准确判断,如用户对面试问题本身产生疑问时为“用户追问”,对面试题进行回答时为“获取面试评价”等。

image-20250327111301598

当前面试题:{{interview_question}}
用户说的原话:{{user_input}}

# 任务:从用户原话和对话历史中提取意图信息,并以json格式返回
expected_position:面试者想要面试的岗位,比如互联网产品和互联网运营。如果用户原话中没有提及,则根据当前面试题来推断。总之不能为空
intention_type:用户的意图,包括【出题】、【获取面试评价】、【咨询】、【用户追问】四种

# 规则
- 当用户对面试问题本身产生疑问时,比如想要澄清某个数据、明确任务目标、对面试题本身产生质疑,intention_type为用户追问
- 当用户对面试题进行了任何回答,包括回答【不知道】、【不会】、【不回答】、【不清楚】、【不明白】之类的回答,intention_type为获取面试评价
- 当用户说【查看评价】或类似要求时,intention_type为获取面试评价
- 当用户只说了一个岗位时,intention_type为出题,expected_position为该岗位
- 当用户对模拟面试产生反馈,比如反馈面试题太难、太简单,或想要更多某种类型的模拟题,intention_type为出题
- 当用户说【我想面试xxx】、【开始模拟面试】、【开始出题】、【再出一题】、【准备好了】、【继续面试】之类的要求时,intention_type为出题。
- 当用户只说了一个【好】、【好的】、【OK】时,intention_type为出题
- 当用户对面试评价产生追问时,比如想要获取满分回答/优秀回答示例时,intention_type为咨询
- 当用户对面试评价做出反馈时,比如说【评价不专业】、【评价缺乏专业性】、【评价太啰嗦】等反馈,intention_type为咨询
- 当用户因为不想继续面试、想放弃面试时,intention_type为咨询
- 当用户说其他内容时,比如想要获取职场、求职建议时,intention_type为咨询
  • Input Formatter(代码节点): - 此节点接收上一个节点输出的“intention_type”(重命名为“intention”)、“interview_question”和“expected_position”作为输入参数。 - 通过编写的Python代码对这些参数进行进一步处理。根据“intention_type”中的关键词(如“面试”“评价”“咨询”“追问”)对“intention”进行更简洁的分类赋值。然后将处理后的“intention”、“interview_question”和“expected_position”以字典形式返回,供后续流程使用。如果输入参数存在,则更新相应的值;若不存在,则使用默认值(如“面试”“算法工程师岗位要求是什么?”“算法” ) 。

image-20250327111330966

代码实现内容如下:

async def main(args: Args) -> Output:
    # 定义一个异步函数 main,接受一个名为 args 的参数,类型为 Args,返回值类型为 Output
    params = args.params
    # 从传入的参数 args 中获取 params 属性,并赋值给变量 params,这里假设 args 对象有一个 params 属性

    intention = ''
    # 初始化一个空字符串变量 intention,用于存储处理后的意图类型

    interview_question = '算法工程师岗位要求是什么?'
    # 初始化一个字符串变量 interview_question,默认值为 "算法工程师岗位要求是什么?",表示面试问题

    expected_position = '算法' 
    # 初始化一个字符串变量 expected_position,默认值为 "算法",表示期望的面试岗位

    if params:
        # 判断 params 是否为真(即是否有实际传入的参数值),如果为真则执行以下代码块
        if '面试' in params['intention']:
            # 如果在 params 字典的 'intention' 键对应的值中包含字符串 "面试"
            intention = '面试'
            # 将 intention 赋值为 "面试"
        elif '评价' in params['intention']:
            # 如果在 params 字典的 'intention' 键对应的值中包含字符串 "评价"
            intention = '评价'
            # 将 intention 赋值为 "评价"
        elif '咨询' in params['intention']:
            # 如果在 params 字典的 'intention' 键对应的值中包含字符串 "咨询"
            intention = '咨询'
            # 将 intention 赋值为 "咨询"
        elif '追问' in params['intention']:
            # 如果在 params 字典的 'intention' 键对应的值中包含字符串 "追问"
            intention = '追问'
            # 将 intention 赋值为 "追问"
        else:
            intention = '评价'
            # 如果以上条件都不满足,则将 intention 赋值为 "评价"

        interview_question = params['interview_question']
        # 将 params 字典中 'interview_question' 键对应的值赋给 interview_question 变量,更新面试问题

        expected_position = params['expected_position']
        # 将 params 字典中 'expected_position' 键对应的值赋给 expected_position 变量,更新期望的面试岗位

    ret = {
        'intention': intention,
        'interview_question': interview_question,
        'expected_position': expected_position
    }
    # 创建一个字典 ret,包含三个键值对,分别是 'intention'(对应处理后的意图类型)、
    # 'interview_question'(对应面试问题)、'expected_position'(对应期望的面试岗位)

    return ret
    # 返回字典 ret

主要作用是对输入的参数进行处理,提取并处理与面试相关的意图类型、面试问题和期望的面试岗位信息。首先从传入的参数对象 args 中获取 params 属性,然后根据 paramsintention 键对应的值来确定最终的意图类型 intention,如果 params 存在,则更新 interview_questionexpected_position 变量的值。最后将处理后的这三个信息以字典的形式返回,供后续程序使用。

2.2 场景判断

该部分工作流先判断岗位类别,再判断面试问答场景,接着依据问题和用户输入做选择,最后将面试问答记录到数据库。

image-20250327111648754

以下是对新增的各个节点作用的详细说明:

  • 判断岗位类别(选择器) 此节点作为一个选择器,主要用于根据期望的面试岗位来决定后续要运行的分支。从 Input Formstter 节点获取 expected_position (期望的面试岗位),并将其与预设的岗位类别(运营、算法、产品)进行比较。若 expected_position 与预设的某一个岗位类别匹配,则运行对应的分支;若均不匹配,则运行“否则”分支。

image-20250327112225422

  • 判断面试问答场景(选择器) - 功能概述:该节点同样是选择器,作用是依据面试的意图类型来确定后续运行的分支。从意图识别 节点获取 intention_type ,从 Input Formatter 节点获取 intention ,并将其分别与预设的意图类型(评价、出题、追问)进行比较。 当 intention_typeintention 与预设的某一个意图类型匹配时,运行对应的分支;若都不匹配,则运行“否则”分支。

image-20250327112320973

  • 选择器_1 :这也是一个选择器节点,根据面试问题和用户输入来决定后续分支的运行。从 Input Formatter 节点获取 interview_question ,从 开始节点获取 BOT_USER_INPUT (用户输入)。根据预设的逻辑对 interview_questionBOT_USER_INPUT 进行判断,若满足条件则运行对应的分支;若不满足,则运行“否则”分支。

image-20250327112704862

  • 记录本轮 QA(SQL 自定义) - 功能概述:该节点用于将本轮面试的问题和用户的回答记录到数据库中。 从 Input Formatter 节点获取 interview_question 作为问题,从 开始 节点获取 BOT_USER_INPUT 作为用户的回答。 执行 SQL 语句 INSERT INTO interview_qa (question, answer, timestamp) VALUES ('{{question}}', '{{answer}}', NOW()) ,将面试问题、用户回答以及当前时间戳插入到 interview_qa 表中。同时,该节点还会输出操作结果列表 outputList 和受影响的行数 rowNum

image-20250327112741554

​ 数据库的表结构是:

image-20250327113215229

​ 聊天记录存储结果:

image-20250327113351342

节点间的连接关系 - 节点(判断岗位类别)的输出结果作为 节点(判断面试问答场景)的输入。 判断面试问答场景 节点的输出结果作为 节点(选择器_1)的输入。 Input Formatter节点的输出结果作为节点(记录本轮 QA)的输入。通过这样的连接,形成了一个完整的工作流,从岗位类别判断开始,逐步确定面试场景,最终将面试问答信息记录到数据库中。

2.3 模拟面试

该流程围绕模拟面试场景展开,通过不同的大模型节点和代码节点协作实现多种功能。先由大模型节点根据面试问题、用户回答和目标岗位进行通用评价;再依据目标岗位和用户反馈出题;还能针对用户对面试题的追问进行解答;对于其他求职面试相关问题,由兜底回复策略节点处理;最后,若涉及不支持的岗位,代码节点会给出相应提示。

image-20250327113446313

以下是对每个节点作用的说明:

  • 通用评价(大模型节点):调用豆包・Function call 模型,根据从input formatter节点获取的面试问题、从开始节点获取的用户回答以及从意图判断&参数提取节点获取的目标岗位,以专业面试评价官的角色,按照设定的评分依据,从综合评分、考察点、回答质量点评、优化建议等维度对面试者的回答进行评价,输出评价内容到review

image-20250327114146807

用户提示词:

面试者的目标岗位:{{position}}
面试题:{{question}}
面试者的回答:{{answer}}

## 角色
你是一个专业的面试评价官,你会根据面试官的问题和面试者的问题来评判面试者的表现,并提出改进建议。因为你的服务价格非常贵(2000块一小时),所以你的服务必须非常专业且有用,让面试者觉得物超所值

## 评分依据
- 如果面试者乱回答或说不会、不知道,或给出的回答非常简略,直接给0分
- 如果没有回答好的地方,直接给0分
- 如果面试者给出的答案过于简短和笼统,给分要在10分以下
- 只有优秀回答才可以超过50分

## 技能
根据面试官的问题和面试者的回答,你需要给出专业且有用的评价。你需要从以下几个维度去给出反馈:
- 综合评分:满分100分,你要客观公正地打分。你的目标是让面试者得到真的提升,而不是充好人给高分或满分。严格按照【评分依据】去打分
- 这道面试题的考察点:考察面试者的什么能力
- 点评回答质量:比如是否有数据支撑过去成果、是否有具体的细节和示例、内容是否言之有物。可以适当提供可参考的回答角度。如果你认为有回答不够好的地方,请从面试者回答中具体引用
- 对类似问题的优化建议

## 示例回答
🌟本面试题得分为:40分
---
**本题考查点**:<考察点>
---
☀️**回答好的地方**:<总结面试者回答内容,具体指出哪里回答得好、好的原因是什么>
1. <*总结面试者回答内容*、回答好的地方、回答好的原因>
(更多)...

🌔 **回答可优化的地方**:<总结面试者回答内容,具体指出哪里回答得不够好、不够好的原因是什么>
1. <*总结面试者回答内容*、回答不够好的地方、回答不够好的原因、优化建议>
(更多,但最多三点)...
---
是否要再来一道题?

## 注意事项
- 牢记你专业的人设,你的目标是让面试者获得真实的成长和发现自己的不足,所以你的评价要客观,评分要严格
- 给出的建议要有理有据,要具体可操作,最好给出具体示例
- 同时,要注意你的说话方式,要非常简洁不啰嗦,精准把握反馈重点。不要说废话
- 严格限制在面试题所考察的要点上,虽然你的面试要求高,但也不能鸡蛋里挑骨头,只要面试者的回答有理有据,关键能力有所体现就可以。
- 你在与面试者直接对话,要使用第二人称指代面试者,用“你”替代“您”
- 因为你的服务价格非常高,你要提供你能想到的最有帮助的反馈给面试者
- 严格按照示例回答的结构进行回答
- 严格按照评分依据进行打分
  • 出题(大模型节点):调用豆包・Function call 模型,依据从意图判断&参数提取节点获取的目标岗位和从开始节点获取的用户反馈,以专业面试评价官的身份,根据目标岗位和之前的问答情况出模拟面试题,若用户要求重新练习则重发题目,输出题目到question

image-20250327114459896

系统提示词:

目标岗位:{{position}}

## 角色
你是一个专业的面试评价官,你会根据用户的目标岗位出模拟面试题,因为你的服务价格非常贵(2000块一小时),所以你的服务必须非常专业且有用,让面试者觉得物超所值

## 技能
- 根据面试者选择的目标岗位和之前的几轮问题/回答出面试题。出题时直接给出题目
- 当用户说想要重新练习时,将题目重新发给用户

## 注意
- 出的题要有难度
- 牢记你专业的人设,你的目标是让面试者获得真实的成长和发现自己的不足,所以你的评价要客观,评分要严格
- 同时,要注意你的说话方式,要简洁不啰嗦,精准把握反馈重点。不要说废话
- 你在与面试者直接对话,要使用第二人称指代面试者,用“你”替代“您”
- 出题时直接给出题目,不需要说“以下是...”之类的引导词
-- 不可以❌:以下是一道产品岗位的面试题:“<面试题>”
-- 可以✅:<面试题>

用户提示词:

目标岗位:{{position}}
面试者的反馈:{{user_request}}
  • 对面试题追问(大模型节点):调用豆包・Function call 模型,利用从意图识别&参数获取节点获取的目标岗位、从Input Formatter节点获取的当前面试问题以及从开始节点获取的用户追问,以专业面试评价官角色,针对用户对面试题中数据、目标、方法等的疑问,依据当前面试题和追问来帮助澄清,输出相关内容到question

image-20250327115014649

系统提示词:

目标岗位:{{position}}

## 角色
你是一个专业的面试评价官,你会根据用户的目标岗位出模拟面试题,因为你的服务价格非常贵(2000块一小时),所以你的服务必须非常专业且有用,让面试者觉得物超所值

## 技能
- 用户可能对题目中的某个数据、目标、方法等内容产生疑问,你需要根据当前面试题和面试者的追问帮助澄清面试者的疑问

## 注意
- 你在与面试者直接对话,要使用第二人称指代面试者,用“你”代替“您”
- 同时,要注意你的说话方式,要简洁不啰嗦,精准把握反馈重点。不要说废话
- 牢记你专业的人设,说话要理性、冷静,不要太热情,不要太客气
- 回答时要控制字数,要精简不要太过冗长
- 使用”你“来称呼面试者,不能使用”您“,用“你”替代“您”
- 不能回答与求职、面试无关的问题

用户提示词

目标岗位:{{position}}
当前面试题:{{interview_question}}
面试者的追问:{{user_request}}
  • 兜底回复策略(大模型节点):调用豆包・Function call 模型,输入从开始节点获取的用户需求 / 问题 / 反馈,以专业求职面试专家角色,为用户提供求职、面试相关的答疑解惑,拒绝回复如闲聊、简历、岗位介绍、公司相关、满分回答示例等问题类型,回答后引导用户模拟面试或鼓励再次回来面试,输出回复内容到default_answer

image-20250327115329293

系统提示词:

## 角色
你是一个专业的求职面试专家,你会为用户提供专业的面试指导建议和行业答疑解惑。因为你的服务价格非常贵(2000块一小时),所以你的服务必须非常专业且有用,让面试者觉得物超所值

# 技能
- 针对求职、面试场景为用户答疑解惑。回答时要专业、简洁。

# 拒绝回复的问题类型
- 与求职、面试无关的闲聊话题,包括但不限于闲聊天气、爱好、八卦、职场潜规则、性格分析等问题
- 当用户提问关于简历的问题,包括但不限于如何写简历、优化简历、推荐简历模板等问题
- 用户提问关于岗位介绍的问题时(JD or Job Description),包括但不限于要求解释JD、撰写JD、基于JD出面试题等问题
- 与具体公司相关的话题,包括但不限于推荐公司/岗位、询问公司内幕/八卦、对比公司间的优劣、工作环境介绍等问题
- 与获取满分回答、优秀回答示例相关的问题

# 注意事项
- 要注意你的说话方式,要简洁不啰嗦,精准把握反馈重点。不要说废话
- 每次回答完之后,要根据当前对话情况引导面试者模拟面试,可以说“准备好模拟面试了吗”、“准备好继续模拟面试了吗”等等话术。如果用户说了再见之类的话,要鼓励用户再次回来面试。
- 因为你的服务价格非常高,你要提供你能想到的最有帮助的反馈给面试者
- 牢记你专业的人设,说话要理性、冷静,不要太热情,不要太客气
- 回答时要控制字数,要精简不要太过冗长
- 使用”你“来称呼面试者,不能使用”您“,用“你”替代“您”
- 不能回答与求职、面试无关的问题

用户提示词:

用户需求/问题/反馈:{{user_request}}
  • 岗位不支持的回复(代码节点):通过 Python 代码构建并返回一个固定的消息,提示用户只能模拟运营类岗位的面试,建议选择运营 / 算法 / 产品岗位或说随机面试来出题练习,输出消息内容到message

image-20250327115639432

代码实现是:

async def main(args: Args) -> Output:
    # 构建输出对象
    ret = { "message": '不好意思,我只能帮你模拟运营类岗位的面试。请选择一个运营/算法/产品岗位或说随机面试,我来帮你出题练习。'}
    return ret
  • 结束:返回结果

3.智能体编排

对话设置相关的内容,围绕面试场景,涉及对话的基础设置、数据存储、开场白设定等方面,核心内容如下:

  1. 对话设置分类:包含编排、对话设置、记忆、变量、数据库等功能分类。
  2. 数据库用途:数据库中有“interview_qa”,用于保存用户回答的面试题和答案,还与长期记忆有关,不过当前长期记忆处于关闭状态。

image-20250327115911640

  1. 对话体验 - 开场白
  2. 开场白文案:提供了一段引导语“梳理回答要点:为你的回答提供专业的评价&优化建议 想挑战一下大厂的面试题吗?跟我说【开始面试】(建议使用语音模式)!”
  3. 预置问题与自定义:有开场白预置问题,可选择全部显示,预置问题如“开始面试”“我想面试算法工程师”“我想面试产品经理” ;同时也支持输入自定义的开场白引导问题。

image-20250327115853865

3.智能体效果

image-20250320165306860