Bläddra i källkod

fix(teaching): 批改器读取铁律 + 不读到不打分(修真实运行暴露的批改跑偏)

真实运行(改 CampusHub P2)暴露:agent 没读到提交物却从无关文件(本仓库
builtin_skills.py)编了个 67/100。根因不是工具(实测 ReadFile/ListFiles 对 P2
绝对路径全部成功、PDF 也能抽文本),而是:
- [工作目录] 提示(=run 输出目录)被模型当成读取基址 → 拼错路径
- 无参 ListFiles → os.getcwd()=服务运行的本仓库 → 列 942 文件误导
- 旧 prompt 没禁止"对没读到的文件打分" → 编出假分(最有害)

修复(grader.yml + skill.yml,均 bump 0.1.1):
- 读取铁律:提交物路径以用户消息为准、非[工作目录];第一步对确切绝对路径
  ListFiles 再逐个完整绝对路径 ReadFile;禁止相对/无参调用
- 不读到不打分铁律:只对真正读到的文件打分;没读到留空标「未读取」绝不估分;
  核心交付物一个没读到→不给总分、直接报「无法批改」并停
- 打分前自检:读到的是不是 spec 要求的交付物,读到源码/无关文件即判路径错

验证:skill validate 无误、grader 编译过、live 平台 skill 刷新到 0.1.1。
另:用修正后的方法已正确读全 5 份交付物并真实批改(95/100 优),报告在提交目录。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
kenny67nju 4 månader sedan
förälder
incheckning
3affca4890

+ 19 - 3
agentexample/agentpacks/teaching.assignment-grader/agents/grader.yml

@@ -25,10 +25,26 @@ systemPrompt: |
   4. **红线先判**:命中红线先记红线,再谈分数(红线通常封顶或建议打回)。
   5. **隐私**:在本地处理,不外传;报告可用队名/编号代替真实姓名。
 
-  ## 输入
+  ## 输入与读取铁律(最重要,先读)
   用户给:作业要求文档(spec)+ 学生提交物(单份目录/文件,或一个班级根目录批量)。
-  - spec 与提交物:用户给文件路径 → ReadFile;说在资料库 → KBList + KBSearch 取回。
-  - 已校准好的 rubric:用户给了就直接用(保证跨队一致),否则按下面派生。
+  - **提交物路径以用户消息里给出的为准**(如「作业在 /a/b/data/P2」就是 /a/b/data/P2)。
+    它通常**不是** [工作目录]——[工作目录] 只用来**写**报告,**读**提交物要用用户给的路径。
+  - **第一步永远是**:用用户给的那个**确切绝对路径**调一次 ListFiles,拿到真实文件清单。
+    然后对清单里每个文件用**完整绝对路径**逐个 ReadFile(.md 优先;.pdf 也能直接 ReadFile,
+    会自动抽取文本;同名 .md 与 .pdf 只需读其一)。
+  - **绝不允许**:① 用相对路径或无参调 ListFiles/ReadFile(会误读到程序运行目录);
+    ② 把提交文件名拼到 [工作目录] 后面去读。
+  - spec:用户给路径 → ReadFile;说在资料库 → KBList + KBSearch。
+  - 已校准 rubric:用户给了就直接用,否则按下面派生。
+
+  ## 不读到不打分铁律(杜绝编分数)
+  - **只能对你真正 ReadFile 成功、看到了内容的文件打分。** 任何没读到内容的评分项,
+    分数栏一律留空写「未读取」,**绝不估分、绝不"保守估分"**。
+  - 若对提交路径 ListFiles 为空或核心交付物一个都没成功读到 → **不要给总分**,直接产出
+    一份「无法批改」报告:写明你试过的路径、ListFiles/ReadFile 的报错、请用户确认路径,
+    然后 terminate。宁可交白卷说读不到,也不能从错误/无关文件编一个分数误导老师。
+  - 打分前先自检:本次实际 ReadFile 成功的文件,是否就是 spec 要求的那几份交付物?
+    如果读到的是程序源码、与作业无关的文件 → 说明路径错了,按上一条处理。
 
   ## 第一步:从 spec 派生 rubric(不写死,能复用到任何作业)
   从 spec 的「交付物清单 / 验收标准 / 各任务要求与工时」抽出评分项,归入三轴

+ 1 - 1
agentexample/agentpacks/teaching.assignment-grader/manifest.yml

@@ -1,6 +1,6 @@
 id: teaching.assignment-grader
 name: 作业批改助手
-version: 0.1.0
+version: 0.1.1
 domain: teaching
 entrypoint: agents/grader.yml
 description: >

+ 11 - 1
agentexample/skills/assignment-grader/skill.yml

@@ -1,5 +1,5 @@
 name: assignment-grader
-version: 0.1.0
+version: 0.1.1
 description: >
   作业批改能力插件。挂到任意智能体上,即让它会按「两轴 + 证据锚定 + 红线先判」
   的方法批改课程作业:从作业要求派生 rubric,分工程产物质量与 AI 协作元能力两轴
@@ -10,6 +10,16 @@ prompt: |
   当任务是批改/评分学生作业时,按下面方法做。你的产出是**带证据的建议总评草稿**,
   必须标注「⚠️ AI 初评,需任课教师复核」,最终成绩由老师定。
 
+  ### 读取铁律(先读)
+  - 提交物路径**以用户消息给出的为准**(如「作业在 /a/b/data/P2」就是它),它通常**不是**
+    [工作目录]——[工作目录] 只用于**写**报告,**读**提交物用用户给的路径。
+  - **第一步**:对用户给的**确切绝对路径**调 ListFiles 拿真实清单,再对每个文件用**完整
+    绝对路径** ReadFile(.md 优先,.pdf 可直接读、自动抽文本)。绝不用相对路径或无参调
+    工具(会误读到程序运行目录)。
+  - **只能对真正 ReadFile 成功的文件打分**。没读到的项留空写「未读取」,**绝不估分**。
+    若核心交付物一个都没读到 → 不给总分,直接报「无法批改:未读到提交物」+ 试过的路径
+    与报错,请用户确认路径,然后停。宁可说读不到,也不从错误/无关文件编分数。
+
   ### 原则
   - **每分必有证据**:每个评分项的扣/给分都锚定到提交物里的位置(文件名+章节/句)。
     没有证据不要判分。