)
OpenMAIC PBL v2 結課報告生成器evaluator-final 提示詞的結構化輸出契約與工程實現(xiàn)【免費下載鏈接】OpenMAICOpen Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click項目地址: https://gitcode.com/GitHub_Trending/op/OpenMAIC本篇技術指南以 OpenMAIC 倉庫中 PBL v2 教學引擎的最終評估系統(tǒng)提示詞 evaluator-final.md 為骨架剖析「整項目完結報告Completion Report」是如何由 LLM 生成、解析并持久化的從嚴格 JSON 輸出契約、四類字段的取值規(guī)范到stars星級校準刻度、what_you_built/what_you_learned的反幻覺寫作規(guī)則再到與之配套的 SSE 流式評估 Agent、JSON Tail 解析器和場景化role-play變體。讀完你將掌握 PBL v2 最終評估的完整鏈路并能在自己的多智能體教學或評估系統(tǒng)中復用這套「敘事 結構化尾巴」的提示詞工程模式。背景PBL v2 的三層評估體系與結課報告的位置在進入提示詞本身之前先厘清它的上下文。OpenMAIC 的 PBL v2Project-Based Learning項目式學習引擎中Evaluator Agent 有三種評估模式共享同一套流式模式見 agents/evaluator.ts 頂部注釋模式觸發(fā)時機產(chǎn)出驅動 UIrunTaskEvaluation一個微任務microtask帶提交完成后短反饋 {strengths, improvements, score?}JSON 尾巴微任務級反饋runMilestoneEvaluation一個里程碑milestone的最后一個微任務推進后反思卡片敘事 {learned, performance, stars}JSON 尾巴MilestoneCard 反思卡片runFinalEvaluation最后一個里程碑完成后短引言敘事 {stars, what_you_built, what_you_learned, whats_next}JSON 尾巴Completion 結課頁 Hero 區(qū)本文的主角evaluator-final.md正是runFinalEvaluation的系統(tǒng)提示詞。它專門負責為剛完成整個 PBL 項目的學習者撰寫結課報告。為什么需要一個獨立 Agent而不是在 Instructor 上加一個工具源碼注釋給出了兩條理由其一系統(tǒng)提示詞基調不同——評估者走「反思 / 報告」語氣與教學語氣是沖突的共用一套提示詞會自我打架其二輸出契約不同——評估者是「敘事 JSON 尾巴」的固定結構而 Instructor 是帶工具調用的對話式回復。此外獨立的 SSE 調用讓前端可以把「導師正在生成階段反饋…」渲染為獨立階段而不是神秘的多余 Instructor 回合。第一要義這是「頁面」而非「聊天氣泡」提示詞開頭就劃定了渲染約束This report is rendered as a dedicated page —NOTa chat bubble — so the structured bullets ARE the main content. Your narrative paragraph is just a short, warm intro at the top of that page.這決定了整份提示詞的寫作策略結構化列表才是主體內容敘事段落只是頁面頂部一段簡短、溫暖的開場白。因此字段規(guī)則中反復強調「不要重復列表內容」「保持敘事緊湊」。在源碼層面這與評估 Agent 的流式策略完全對應。runShared中設定了shouldStreamTokens false——評估輸出是 JSON-only 的且只有在結構化載荷持久化后才會渲染因此原始 JSON 不會流式進入聊天見 agents/evaluator.ts。也就是說結課報告的文本流在「確認 JSON 尾巴可解析」之前是不對學習者暴露的保證學習者永遠不會看到一段未成型的 JSON 或半截敘事。輸出契約唯一的、嚴格形狀的 JSON 對象提示詞規(guī)定輸出的硬性形狀{feedback: ..., stars: 4.5, what_you_built: [..., ..., ...], what_you_learned: [..., ..., ...], whats_next: ...}附帶三條輸出格式鐵律只輸出一個合法的 JSON 對象JSON 之外不得有任何散文不要用 markdown 包裹不要用json代碼圍欄字段名嚴格如上不可改名、不可增刪。當然LLM 在實際推理中并不總是遵守「裸 JSON」的要求。這正是工程側要兜底的地方——倉庫中 eval-tail-parser.ts 的存在意義。它專門處理三類業(yè)界常見的「不聽話」輸出LLM 輸出圍欄包裹的 JSON、裸 JSON、或「散文 JSON」混合 → 復用 OpenMAIC 共享的 JSON 修復解析器parseJsonResponse通過parseEvaluationTail從多個候選全文、任意圍欄內容、尾部平衡花括號段中自后向前找到最后一個可解析對象圍欄內 JSON 本身畸形 → 同樣走共享修復邏輯只有完全無法恢復對象時才返回null字段值類型不合法見下節(jié)→ 通過各normalize*函數(shù)鉗制與歸一。而且這是有歷史教訓的注釋明確寫道這是 v1 倉庫Python 版評估器踩過的坑——同樣的三類失敗模式當時迭代修復了很久PBL v2 一次性全部編碼進解析器里。四個字段的取值規(guī)則feedback23 句的開場敘事提示詞給出的結構是一句話點出學習者具體做了什么用學習者自己的話描述的項目標題 一句話概括它做什么一到兩句突出一個具體高光時刻某個恢復過來的報錯、某個突然想通的概念、某個提速的階段——必須從下方 engagement rollup 取材不得編造細節(jié)若「Integrative checks (stage synthesis)」部分含有學習者的作答則優(yōu)先以此為高光明確表揚學習者如何跨階段/跨項目連接了概念并以記錄的問答為根據(jù)簡短引用或轉述。若沒有記錄作答絕不虛構。同時明確禁止標題、列表符號、長弧線敘事from beginning to end...、結尾號召。stars0-5 半星刻度的星級校準stars是頁面以星星圖標渲染的視覺評分不是 /5 分母步進為 0.5。提示詞給出了與里程碑卡片一致的校準刻度星級含義5.0自信流暢完成4.5大體順利有一兩個小磕絆4.0扎實遇到預期內的障礙并干凈利落地恢復不確定時的默認值3.5明顯掙扎但在提示下最終達成3.0大量來回反復 3.0出現(xiàn)多個未解決的錯誤時工程側的normalizeStarseval-tail-parser.ts對這個字段做了完整防御接受干凈數(shù)字4.5、3、數(shù)字字符串4、4.5/5或4.5 / 5形式的分數(shù)串取分子越界值鉗制到[0, 5]NaN/Infinity/ 非數(shù)字字符串如good、4 stars/null/ 對象 / 數(shù)組一律拒絕返回null最終Math.round(clamped * 2) / 2保證半星步進。解析失敗時 UI 干凈地隱藏評分而不是渲染一個錯誤值。what_you_built3-5 條具體成果名詞短語要求學習者能一眼認出的名詞短語? 一個能猜數(shù)字的命令行小游戲? 用戶輸入名字后會個性化打招呼? Working Python script太抽象? main.py只有文件名第一條必須是整個項目其余為關鍵功能/能力。工程側normalizeStringListeval-tail-parser.ts過濾非字符串、去空、剔除模板占位符并截斷到最多 6 條persistEvaluation傳入6防止失控的 LLM 撐爆存儲。what_you_learned3-5 條學習者自己的話——最容易造假、被重點防范的字段提示詞用相當篇幅原文最大的規(guī)則塊強調這是最常被垃圾內容偽造的字段?禁止任何像函數(shù)名、snake_case 標簽、內部簽名的東西。舉例python_install_verified、if_elif_else_number_comparison、while_break_loop——這些是內部埋點標簽絕不允許出現(xiàn)在這里?禁止學習者自己沒使用過的行話Conditional control flow、Loop invariants、Variable scoping? 允許用 if/else 讓程序根據(jù)輸入做出不同反應? 允許看到紅色報錯不再慌張會逐行讀錯誤信息找出問題。具體操作指令是把 engagement rollup 里concepts_unlocked的內部簽名翻譯成學習者語言的自然句子禁止原樣粘貼簽名。此外若存在整合性階段檢查integrative stage-check的作答至少一條what_you_learned應承認學習者做出的跨階段連接。whats_next1-2 句、指向具體下一步禁止泛泛而談keep learning!要基于剛做完的東西推薦具體的下一個項目或擴展方向。證據(jù)從哪來user 側提示詞的真實數(shù)據(jù)裝配系統(tǒng)提示詞負責定規(guī)則而user側則由buildFinalEvalPrompt組裝證據(jù)見 eval-prompts.ts。它拼接了四個數(shù)據(jù)塊項目信息project.titleproject.description各里程碑反思卡片Per-milestone reflection cards取每個 milestone 最新的kind milestone評估帶上strengths截前 4 條、stars、以及截斷到 280 字符的反饋散文——注釋強調要用敘事而非僅 strengths 列表因為「敘事捕捉了我們希望結課卡片回映的人性化時刻」engagement rollup 分析匯總formatProjectEngagementRollup聚合每個里程碑的時長、學習者輪次、錯誤數(shù)含重復錯誤、完成微任務數(shù)、closing-check 質量直方圖weak/ok/strong、去重后的概念集合等讓 LLM 有結構化事實依據(jù)而不是默認生成泛泛的 great work整合性檢查formatProjectSynthesisChecks從stage_synthesis_check事件或回退到收尾微任務的 closing_check / 緩存 engagement中取出核心概念、問題、學習者作答與質量標記明確標注數(shù)據(jù)來源。這正回應了提示詞中「從 engagement rollup 取材、不編造細節(jié)」的要求——系統(tǒng)把真實遙測以結構化文本喂給模型模型只能引用已有證據(jù)。從 LLM 輸出到持久化一次「部分成功優(yōu)于整體失敗」的容錯設計評估完成后的落庫邏輯在 agents/evaluator.ts 的persistEvaluation中先用parseEvaluationTail解析 JSON 尾巴解析失敗是非致命的仍持久化散文反饋學習者能看到 LLM 說了什么只是缺少結構化字段不渲染。注釋明言partial success beats throwing the whole evaluation away on a malformed JSON tailkind final分支將tail.what_you_built→whatYouBuilt、tail.what_you_learned→whatYouLearned、tail.whats_next→whatsNext通過normalizeStringList/normalizeOptionalString歸一然后調用addEvaluation寫入project.evaluations并追加evaluation_created運行時事件evaluation.ts類型層面types.ts 中PBLEvaluation的whatYouBuilt/whatYouLearned/whatsNext被標注為final-evaluation-only字段task / milestone 評估保持空值前端以kind final為鍵來決定是否渲染整個評估期間 Evaluator不調用任何工具僅在最后、JSON 尾巴解析成功后追加一次project.evaluations——這讓流式層保持簡單且解析失敗時項目保持原封不動。值得注意的一點任務評估task使用score0-100 整數(shù)而里程碑與最終評估使用stars0-5 半星。提示詞中明確禁止在結課報告里出現(xiàn)score//100字段也禁止使用 task 評估的strengths/improvements形狀——三種評估形態(tài)刻意不做統(tǒng)一而是讓 UI 依據(jù)kind分支渲染。場景化變體evaluator-final-scenario.md 與 act_goals當項目帶有scenario角色扮演/模擬場景配置時buildFinalEvalPrompt會切換系統(tǒng)提示詞到 evaluator-final-scenario.md并裝配完全不同的證據(jù)場景前提、角色扮演逐字記錄formatScenarioTranscript保留尾部 6000 字符預算、以及每幕act的目標清單scenarioActGoalsScaffold。這是「技能練習」而非「知識構建」的評估禁止談論 concepts/code/artefacts改為評判對話處理質量輸出契約多出一個act_goals數(shù)組。對齊是嚴格且基于索引的幕與幕之間按milestoneId對齊幕內每個結論按goalIndex對齊而非數(shù)組位置防止模型重排同幕目標導致結論錯掛normalizeActGoalscompletion-stats.ts要求模型返回的 goals 必須構成[0, N)的完美雙射每個索引恰好出現(xiàn)一次、在范圍內、狀態(tài)合法achieved/partial/missed任何一處不合規(guī)缺幕、目標數(shù)不對、越界/重復/缺失 goalIndex、非法狀態(tài)都返回undefined寧可讓結課頁回退到敘事 只讀目標列表也絕不展示錯標或虛構的記分卡目標文本、技能標簽、幕標題永遠來自項目數(shù)據(jù)LLM 只貢獻status和note從機制上杜絕它改寫或捏造目標。這一設計是「LLM 輸出永遠可以被平臺嚴格校驗」的極佳范例普通項目與場景項目的最終評估在提示詞、證據(jù)、輸出契約三層完全隔離互不污染。結課報告提示詞的工程要點回顧回到evaluator-final.md本身這套提示詞之所以值得復用在于它把「寫作質量」與「工程可控性」做了清晰分工敘事與結構化解耦頁面級渲染讓列表成為主體敘事限定 2-3 句既保證頁面信息密度又避免 LLM 長篇大論稀釋重點反幻覺顯式化「從 rollup 取材」「禁止內部簽名」「禁止學習者沒說過的話」「沒記錄就不虛構」全部寫成顯式規(guī)則并在 user 側用formatProjectEngagementRollup/formatProjectSynthesisChecks提供真實證據(jù)錨點數(shù)值規(guī)范提前編碼stars的 0.5 步進校準、范圍鉗制、非法值拒絕在提示詞與解析器normalizeStars中雙重定義保證 UI 永遠拿到干凈值失敗降級而非硬失敗JSON 尾巴解析失敗時保留散文學習者不會面對空白頁面規(guī)則與代碼分離提示詞以 Markdown 文件存放lib/pbl/v2/prompts/ 目錄由 prompts/loader.ts 讀取并做{{language}}變量插值改提示詞文案無需觸碰 TypeScript人類審閱也只需通讀一個文件。如果你正在為自己的 AI 教學系統(tǒng)設計「項目完結報告」或「階段反思卡片」功能直接借鑒這套「系統(tǒng)規(guī)則 Markdown user 證據(jù)裝配 JSON 尾巴解析 索引對齊校驗」的組合就能同時獲得高質量文本與可驗證的結構化數(shù)據(jù)。【免費下載鏈接】OpenMAICOpen Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click項目地址: https://gitcode.com/GitHub_Trending/op/OpenMAIC創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考