开发博客:AI面试官个性化出题MCP功能最终完善

本周作为项目开发的最后冲刺阶段,我们致力于进一步增强AI面试官在个性化题目生成方面的能力。核心工作是新增和优化了一系列MCP(Multi-turn Conversation Protocol)工具,旨在为AI面试官提供更丰富、更精准的用户画像和知识背景,从而生成更具针对性的面试题目。

目前整个MCP工具链的结构如下:
在这里插入图片描述

本周主要完成的MCP功能模块包括:query_user_submission_statsquery_user_articles,以及search_articles_by_keyword。以下将对这些功能进行详细说明。

1. query_user_submission_stats:用户答题数据统计

  • 功能描述: 此工具通过分析用户在在线判题系统(OJ)中的答题记录,评估用户的代码熟练度和能力水平。统计信息包括用户尝试过的题目总数、成功解答的题目总数,以及成功解答题目按难度(简单、中等、困难)的分布情况。
  • 实现逻辑:
    1. 工具接收用户ID(userId)作为输入。首先对userId进行校验,确保其为有效的整型数字字符串。
    2. oj_code_submission数据库表中查询指定用户的所有提交记录,提取problem_idstatus
    3. 使用Set数据结构统计用户尝试过的所有题目ID(attemptedProblemIds)和状态为“accepted”的题目ID(acceptedProblemIds),以实现自动去重。
    4. 若用户有成功解答的题目(acceptedProblemIds不为空),则进一步从oj_problem表中查询这些已通过题目的难度(difficulty)。
    5. 根据查询到的难度信息,统计“简单”、“中等”、“困难”各自的数量。
    6. 最终返回一个包含总尝试题目数(totalAttempted)、总通过题目数(totalAccepted)以及按难度分类的通过题目数(acceptedByDifficulty)的JSON对象。
    7. 包含完整的错误处理机制,如无效userId或数据库查询失败等情况。
  • 价值: AI面试官可以利用这些数据了解候选人的实际编程能力和薄弱环节,从而调整面试题目的难度和类型,实现更精准的考察。
  • 代码实现:
    server.tool("query_user_submission_stats","统计用户的答题记录信息,包括已完成题目数和完成题目的按难度分类统计",{userId: z.string().describe("用户ID,为整形数字的字符串格式"),},async ({ userId }) => {try {const mysqlPool = getMySQL();const userIdInt = parseInt(userId);if (isNaN(userIdInt)) {return {content: [{ type: "text", text: `无效的userId格式: ${userId}` }],isError: true};}// 获取用户的提交记录const [submissions] = await mysqlPool.query(`SELECT problem_id, status FROM oj_code_submission WHERE user_id = ?`, [userIdInt]);// 统计已尝试和已通过的题目const attemptedProblemIds = new Set();const acceptedProblemIds = new Set();const ACCEPTED_STATUS = "accepted";for (const submission of submissions) {const problemId = submission.problem_id;// 所有提交过的题目ID(自动去重)attemptedProblemIds.add(problemId);// 仅添加ACCEPTED状态的题目ID(自动去重)if (ACCEPTED_STATUS.toLowerCase() === submission.status.toLowerCase()) {acceptedProblemIds.add(problemId);}}// 查询已通过题目的难度分布const acceptedProblemsList = Array.from(acceptedProblemIds);let difficultyStats = {easy: 0,medium: 0,hard: 0};if (acceptedProblemsList.length > 0) {const [problemDifficulties] = await mysqlPool.query(`SELECT id, difficulty FROM oj_problem WHERE id IN (?)`, [acceptedProblemsList]);// 按难度统计for (const problem of problemDifficulties) {const difficulty = problem.difficulty ? problem.difficulty.toLowerCase() : 'unknown';if (difficulty === '简单') difficultyStats.easy++;else if (difficulty === '中等') difficultyStats.medium++;else if (difficulty === '困难') difficultyStats.hard++;}}// 构建统计结果const stats = {totalAttempted: attemptedProblemIds.size,totalAccepted: acceptedProblemIds.size,acceptedByDifficulty: difficultyStats};return {content: [{ type: "text", text: JSON.stringify(stats, null, 2) }]};} catch (error) {console.error(`查询用户答题统计时发生错误: ${error.message}`);return {content: [{ type: "text", text: `查询用户答题统计时发生内部错误: ${error.message}` }],isError: true};}}
    );
    

2. query_user_articles:用户论坛发帖分析

  • 功能描述: 该工具用于检索并分析用户近期在社区论坛中发布的文章。目的是从用户的发帖内容中提取其关注的技术方向、感兴趣的公司、讨论过的面试题目等信息,作为个性化出题的参考。
  • 实现逻辑:
    1. 工具接收用户ID(userId)作为输入,并进行有效性校验。
    2. 通过联合查询forest_article(文章主表)和forest_article_content(文章内容表),获取指定article_author_id用户的最多20篇最新发布的文章,包括文章标题、标签、浏览/评论/点赞数、创建时间、预览内容及完整内容。
    3. 若未找到用户文章,则返回相应提示。
    4. 如果查询到文章,且配置了DashScope的API密钥(DASHSCOPE_API_KEY)和应用ID(DASHSCOPE_SUM_APP_ID),则将获取的文章数据(JSON格式)作为输入,调用DashScope大模型服务进行内容分析和总结。Prompt中指定为“模式一以分析下面内容”。
    5. AI服务返回对用户发帖内容的提炼信息,该信息将作为出题参考返回。
    6. 若AI调用失败、未配置API密钥或应用ID,则直接返回原始查询到的文章数据(JSON格式)。
    7. 包含数据库查询和AI服务调用的错误处理。
  • 价值: 通过用户自身的言论,AI面试官能更深入地了解候选人的求职意向、技术栈偏好以及对特定问题的看法,为生成高度个性化的面试场景和问题提供素材。
  • 代码实现:
    server.tool("query_user_articles","根据用户ID获取该用户发布文章,用于作为用户个性化问题出题参考",{userId: z.string().describe("用户ID,为整形数字的字符串格式"),},async ({ userId }) => {try {const mysqlPool = getMySQL();const userIdInt = parseInt(userId);if (isNaN(userIdInt)) {return {content: [{ type: "text", text: `无效的userId格式: ${userId}` }],isError: true};}// 联合查询获取用户的文章及其内容const [articles] = await mysqlPool.query(`SELECT a.id, a.article_title, a.article_tags, a.article_view_count,a.article_comment_count,a.article_thumbs_up_count,a.created_time,a.article_preview_content,c.article_contentFROM forest_article aLEFT JOIN forest_article_content c ON a.id = c.id_articleWHERE a.article_author_id = ?ORDER BY a.created_time DESCLIMIT 20`, [userIdInt]);if (!articles || articles.length === 0) {return {content: [{ type: "text", text: `未找到用户ID为${userId}的文章` }]};}// 调用AI处理查询结果const apiKey = process.env.DASHSCOPE_API_KEY;const appId = process.env.DASHSCOPE_SUM_APP_ID;if (!apiKey || !appId) {console.error('DashScope API Key or App ID not configured.');return {content: [{ type: "text", text: JSON.stringify(articles, null, 2) }]};}const url = `https://dashscope.aliyuncs.com/api/v1/apps/${appId}/completion`;const data = {input: {prompt: `以模式一以分析下面内容:\n${JSON.stringify(articles)}`},parameters: {},debug: {}};try {const response = await axios.post(url, data, {headers: {'Authorization': `Bearer ${apiKey}`,'Content-Type': 'application/json'}});if (response.status === 200 && response.data.output && response.data.output.text) {return {content: [{ type: "text", text: "获取到以下信息作为你的出题参考"+response.data.output.text }]};} } catch (aiError) {console.error(`Error calling DashScope: ${aiError.message}`);// 如果AI调用失败,返回原始查询结果return {content: [{ type: "text", text: JSON.stringify(articles, null, 2) }]};}} catch (error) {console.error(`查询用户文章时发生错误: ${error.message}`);return {content: [{ type: "text", text: `查询用户文章时发生内部错误: ${error.message}` }],isError: true};}}
    );
    

3. search_articles_by_keyword:社区内容关键词检索

  • 功能描述: 此工具允许根据特定关键词(如目标公司名称“阿里”、“腾讯”等)在社区论坛中搜索相关的文章,如面经分享、技术探讨、解题思路等,为AI面试官提供针对性的出题参考。
  • 实现逻辑:
    1. 工具接收搜索关键词(keyword)作为输入,并校验关键词非空。
    2. 构建SQL的LIKE查询模式(%keyword%),在forest_article表的article_title字段和forest_article_content表的article_content字段中进行模糊匹配。
    3. 查询并返回按创建时间倒序排列的最多20篇相关文章,包含与query_user_articles类似的字段信息。
    4. 若未找到匹配文章,则返回相应提示。
    5. query_user_articles类似,如果查询到文章且配置了DashScope服务,则将文章数据发送给大模型进行分析总结。Prompt中指定为“模式二以分析下面内容”。
    6. AI服务返回对搜索结果的提炼信息,作为出题参考。
    7. 若AI调用失败、未配置或关键词无效,则返回原始文章数据或错误信息。
    8. 包含数据库查询和AI服务调用的错误处理。
  • 价值: 当AI面试官需要针对特定公司或技术领域出题时,此工具能快速从社区中聚合相关的高价值信息,确保面试问题的前沿性和针对性,例如了解某公司常考的知识点或最新的技术趋势。
  • 代码实现:
    server.tool("search_articles_by_keyword","根据企业相关关键词(如阿里,腾讯)获取社区中提及相关出题知识点,用于作为出题参考",{keyword: z.string().describe("搜索关键词"),},async ({ keyword }) => {try {if (!keyword || keyword.trim() === "") {return {content: [{ type: "text", text: "搜索关键词不能为空" }],isError: true};}const mysqlPool = getMySQL();const searchKeyword = `%${keyword}%`; // 构建LIKE匹配模式// 联合查询匹配标题或内容的文章const [articles] = await mysqlPool.query(`SELECT a.id, a.article_title, a.article_tags, a.article_view_count,a.article_comment_count,a.article_thumbs_up_count,a.created_time,a.article_preview_content,c.article_contentFROM forest_article aLEFT JOIN forest_article_content c ON a.id = c.id_articleWHERE a.article_title LIKE ? OR c.article_content LIKE ?ORDER BY a.created_time DESCLIMIT 20`, [searchKeyword, searchKeyword]);if (!articles || articles.length === 0) {return {content: [{ type: "text", text: `未找到包含关键词"${keyword}"的文章` }]};}// 调用AI处理查询结果const apiKey = process.env.DASHSCOPE_API_KEY;const appId = process.env.DASHSCOPE_SUM_APP_ID;if (!apiKey || !appId) {console.error('DashScope API Key or App ID not configured.');return {content: [{ type: "text", text: JSON.stringify(articles, null, 2) }]};}const url = `https://dashscope.aliyuncs.com/api/v1/apps/${appId}/completion`;const data = {input: {prompt: `以模式二以分析下面内容:\n${JSON.stringify(articles)}`},parameters: {},debug: {}};try {const response = await axios.post(url, data, {headers: {'Authorization': `Bearer ${apiKey}`,'Content-Type': 'application/json'}});if (response.status === 200 && response.data.output && response.data.output.text) {return {content: [{ type: "text", text:"获取到以下信息作为你的出题参考"+ response.data.output.text }]};} } catch (aiError) {console.error(`Error calling DashScope: ${aiError.message}`);// 如果AI调用失败,返回原始查询结果return {content: [{ type: "text", text: JSON.stringify(articles, null, 2) }]};}} catch (error) {console.error(`关键词搜索文章时发生错误: ${error.message}`);return {content: [{ type: "text", text: `关键词搜索文章时发生内部错误: ${error.message}` }],isError: true};}}
    );
    

代码集成说明

上述三个核心功能均已通过server.tool方法在服务端进行了注册。每个工具都明确了其名称、功能描述、输入参数模式(使用zod进行定义和校验)以及异步执行函数。这种模块化的工具设计,使得AI面试官能够根据对话上下文和面试需求,灵活地调用这些外部能力。代码实现细节已在各功能模块中展示。

本周工作总结与意义

通过本周新增的这三个MCP工具,AI面试官获取个性化信息的能力得到了显著加强:

  1. 更精准的能力评估: 基于用户的实际刷题数据,准确判断其编程水平。
  2. 更深入的意向洞察: 通过分析用户发帖,了解其技术偏好和求职目标。
  3. 更相关的知识获取: 结合社区中关于目标公司的热门讨论,使面试题目更贴近实际。

这些工具的组合使AI面试官能够构建一个更全面的用户画像,从而设计出既能考察核心能力,又能体现候选人特点和意向的面试流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/83819.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/83819.shtml
英文地址,请注明出处:http://en.pswp.cn/web/83819.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rabbitmq后台无法登录问题解决

rabbitmq pod正常运行,查看pod日志也没有发现异常报错。 我们进入容器查看插件是否正常启用: $ kubectl exec -it rabbitmq-hitch-0 -n rabbitmq -- rabbitmq-plugins list Listing plugins with pattern ".*" ...Configured: E explicitly…

期权入门介绍

文章目录 1.基本概念2.期权损益图买入看涨期权卖出看涨期权买入看跌期权卖出看跌期权 3.买卖逻辑3.1 买卖逻辑买入看涨期权卖出看涨期权买入看跌期权卖出看跌期权 3.2 决策依据 4.行权方式美式期权 (American Style)欧式期权 (European Style)百慕大期权 (Bermudan Style)关键区…

useMemo vs useCallback:React 性能优化的两大利器

文章目录 什么是 useMemo?基本语法使用场景实际例子 什么是 useCallback?基本语法使用场景实际例子 核心区别对比什么时候使用它们?使用 useMemo 的时机使用 useCallback 的时机 常见误区和注意事项误区 1:过度使用误区 2&#xf…

C++ 记录

1. 字符串查找字符 bool findMap(char ch){string mapper "aeiouAEIOU";return mapper.find(ch) ! string::npos;} 2.substr函数 string substr(size_t pos 0, size_t len npos) const; 3.to_string && stoi 函数 iota 填充一个范围&#xff0…

朴朴超市小程序 sign-v2 分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 部分python代码 cp execjs.compile(…

Azure 机器学习初学者指南

Azure 机器学习初学者指南 在我们的初学者指南中探索Azure机器学习,了解如何设置、部署模型以及在Azure生态系统中使用AutoML & ML Studio。Azure 机器学习 (Azure ML) 是一项全面的云服务,专为机器学习项目生命周期而设计&am…

HTML 从入门到起飞 · 系列合集:一站式学习不掉线

一、💻计算机基础 🌟艾伦麦席森图灵🌟 ⚔️ 二战时期,破译了德军的战争编码——英格玛。 🕊️ 让二战提前2年结束,拯救了上千万人的生命。 🏆 设立图灵奖,被后人誉为:&qu…

NodeJS的yarn和npm作用和区别,为什么建议用yarn

一、yarn和npm作用和区别 yarn异步执行安卓,npm同步执行安装 yarn会复用,已经安装的不会再次安装。不过新版npm已经解决了。 Yarn安装信息干净一点,npm会罗列包信息 下面是关于 Node.js 中 npm 和 yarn 的完整对比与说明,帮你…

青少年编程与数学 01-011 系统软件简介 19 SSMS 数据库管理工具

青少年编程与数学 01-011 系统软件简介 19 SSMS 数据库管理工具 一、历史发展二、技术特色三、主要功能四、应用场景五、产品版本六、使用方法七、市场地位八、发展前景全文总结 **摘要:**SSMS 是微软开发的数据库管理工具,首次引入于 SQL Server 2005&a…

React配置别名路径完整指南

文章目录 什么是别名路径配置方法1. Create React App 项目方法一:使用jsconfig.json(推荐)方法二:使用CRACO(React App Rewired的替代方案) 2. Vite 项目修改vite.config.js配置TypeScript支持 3. Next.js…

本周大模型新动向:自主机器学习、状态机推理、上下文压缩

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 Sentinel: Attention Probing of Proxy Models for LLM Context Compression with an Understanding Perspective 检索增强型生成(RAG)通过外部上下文增强了大型语言模型(…

从零开始掌握 Docker:核心命令与实践指南

从零开始掌握 Docker:核心命令与实践指南 摘要: 本文系统整理了 Docker 的核心概念与常用命令,涵盖镜像管理、容器操作、数据存储、网络配置、Compose 编排以及 Dockerfile 构建等内容。通过清晰的命令示例和实用说明,帮助开发者…

RDMA简介7之RoCE v2可靠传输

可靠传输技术旨在通过多种方法确保数据包在传输过程中不会丢失或损坏,同时保证数据包按发送顺序到达接收端,其要求在链路发生丢包或网络发生拥塞等情况下能够完全保证数据包的正确性同时尽可能地提高传输速率。RoCE v2协议实现可靠传输的技术手段共有三种…

java33

1.特殊文件 属性文件properties 配置文件xml 注意:XML文件可以直接在浏览器里面打开: 了解知识: 2.日志技术 3.单元测试 注意:点击方法内部再右键运行是测试改方法的,点击类名再右键运行才是测试整个测试类的&#xff…

OSI 七层网络模型

目录 OSI 七层网络模型七层模型1. 物理层(Physical Layer)2. 数据链路层(Data Link Layer)3. 网络层(Network Layer)4. 传输层(Transport Layer)5. 会话层(Session Layer…

Spring Boot 4.0.0 新特性详解:深入解读 Spring Framework 7.0.0

你是否注意到创建新 Spring Boot 项目时出现的最新选项?Spring Boot 4.0.0 预览版现已发布,基于最新的 Spring Framework 7.0.0 🌱。这个版本引入了众多激动人心的新特性,不仅提升了开发效率,改善了空值安全性,还简化了 Web 应用程序的开发流程。本文将深入探讨这些重要…

从0到1构建高并发秒杀系统:实战 RocketMQ 异步削峰与Redis预减库存

🚀从0到1构建高并发秒杀系统:实战 RocketMQ 异步削峰与Redis预减库存 📖一、 简介 在电商、抢票等高并发场景中,秒杀系统面临着“高并发、库存稀缺、易超卖、系统易崩”的严峻挑战。传统的同步处理架构难以支撑海量请求并发下的性…

OpenCV CUDA模块图像变形------对图像进行任意形式的重映射(Remapping)操作函数remap()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数根据给定的映射表 xmap 和 ymap 对图像进行 任意形式的重映射(Remapping)操作,是 GPU 加速版本的图像几…

PC 端常用 UI 组件库

一、前言 随着企业级应用、后台管理系统、数据平台等项目的不断发展,前端开发已经不再局限于移动端和响应式布局,而是越来越多地聚焦于 PC 端系统的构建。为了提升开发效率、统一设计风格并保障用户体验,使用成熟的 UI 组件库 成为了现代前端…

pikachu靶场通关笔记31 文件包含02之远程文件包含

目录 一、文件包含功能 二、文件包含Vulnerability 二、远程文件包含 三、环境配置 1、进入靶场 2、搭建环境 (1)定位php.ini文件 (2)修改php.ini文件 四、源码分析 五、渗透实战 1、选择科比 2、执行phpinfo &…