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