山東大學軟件學院項目實訓-基于大模型的模擬面試系統-個人博客(十)

開發博客: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 &…