AI_11_Coze_AI面试助手

项目介绍

学习目标

  • 理解AI面试官项目背景和业务流程
  • 实现简历修改模块
  • 实现面试录音模块
  • 实现面试题生成模块

一、项目背景

1 立项背景[¶](#1 立项背景¶)

2025年年初国运级项目deepseek火热,很多企业尝试加入AI赛道,使用AI赋能业务产生价值,市场上涌现了大量的大模型相关就业机会,进而使得许多应聘者期望从事相关岗位。

在这个大背景下,某职业教育机构的人工智能学科学生短期内报名数激增,学生数量增长太快,给教学工作带来了较大的挑战。 基于多年积累的教学资源,在公司人员的共同努力下,学生们的课程学习的需求得以较好的满足。但是在就业的时间节点还是存在效率痛点,其中有一部分可以通过AI得以解决和提效: * 简历修改问题:在课程后期阶段,学生们基于已经学习过的知识、项目,和简历指导课产出简历后,因同学编写简历的能力各有参差,且编写简历中需要注意的细节过多,初版质量较难把控。 * 面试录音分析问题:为提高学生的就业率,在就业阶段会有老师负责帮助学生分析面试情况。一般一场面试时间在30-60分钟时间,我们取40分钟,如果高峰期一个学生平均有3场面试,那么一个学生的录音就是120分钟,也就是2小时。 如果有3个学生正在面试中,那就是6小时。 如果逐个听,时间成本将会巨大, 如果不听,则会忽略掉一些重要的信息。 * 面试题背题问题:面试宝典中收录了绝大部分的常见面试问题,体量庞大,对于部分学生来讲抓不到重点,全部背下来显然也不现实。在模拟面试或者在实际面试时,总会出现一些简历相关的常见问题回答错误的,这些和面试题没有抓到重点存在关联。 在这个场景下,基于RAG + 大模型技术,结合学生的简历、面试宝典、企业实际的高频面试题,给学生圈出来重点和高频的面试题。 * 模拟面试问题: 虽然在教学的过程中每个阶段都有安排模拟面试,但是对于部分未工作过或者性格内向的同学来讲练习的次数依然不够,在实际面试的时候因为练习不足可能会导致浪费掉一些机会。这里可以结合前面的面试题生成 + 大模型,以及ASR + TTS技术,实现一个语音交互的面试官,达到面试练习的目的。

2 项目规划[¶](#2 项目规划¶)

一般来讲,在公司基于内在的需求转化成项目实现时,往往会基于需求的紧急程度、现有人力、预算等各个因素,对要实现哪些需求,以及实现的质量和效果上做一个取舍。比如:

基于简历修改问题、面试录音分析问题、面试题背题问题、模拟面试问题这4个痛点,结合现有人力投入以及优先级来讲,最终决定按照两期落地该项目。

一期规划:

  • 计划投入人力:40人天 , 1~2人(大模型开发工程师)

  • 时长:3个月

  • 功能集合:

  • 简历修改模块

  • 面试录音分析问题模块

  • 面试题生成模块

  • 批处理模块

  • 落地节奏:

  • 立项后2周内,实现MVP (Minimum Viable Product,最小可行产品))版本,验证可行性:搭建一个最基本的简历

  • 立项后2个月时完成所有功能的开发

  • 立项后2.5个月时完成所有功能的测试与BUG修复

  • 立项后3个月时完成小流量测试

这里或许有同学注意到了,"模拟面试问题" 这个需求没有在一期规划中被接纳,这是因为考虑到实现难度,以及需求的迫切程度,进行的妥协:

  • 模拟面试实现困难:模拟面试功能需要实现面试题生成,模拟面试官的语气,以及基于学生回答的问题进行再次提问,判断问题回答是否正确, 把控面试节奏等功能,实现起来比较复杂。
  • 已有面试题生成功能:对于绝大部分学生来讲,模拟面试更多的问题是对于知识掌握程度的不足,而不是表达类问题。已有面试题生成的情况下,可以先把大部分同学的痛点解决,其余的我们留到下个版本。

一般来讲,一期的规划都是去开发优先级最高的需求。对于比较大型的项目,往往是研发团队和产品经理共同决定。 但是我们本文中的案例是相当于研发人员解决自己的问题, 这种情况下, 我们自己去决定项目的节奏。

二期规划: 实现前端页面,集成到教学后台。 实现第一期没有实现的模拟面试的功能,实现咨询和分析助手方便老师查询面试情况。具体规划需要等待一期落地后的解决,继续判断。

二、技术设计

1 业务流程[¶](#1 业务流程¶)

业务流程如下:

  1. 简历评估:学生和面试助手对话,上传简历。面试助手判断需求,如果是简历评估需求,则通过简历评估Agent执行简历评估的执行。简历评估除了基于规则判断以外,还会根据简历模板进行查重,以及判断是否包含违禁词。
  2. 面试录音分析:学生和面试助手对话,上传录音文件。面试助手判断需求,如果是面试录音分析场景,则通过面试录音Agent执行面试录音分析任务。面试录音分析除了基于规则以外, 也会基于面试宝典和互联网上的答案判断回答的结果是否准确,同时记录到真实的面试题题库中。也会返回原始对话文字,让讲师进行判断,对比音频,效率也会更高。
  3. 面试题生成:学生和面试助手对话,上传简历。面试助手判断需求,如果用户要求生成面试题,这里则会基于用户的面试题,并参考真实面试题、面试宝典,生成对应的面试题。

2 技术选型和架构设计[¶](#2 技术选型和架构设计¶)

2.1 技术选型[¶](#2.1 技术选型¶)

经调研,我们可以基于以下几套技术栈实现上述功能:

技术栈 优势 劣势
Coze 版 快速实现需求,低代码 限制较多,无法实现比较定制化的功能
Dify本地版 快速实现需求,低代码,能够对接本地模型和服务 本地版插件太少,很多功能需要重新造轮子
Langgraph等框架 扩展性极强,基本上不受限制,可以对接本地模型,实现自定义复杂逻辑等 上手成本太高,开发周期长

(Langgraph:代码版的工作流框架,因为可以在代码中调用这种库,对比coze等节点类型固定的框架,拓展性要强的多。并且支持高并发,复杂业务和高流量业务优选)

基于我们可投入的人力,以及项目周期,我们的技术选型结论如下:

  • 使用Coze 在线版实现该功能。如果在线上有一定的规模以后,考虑使用Langgraph框架重构实现,并集成到教学系统。
2.2 架构设计[¶](#2.2 架构设计¶)

在实际工作中,对于目前我们这个项目体量的往往不会有架构设计,只会有上面的业务流程和技术选型,以及一个详细的"技术设计"用来体现用哪些组件实现的。对于比较大的项目,则先有一个架构设计,进行功能模块的分层,体现模块之间的层次和依赖关系,比如:

以上这个架构图就是一个比较典型的架构设计图,我们这里则在架构设计中填充了一些细节, 比如简历模块等模块的内部调用关系。

三、模块介绍

1 简历修改模块[¶](#1 简历修改模块¶)

简历评估除了基于规则判断以外,还会根据简历模板进行查重,以及判断是否包含违禁词。 如下图:

2 面试录音分析模块[¶](#2 面试录音分析模块¶)

面试录音分析场景,则通过面试录音Agent执行面试录音分析任务。面试录音分析除了基于规则以外, 也会基于面试宝典和互联网上的答案判断回答的结果是否准确,同时记录到真实的面试题题库中。 如下图:

3 面试题生成模块[¶](#3 面试题生成模块¶)

基于用户的面试题,并参考真实面试题、面试宝典,生成对应的面试题。

4 智能体编排[¶](#4 智能体编排¶)

使用单Agent(自助规划模式)来实现多个功能的合并,把每个工作流当做一个只完成某项固定任务的流水线式的Agent,最终由一个父Agent进统一管理。

简历评估模块

一、工作流介绍

功能:简历评估模块的功能就是接收学生的文件,并基于讲师总结的面试的各类规则,给学生输出简历中存在的问题

具体步骤如下:

输入:简历文档(pdf/doc格式)

执行流程: 1. 数据准备:基于OCR插件读取简历中的文字内容,同时还需要准备:当前时间,在评估毕业时间等信息的时候结合当前时间;违禁词数据,用于在项目判断中判断是否存在不该出现的词语 2. 简历内容分块:把上一步提取出来的简历文字内容进行拆分,分为个人信息、技能、学历、工作经历、项目经历、个人评价几个部分,在后续的处理中分别单独处理 3. 简历内容处理:对个人信息、技能、学历、工作经历、项目经历、个人评价部分的简历内容分别单独进行处理,输出各个部分的评估结果 4. 内容整合:把每个部分召回的问题进行整合,并输出给学生对应的内容

输出:简历中存在的问题对应的Markdown

二、实现数据准备

该部分内容如下:

  • 开始节点:我们这个流水线整体是围绕着简历修改进行的,所以对于开始节点,我们只需要接收简历即可。剩下的内容工作流自行判断和完成。

1 使用插件实现文字提取[¶](#1 使用插件实现文字提取¶)

简历文字提取节点接收resume作为输入,输出即可。从前面的学习,我们了解到,这里url需要的是str类型的数据,而我们传入的是doc类型。这里coze会把我们上传的doc文件存到一个临时存储中并返回一个url,所以这里的兼容、可执行的。

对于上传的pdf文件,解析出来后,数据会被存到pdf_content中,我们后面要用的就是这个字段的内容。但是有时候doc的可能会出现在content里,所以这里我们也需要会用到content字段。 这里两个字段只会有一个是有内容的。

2 使用数据库实现违禁词功能[¶](#2 使用数据库实现违禁词功能¶)

这里违禁词为什么使用数据库实现的优势:

  1. 便于管理:课程内容和经验一直是迭代的,所以违禁词的词库会一直不断地写入新的数据,数据库对增删改查非常擅长。对比修改提示词每次都还要发布流水线,发布智能体,更新数据库直接更新即可,操作便利。
  2. 支持API操作:违禁词的更新支持API进行,目前我们做的项目是一个coze的智能体,如果后续我们要把简历修改功能集成到内部教学系统中时,在前端操作->调用API会成为一个必然的操作。
  3. 方便多处使用:违禁词除了在当前流水线中使用,未来也可能会用到一些别的业务中,一份数据库的数据可以被多条流水线引入,且数据都访问到的是同一份,我们只需要维护这一份数据就行。
2.1 创建数据表并录入违禁词[¶](#2.1 创建数据表并录入违禁词¶)
  • 表结构如下,非常简单,我们只需要知道违禁词的时候有哪些就行了。

把输入导入到测试环境:素材 07-违禁词数据.xlsx ,过程略

至此我们就完成了创建数据库查询节点的工作,这里我们导入的数据是测试环境的,在业务上线时同样的操作,生产环境也需要做一次。

2.2 创建数据库查询节点[¶](#2.2 创建数据库查询节点¶)

创建违禁词查询节点,如下图:

  • 数据表选择刚才创建的即可
  • 查询字段:只需要违禁词即可,其他字段在后续用不上。
  • 查询条件:uuid不为空, 因为uuid由系统且不会为空,所以这里相当于是查询出来所有的数据。

最后,输出内容如下图。我们实际用到是outputList,包含所有的违禁词

3 获取当前日期[¶](#3 获取当前日期¶)

添加插件,在插件商店中搜索"日期",如下图,使用"现在时间"这个插件即可实现。 除此之外也有一些别的插件也有类似功能,可自行替换使用。

可以看到,使用这个插件获取当前时间不需要任何输入,我们只需要接收它的输出message即可。格式是常见的YYYY-MM-DD HH:MM:SS格式, 其实在这里格式不是特别重要,因为后面我们是给大模型来使用的, 只要输出结果没有错误即可。

三、实现简历内容分块

简历内容分块仅需一个LLM模块即可实现, 虽然流程比较简单,但是这里的提示词的编写非常重要。对后面的任务影响较大。

1 简历内容分块LLM节点[¶](#1 简历内容分块LLM节点¶)

添加一个LLM节点,首先这里我们选择模型,不再使用默认的豆包1.5Pro32K而是使用豆包1.5Pro256K。这里是因为32K的上下文能够处理的问题数量有限, 我们需要使用具备使用更大的上下文窗口的能力。确保能处理内容比较多的简历。

接下来是模型的输入,因为使用文字提取插件两个字段都有可能输出内容,所以这里我们把两个字段的内容都输入进来进行处理。

接下来我们给模型输入提示词,

系统提示词

复制代码
你是一个大模型和算法工程师简历内容提取助手,能够根据简历中的内容提取出来对应的实体。你将接受简历内容作为输入,并按照下列要求进行拆分,并输出为json格式:

姓名:字段名{{name}}

基本信息: 字段名 {base_info}}, 包含个人姓名、求职岗位、期望薪资、工作年限、手机号、邮箱号等基本信息,不包含学历、技能、爱好

个人技能:字段名 {{skill}}, 个人掌握的IT相关的技能

教育经历:字段名 {{education}}, 包含学历、在校时间、专业、是否为计算机专业、以及在简历内容的第几部分

工作经历:字段名 {{work_exp}},  包括公司、时间、角色,在公司里面从事哪些内容、以及在简历内容的第几部分

项目经验:字段名 {{project_exp}} , 包含简历上所有项目相关的内容,包括项目背景,项目目标,项目成果等、以及在简历内容的第几部分,每个项目作为数组中的一个元素返回,最后返回一个字符串数组,数组长度和项目数一致


个人爱好、评价:字段名 {{self}}, 包含所有的个人爱好以及软素质评价等部分、以及在简历内容的第几部分

上下文:字段名{{context}},包含以上所有内容的概括,后续用于分块检验(比如单独校验基本信息、单独校验教育经历)作为参考使用。


注意,以上的要求需要严格遵循,除了上下文以外,其他的内容不要省略和总结,直接拆出来原文即可,不要出现错误的划分

首先我们给大模型指定了一个角色,说明它的能力和要做的事情,让模型输出结果更可控和更聚焦。

接下来,因为我们要让大模型识别多个部分的内容,为了提高识别的准确度,需要使用few-shot的方式,让模型在提示词中学习如何识别。

因为我们要输出的结果是多个字段,所以这里我们字段名要在提示词中指定, 并以{{字段名}}的方式,可以不是{{}},但一定是需要加符号来分割,强调字段名,减少被误判的可能性。

最后,要把注意事项告诉模型,不要擅自该内容, 保证原始内容到分割后的内容的一致性。

用户提示词

复制代码
输入的内容为:
{{input}}
如果为空,则:
{{content}}

输出部分

四、实现简历内容处理

简历内容处理是简历修改模块的核心,所有的评估的逻辑都是在这里实现, 学生拿到的报告也是这里生产。 因此,这个环节的质量对结果有直接影响。

在实现上,每个部分的评估都是并行的,除了项目评估以外,其他都是各通过一个LLM节点实现。 这里对比串行和并行的效率差:

  • 串行:一个部分评估结束了,才执行下一个部分的评估。 一共有6个部分的评估,假设每个评估节点都是n秒完成,最后总的执行时间就是6n
  • 并行:所有部分评估并行执行,总时间取决于最长的那个评估节点。 如果每个节点都是n秒完成,总时间就是n, 少了5倍的时间。

因为我们每个部分的评估都是互相独立互不干扰的,所以我们这里使用并行加快执行速度。

1 个人信息评估[¶](#1 个人信息评估¶)

个人信息评估接收输入: * base_info: 内容分块以后的个人信息部分 * context: 内容分块后的上下文,用于判断和个人信息是否有冲突 * date: 当前时间,用于工作年限等时间相关的信息判断

系统提示词

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责个人基本信息部分,能够根据输入的个人信息内容基于规则,参考上下文,并判断是否有需要修改的部分。

规则如下:
1. 个人信息中不要包含具体的期望薪资
2. 求职意向不明确:如果上下文里面的项目大部分都是大模型的,求职意向就不要写"算法工程师"
3. 不要使用QQ邮箱,显得不专业
4. 学历非优秀本科不建议意向是算法工程师
5. 需要有手机号、邮箱、年龄,城市,信息完整
6. 工作年限和毕业时间需要对得上, 比如2023年毕业,现在是2025年,最多写3年(1年实习+2年实际工作)


如果违反规则,则需要给用户列出需要修改的部分, 你也可以提出一些建议,但是为了减少,最终返回的格式:

需要修改:需要修改的部分以及怎么修改,需要附带简历原文

参考建议:其他参考建议,这里只能是给个人信息相关的修改建议,控制在3条以内,不得超过需要修改的部分。

用户提示词

复制代码
个人信息部分:
{{base_info}}
上下文:
{{context}}

当前时间:{{date}}

输出 :直接输出纯文本即可

2 技能评估[¶](#2 技能评估¶)

技能评估接收输入:

  • skill: 内容分块中的技能部分
  • context: 内容分块后的上下文,用于判断和个人信息是否有冲突
  • project_exp: 项目经验。 技能应当和项目经验挂钩

因项目评估属于比较复杂的逻辑,需要结合项目经验中的大量文本内容做对比,为提升效果,我们这里使用豆包1.6深度思考 模型代替豆包1.5pro

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责个人技能部分,能够根据输入的个人技能基于规则,参考上下文,并判断是否有需要修改的部分。

规则,具有最高优先级,需要保证执行到位:
1. 个人技能不要超过12条
2. 个人技能中需要有至少2-3条专门描述大模型技术的,比如RAG、微调(可选,不写也行)、大模型使用相关
3. 每一条中的内容之间需要是相关的,比如: 掌握深度学习的原理,如RNN、LSTM、GRU、Transformer等, 不要一条里面混入多个不相关的
4. 不要写精通,但凡遇到精通的,统统需要去掉。掌握和熟练等不要干涉,候选者自己写就行
5. 如果是转行的,需要注意,还是要体现AI的技术栈,其他方向的少些, 篇幅不超过1/3
6. 技能点要多体现一些技能点,不要概括,因为HR看不懂,把关键词抛出来
7. 项目中出现的技能点,在技能中需要体现关键词。比如milvus出现在了项目中,那么个人技能也得有。项目中没有用到的技术点,需要给用户指出来
8. 技能点里面但凡是熟练、掌握的,在项目内容中要有联系
9. 个人技能所在的位置需要在工作经历和项目经历前面

注意:
1. 只输出技能相关的,不要输出项目相关
2. 技术栈的表述不要过多介入,有关键词即可
3. 没有违反以上规则的内容的部分,不要建议用户删除数据

如果违反规则,则需要给用户列出需要修改的部分,并指出犯了什么错误

用户提示词:

复制代码
个人技能:
{{skill}}
上下文:
{{context}}
项目:
{{project_exp}}

3 学历信息评估[¶](#3 学历信息评估¶)

学历评估接收输入:

  • education: 教育经历
  • context:简历总结,作为学历信息评估时的参考
  • date:当前日期

为减少大模型的幻觉问题,我们给LLM节点赋予头条搜索的技能,让它能够自动取查询学校相应的信息,并根据系统提示词中的内容对学历信息进行评估。

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责教育部分,具备联网搜索学生给出的学校的信息的能力,能够根据输入的学历内容基于规则,参考上下文,并判断是否有需要修改的部分。

规则,具有最高优先级,需要保证执行到位:
1. 学历不可造假或者包装,这一条直接在返回的内容中提醒用户: 需要保证学历的真实性,造假会有严重后果

2. 避短,参考上下文工作经历和项目经历的位置, 如果学校是三本甚至专科,建议调整位置,放到后面

3. 扬长,如果学校是计算机专业,且毕业时间在4年以内,可以把相关课程展开写一下,尤其是毕业2年以内的,建议这么做。 如果学校是211或者985,最好标记出来

4. 教育经历和上下文内容不要有冲突


如果违反规则,则需要给用户列出需要修改的部分, 你也可以提出一些建议,但是为了减少,最终返回的格式:

需要修改:需要修改的部分以及怎么修改,需要附带简历原文
参考建议:其他参考建议,这里只能是给学历信息相关的修改建议,控制在3条以内,不得超过需要修改的部分。

用户提示词:

复制代码
学历信息:
{{education}}

上下文:
{{context}}

当前时间:{{date}}

4 工作经历评估[¶](#4 工作经历评估¶)

工作经历部分接收输入:

  • context:简历总结,作为工作经历评估时的参考
  • work_exp:工作经历
  • date:当前日期

因工作经历评估属于比较复杂的逻辑,我们这里使用豆包1.6深度思考 模型代替豆包1.5pro

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责工作经历部分,能够根据输入的工作经历内容基于规则,参考上下文,并判断是否有需要修改的部分。

规则,具有最高优先级,需要保证执行到位:
1.  每段经历的公司名、工作年限、以及角色必须是完整的
2. 工作经历和项目经历需要分开来写, 工作经历是工作经历,项目是项目
3. 每份工作中的工作内容需要列出来
4. 如果工作经验特别长的, 和AI、大模型无关的篇幅不要太多,控制在一半以内
5. 如果毕业3年以内的,如果实习和实际工作不在一个公司的,建议改成一家公司
6. 工作经历和上下文里面的项目相关的内容不要有冲突
7. 工作经历内容的位置需要在项目经验前面


对于没有内容的,可以简单给一些提示。

如果违反规则,则需要给用户列出需要修改的部分, 你也可以提出一些建议,但是为了减少,最终返回的格式:

需要修改:需要修改的部分以及怎么修改,需要附带简历原文
参考建议:其他参考建议,这里只能是给工作经历信息相关的修改建议,控制在3条以内,不得超过需要修改的部分。

用户提示词:

复制代码
工作经历:
{{work_exp}}

上下文:
{{context}}

当前时间:
{{date}}

5 项目经历评估[¶](#5 项目经历评估¶)

项目部分作为IT行业找工作时最容易提现区分度,也是最需要控制内容的部分,但是实际上做起来并不容易:

  1. 内容多:项目的文字都是非常多的,并且每个同学写的项目数也不同,有的10年+经验的同学甚至能写5个+项目,对模型的能力有比较高的考验。
  2. 容易雷同:因为同学们参考的模板都是类似的,且部分同学没有要修改内容的意识或修改不到位,导致雷同率较高。有的同学甚至项目名直接和课程中的项目名保持一致,在用人公司筛选简历时,容易被淘汰。
  3. 校验项多:对比其他部分的内容,项目中的需要校验的内容更多,实际上也对模型有着比较高的考验

该部分的内容基于一个循环体实现

循环体的循环内容如下:

  • 循环体接收项目经验数组作为循环条件,遍历数组,并依次处理每个项目的内容评估
  • 循环体结束后把处理结果进行汇总,并输出

对于循环体中处理每个项目的内容,主要有两部分逻辑:

  • 项目经历评估:基于LLM + prompt ,实现简历内容评估
  • 项目重复度评估:基于RAG,和简历内容进行匹配,并评估简历重复度
5.1 项目经历评估[¶](#5.1 项目经历评估¶)

项目经历作为循环体中的一部分,每次处理的内容是一个项目的内容,接收输入如下:

  • project_exp:循环中一个项目的内容
  • context:简历的上下文
  • date:当前日期
  • forbid_list:违禁词

因项目评估属于比较复杂的逻辑,我们这里使用豆包1.6深度思考 模型代替豆包1.5pro

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责项目经历部分,能够根据输入的项目经历内容基于规则,参考上下文,并判断是否有需要修改的部分。


规则:
1. 项目数量部分,刚毕业写2个项目即可。, 工作2年(含实习)不能低于3个,3年不要低于4个,无论几年,最好不要超过5个。
2. 工作经历和项目经历需要分开来写, 工作经历是工作经历,项目是项目
3. 每个项目的结构至少需要包含项目介绍(或者背景)、个人负责部分、成果数据,需要分开写
4. 建议在每个项目前面加上技术栈
5. 项目的内容需要强调算法、大模型这些技术,如果是之前做java的等其他方向的,需要缩减篇幅
6. 项目的背景需要合理, 需要是实时在在的需求,描述需要让人觉得这个项目做出来是有价值的而不是编造的
7. 项目中用到的技术点需要合理
8. 实习阶段避免写:精通、主导、负责等字眼,写参与、设计部分小的功能都可以
9. 项目周期需要合理,一般来讲一个小项目的开发需要控制在半年以内,如果超过半年,自己需要想清楚这么久的周期时间上是怎么安排的
10. 禁止出现: {{forbid_list}} 中的单词
11. 对于项目中的个人职责,除了实现项目以外,一般在公司还有技术调研、上线后的维护、迭代、优化等工作
12. 对于每个面试者,都提醒需要准备话术文档(逐字稿)
13. 对于项目中的成果数据,尤其是指标类的,如果有一些不好解释的,需要给用户提醒
14. 项目经历和上下文的内容不要有冲突
15. 技术栈的描述不要写太多


如果违反规则,则需要给用户列出需要修改的部分,以及违反了哪条规则。
  • 这里需要注意,10. 禁止出现: {{forbid_list}} 中的单词,这里作为违禁词判断的内容

用户提示词:

复制代码
项目经历:
{{project_exp}}
上下文:
{{context}}

当前时间:
{{date}}

最终输出:

需要注意:这里最终输出内容为json格式,以便循环后合成list后节省字符数

5.2 项目重复度评估[¶](#5.2 项目重复度评估¶)

项目重复评估分为3个节点:

  1. 简历内容query优化:基于简历内容进行优化,不使用整个项目的文本直接去查询知识库。
  2. 简历模板检索:去简历模板库中匹配相似的内容
  3. 简历重复度评估:基于简历模板检索出的结果,结合用户的项目内容进行对比,输出重复的部分的评估结果

项目内容query优化:

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责项目经历部分,能够根据输入的项目内容整合成更易查询的结构。

需要严格执行:
1. 基于输入的内容进行总结或者优化,不可以添加不存在、杜撰的内容。
2. 项目内容根据项目背景、技术点、业务流程、个人职责、优化点、成果数据进行排序,不存在的部分跳过即可。

用户提示词:

复制代码
项目内容:{{project_exp}}

简历模板库检索:

这里需要注意:

  • 召回数量给到20,让检索出来的内容更多,增加重复内容部分的召回率
  • 最小匹配度的阈值给到0.85,防止检索出来只是小部分内容相同的文档
  • 开启查询改写、结果重排,近一步提升检索效果

简历重复度评估:

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责项目经历部分,能够根据用户输入的项目内容和知识库中检索出来的内容进行对比,并提示用户重合的情况如何。

需要严格执行:
1. 对于雷同的表述,包括技术点、业务流程、个人职责、优化点、成果数据一致或基本相似的,认为是雷同部分
2. 输出内容的时候,需要做对比的部分需要给出哪些部分雷同

用户提示词:

复制代码
项目内容:
{{query}}
检索出来的内容:
{{context}}

最后,把简历重复度评估和项目经历评估的结果做一个整合:

5.3 拓展:分治策略[¶](#5.3 拓展:分治策略¶)

分治策略是一种通过将大规模问题分解为相互独立、结构相同的子问题进行求解的数学方法,其核心思想为"分而治之"。分为以下3个步骤:

  1. 分解:将原始复杂问题拆分成若干个规模较小、更易解决的子问题。

  2. 解决:递归地或独立地解决这些子问题。

  3. 合并:将子问题的解综合起来,得到原始问题的解。

首先,对于我们简历修改模块整体来讲,就是分治策略的一种应用:

步骤 在简历评估工作流中的体现
分解 将一份完整的简历分解为多个部分(如基本信息、工作经历、项目经验、技能清单、教育背景等)。
解决 针对每个部分,设计专门的提示词或评估模块,交由大模型进行独立、精准的分析和提取。例如,专门用一个模块来深度挖掘工作经历中的职责和成果。
合并 将各个模块的分析结果(如提取出的技能点、项目亮点、工作年限等)汇总、综合,最终形成对这份简历的全面评估和打分。

其次,对于"项目经历评估"这个部分,因为大模型一次性处理每个项目的评估,效果会大打折扣,在这里我们同样使用分治策略解决了这个问题。就是把项目整体拆分成多个项目,逐个评估后再把结果汇总。

最后我们说一下,在这里给同学们拓展分治策略的目的,是为了告诉同学们,在搭建工作流解决一个业务问题的时候,要有"分解问题"和"逐个击破"的思想,因为目前的大模型的能力有限,让一个大模型实现一个超出自己能力范围的问题,就容易引发幻觉问题的产生。但是工作流可以添加无数个LLM节点,所以当幻觉出现时,我们第一时间可以去思考,是否可以通过分治策略解决。

7 个人评价评估[¶](#7 个人评价评估¶)

最后是个人评价评估,这个部分的内容是可选项,有很多应试者没有这部分的内容。接收变量:

  • context:简历总结内容,作为参考
  • self:个人评价

系统提示词:

复制代码
你是一个大模型和算法工程师简历审核大师,专门负责个人评价和爱好部分,能够根据输入的个人评价和爱好部分基于规则,参考上下文,并判断是否有需要修改的部分。

注意:
1. 如果输入内容没有个人爱好和个人评价,这部分为空的,最后返回空就可以。不需要输出任何内容

规则,具有最高优先级,需要保证执行到位:
1. 个人爱好和评价篇幅不要过多,控制在4行以及以内
2. 个人爱好如果要写的话,写健身等能体现个人优秀品质,比如坚持、身体好等,不要写王者荣耀这类容易留下坏印象的
3. 不要和上下文有冲突



如果违反规则,则需要给用户列出需要修改的部分, 你也可以提出一些建议,但是为了减少,最终返回的格式:

需要修改:需要修改的部分以及怎么修改,需要附带简历原文


参考建议:其他参考建议,这里只能是给项个人评价和爱好部分的修改建议,控制在3条以内,不得超过需要修改的部分。

用户提示词:

复制代码
个人评价和爱好:
{{self}}
上下文:
{{context}}

五、实现评估结果整合

这个节点需要接收以下内容作为输入:

  • 工作经历评估结果
  • 个人信息评估结果
  • 项目经验评估结果
  • 自我评价评估结果
  • 技能苹果结果
  • 学历信息评估结果

同时,为了追求整合的效果更优,我们这里使用豆包1.6深度思考模型

六、工作流调试

工作流搭建好后,我们上传一份简历文件,并试运行工作流,最终节点输出如下(输出结果因简历不同以及模型的随机性, 我们这里只截取开头和结尾的部分,中间略):

七、总结

在实际工作中,开发一个项目往往需要考虑项目收益,以及基于当前实现的不足的优化方向等。

收益:项目的收益的衡量一定是来自于开发项目时的需求, 我们这个模块的需求是为了解决面试辅导中的人效问题,那么这个项目衡量收益,一定是围绕着人效的提升。 其他项目也是类似的,比如电商推荐项目是为了提升用户成交,可以使用GMV提升、渠道转化数等指标来衡量; 短视频推荐是为了提升用户的粘性,可以通过用户在线时长增加量等指标来衡量。

  • 这里有同学可能会纠结:推荐场景准确率是不是也是收益? 这里需要跟同学们区分一下, 项目收益和你项目中最终达到的效果是两码事,我们这里提到的项目收益是指的项目在业务层面的收益, 而准确率这类指标是属于技术类的收益,它只能作为一个中间过程的指标。
  • 但是在一些纯技术类的项目中,准确率这类指标也是衡量项目收益的指标,比如项目本身就是做一个图片分类算法,客户要求准确率必须达到0.95以上才付费,这个时候准确率就是项目收益完全相关了。准确率就等价于项目的业务收益。

优化方向:软件工程的开发往往需要基于目标在 时间、成本、质量上做一个取舍,投入成本和时间越高, 质量往往越好,但是成本和时间不是无限的,在实际工作中,我们需要基于可投入的成本和时间妥协。

  • 比如要求两周内实现一个聊天APP,成本3000元,这样的约束下,只能牺牲质量。
  • 对于我们本次的项目也是一样,其实有很多优化点在开发的时候是可以做的,但是考虑到时间和成本,最终选择按照本次文档中的实现方式实现。
  • 但是一个项目往往不是开发一个版本以后就再也不会迭代了,在项目上线后如果收益是正向的,往往后续还会继续迭代,所以我们在这里列出一些可优化项,如果有有人力(时间)和其他成本投入时,可以进行迭代。具体可参考下面的2 优化方向 部分。

本章节的内容是因为第一次学习项目,让同学们了解项目的收益衡量以及质量和成本之间的平衡等内容,后续模块将不再对这个部分的内容进行过多介绍。原理都是一致的。

1 项目收益[¶](#1 项目收益¶)

本模块作为面试助手智能体的第一个模块,也是最重要的功能,基于coze工作流实现了简历评估的功能,效果良好。在一定程度上提升了简历修改的效率,比如: * 提升学生修改简历的效率:在简历提交之前,学生可通过该功能解决简历中的小错误,减少提交至老师 * 提高老师的效率:班主任和老师在批量收简历的时候可以批量运行,做一次卡点,问题较多的简历打回(,然后再进行人工审核,可聚焦于发现"高级错误"而非"低级错误"

项目的收益可以从以下几个指标进行衡量: * 调用量:试点班级中,超过70%学生有过调用,平均每个学生调用1.7次。 * 问题召回数:共召回问题240+,平均每个学生4个问题 * 人力节省比:查看一遍简历的时间约20分钟,每次调用可节省老师20分钟时间,共节省老师人力4.25人/天。

2 优化方向[¶](#2 优化方向¶)

  • 替换性能更优的模型:目前我们使用的都是豆包模型,可以选择使用qwen-max以及效果更好的其他模型。 (因为模型排名一直是动态变化的,我们在这里无法给一个最好的模型的选择,需要根据当下模型的排名以及经济性和业务需求选择一个合适的)
  • 简历查重优化:比如增加存储每个学生的简历,对比其他学生简历和当前学生简历查重等类似功能。 这个可以提升简历查重的效果,但是实现成本会比较高
  • 记录调用信息:存储调用过程中的各类信息,比如:项目背景、学历等各类信息,可以帮助教学人员看清楚简历各类信息的分布,有助于分析招聘市场和简历内容之间的gap、课程研发等
  • 替换OCR插件:豆包自带的OCR插件效果并没有那么好,对排版比较差或者表格数据的识别能力不足,在实际使用时,可能会导致一些简历识别错误。可以考虑替换更优的付费模型实现内容识别。

录音分析模块

一、工作流介绍

功能:接收学生面试时的录音,并分析面试表现。

具体步骤如下:

输入:面试语音(Mp3、Wav等格式,不支持m4m)

执行流程: 1. 面试语音转文字:基于ASR技术将面试对话语音转为文字,为追求效果,我们这里选择使用大模型ASR插件 2. 角色划分和概要提取:基于面试语音转完的文字,通过大模型拆分面试官和应试者的角色部分,并将自我介绍部分以及面试提问的问题和面试者的回答进行拆分和提取,并总结面试问题粗略的分布。同时也判断如果不是面试对话录音,则进行拦截。 3. 面试表现评估:分别对自我介绍、面试提问的问题和面试者的回答进行评估。 面试题回答情况基于面试宝典+互联网答案综合判断,同时把面试题记录在数据库中,以便后续建设新的面试题库。 4. 报告内容生成:结合总结面试问题粗略的分布、自我介绍评估、面试问题回答评估的结果,拼接面试题文字原文,生成最终的报告。

输出:面试结果概要、面试表现评估、面试对话原文

二、实现面试语音转文字

流程如下:

在前面的章节中,我们已经学习过了语音识别是什么,这里我们使用coze自带的语音识别插件实现语音转文字,选择"大模型版本",需要注意:

  • 为了保证识别效果,我们这里选择使用参数量更大的大模型。能够基于上下文等信息获取优的效果。

  • 因为使用的是大模型,以及面试录音时长较长,通常需要处理3min以上,这里我们需要把超时时间调到600秒的最大值。

  • audio_url需要接收的是str的链接字符串,我们输入的部分是Audio。这里也和图片类似,自动做了类型兼容

三、实现角色划分与概要提取

角色划分与概要提取阶段如下:

分为以下几个步骤:

  • 角色划分:基于ASR识别的语音划分面试官和应试者
  • 其他信息提取:基于角色划分总结面试的基本内容, 提取自我介绍部分
  • 面试题问答对提取:纠结角色划分的结果,提取问题和对应的回答

1 角色划分[¶](#1 角色划分¶)

角色划分通过提示词结合ASR识别后的文字实现角色的划分:

  • 输入内容到这里已经只剩下文本对话了,已经没有了语音中声纹、语气等各种信息,准确划分角色对推理能力有一定的要求,最好选择能力更强的模型

  • 划分角色是基于这是一个面试录音内容,如果模型判读就按部是面试对话,直接输出空字符串,并结束整个流程的执行。

系统提示词:

复制代码
你是一个语音转文字内容总结助手,专门负责处理大模型和算法工程师的面试内容的总结。 你能够根据给定的输入对话的进行内容的提取,你需要做的事情如下
1.  提取出来对话内容,以面试官和应试者进行区分,存放到字段{{result}}面试原文 ,按照原内容就行,不要省略,注意每次说话需要换行。

需要注意:
1. 以上内容以文本形式返回,如果中间有卡顿或者表现不好的情况,用[]括起来,在里面注明是什么异常情况
2. 在内容的开头注明是面试官还是应试者,以"面试官:内容" 换行 "应试者:内容"这样的方式组织文本
3. 如果你认为本次的内容不是面试的对话,直接输出空字符

用户提示词:

复制代码
语音转文字内容:
{{input}}

2 其他信息提取[¶](#2 其他信息提取¶)

提取两部分内容,输入为角色划分的结果:

  • 个人简介部分:个人简介说了什么,从我是谁到最后,包括自我介绍中的项目部分
  • 其他内容总结:主要问了哪些知识点,哪些技术问题,哪些项目问题,人事问题 ,有哪些不好回答的问题。各自占比怎么样,用户回答怎么样

系统提示词:

复制代码
你是一个面试过程概要总结助手,能够根据用户的面试内容总结出来概要信息,包括以下内容:
1. 个人简介部分:个人简介说了什么,从我是谁到最后,包括自我介绍中的项目部分,要求直接返回原文,以{self_introduce}变量返回。 如果是面试官问的介绍一下项目,不作为个人简介部分。
2. 其他内容总结:主要问了哪些知识点,哪些技术问题,哪些项目问题,人事问题 ,有哪些不好回答的问题。各自占比怎么样,用户回答怎么样,以{summarize}变量返回

用户提示词:

复制代码
面试内容:
{{qa}}

输出有两部分:

3 面试题问答对提取[¶](#3 面试题问答对提取¶)

面试题问答对提取节点的作用,是为了提取出问题和回答两部分内容两部分。我们在这个几点首先并把问题由一个大字符串拆成若干个问答对,每个元素是一个问答对。因为LLM节点只能转成Array[str]数据类型,Array[object]实测效果并不稳定, 所以在后面的过程中还得对每一个问答对(str格式)再进行拆分。

系统提示词:

复制代码
你是一个面试内容提取助手,能够根据面试官和面试者的对话提取出问题和回答两部分内容,格式:"问题:" + 换行 + "回答", 并以数组形式返回。

需要注意:
1. 每个问题和答案只保留问题和对应的回答,中间的一些无关的连接词什么的省略
2. 保留回答中的【停顿】等信息,以便后续评估
3. 不需要提取自我介绍和项目介绍
4. 问题需要结合上文进行补充,比如面试官先问了transformer的编码器是什么,然后又问了"解码器呢", 这里需要把第二个问题"解码器呢"改写成 "transformer的解码器是什么"

用户提示词:

复制代码
问题和回答:
{{qa}}

输出:

四、实现面试表现评估

面试表现评估整体图:

主要分为两部分:

  1. 自我介绍评估:基于知识库+prompt实现自我介绍的评估
  2. 面试回答结果评估: 基于RAG+prompt实现回答结果的判断,查询不到答案的通过互联网搜索获取答案;同时把提取出来的问题进行入库,以便统计使用

1 自我介绍评估[¶](#1 自我介绍评估¶)

接收自我介绍的文本作为输入

系统提示词如下:

复制代码
你是一个大模型算法工程师的面试官,能够基于给出的规则对用户的自我介绍和项目介绍做一个评价,规则如下:

自我介绍:
1. 自我介绍应当包含姓名、学历、工作经历、做过哪些项目等,不可以有缺失
2. 工作经历的介绍主要介绍自己做过什么,担任过什么角色,突出自己的能力。篇幅长短要合适
3. 如果提到了自己的技能有哪些,不要直接说太多的技能点,比如擅长pytorch、擅长mysql这种,如果太多会比较啰嗦
4. 自我介绍中如果包含自己讲了项目经历,需要计算一下项目的篇幅。正确的方式应该是全部的自我介绍加起来3-5分钟,介绍一下最有价值的3个项目,并说一下3各项目都做了什么。不要直接一个项目说半天
5. 自我介绍中不要包含太多软素质的篇幅,靠说无法打动面试官,意义不大。需要以事实说服面试官
6. 以上违反了哪条,需要在评估结果中指出,并引用面试回答中的原文

用户提示词如下:

复制代码
自我介绍:
{{self_introduce}}

2 面试回答结果评估[¶](#2 面试回答结果评估¶)

对于面试回答结果的评估,我们这里使用循环结构进行处理:

  • 循环的内容就是上一步拆解出来的问答对数组:

接下来我们进入循环内部,在循环内部,首先要做的事情就是把问题和回答进行分离,并对问题的内容做一些简单的处理。接收循环中的每个问答对作为处理对象,同时,接收qa作为面试中的全部问答内容,因为处理的内容比较多

系统提示词:

复制代码
你是一个数据格式处理专家,能够基于用输入的问题和回答拆分成两部分, 问题以{query}变量返回,答案以{answer}格式返回。

需要注意:
1. 答案保留原文即可
2. 问题要用来落库和查询,尽量书面化一些

用户提示词:

复制代码
问答对:
{{input}}

最后,我们把问答对进行输出:

接下来,我们分两个链路执行:

  1. 知识库检索:把问题在面试题题库中进行检索,并获取到对应的答案
  2. 面试题入库:收集所有的面试题,并存入面试题题库,以便后续使用

首先是知识库检索,这里需要注意两个参数的设置:

  • 最大召回数量:2个
  • 最小匹配度:0.85或更高

这么设置的 原因是为了让检索出来的结果和问题更加接近,否则则会给后面的判断造成负面的影响。

同时,我们把面试题进行入库,和知识库检索并行执行,这里我们写入两个字段:

  • question: 面试问题
  • company:公司,这里我们写unknow。比如后续迭代中,我们可以增加记录当前面试题属于哪个公司的逻辑

最后,对查询到的结果进行判断:

  • 如果知识库中有对应的问题和答案,并且大模型可以作为参考的,基于知识库中的答案判断用户回答是否正确,以及和问题是否匹配
  • 如果知识库查不到对应的内容,大模型通过查询互联网,基于互联网上的回答,验证和问题是否匹配

因为这里需要判断答案和用户的回答是否一致,对逻辑推理的要求比较高,我们使用深度思考模型。该部分的输入有3个:

  • input:知识库检索出的结果
  • query:问答对分离后的问题
  • anwser:面试者的回答

系统提示词:

复制代码
你是一个大模型算法工程师的面试官,能够根据面试的问题、 用户的回答、 题目库中查询出来的结果,以及互联网上搜索到的答案对用户的问题进行综合的评估。

步骤如下:
1. 请根据知识库查询出来的结果先判断检查出来的是否是问题的答案,如果查询出来的内容和答案无关,则进行互联网查询;如果就是答案,请以这个答案为准
2. 对比问题和答案,判断用户回答的结果怎么样

需要注意:
1. 需要给本题的回答进行评价,ABCD 4个级别, D是完全不会,C是只能回答一小部分,或者卡壳太厉害,B是能够回答对大部分但是不够深入,A是回答的非常好甚至超越面试题库或者接近互联网上的答案
2. 回答的不好的问题,需要告诉用户正确答案
3. 回答复杂问题的方式需要易懂,言简意赅,先回答整体,再回答细节。 如果回答的不易懂或者逻辑比较乱,需要告诉面试者要培养更好的表达方式
4. 如果面试官问的是项目介绍(不是项目架构这类具体问题),要从项目的业务背景、项目架构、自己做了哪些、优化项表达,并参考3的判断条件当做一个复杂问题评判
5. 回答的问题如果和题目不太相干,或者说理解错了。需要指出面试者需要先理解问题再回答

用户提示词:

复制代码
问题:
{{input}}
用户回答:
{{answer}}
题库检索结果:
{{input}}

五、实现报告内容生成

报告内容生成节点接收自我介绍评估、面试表现评估两个部分的结果作为输入和整合,这个部分的目的主要是为了把面试整体的情况做一个整合,再输入给结束节点

报告内容生成仅需一个LLM节点即可完成,接收3个输入:

  • summarize:面试整体描述
  • self_introduce_result:自我介绍的评估结果
  • qa_result:回答结果评估的结果,数组格式

系统提示词:

复制代码
你是一个面试助手,服务于大模型算法工程师的面试官。能够根据输入的面试整体概述、自我介绍内容评估、问答结果评估进行整合,需要注意,面试整体描述在前、然后是自我介绍评估、最后是问答结果评估。

需要注意:
1. 把问答结果的整体情况,比如问了多少个题,多少个回答不错,多少个没有回答上来,结合问题的难易程度,评估面试者的技术如何,如果回答不对的有一些,需要提醒面试者有针对性的复习。如果回答不对的比较多,提醒面试者需要投入更多的时间复习技术,并联系老师寻求帮助。这部分内容加到整体描述部分
2. 问答结果部分在整合时只保留回答的不好的部分,并在返回结果中说明哪些回答的不好,应该怎么回答更好。把评估结果中的原文直接返回就行
3. 如果问答结果中或者自我介绍评估结果中提到的表述方面的问题比较多, 需要在整体概述中进行强调,要求将面试者加强

六、工作流调试

工作流搭建好后,我们上传一份录音文件,并试运行工作流,最终节点输出如下:

在调试的过程中,运行日志如下:

消耗的token数增多,同时,运行时长很明显比较长

面试题生成模块

一、工作流介绍

功能:接收用户的简历,结合面试题宝典的数据和录入到面试题记录中的面试题数据,生成面试题

具体步骤如下:

输入:简历文件

执行流程: 1. 数据预处理:准备最近100个面试问题, 解析简历文件中的技能和项目部分的内容 2. 面试题生成:基于技能点生成技术类问题, 基于项目部分的内容生成项目类问题 3. 面试题整合:把最近的100道面试题

输出:面试题集合

二、实现数据预处理

数据预处理部分如下图,主要是两部分:

  • 解析简历文件中的技能和项目部分的内容:从简历中提取出来对应的部分的文字,并进行分块
  • 准备最近100个面试问题:从数据库中查询最近100道面试题

1 解析简历文件中的技能和项目部分[¶](#1 解析简历文件中的技能和项目部分¶)

有些细心的同学或许已经注意到,这里的简历文字提取和内容分块部分的内容和"简历评估模块"基本类似,所以我们可以直接复用这一部分的内容。coze的工作流的画布上,我们通过鼠标框选 + 复制的, 再在新的画布中进行粘贴,即可复用。

粘贴过来以后,我们需要做的就是基于业务再进行修改:

  • 简历文字提取部分:这部分完全一致,目标都是要把pdf和doc的文档转化为文本格式,不需要修改
  • 内容分块部分:我们生成面试题的时候只需要依赖技能和项目两个部分即可,所以在原版内容分块结果的基础上要做一次减法,只保留技能和项目部分即可。同时对于技能部分,要拆分成更细的技术点,以便更好的生成对应的面试题。

简历问题提取部分略, 内容分块部分我们这里使用豆包1.6深度思考模型,同时修改提示词,如下:

系统提示词:

复制代码
你是一个大模型和算法工程师简历内容提取助手,能够根据简历中的内容提取出来对应的实体。你将接受简历内容作为输入,并按照下列要求进行拆分,并输出为json格式:

个人技能:字段名 {{skill}}, 个人掌握的IT相关的技能,按行按内容拆分,拆分成尽可能多的单独的技术点,并最终以字符串数组返回


项目经验:字段名 {{project_exp}} , 包含简历上所有项目相关的、以及在简历内容的第几部分,每个项目作为数组中的一个元素返回,最后返回一个字符串数组,数组长度和项目数一致


注意,以上的要求需要严格遵循,除了上下文以外,其他的内容不要省略和总结,直接拆出来原文即可,不要出现错误的划分

这里需要注意,拆分技能点的目的是为了让生成问题更加精准。 一般按照大部分简历的编写方式,一行技能介绍里面往往包含多个技能点:

  • 比如:"熟悉深度学习原理,对RNN、LSTM、Transformer的原理有深入的研究,熟练使用pytorch搭建神经网络"。 这句话中涉及到多个技术点, 如果我们直接基于这句话生成一个面试题,是比较困难的。所以这里我们要"换位思考",站在业务的角度,也就是简历的使用者(面试官)的角度去思考,怎么使用。
  • 一般来讲,面试官拿到简历后,会针对简历上的内容结合岗位的需求,针对性提问,比如岗位对于深度学习算法基础要求比较高,那么会针这条内容中的每个点进行详细的提问。所以我们在这个阶段,需要把技能点拆分到最细。

用户提示词:

复制代码
输入的内容为:
{{input}}
如果为空,则:
{{content}}

输出:

2 获取最近的真实面试题[¶](#2 获取最近的真实面试题¶)

首先,我们获取"最近100道面试题"的来源,是来自于我们在"录音分析模块"工作流中创建的面试题,数据库结构如下:

这里的面试题主要来自于学生面试录音中获取到的各类面试题,也可以手动导入一部分数据,这里我们可以选择的策略比较多,比如:

  • 取最近100条
  • 随机无放回抽样100条
  • 按照某种分布,比如:大模型50条,其他的加起来50条等
  • ......

这里抽样的策略可以有很多,我们上面列举的方式实现难度从上到下对应着由易到难,同时效果也会由好到坏。但是鉴于我们是出于项目初期:

  • 面试题的记录没有很多,最好的抽样方式和最简单的效果上查不了多少
  • 基于coze这个框架,实现无放回抽样100条和按照某种分布进行抽样会把这个问题复杂化,投入更多的人力成本

因此,我们这里选择使用:取最近100条,如下图:

这里我们看一下:

  • 查询字段:除了question以外,我们还需要查询出来bs_studio_create_time字段,这个字段是在数据插入数据库时取的当时时间,也就是数据写入时的时间,用于排序
  • 查询条件:question不为空,因为我们存入的时候就不存入空的数据,相当于查询所有的数据
  • 排序方式:使用bs_studio_create_time作为排序字段,并选择倒序排列的方式

最后返回100条,就是最近的100道面试题。

三、实现面试题生成

生成面试题分两个部分:基于技能生成面试题、基于项目经验生成面试题,都是基于内容分块的结果,拿到各自需要的信息,并进行循环处理。

1 基于技能点生成面试题[¶](#1 基于技能点生成面试题¶)

基于技能点生成的问题功能接受数组类型的技能点信息,并循环遍历,检索面试题面试宝典题库,并进行分润色和补齐

循环体的输入输出如下:

  • 输入:拆分后的技能点数组
  • 输出:每个技能点对应的面试题

接下来我们看一下面试题题库检索部分:

这里需要注意:

  • 最大召回数量:设置5,同一个知识点可以有多个问题
  • 最小匹配度:设置0.9,这里查询出来的结果后续要给到大模型进行处理。这里需要对检索出来的内容的相关性要求更加严格,防止检索出不相干的问题

开启查询改写和结果重排,以便提升查询效果。

接下来是问题润色和补齐部分,接收查询到的面试题和对应的知识点,对面试题进行生成:

  • 因为查询到的内容往往是一个段落,有的可能是面试题题目+答案,这里我们只需要答案。需要依赖大模型进行问题的精简
  • 面试宝典无法涵盖所有的技能点,会存在查询不出来结果的情况,这里我们需要做个兜底,从互联网上获取

因为问题的润色和联网获取对模型的推理能力要求不高,所以在这里我们选择豆包1.5Pro的32K即可满足需求。

系统提示词:

复制代码
你是一个大模型算法的面试题生成专家,能够根据输入的技能点和面试题题库中相关的内容,生成对应的面试题。如果没有检索出来的内容,请查询互联网并生成对应的面试题

注意:
1. 问题难易适中,不要故意刁难,也不要简单到三言两语就能说清楚
2. 从面试题中总结出来的问题要完整,具有良好的可读性。如果查询出来的结果中有问题原文,直接保留原文即可。

用户提示词:

复制代码
技能点:
{{skill}}
面试题题库查询结果:
{{input}}

2 基于项目经验生成面试题[¶](#2 基于项目经验生成面试题¶)

基于项目生成面试题部分,因为项目中的内容对比技能不属于通用知识,所以这里我们不进行检索类的操作,而是根据每个项目中的内容,基于提示词生成对应的面试题。所以在这个部分,提示词的质量直接影响着面试题生成的效果。

循环体基于简历内容拆分出来的项目经验部分字符串数组作为输入:

循环体中,每次循环处理的是一个项目的全部内容,涉及到推理,所以在这里我们需要使用效果最好的模型,也就是豆包1.6深度思考模型。

系统提示词:

复制代码
你是一个大模型算法专家,能够根据用户的项目内容提问高质量问题

注意:
1. 对于项目的业务背景部分,找到可疑的点,提问用户。尤其是是质疑背景的真实性,如果觉得项目的立项有一些牵强,可以直接问到对应的点上。至少提问一个问题

2. 对于项目的技术栈部分,结合项目个人职责的具体的内容,对于比较难实现的部分,

3. 对于项目中所有的成果指标类的数据,比如效率提升多少,提问分子和分母是什么。对于性能类指标比如f1分数大于0.9,如果分数比较难实现,提问怎么实现的。这里提问2-3个问题,其他指标比如训练数据集多少,结合业务背景,提问用户怎么分布的

4. 如果项目中谈到了优化,针对优化项里面的内容,询问实现细节,以及是否有别的方案。

5. 直接提问:在落地这个项目中,你觉得你做的最有难度的一件事是什么,你是怎么克服的

6. 对于项目中的技术选型问题,比如某个文本分类项目使用的bert-base-chinese作为核心技术点。询问用户为什么要使用它,而不使用其他方案

7. 对于项目中用到的核心技术点,提问用户对于这个核心技术点的理解。问至少2个问题

8. 针对项目中个人职责部分,问至少2个怎么实现的,之类的问题。

除了以上必须要提的问题以外,根据你的理解,基于当前项目的特点,发挥几个问题。 提问的问题以问号分割 ,每个问题之前加一个项目名的前缀, 比如: 对于xxx项目:你的数据预处理部分怎么实现的?

用户提示词:

复制代码
项目内容:
{{project_exp}}

四、实现面试题整合

面试题整合阶段需要实现以下几个功能:

  • 把三个来源的面试题进行整合,并去重
  • 基于和大模型算法岗位的关联程度,对面试题进行删减
  • 去除口语化表达
  • 补充一些人事问题

该节点接收3个输入:

  • project_gen:基于项目提出的问题
  • skill_gen:基于技能点提出的问题
  • last_100:最近的100条面试题

系统提示词:

复制代码
你是一个面试题整理整合专家,能够根据输入的多个来源的面试题进行整合:

1. 如果是基础比如java、python、mysql之类的,对于每个技术点保留2个就可以了。 如果是对于比较核心的比如RAG、agent的技术,数量则需要进行增加, 至少4个以上;其他的比如transformer的,2个核心问题即可
2. 项目面试题可以直接保留
3. 面试题不可出现重复
4. 整合的结果以字符串数组数据格式返回,一个问题一个元素
5. 问题要进行书面化表达,不要出现"你好","那你们是怎么做的"之类的过于口语化的表达,如果有类似的表达,提来出来问题本身。
6. 提问几个常见的人事问题,比如:为什么从上家公司离职,如果你的领导当面说你能力不行你该怎么办等问题,这部分问题需要有适当难度。

用户提示词:

复制代码
项目面试题:
{{project_gen}}
技能点面试:
{{skill_gen}}
近期的100道面试题:
{{last_100}}

输出:

五、工作流调试

工作流搭建好后,我们上传一份简历文件,并试运行工作流,最终节点输出如下:

在调试的过程中,运行日志如下:

我们可以看到,循环执行的次数较多,同时,这个工作流消耗的token数也是非常高,且最终消耗token数也是10万级别的。

智能体编排

一、整体说明

在这里,我们使用单Agent(自助规划模式)来实现多个功能的合并,在这里,我们把每个工作流当做一个只完成某项固定任务的流水线式的Agent,最终由一个父Agent进统一管理。

因此在实现3个工作流以后,我们需要一个统一的入口。接下来,我们创建一个智能体,并融合3个工作流。选择"Agent(自助规划模式)"模式:`

二、人设与细节编排

1 人设与回复逻辑[¶](#1 人设与回复逻辑¶)

人设与回复逻辑部分我们可以使用coze官方提供的模板,在基础上进行修改,

提示词的核心逻辑主要在于交代智能体什么情况下调用什么工作流,以及处理不了的场景怎么回复。

提示词:

复制代码
# 角色:
大模型算法工程师面试助手

## 目标:
帮助求职者解决面试中的问题,比如简历修改、面试录音分析、模拟面试题生成等
## 技能:
1. 简历评估,调用工作流实现简历的评估
2. 面试录音判断,调用工作流处理上传的录音文件
3. 简历校验,通过调用工作流实现简历内容的验证
4. 如果是闲聊或者不是以上3种场景,不要搭理。返回固定话术: 目前只支持简历修改、面试录音分析、模拟面试题,请上传简历或者面试录音,有问题请联系姚老师

## 工作流:
1. 如果用户上传简历,没有做说明或者表达帮我看看简历之类的内容,先调用简历校验工作流ai_resume_handler
2. 如果用户上传了语音文件,不管说什么,执行recording_handler
3. 如果用户上传了简历,说明要生成面试题,执行面试题生成工作流,resume_question_generate。如果用户没有上传简历,不要执行任何工作流,并提示用户上传简历。

## 输出格式:
无特定格式

## 限制:
- 多给用户鼓励而不是打击
- 对用户屏蔽调用工作流等细节

2 编排[¶](#2 编排¶)

在编排部分,我们需要设置以下内容:

  • 模型:为了能更好的理解用户的意思,对大模型的调用
  • 工作流:3个工作流需要全部添加进来,以便coze进行调用
  • 开场白:给使用者对功能进行简介,要求言简意赅

如下图:

开场具体内容:

复制代码
同学你好,我是黑马程序员面试助手,服务于AI学科,请上传你的简历并耐心等待。 目前面试助手支持简历校验、面试录音分析、基于简历生成面试题三个功能, 基于公司面试宝典、高频面试题等知识库生成和判断。
操作流程: 
上传简历(pdf/word均可,最好pdf) / MP3格式的录音
在聊天框中输入要做的事情,目前支持三类: 帮我看看简历/ 帮我分析录音/帮我生成面试题

 等待模型返回最终结果即可

在开场白下方,预留问题:

复制代码
帮我看看简历(上传文件后点击)

帮我分析以下面试录音(上传文件后点击)

帮我生成面试题(上传文件后点击)

得到如下效果:

开启长期记忆,让面试助手记录用户的技能:

三、智能体调试

接下来我们对智能体进行调试,在这里我们先上传一份简历,执行简历评估逻辑。得到结果如下:

其他场景调试略。

四、智能体发布

点击右上角发布,在发布页面,我们直接点击生成按钮,生成发布记录。

API调用方式

一、模块介绍

基于已经发布的智能助手,通过Chat SDK调用并实现,如下图:

在这里我们需要做其实就是通过python代码肚脐文件,构造对应场景的Message,并实现内容生成。代码结构如下:

在实现之前,我们需要获取Coze API密钥和应用的id,并且需要安转cozepy工具包。

获取Coze API密钥方式:

点击添加后,设置以下信息:

点击确定后,获取个人令牌:

智能体的 ID获取:

在智能体编排页面的 URL 中,查看 bot 关键词之后的字符串就是智能体 ID。例如https://www.coze.cnwww.coze.com/space/341****/bot/73428668*****,智能体 ID 为 73428668*****

cozepy工具包:

cozepy 是字节跳动 Coze(扣子)平台的官方 Python SDK;使用 pip 来安装:

复制代码
pip install cozepy

二、简历分析模块

该模块处理流程如下:

  1. 配置API认证信息:设置Coze API密钥、创建Coze客户端实例、指定机器人ID和用户ID
  2. 上传文档:将本地的Word简历文件上传到Coze云,获得一个文件ID。
  3. 请求分析:把文件ID和一句指令("帮我看看简历")一起发送给指定的Coze Bot,请求它分析简历内容。
  4. 获取并保存结果:以"流式"方式接收Bot返回的分析结果,并实时将其保存到本地的Markdown文件中。

具体实现如下:

复制代码
# 从pathlib模块导入Path类,用于处理文件路径
from pathlib import Path
# 从cozepy库导入必要的模块:中国区API地址、客户端主类、消息类、令牌认证类、消息对象类和聊天事件类型
from cozepy import COZE_CN_BASE_URL, Coze, Message, TokenAuth, MessageObjectString, ChatEventType

# 配置部分开始
# API访问令牌,用于身份验证
coze_api_token = 'pat_EF9Grr6ckrHDfORBaeDrsWrwvADy8ATBmRIRl2uyE7rTQ****'
# 要调用的机器人ID
bot_id = "758126000080750**"
# 用户标识符,可以自定义,用于区分不同用户
user_id = "12334"
# 结果保存的本地文件路径(Markdown格式)
RESULT_PATH = r"C:\Users\Abela\***\resume_evaluated\result.md"

# 初始化Coze客户端
# 创建Coze客户端实例,使用令牌认证并指定中国区API地址
coze = Coze(auth=TokenAuth(token=coze_api_token), base_url=COZE_CN_BASE_URL)

# 定义分析简历的主函数
def analyze_resume(file_path):
    """
    上传并分析简历文件
    """
    # 上传文件到Coze平台
    # 调用API的文件上传接口,将本地文件上传到云端
    file_response = coze.files.upload(file=Path(file_path))
    # 检查上传是否成功
    if not file_response:
        # 如果失败,打印错误信息并返回None
        print(f"文件上传失败: {file_path}")
        return None

    # 从上传响应中获取文件ID(云端文件的唯一标识符)
    file_id = file_response.id

    # 构建要发送给机器人的消息
    # 创建包含文件引用和文本指令的复合消息
    messages = [
        # 构建用户提问对象消息
        Message.build_user_question_objects([
            # 在消息中嵌入上传的文件(通过文件ID引用)
            MessageObjectString.build_file(file_id=file_id),
            # 添加文本指令,告诉机器人要做什么
            MessageObjectString.build_text('帮我看看简历')
        ])
    ]

    # 流式获取响应
    # 初始化结果文本为空字符串
    result_text = ''
    # 调用流式聊天接口,向指定机器人发送消息
    stream = coze.chat.stream(
        bot_id=bot_id,           # 指定目标机器人ID
        user_id=user_id,         # 指定用户ID
        additional_messages=messages,  # 设置要发送的消息
        parameters={},           # 额外的参数(这里为空字典)
    )

    # 遍历流式响应的事件
    for event in stream:
        # 检查事件类型是否为消息增量事件(机器人回复的片段)
        if event.event == ChatEventType.CONVERSATION_MESSAGE_DELTA:
            # 如果事件中包含消息内容,将其拼接到结果文本中
            if event.message.content:
                result_text += event.message.content
        # 检查事件类型是否为聊天完成或失败事件
        elif event.event in [ChatEventType.CONVERSATION_CHAT_COMPLETED,
                             ChatEventType.CONVERSATION_CHAT_FAILED]:
            # 如果是完成或失败事件,则退出循环
            break

    # 保存结果到本地文件
    # 检查是否有有效的结果文本
    if result_text:
        # 以写入模式打开结果文件(UTF-8编码)
        with open(RESULT_PATH, 'w', encoding='utf-8') as f:
            # 将结果文本写入文件
            f.write(result_text)

    # 返回结果文本(可在程序中使用或进一步处理)
    return result_text

# 程序入口点
if __name__ == '__main__':
    # 测试代码
    # 调用analyze_resume函数分析指定的Word简历文件
    result = analyze_resume(r"C:\Users\Abela\****\02-简历.docx")
    # 打印结果到控制台
    print(result)

输出结果为:

复制代码
以下是为你优化后的简历:

个人信息
出生年月:1980.06.11
政治面貌:群众
所在城市:[具体城市]
毕业院校:本科毕业于国际知名高校------牛津大学
求职意向:大模型算法工程师
个人技能
Python:熟练运用Python语言编程,精通pandas、numpy库的使用。
机器学习基础:深入理解人工智能与机器学习的核心概念及其差异,明晰机器学习在数据预测和模式发现中的应用场景。
机器学习建模全流程:全面掌握从数据获取、预处理、特征工程,到模型训练(如线性回归、决策树等)、评估及调优的完整流程。
KNN算法:透彻理解KNN算法原理,能通过交叉验证动态调整K值以优化模型。
特征工程:擅长数据清洗、缺失值处理、特征编码(如独热编码)和特征选择,有效提升模型训练效果。
大模型技术:熟悉大模型微调技术,可基于特定数据集对预训练大模型进行微调;掌握RAG(检索增强生成)技术,能够将外部知识与大模型相结合,提高生成效果;了解常见大语言模型,如ChatGPT、文心一言等的使用方法。
机器学习算法:熟练掌握逻辑回归、随机森林、梯度提升树、XGBoost等机器学习算法的原理和应用。
模型评估:能够运用ROC曲线、AUC值等指标对机器学习模型进行准确评估。
个人评价
具备较强的自主学习能力,能够快速掌握新的专业技能。对数据敏感,拥有出色的数据处理和分析能力以及严谨的逻辑思维。工作认真负责,注重细节,能高效处理多项复杂任务,具备良好的抗压能力。沟通协调能力强,善于团队协作。

工作经历
2024.07 - 至今 北京ABC有限公司 NLP算法工程师
工作内容:主要运用Python的NLTK、SpaCy库以及TensorFlow和PyTorch深度学习框架等进行自然语言处理任务。负责公司内部NLP相关项目的算法设计与开发,全程参与数据收集、清洗、特征提取、模型训练和优化等环节。与团队紧密合作,推动项目顺利进行,确保按时交付。通过优化模型,将文本分类准确率提高了[X]%,有效解决了之前分类不准确的问题,为公司业务决策提供了可靠支持。
项目经历
项目一:战略性人才可持续性智能分析系统 - 人才流失预测模型项目
技术栈:Python、NLTK、TensorFlow、逻辑回归、随机森林等
个人负责部分:承担数据预处理和特征工程工作,包括数据清洗、缺失值处理、特征编码(独热编码)和特征选择。运用逻辑回归、随机森林、梯度提升树、XGBoost等算法进行模型构建和训练,并使用ROC曲线、AUC值等指标进行评估和调优。最终模型的AUC值达到0.91,同时准备好关于此成果数据的详细解释话术文档。
项目二
技术栈:[具体技术栈]
个人负责部分:[详细描述个人职责]
成果:[列举取得的成果或解决的问题]
项目三
技术栈:[具体技术栈]
个人负责部分:[详细描述个人职责]
成果:[列举取得的成果或解决的问题]
这份简历突出了你的专业技能、工作经验和项目成果,语言表达更加清晰流畅,相信会对你的求职有所帮助,加油!

三、录音处理模块

该模块处理流程如下:

  1. 配置API认证信息:设置Coze API密钥、创建Coze客户端实例、指定机器人ID和用户ID
  2. 上传文档:将本地的面试录音文件上传到Coze云,获得一个文件ID。
  3. 请求分析:把文件ID和一句指令("分析面试录音")一起发送给指定的Coze Bot,请求它分析简历内容。
  4. 获取并保存结果:以"流式"方式接收Bot返回的分析结果,并实时将其保存到本地的Markdown文件中。

具体实现如下:

复制代码
# 导入必要的库和模块
from pathlib import Path
from cozepy import COZE_CN_BASE_URL, Coze, Message, TokenAuth, MessageObjectString, ChatEventType

# 配置
coze_api_token = 'pat_EF9Grr6ckrHDfORBaeDrsWrwvADy8ATBmRIRl2uyE7rTQ****'
bot_id = "758126000080750**"
user_id = "12334"
RESULT_PATH = r"C:\Users\Abela\***\audio_evaluated\result.md"

# 初始化客户端
coze = Coze(auth=TokenAuth(token=coze_api_token), base_url=COZE_CN_BASE_URL)

def analyze_audio(file_path):
    """
    上传并分析简历文件
    """
    # 上传文件
    file_response = coze.files.upload(file=Path(file_path))
    if not file_response:
        print(f"文件上传失败: {file_path}")
        return None

    file_id = file_response.id

    # 构建消息
    messages = [
        # 构建用户问题消息
        Message.build_user_question_objects(
            [
                MessageObjectString.build_file(file_id=file_id),  # 添加文件到消息
                MessageObjectString.build_text('分析一下面试录音')  # 添加文本请求
            ]
        )
    ]

    # 流式获取响应
    result_text = ''
    stream = coze.chat.stream(
        bot_id=bot_id,
        user_id=user_id,
        additional_messages=messages,
        parameters={},
    )

    for event in stream:
        if event.event == ChatEventType.CONVERSATION_MESSAGE_DELTA:
            if event.message.content:
                result_text += event.message.content
        elif event.event in [ChatEventType.CONVERSATION_CHAT_COMPLETED,
                             ChatEventType.CONVERSATION_CHAT_FAILED]:
            break

    # 保存结果
    if result_text:
        with open(RESULT_PATH, 'w', encoding='utf-8') as f:
            f.write(result_text)

    return result_text


if __name__ == '__main__':
    # 测试
    result = analyze_audio(r"C:\Users\Abela\。。。。、09-面试录音2.wav")
    print(result)

输出结果为:

复制代码
本次面试主要围绕技术问题展开,占比 100%。面试官询问了一对多 EPO 关系并要求举例,接着追问在该技术中如何解决只获取想要信息(如学校或专业)的问题,共 2 个问题。应试者对一对多 EPO 关系举例有回应,但未完整回答出该关系的概念,对于后续问题完全没有作答,回答不错的题目为 0 个,未回答上来的题目为 2 个。从问题的难易程度来看,这些问题属于对专业技术知识的考察,有一定难度,但也是大模型算法工程师需要掌握的基础概念和应用。整体来看,你在技术掌握方面还有很大的提升空间哦,别灰心,接下来可以投入更多的时间复习技术知识,并联系邢老师寻求帮助。同时,在面试过程中,你的表达比较混乱,需要加强表达能力,培养更好的表达方式,先把整体概念讲清楚,再举例说明。

自我介绍内容为空,不包含姓名、学历、工作经历、项目经历等必要信息,违反了规则要求,请补充完整的自我介绍内容,以便能给出更准确评价。

问答结果中回答不太好的部分如下:

对于一对多 EPO 关系的问题:从你的回答来看,表达比较混乱,没有清晰准确地说明一对多 EPO 关系是什么样的问题。你需要培养更好的表达方式,先把整体概念讲清楚,再举例说明。 通过互联网查询,一对多 EPO(Exclusive Product Offer)关系通常指在商业或业务场景中,一个实体与多个相关联的其他实体之间存在的一种对应关系。在这种关系里,一个主体可以对应多个客体。 例如,在电商平台中,一个商家(主体)可以提供多种不同的商品(客体),这就是一对多的关系。商家与这些商品之间就形成了一对多 EPO 关系。商家可以对这些商品分别设置不同的价格、促销活动等。 本题回答评价为 C,你只是尝试举了个例子,但没有清晰说明一对多 EPO 关系的概念,只能算回答了一小部分。
对于在该技术中如何解决只获取想要信息(如学校或专业)的问题:评价为 D。你完全没有作答。 正确答案:通过互联网查询可知,解决系统识别用户具体想要的学校或专业的问题,可从以下方面着手: 整体来说,可通过数据处理、算法设计和交互设计来实现。 细节上,在数据处理方面,要构建丰富全面的学校和专业知识库,包含学校的各类信息和专业的详细介绍等,同时收集用户的历史搜索、浏览、收藏等行为数据。在算法设计上,运用自然语言处理技术解析用户输入的文本,使用关键词匹配、语义理解和机器学习模型来精准识别用户意图,还可通过协同过滤算法根据相似用户的行为来推测用户需求。在交互设计方面,提供搜索提示和智能联想功能,根据用户输入给出相关的学校和专业建议,同时设计引导式问答界面,逐步明确用户的具体需求。

四、面试题生成模块

该模块处理流程如下:

  1. 配置API认证信息:设置Coze API密钥、创建Coze客户端实例、指定机器人ID和用户ID
  2. 上传文档:将本地的Word简历文件上传到Coze云,获得一个文件ID。
  3. 请求分析:把文件ID和一句指令("生成面试题")一起发送给指定的Coze Bot,请求它分析简历内容。
  4. 获取并保存结果:以"流式"方式接收Bot返回的分析结果,并实时将其保存到本地的Markdown文件中。

具体实现如下:

复制代码
# 导入必要的库和模块
from pathlib import Path
from cozepy import COZE_CN_BASE_URL, Coze, Message, TokenAuth, MessageObjectString, ChatEventType

# 配置
coze_api_token = 'pat_EF9Grr6ckrHDfORBaeDrsWrwvADy8ATBmRIRl2uyE7rTQ****'
bot_id = "758126000080750**"
user_id = "12334"
RESULT_PATH = r"C:\Users\Abela\***\question_generated\result.md"

# 初始化客户端
coze = Coze(auth=TokenAuth(token=coze_api_token), base_url=COZE_CN_BASE_URL)


def generate_que(file_path):
    """
    上传并分析简历文件
    """
    # 上传文件
    file_response = coze.files.upload(file=Path(file_path))
    if not file_response:
        print(f"文件上传失败: {file_path}")
        return None

    file_id = file_response.id

    # 构建消息
    messages = [
        Message.build_user_question_objects([
            MessageObjectString.build_file(file_id=file_id),
            MessageObjectString.build_text('帮我生成面试题')
        ])
    ]

    # 流式获取响应
    result_text = ''
    stream = coze.chat.stream(
        bot_id=bot_id,
        user_id=user_id,
        additional_messages=messages,
        parameters={},
    )

    for event in stream:
        if event.event == ChatEventType.CONVERSATION_MESSAGE_DELTA:
            if event.message.content:
                result_text += event.message.content
        elif event.event in [ChatEventType.CONVERSATION_CHAT_COMPLETED,
                             ChatEventType.CONVERSATION_CHAT_FAILED]:
            break

    # 保存结果
    if result_text:
        with open(RESULT_PATH, 'w', encoding='utf-8') as f:
            f.write(result_text)

    return result_text


if __name__ == '__main__':
    # 测试
    result = generate_que(r"C:\****\02-简历.docx")
    print(result)

输出结果为:

复制代码
以下是为您生成的面试题:

对于战略性人才可持续性智能分析系统项目,能否提供一些具体企业因高流失率遭受重大损失的数据来支撑项目立项背景的真实性?
项目成果中的AUC值为0.91,这里的分子和分母分别是什么?
项目成果的AUC值达到0.91是怎么实现的,在模型训练和优化过程中采取了哪些特别的措施?
在数据预处理中,处理缺失值和异常值是如何实现的?
特征工程里选择特征和提取有价值特征是如何实现的?
对于模型构建与训练中使用的XGBoost算法,如何理解它,它在这个项目中的优势体现在哪里?
对于交叉验证和网格搜索方法,如何理解它们在模型参数优化中的作用?
在模型评估时使用ROC曲线和AUC值,为什么选择这两个指标,而不使用其他评估指标?
在优化模型参数时,除了交叉验证和网格搜索,是否考虑过其他方案?
在落地这个项目中,觉得做的最有难度的一件事是什么,是怎么克服的?
项目使用的训练数据集是多少,这些数据是怎么分布的,比如不同部门、不同岗位的数据占比情况?
请用Python代码实现梯度累积的训练过程,结合一个简单的神经网络模型进行说明。
编写Python代码将一个大语言模型的参数进行量化,从FP32转换为FP16,并解释代码中关键步骤的作用。
Pandas的核心数据结构有哪些,分别有什么特点?
什么是Pandas DataFrame,它和SQL中的表格有什么相似之处?
请简要介绍一下NumPy,以及它在Python中的作用是什么?
如何创建一个指定大小的全零矩阵和全一矩阵?请写出代码示例。
请列举一些省内存的大语言模型训练、微调、推理方法,并简要说明其中一种方法的原理。
大模型是否具备推理能力?请阐述其推理能力的关键技术以及在不同类型推理问题上的表现。
请简述对预训练模型进行微调的步骤。
微调和参数高效微调之间的区别是什么?
在数据收集过程中,以下哪一项不属于数据收集的基本原则?A. 准确性 B. 完整性 C. 及时性 D. 主观性
以下哪些是数据搜集的基本步骤?(多选)A. 确定搜集目的 B. 选择搜集方法 C. 设计问卷或表格 D. 数据分析 E. 数据存储
请谈谈数据预处理在数据分析和机器学习中的重要性,并列举几种常用的数据预处理方法及其作用。
假设接手一个电商平台用户行为数据集,包含用户ID、浏览商品ID、购买商品ID、浏览时间、购买时间、用户性别、年龄、城市等信息。请描述会进行哪些数据预处理步骤来为后续的数据分析或建模做准备。
请列举特征工程中的预处理步骤有哪些,并简要说明每个步骤的作用。
常见的用于特征选择的方法有哪些?请至少说出三种,并阐述其原理。
请详细阐述模型微调的一般步骤。
参数高效微调(PEFT)有哪些优点?
简单介绍一下线性回归。
线性回归的假设函数是什么形式?
请解释决策树算法的基本原理。
决策树的基本概念是什么?它是基于什么理论的分类或回归方法?
在对微调模型进行评估时,通常会使用验证集或测试集,请问使用这两种数据集进行评估各有什么优缺点?
请列举至少三种常见的模型评估指标,并说明它们分别适用于哪些类型的任务。
请详细阐述模型微调的一般步骤有哪些?
参数高效微调有哪些常见策略?
KNN算法中,K的取值通常( )A. 越大越好 B. 越小越好 C. 需要根据具体情况调整 D. 固定为5
KNN算法属于( )A. 监督学习 B. 无监督学习 C. 强化学习 D. 半监督学习
请简要解释什么是交叉验证以及它在机器学习模型训练中的作用。
交叉验证的主要目的是什么?A. 提高模型精度;B. 选择最佳模型;C. 减少训练时间;D. 降低数据维度,请说明正确答案并解释原因。
请阐述数据清洗的主要流程是什么?
数据清洗过程中常见的数据质量问题有哪些,如何处理?
某电商平台销售数据中,用户年龄、购买频率等字段存在大量缺失值。作为数据分析师,会如何处理这些缺失值?请说明不同策略的适用场景和优缺点。
在数据预处理阶段,对于缺失值处理方法中,使用均值或中位数填充、使用众数填充、使用KNN算法填充、删除含有缺失值的记录,哪种方法可能会导致数据偏差?请说明理由。
请简要介绍几种常见的类别特征编码方式,如自然数编码、独热编码、count编码、目标编码,并说明它们各自的适用场景。
在数据预处理阶段,特征编码与数据清洗、数据标准化等操作有什么区别和联系?
请解释什么是独热编码(One - Hot Encoding),并说明它是如何处理类别型特征的。
独热编码在自然语言处理和机器学习中都有应用,请举例说明在这两个领域中独热编码分别适用于哪些场景。
请简要介绍什么是特征选择,以及说出特征选择的一些好处。
常用的特征选择方式有哪些,分别阐述其原理。
在技术中,如何解决系统识别用户具体想要的学校或专业的问题
请说明一对多EPO关系是什么样的问题,并举例说明
为什么从上家公司离职?
如果你的领导当面说你能力不行,你该怎么办?
在团队合作中,遇到与你意见严重不合且固执己见的同事,你会如何处理?
当你负责的项目时间紧迫,同时又出现了突发的重要任务,你会如何安排工作优先级?
请举例说明你曾经在工作中犯过的一个严重错误,以及你从中学到了什么?
希望这些面试题能帮助您更好地准备面试,加油!

©Copyright 2024 AITutorials.CN This website has been reviewed by the review agency. 京ICP备23006137号

相关推荐
ting94520001 天前
Codex 适配国产信创环境完整部署指南(深度技术篇)
人工智能·架构
JEECG低代码平台1 天前
JimuReport 积木报表 v2.3.4 版本发布,免费的可视化 AI 报表
人工智能·低代码·数据可视化·报表工具
a752066281 天前
飞书机器人+OpenClaw(小龙虾)本地AI:从创建应用到配置AppID/Secret全流程
人工智能·机器人·飞书·openclaw·小龙虾 ai·本地 ai 智能体
SuniaWang1 天前
AgentX 专栏-00前言:一个Java开发者的Agent实践之路
java·人工智能·spring boot·langchain·系统架构
koharu1231 天前
PointRCNN 精解:从原始点云到三维框的两阶段检测
人工智能·深度学习·目标检测·3d·三维点云
aneasystone本尊1 天前
把小龙虾装进口袋:iOS / Android Node 配对
人工智能
梦想的初衷~1 天前
claude code、codex双AI协同高水平论文撰写与质量校准:数据分析→论文初稿→交叉审稿全流程
人工智能·生物信息·实战教程·临床医学·claude code·codex cli·认知颠覆
@蔓蔓喜欢你1 天前
GraphQL 入门:API 开发的新范式
人工智能·ai
南屹川1 天前
【架构设计】设计模式实战与应用:从理论到代码实现
人工智能
梦想的颜色1 天前
LangGraph与智能体:当AI学会了“思考图谱”,离真正干活还有多远?
人工智能