在山東大學軟件學院的項目實訓中,團隊成員們圍繞基于大模型的模擬面試系統展開了一系列開發與優化工作。以下是本周項目的核心進展與成果總結。
前端界面優化與 Bug 修復(吳尤)
Logo 顯示問題修復
在項目開發過程中,團隊發現項目左上角的 SVG 格式 logo 存在兩個主要問題:一是經常遮擋博客標題的輸入區域;二是點擊 logo 外圍透明區域時也會觸發返回主頁的操作。通過使用專業的 SVG 編輯工具(如 Adobe Illustrator 或 Inkscape)進行圖形裁剪,導出優化后的 SVG 文件,成功解決了這些問題,修復后點擊熱區與可視圖形完全匹配,不再遮擋標題區域。
按鈕消失 Bug 修復
當用戶選中任意面試話題、刪除該話題記錄時,底部“新建面試對話”按鈕會消失。經過代碼審查發現,handleDeleteRecord
方法中存在邏輯缺陷,刪除當前激活記錄時將 currentInterviewer
誤設為 null,導致按鈕顯示條件失效。修改后的核心邏輯不再重置 currentInterviewer
,修復了這一問題,按鈕在刪除操作后保持正常顯示,用戶體驗得到改善。
導航欄視覺升級
原導航欄存在純文字菜單缺乏視覺引導、層級結構不夠清晰、不符合現代 UI 設計趨勢等問題。團隊為導航欄添加了圖標系統,使用 Element UI 內置圖標庫,保持一致的右邊距,按功能類別選擇語義化圖標。同時,增加了垂直間距,使用更現代的字體組合,添加平滑的 hover 動畫效果,提升了導航欄的視覺效果和用戶體驗。
名稱截斷處理
對于可能過長的名稱顯示,團隊采用了統一的截斷方案,保留完整 tooltip 提示,并適配響應式布局,確保了界面的整潔性和信息的完整展示。
面試官和面試記錄分享功能開發(李一銘)
卡片渲染
開發了面試官和面試記錄的卡片渲染功能,使用 Element UI 的卡片組件展示面試官和面試記錄的信息。面試官卡片顯示面試官的頭像、名稱和描述,面試記錄卡片顯示面試記錄的主題、面試官名稱和操作按鈕。用戶可以通過點擊按鈕獲取面試官或面試記錄,增強了系統的互動性。
前后端對接
實現了獲取分享的面試官信息和面試記錄的前后端對接。前端通過調用后端的 /api/share/interviewShareToUser
和 /api/share/chatShareToUser
接口,將面試官或面試記錄的 ID 傳遞給后端。后端接收到請求后,將對應的面試官或面試記錄數據復制到當前用戶的賬戶下,并返回成功提示。這一功能的實現,使得用戶可以方便地分享和獲取優質的面試官和面試記錄資源。
數據處理與標簽優化(孫旭)
標簽層次結構設計方案
在微調算法題推薦功能的開發過程中,團隊面臨了微調數據中特征屬性過多、標簽分布稀疏的問題。經過研究和比較,選擇了標簽層次結構設計方案,通過手動設計多層次的標簽體系,將原始標簽歸類到不同的類別和子類別中。這一方案不僅保留了原始標簽的語義信息,結構清晰,易于理解和維護,還符合領域專家的認知方式,更貼合實際應用場景。通過實現標簽層次結構,解決了標簽稀疏性問題,提高了推薦精度,增強了系統的可解釋性。
方案比較:研究了三種可能的解決方案,包括PCA + 特征選擇組合、卷積神經網絡(CNN)+ 聚類、標簽層次結構設計。最終選擇了標簽層次結構設計方案,因為它更符合算法和數據結構領域的層次關系,且系統需要保持結果的可解釋性。
標簽層次結構實現:通過代碼實現了標簽層次結構,包括關鍵標簽篩選、層次化特征生成等步驟。代碼中定義了核心算法標簽列表和層次化映射字典,通過分析標簽重要性、選擇重要標簽、創建層次化特征等步驟,將原始標簽優化為更有效的特征體系。
主處理流程框架:描述了整個特征處理的總控流程,包括數據讀取、基本統計、特征分配策略、核心標簽篩選、層次特征生成、結果保存等步驟,并計算了信息保留度。
關鍵標簽篩選策略:采用三重機制篩選核心標簽,優先選擇關鍵算法標簽,然后是高頻標簽和高共現標簽。
層次化特征生成:將非關鍵標簽按邏輯分類聚合,使用反向映射機制和層次化規則,過濾低頻類別。
數據分析與驗證:包括標簽共現矩陣計算、完整性檢查、信息保留率驗證等,確保處理結果的質量。
詳細報告生成:生成可追溯的處理日志,包括關鍵標簽保留清單、層次化標簽的組成說明、被合并標簽的映射關系等。
MCP服務器工具改進
修改了MCP服務器中的工具函數,增強了題目推薦的精準度。通過調用工具函數“generate_problem_selection_prompt”,根據面試表現和簡歷信息生成算法題選擇提示。
在面試官AI的提示詞模板中增加了對這些工具的調用說明,使AI能夠在合適的時機根據候選人的表現調用相應的工具函數。
題目管理與數據統計功能完善(吳浩明)
題目添加功能
實現了題目的添加功能,豐富了題庫內容。在后端的 ProblemController.java
中,完善了題目的添加邏輯,通過接收前端傳遞的 ProblemDTO
對象,并進行參數校驗、設置默認值、創建時間和更新時間等操作,最后調用服務層的方法將題目信息持久化到數據庫。前端的 add.vue
文件中,使用 Element UI 組件構建了題目添加的表單,實現了數據雙向綁定和表單校驗規則,并通過調用后端接口發送 POST 請求完成題目的添加。
數據統計功能
完成了用戶練習情況、題目通過率等關鍵指標的統計與展示。在后端的 ProblemServiceImpl.java
中,實現了用戶練習情況的統計邏輯,查詢當前用戶的所有提交記錄,統計用戶已接受的題目 ID 集合和已嘗試的題目 ID 集合,以及題目總數,并將統計結果封裝到 Map 中返回。前端的 index.vue
文件中,通過調用后端接口獲取統計數據,并使用 Element UI 的卡片和進度條組件展示總題數、已解決和嘗試過的題目數量及其對應的比率。同時,對統計準確性進行了修正,確保只統計可見的題目,并移除了 Redis 緩存邏輯,改為直接從數據庫讀取數據,保證了數據的實時性。
判題邏輯優化
調整了獲取用戶提交記錄的邏輯,不再進行 distinct
操作,確保 acceptedProblemIds
根據題目 ID 進行去重且提交狀態為 ACCEPTED
,attemptedProblemIds
根據題目 ID 進行去重且不限制提交狀態。這一優化提高了判題的準確性和效率。
題目總數統計修正
修正了題目總數統計邏輯,確保只統計可見的題目,避免了因統計不準確導致的用戶困惑和系統專業性受損。
緩存策略調整
移除了數據統計功能中的 Redis 緩存邏輯,改為直接從數據庫讀取數據,以保證數據的實時性。這一調整雖然可能會略微增加數據庫的訪問壓力,但確保了用戶看到的統計數據是最新的,提升了系統的可靠性和用戶體驗。
AI面試官及與AI的聊天記錄分享(王博凡)
這篇文章主要介紹了山東大學軟件學院項目實訓中,基于大模型的模擬面試系統的AI面試官與聊天記錄分享功能的設計與實現。以下是文章的核心內容總結:
功能概述
用戶可以將自己創建或使用過的AI面試官及與AI的聊天記錄,通過文章的形式分享給其他用戶。
其他用戶可以查看分享的AI資源,并一鍵將其添加到自己的賬戶下使用。
分享的內容以“快照”形式存在,即分享出去的是一個獨立副本,原作者后續的修改不影響已分享的內容,反之亦然。
數據結構設計
新增ShareReference
表:存儲文章與分享的AI資源(面試官/聊天記錄快照)之間的關聯關系。
擴展ArticleDTO
:增加用于承載分享內容的列表,分別用于存儲聊天記錄快照和面試官快照。
核心流程設計
用戶選擇要分享的AI面試官或聊天記錄。
系統對每個被選中的資源執行深度拷貝操作,生成獨立副本(快照),并與特定的系統用戶關聯。
創建新的ShareReference
記錄,關聯文章ID、快照類型和快照ID。
如果是更新文章,會先刪除舊的ShareReference
記錄及舊快照數據,再創建新的快照和關聯。
通過文章ID查詢ShareReference
表,獲取關聯的分享項。
根據type
和對應的chatId
或interviewerId
,獲取快照的詳細信息。
在前端以卡片樣式展示分享的AI資源,提供預覽信息和“添加到我的”按鈕。
前端將快照ID和類型傳遞給后端API。
后端調用相應的deepCopy
服務,將快照內容復制到當前登錄用戶的賬戶下。
用戶獲得一個屬于自己的、全新的副本,可自由修改,不影響原始快照。
深度拷貝機制
為目標用戶在Milvus中創建新的Collection。
遍歷源知識庫中的文件,重新解析文件內容,分割成文本塊,生成向量。
將新的KnowledgeRecord
批量插入到新的Collection中。
- 更新MongoDB中的
MilvusDatabase
和MilvusFile
元數據。
調用milvusService.deepCopy
復制知識庫,獲取新的知識庫ID。
創建新的Interviewer
對象,設置新知識庫ID和其他屬性。
保存新的Interviewer
對象。
調用interviewerService.deepCopy
復制關聯的面試官,獲取新的面試官ID。
創建新的ChatRecords
對象,關聯新的面試官ID和目標用戶ID。
保存新的ChatRecords
以獲得其ID。
遍歷源聊天記錄的所有Branch
,調用branchDeepCopy
復制每個分支及其消息。
處理children
(子分支ID列表)的映射,確保它們指向新復制的子分支ID。