Repository navigation
将编号抽取接进一轮 - #96
将编号抽取接进一轮#96
Conversation
JunieXD
left a comment
There was a problem hiding this comment.
感谢!这一版把 #44 的几项都接上了:学院和已有项目按编号选、选错就失败;延期通知只交新的那一端;正文和附件共用一套编号;认不出的日期交给网站,网站核对原文后进审核页。标注集上截止 27/28,证据 0/826 找不到,PR 里把活动结束偏低这些局限也写清楚了。
我们本地跑了 ./check.sh,211 项都通过;网站的类型检查、lint 和构建也都通过;网站和抓取节点两边的 diff 逐个文件读了一遍。
方向:认不出的日期按你在 #44 提的方式交接,也就是 ExtractedProgram.unresolved_dates 加上 unparsed_date 这种审核原因,我们同意。
必须改
-
重复项目并进原项目时,「日期待确认」的条目会丢:审核页确认一个新项目是重复的,
review-items.ts会把它的各个版本按fields重新归并到原项目(:395、:421),不带unresolved_dates;然后把这个项目上其他待审的条目全部关掉(:426)。认不出的时间就这样悄悄没了。请改成:合并时把重复项目上还没处理的unparsed_date条目改挂到原来的项目上,不关掉;再加一个测试:一个项目同时有「可能重复」和「日期待确认」两个条目,并进原项目后,「日期待确认」还在、挂在原项目上。 -
标注集的评估要跑正式的抽取:仓库里的
extraction/evaluate.py还是用llm.py调硅基流动的 Chat Completions,用的也是实验的提示词和按学院名称输出的结构(evaluate.py:14、:260)。PR 里贴的接入版结果来自没提交的脚本,别人照 §8.5 的命令跑出来的是旧方案。以后改提示词或者换模型,都要靠这个脚本重跑(AGENTS.md「用实验说话」),所以它要跑的就是一轮里用的那一套。请改成:evaluate.py用extract.py的prepare、Responses和resolve_programs,学院从data/sources.csv生成,也就是你这次在本地的做法;缓存命中数直接从Responses返回的usage里取;- 删掉只给硅基流动用的
llm.py,以及只对它有用的--models、--modes; - §8.5 的命令改成新的,结果用提交的脚本重跑一次贴出来。#40 里我们也会把实验那份取正文的代码换成正式的,道理一样:一件事只有一种实现。
-
提示词只留一份,不要前后矛盾:
ROUND_INSTRUCTIONS(extract.py:21)是在实验的INSTRUCTIONS后面追加一段「替代上面 college 的规则」。结果同一份提示词里,前面说「这是正文抽取实验,不处理附件」「直接写学院全称,不对照院校清单」,后面又说「编号覆盖正文和附件」「college_id 必须选编号」。模型可能因此忽略只写在附件里的截止时间。请把prompt.py直接改写成一轮用的那一份(正文加附件、学院和项目选编号、unresolved_dates),删掉ROUND_INSTRUCTIONS,评估也用这一份。改完提示词按第 2 条重跑。 -
改表直接改
0001_init.sql:上线前没有历史包袱,表结构直接改(AGENTS.md「写代码」),之前改表的 PR(#90、#95)都是这么改的。请删掉0002_unparsed_date.sql,把unparsed_date加进0001_init.sql:248的reason约束。 -
截图不提交进仓库:请删掉
docs/images/下的两张 PNG,截图在网页上直接拖进 PR 描述。现在描述里引用的是你 fork 上分支的地址,分支删了图也就没了。 -
NoticePage的新字段不要带默认值:title: str = ""、hyperlinks = ()加上一轮里的replace(page, title=notice.title)(rounds.py:56-57、:175),是为了让原来的写法不改也能跑,属于兼容的写法(AGENTS.md「不留旧东西」)。请改成:- 标题不放进
NoticePage,作为Steps.extract的参数交给抽取:steps.extract(notice.title, page, result.extraction); hyperlinks去掉默认值,测试里构造NoticePage时写hyperlinks=()。读正文那一步填这个字段,由 #40 来做,我们正在写,它会加同一个字段,合并时由后合并的那边调整。
- 标题不放进
-
设计文档只写结论:
- §8.5 的「官方 Responses 迁移基线」是过程,请删掉;「接入版抽取复验」按第 2 条重跑后,只留结果表和两三句局限。
- §8.2 新加的第二条,只留设计(学院和已有项目选编号、元数据要和对照一致、对照里的旧时间不当成候选),类名和调用方怎么读密钥这些是代码的事,请删掉(AGENTS.md「写文档」)。
建议一起改
Extract和Responses照Fetcher、Website的写法用async with,不单独写close()(extract.py:152)。ResponseUsage.valid_cached_tokens(responses.py:28)删掉:接口不会返回命中数比输入还多的用量,这是不可能出现的检查。resolve_programs用一整段except KeyError把「编号不存在」转成SelectionError(extract.py:143),resolve内部真有 bug 也会被当成模型选错。请在查学院、查项目的地方各自判断,查不到就抛SelectionError。- 审核页的提示里写「补充时间后标记已核对」(
review.tsx:31),「已核对」在项目上是另一个意思(项目的 verified)。建议写成「到项目页补充时间后关闭此条」,按钮也和「缺少截止时间」那种对齐,用「已补充,关闭此条」。
说明
|
已推送审查修复
本地全部检查通过:Python 235 项、网站 100 项测试,格式、lint、严格类型和生成契约检查通过。使用仓库里的正式评估命令在线跑完 50 条并离线复算,截止 27/28(96.43%),0 条失败,整条全对 25/50;网站实际 evidenceFound 核验 0/832 找不到。缓存命中 57.4795%,按实际命中量及官方空闲价估算 0.20118524 元,未核对账单;活动结束仅 18/24,局限已保留。 首次统一提示词复验出现 3 条空字段结构错误,仍计入分母,截止 24/28、估算 0.20274188 元;显式开启严格 schema 并明确空字段整体为 null 后,固定方案完整重跑得到上述结果,两轮用量均保留,没有重发失败响应挑分。 第 5 条还差 GitHub 附件上传:内置浏览器页面控制超时,本机 Chrome 的应用控制授权也超时。没有换图床或再引用分支地址。GitHub CI 的 crawler、web 两项均已通过。 |
JunieXD
left a comment
There was a problem hiding this comment.
感谢!上次的意见都改到了:重复项目合并时「日期待确认」改挂到原项目并补了测试,评估脚本跑的就是正式的抽取,提示词只留一份,改表直接改初始迁移,NoticePage 不再带兼容的默认值,文档只留结论。我们把这个分支和最新的 main(含 #99)合在一起跑了 ./check.sh(235 项)和网站的类型检查、lint、格式检查,都通过,生成的 OpenAPI 文档也对得上。
截图传不上来没关系,审核页我们在接入口(#100)联调时对着开发版看。接入口时我们会顺手调两处:抽取失败的原因改成中文、带上具体的错误码(比如 unknown_college),方便在抓取看板上查;调用 LLM 的并发上限整个进程共用,和初筛一样。
关联
Closes #44。按 #18 选定的 DeepSeek 官方
deepseek-flash编号方案实现Steps.extract,支持已确认的unresolved_dates交接与unparsed_date审核。入口组装和部署归 #45。改了什么
steps.extract(notice.title, page, context)传标题,NoticePage.hyperlinks为必填;正文和附件统一编号。抽取从同校学院和近期项目清单中选编号,校验已有项目的学院、届、类型,再还原日期、入口和证据。延期只交本次原文明确写出的端点,不抄旧时间。prepare、Responses、resolve_programs和同一份提示词。学院候选独立来自sources.csv。缓存只存调用结果,恢复编号每次重算,请求失败不缓存。Extract、Responses使用async with;仅本地环境变量LLM_API_KEY放密钥。未知学院或项目编号明确报错。unparsed_date审核原因;设计文档定义编号选择、未识别日期交接与缓存组织,§8.5 提供复现命令、结果和局限。怎么验证的
Browser、PageSession,评估取正文复用正式解析。--reuse-only离线复算;网站实际evidenceFound核验 832 条证据,未找到 0 条。同一标注集复验
在
crawler/中设置本地LLM_API_KEY后运行:--off-peak只用于原调用处于官方空闲计费时段的费用估算;在线与复算使用同一计费口径。固定模型deepseek-flash、非思考、温度 0、8192 输出 token,时间和报名入口按标注有值的数量固定分母,失败不排除,多抽单列。同一 50 条通知按首次收录评估,学院候选来自
sources.csv,近期项目和附件为空;已有项目更新、附件和未识别日期交接由固定响应及数据库测试验证。仅 28 个标注截止,无独立测试集且缓存受此前请求影响,不能据一两条差异断言稳定优势,扩充后须重跑。活动结束仍只有 18/24,证据精确匹配不能代替语义判断,网站校验和人工审核须保留。日期候选覆盖为报名开始 23/23、截止 28/28、活动开始 25/25、结束 24/24。本轮未识别日期列表为空。截止漏抽为东南大学多项目通知的第二个项目未抽出,正确截止候选已存在;多抽为厦大人工智能研究院通知中的另一个截止。
费用按官方空闲时段单价和返回的实际缓存命中量估算,未核对账单。
影响
Steps.extract的首参数新增标题,NoticePage.hyperlinks必填,已对接 #98 合入的正式正文读取步骤。抓取接口新增可选unresolved_dates,初始表结构新增审核原因;审核关闭本身不写时间。MCP 工具无变更,无新依赖或环境变量。