求职记忆引擎测评

DrawOffer 求职记忆引擎测评:能力判断准确率 97.7%,预测下一题 AUC 0.843,96.3% 的结论能追溯到原话;在三个公开教育数据集上与 BKT、PFA 相当。附完整数据与测评说明。

我们用四组测试检验 DrawOffer 的求职记忆引擎:和“把全部记录交给大模型”、开源记忆框架 Mem0 正面对比;放到三个公开的学生作答数据集上,和学界常用的知识追踪模型比较;检查结论能否复现、能否追溯到原话、删除资料后是否删得干净;再把虚构求职者剧本扩到 102 份,按方向、级别和问题类型分层看结果。这里是完整报告的网页版,包括引擎领先的地方,也包括它落后的地方。

  • 能力判断准确率:97.7%(大模型读全部记录 81.4%,Mem0 81.4%)
  • 预测下一题 AUC:0.843(大模型 0.781,Mem0 0.736)
  • 结论能追溯到原话:96.3%(Mem0 的回答只有 1.6%)
  • 删除资料后残留的结论:0(逐一删除 85 份来源)

1. 测评要回答什么

DrawOffer 引擎读取一位求职者的简历、目标岗位、模拟面试和真实面试记录,判断他在每个知识点上的水平,指出简历说法是否写高、经历是否讲得清楚,并预测下一道题能否答好。对这样一个系统,我们最关心四个问题:

  1. 和通用做法相比,它判断得准不准?通用做法指把记录直接交给大模型,或者使用开源记忆框架 Mem0。
  2. 放到教育领域公开的学生作答数据上,它和学界常用的知识追踪模型 BKT、IRT、PFA、DKT 比怎样?
  3. 它自身是否可靠:结论能不能复现、能不能追溯到原话、删除资料后是否删得干净,推断有多快?
  4. 在更大、更多样的剧本集上,它在哪些方向、哪些问题类型上表现好,在哪些地方表现差?
表 1 核心结论
结论关键数据出处
判断知识点水平比直接用大模型准准确率 97.7%(42/43);大模型读全部记录 81.4%,Mem0 + 大模型 81.4%第 3 节
预测下一题能否答好,优于通用记忆AUC 0.843;大模型 0.781,Mem0 0.736;log loss 比两者低 34%–36%第 3 节
结论有据可查96.3% 的结论能追溯到原话;Mem0 的回答只有 1.6%第 3 节
推断可复现同样的输入重复推断,25/25 份剧本逐字节相同第 5 节
删除资料删得干净逐一删除 85 份来源,残留结论 0 条第 5 节
原话不是编的结论引用的 420 条原话全部能在原文中找到第 5 节
在公开教育数据上达到经典模型水平AUC 与 BKT、PFA 相差在 ±0.005 以内;隔天后的作答高出 0.02–0.03第 4 节
推断快、不花模型费用3000 次作答全量推断 0.28 秒,新增一场 0.04 秒第 7 节

2. 测评怎么设计

求职场景没有现成的公开数据集:真实简历和面试记录涉及个人信息,也没有人知道一位求职者在某个知识点上的“真实水平”。所以我们采用“剧本”的方法:先写下一位虚构求职者的完整设定,再按产品的真实流程生成他的记录,最后检查系统给出的结论是否符合剧本。

测评流程:编写虚构求职者剧本,按产品真实流程模拟面试记录,三种做法读同一批记录,在检查点上用同一个判分函数判分。
图 1 测评流程。三种做法读同一批记录、回答同一批检查点,用同一个判分函数判分;测试集在开发期间封存,只开封一次。

剧本

每份剧本写明这位求职者各个知识点在不同时间的真实水平、每段经历的真实分量和角色,以及简历上每条说法是真是假。剧本还规定了一组检查点:在某个日期,系统应当给出什么样的结论,比如“这一天 Redis 应在‘掌握’一档,允许差一级”“这一天不应报出任何 MySQL 的缺口”“这段经历的角色写高了”。

模拟记录

记录按产品的真实流程生成:面试官出题和追问、评委评分,都使用产品自己的提示词;求职者由另一家厂商的大模型按剧本当天的真实水平扮演。这样,记录里会自然出现真实使用中会有的噪声,比如评分偏差、答非所问、临场发挥失常。

开发集与测试集

第一组对比使用 25 份剧本、129 个检查点,其中 16 份为开发集,9 份为测试集。测试集在开发期间完全封存,2026-10-30 打开一次;开封后没有再调整引擎、提示词或评测代码。扩充实验的 102 份剧本按编号的哈希划分,测试集 37 份在 2026-11-01 打开一次。

能力判断准确率
能力等级类检查点的通过率。允许与剧本相差一级;剧本规定证据不足时,必须回答“证据不足”。
预测下一题 AUC 与 log loss
每道知识题吸收之前,预测“能通过这一层”的概率,标签是产品评分器的判定。AUC 越高越好,log loss 越低越好;AUC 区间按题重抽样 2000 次得到。
原话可追溯
结论附带的原话按省略号分段后,每一段都能在原始记录里逐字找到才算。
一致性
同一输入独立重跑 5 次,每次都重新调用模型;看结论相同、答案逐字相同的比例。

3. 与通用记忆方案正面对比

我们选了两种最常见的做法作为对照。第一种不做任何记忆处理,把截至检查日的全部记录按时间排好,连同问题一起交给一个更强的大模型;第二种使用开源记忆框架 Mem0,逐条写入记录,回答每个问题时检索 20 条记忆再交给同一个大模型。

表 2 三种做法
做法怎么工作模型
DrawOffer 引擎观察器把每条记录读成结构化观察并逐字摘录原话;推断不调用模型,事先不知道会被问什么观察器 deepseek-v4.1-flash
大模型读全部记录到检查日为止的全部记录按时间排好,连同问题一起交给模型,要求结构化作答并摘录原话gpt-6.1-terra(推理强度 medium)
Mem0 + 大模型mem0ai 2.2.1 逐条写入记录、删除来源时同步删除;每题检索 20 条记忆,只看检索结果同上;本机嵌入 bge-small-zh-v1.5

全部 25 份剧本的结果

三种做法在四项指标上的对比:能力判断准确率 97.7%、81.4%、81.4%;预测下一题 AUC 0.843、0.781、0.736;log loss 0.531、0.803、0.828;原话可追溯 96.3%、93.8%、1.6%。
图 2 四项核心指标(全部 25 份剧本)。蓝色为 DrawOffer 引擎,灰色为两种对照做法;log loss 越低越好。
表 3 全部 25 份剧本(129 个检查点)
指标DrawOffer 引擎大模型读全部记录Mem0 + 大模型
能力判断准确率(允许差一级)97.7%(42/43)81.4%(35/43)81.4%(35/43)
预测下一题 AUC0.843(0.79–0.89)0.781(0.72–0.84)0.736(0.67–0.80)
预测下一题 log loss0.5310.8030.828
结论能追溯到原话96.3%(520/540)93.8%(120/128)1.6%(2/128)
全部检查点通过率81.4%(105/129)84.5%(109/129)83.0%(107/129)
同一输入 5 次,结论都相同86.8%(112/129)86.8%(112/129)83.7%(108/129)
同一输入 5 次,答案逐字相同76.0%(98/129)70.5%(91/129)67.4%(87/129)

引擎在能力判断和预测上明显领先:能力等级判断 42/43,另外两种做法都是 35/43;预测下一题的 AUC 为 0.843,log loss 为 0.531,比大模型和 Mem0 低 34%–36%,说明引擎给出的概率不仅排序更准,数值本身也更接近真实结果。

统计上,我们按题重抽样(共 94 道题)计算 AUC 差的 95% 区间。引擎减 Mem0 为 +0.035 到 +0.178,不含 0,优势显著;引擎减“大模型读全部记录”为 −0.005 到 +0.129,下限略低于 0,所以还不能说一定更好。

封存的测试集

表 4 封存测试集(9 份剧本、45 个检查点,只开封一次)
指标DrawOffer 引擎大模型读全部记录Mem0 + 大模型
能力判断准确率100.0%(15/15)93.3%(14/15)86.7%(13/15)
预测下一题 AUC0.809(0.72–0.89)0.768(0.67–0.87)0.743(0.65–0.84)
预测下一题 log loss0.5290.8310.840
结论能追溯到原话96.7%(177/183)88.9%(40/45)0.0%(0/45)
全部检查点通过率88.9%(40/45)88.9%(40/45)84.4%(38/45)
同一输入 5 次,结论都相同88.9%(40/45)93.3%(42/45)86.7%(39/45)

测试集上的方向和全部数据一致:能力判断 15/15 全对,高于另外两种做法。测试集只有 45 个检查点,AUC 差的区间都跨过了 0(引擎减大模型 −0.070 到 +0.146,引擎减 Mem0 −0.043 到 +0.174),这一部分只能作为方向上的佐证。

按检查点类型看:引擎落后在哪里

按检查点类型的通过率:能力等级引擎 42/43 领先;经历评估引擎 8/14,大模型 13/14,Mem0 14/14;问题存在引擎 15/26,大模型 21/26;不误报问题三者都接近满分。
图 3 按检查点类型的通过数。引擎领先在能力等级,落后在经历评估和问题存在,因此全部检查点通过率略低于大模型。

全部检查点通过率,引擎为 81.4%,略低于“大模型读全部记录”的 84.5%。拆开看,引擎领先的是能力等级;落后最多的是经历评估(8/14,大模型 13/14,Mem0 14/14)和问题存在(15/26,大模型 21/26)。经历评估要判断一段经历在追问中讲得是否清楚,这恰恰是大模型直接阅读全文最擅长的,也是我们后面重点改进的方向。在“不该报的问题不要报”这一类检查点上,三种做法都接近满分(引擎 28/28)。

原话可追溯

引擎对人的判断,96.3%(520/540)能追溯到原始记录里的原话;大模型为 93.8%,Mem0 只有 1.6%。原因在于 Mem0 回答时引用的是它自己抽取、改写过的记忆,而不是原文:这些引用有 93.0% 能在它看到的记忆里找到,但不在原始记录里。对求职场景来说,这一点很重要:当系统说“你在某场面试中没讲清楚”,求职者应当能看到自己当时到底说了什么。

引擎另有派生结论(准备度、被问过的题、岗位要求)230 条,其中 153 条带有来源。准备度和“被问过的题”在产品数据里还没有挂接依据,这是待补的缺口,不计入上面的 96.3%。

这个对比偏向对照组

  • 对照组被直接问到考点。对照组被问“X 现在什么水平”“是否存在 Y 问题”,引擎事先不知道会被问什么,要自己发现所有问题。
  • 对照组的模型更强。gpt-6.1-terra 强于引擎观察器使用的 deepseek-v4.1-flash。
  • 对照组没有误报的机会。对照组只回答被问的检查点;引擎如果多报了别的问题,会在“不误报问题”检查点上扣分。

所以对照组的分数偏高,引擎的优势是保守估计。

成本

两种对照做法跑完全部对比,共调用 gpt-6.1-terra 1696 次(另有 396 次命中缓存),消耗约 4060 万 token,失败 0 次。引擎的推断环节不调用模型,只有观察器读取记录时调用一个较小的模型,而且同样的输入只读一次。

4. 公开知识追踪数据集

知识追踪是教育领域的标准问题:根据学生过去的作答,预测下一题能否答对。它和我们的问题不完全相同,学生作答只有对错,面试作答有层级和追问;但两者的核心都是“从一串作答里估计会不会”。所以我们把引擎放到三个公开数据集上,和学界常用的四个模型比较,检验它的推断部分是否站得住。

表 5 三个公开数据集
数据集学生作答知识点时间戳
ASSISTments 20094,027282,969123无
EdNet-KT15,000703,306188有
Junyi Academy5,000787,452664有

EdNet 和 Junyi 学生太多,从至少有 20 次作答的学生中抽取 5000 名,每人取最早的 500 次作答。三个数据集都按学生做 5 折交叉验证:每个模型只在训练折上拟合;对测试折里每位学生的每次作答,只用他之前的作答来预测。

DrawOffer 引擎
产品做法:只从训练集估计每个知识点的难度;每次作答带真实时间,预测取引擎吸收这次作答之前给出的通过概率。遗忘与稳定度使用产品参数,没有在这些数据上调整。
BKT
贝叶斯知识追踪,pyBKT 1.4.3,每个知识点一个隐马尔可夫模型。
PFA
按成功、失败次数做逻辑回归。
IRT
Rasch 模型,从训练集学生身上估计每道题的难度。
DKT
基于 LSTM 的深度知识追踪。
对照组
引擎关闭遗忘;引擎加上每道题的难度(产品里没有这一步)。
三个数据集上预测下一题的 AUC:ASSISTments 引擎 0.719、BKT 0.717、PFA 0.721、DKT 0.751、IRT 0.762;EdNet 0.677、0.673、0.678、0.703、0.763;Junyi 0.786、0.787、0.790、0.796、0.777;隔天后作答 EdNet 引擎 0.609 高于 BKT 0.589、PFA 0.582,Junyi 引擎 0.766 高于 BKT 0.739、PFA 0.743、DKT 0.750。
图 4 预测下一题的 AUC(5 折平均,纵轴从 0.55 起)。左:全部作答;右:距上次练习同一知识点至少一天的作答(ASSISTments 没有时间戳,不参与)。
表 6 预测下一题 AUC(5 折平均)
模型ASSISTmentsEdNetEdNet 隔天后JunyiJunyi 隔天后
DrawOffer 引擎0.7190.6770.6090.7860.766
BKT0.7170.6730.5890.7870.739
PFA0.7210.6780.5820.7900.743
DKT(深度模型)0.7510.7030.6190.7960.750
IRT0.7620.7630.7310.7770.765

怎么读这组结果

整体与经典模型 BKT、PFA 持平。三个数据集上,引擎与 BKT、PFA 的 AUC 差都在 ±0.005 以内。这些模型是专门为这类数据设计、并在每个数据集上单独训练的;引擎是为求职场景设计的通用推断,没有针对这些数据调参。

隔了一段时间再练的题,引擎更准。只看距上次练习同一知识点至少一天的作答,EdNet 上引擎比 BKT 高 0.021、比 PFA 高 0.028;Junyi 上比 BKT 高 0.027、比 PFA 高 0.023、比深度模型 DKT 高 0.016,与 IRT 持平。这正是遗忘建模起作用的地方。

遗忘模型确实起作用。同一个引擎打开遗忘与关闭遗忘相比,隔天后的 AUC 在 EdNet 上平均高 0.0062,在 Junyi 上高 0.0030,两个数据集的 10 折全部为正。

和 IRT、DKT 的差距来自题目难度。IRT 和 DKT 会从大量其他学生身上学习“每道题有多难”,引擎在产品里不这样做。作为对照,给引擎补上每道题的难度之后,ASSISTments 上为 0.768(IRT 0.762),EdNet 上为 0.758(IRT 0.763),Junyi 上为 0.790(IRT 0.777)。在求职场景里,面试题很少完全重复,而且我们不希望用别人的作答去校准你的结论,所以产品没有采用这一步。

各数据集的完整结果

表 7 ASSISTments 2009(5 折均值)
模型AUCRMSElog loss
引擎 + 题目难度(对照)0.7676 ± 0.00340.42440.5372
IRT0.7623 ± 0.00300.42500.5381
DKT0.7514 ± 0.00550.42710.5443
PFA0.7213 ± 0.00670.43820.5672
DrawOffer 引擎0.7189 ± 0.00840.43920.5692
BKT0.7173 ± 0.00600.43900.5707
引擎(默认参数,不用训练集)0.7010 ± 0.00900.45030.5919
知识点平均通过率0.6223 ± 0.00510.46370.6197
表 8 EdNet-KT1(5 折均值)
模型AUCRMSElog loss隔天后 AUC
IRT0.7626 ± 0.00090.43450.55830.7313
引擎 + 题目难度(对照)0.7577 ± 0.00120.43680.56270.7250
DKT0.7033 ± 0.00220.45300.59790.6185
PFA0.6783 ± 0.00290.46010.61240.5815
DrawOffer 引擎0.6765 ± 0.00280.46240.61690.6093
BKT0.6730 ± 0.00300.46230.61730.5886
引擎(关闭遗忘,对照)0.6725 ± 0.00300.46390.62000.6031
引擎(默认参数,不用训练集)0.6521 ± 0.00260.47190.63630.5921
知识点平均通过率0.6407 ± 0.00280.47170.63620.5624
表 9 Junyi Academy(5 折均值)
模型AUCRMSElog loss隔天后 AUC
DKT0.7960 ± 0.00570.33170.36130.7499
引擎 + 题目难度(对照)0.7903 ± 0.00710.33320.36530.7677
PFA0.7903 ± 0.00690.33240.36320.7432
BKT0.7868 ± 0.00740.33350.37080.7390
DrawOffer 引擎0.7863 ± 0.00700.33400.36640.7659
引擎(关闭遗忘,对照)0.7851 ± 0.00730.33480.36790.7629
IRT0.7768 ± 0.00670.33750.37220.7648
引擎(默认参数,不用训练集)0.7397 ± 0.00940.36300.42830.7028
知识点平均通过率0.7318 ± 0.00860.35120.39810.7210

几点说明:ASSISTments 没有时间戳,作答按顺序每题间隔 1 分钟,遗忘模型在这里不起作用;pyBKT 1.4.3 与 NumPy 2 不兼容,运行时把一个数组转成标量,它的 E 步改用编译版提速,两者预测逐位相同,有单元测试检查,复跑结果也逐位相同。

5. 稳定性与可追溯性

这一组测试把观察器的输出固定下来(读取缓存),单独检验推断本身,覆盖全部 25 份剧本。

表 10 稳定性与可追溯性(25 份剧本)
测试结果
同一输入在同一进程内推断 5 次25/25 份剧本、60 个时点的结论逐字节相同
换 2 个新进程、不同哈希种子再推断25/25 份剧本逐字节相同
逐一删除每份来源(85 次)只依赖被删来源的 176 条结论全部消失;残留结论 0 条,仍引用被删来源的结论 0 条,残留观察 0 条
结论引用的原话420/420 条能在原文中找到(按省略号分段核对;整句直接匹配 348 条)

这意味着三件事。可审计:同一份资料永远得出同一个判断,任何一条结论都可以在事后完整重算、逐步检查。删得干净:用户删除一份资料后,由它得出的结论随之消失,满足个人信息删除的要求。有据可查:每个判断都能指回求职者说过的原话。

6. 扩充到 102 份剧本

25 份剧本足以做正面对比,但不足以看清引擎在不同人群、不同问题上的表现。我们把剧本扩充到 102 份、581 个检查点,覆盖 5 个方向(后端、前端、AI、产品、运营)和 4 个级别(实习、校招、中级、资深),每个组合 5–6 份。

新增剧本按问题类型分配重点:简历写高或写低(技能熟练度、经历角色)、岗位知识缺口、经历先讲不清后讲清、简历与面试数字矛盾、多份简历的经历合并、复习到期与休眠、通用能力证据不足,以及表现一致、不该报任何问题的对照组。新增 77 份剧本的求职者由 claude-haiku-5.5 按剧本当天的真实水平扮演,原有 25 份复用此前记录;面试官与评委仍使用产品自己的提示词和 deepseek-v4.1-flash。

模拟本身也有误差:知识题的评分深度与剧本设定完全一致的比例,开发集为 50%,差一级以内为 97%;测试集分别为 56% 和 94%。划分按剧本编号的哈希:开发集 65 份、370 个检查点;测试集 37 份、210 个检查点,2026-11-01 打开一次,开封后没有再调整引擎或剧本。

  • 测试集检查点通过:80.5%(169/210;开发集 302/370)
  • 测试集问题召回率:0.64(上一代引擎只有 0.27)
  • 测试集能力档位合理:91%(开发集 97%)
  • 测试集预测下一题 AUC:0.715(上一代引擎 0.688)
表 11 当前引擎(v3)与上一代引擎(v2),读同一批观察器输出
指标开发集 v3开发集 v2测试集 v3测试集 v2测试集 v3 的 95% 区间
能力档位合理0.9670.9780.9130.9570.80–0.97
问题准确率0.9020.9090.8750.8180.69–0.96
问题召回率0.5780.3120.6360.2730.47–0.78
证据门槛(不误报)0.9690.9850.9620.9750.89–0.99
问题状态变化0.2730.0000.1250.0000.02–0.47
经历去重1.0000.8751.0001.0000.70–1.00
经历评估0.5520.5690.5810.6130.41–0.74

测试集上,当前引擎的问题召回率是上一代的两倍多(0.636 对 0.273),问题准确率也更高(0.875 对 0.818);能力档位与上一代接近。测试集与开发集的总通过率接近,但单次划分还不足以完全排除过拟合。模型标签已缓存时,单人状态推断的 P95 为 0.054 秒,不含模型调用耗时。

按方向与级别

按方向和级别的检查点通过率:测试集后端 84%、前端 80%、AI 86%、产品 71%、运营 81%;实习 88%、校招 96%、中级 77%、资深 70%。
图 5 按方向与级别的检查点通过率(空心为开发集,实心为测试集)。产品方向和资深级别最低,它们的检查点更多依赖经历叙述。
表 12 按方向与级别的通过数
分组开发集测试集
后端70/85(82%)31/37(84%)
前端68/73(93%)32/40(80%)
AI49/61(80%)43/50(86%)
产品55/75(73%)29/41(71%)
运营60/76(79%)34/42(81%)
实习103/119(87%)21/24(88%)
校招76/97(78%)47/49(96%)
中级59/75(79%)51/66(77%)
资深64/79(81%)50/71(70%)

产品方向最低。产品与运营的剧本主要考经历叙述,正好落在下面说的短板上;资深级别也是同样的原因。各组的检查点构成不同、样本较小,这些差异不宜作因果解读。

按检查点类型

表 13 按检查点类型的通过数
检查点类型开发集测试集
能力档位89/92(97%)42/46(91%)
经历评估32/58(55%)18/31(58%)
经历合并8/8(100%)9/9(100%)
简历写高13/20(65%)4/5(80%)
简历写低10/11(91%)8/9(89%)
岗位知识缺口7/13(54%)4/5(80%)
数字矛盾3/7(43%)3/5(60%)
经历讲不清1/9(11%)1/6(17%)
讲不清后讲清0/6(0%)0/5(0%)
缺口解除或休眠2/4(50%)1/3(33%)
复习到期2/3(67%)1/3(33%)
岗位准备度4/4(100%)2/2(100%)
可补充事实2/2(100%)0/2(0%)

依赖经历评估模型的检查点,测试集通过 52/77(68%);其余检查点 117/133(88%)。所有“不该报”的干扰项通过率都在 92% 以上,误报少。

找到并修复的问题:经历评估模型

扩充后,我们定位到经历评估模型(读一道经历题的回答,判断本人分量、角色和每次追问讲没讲清)的两个问题。一是分量常给“未知”,还会把角色词填进分量字段:修复前单票给出分量的只有 51%。把分量和角色都改成固定的可选值之后,单票给出分量 58%、给出角色 48%。二是复述追问的草稿限 40 字,超长的整条作废,我们放宽到了 80 字。

表 14 经历评估模型的修复(开发集重新采样对比)
版本通过问题准确率问题召回率经历评估单票给出分量单票给出角色
修复前292/3700.8600.5780.41451%49%
只把分量改成可选值300/3700.8000.5000.67275%27%
分量和角色都改成可选值(采用)302/3700.9020.5780.55258%48%

这是一次采样对比,不能单凭该结果确认变化的因果;表中前两版的单票比例来自开发集,采用版来自开发集与测试集合计,不能直接作同样本比较。“经历讲不清”仍然几乎报不出,原因有二:真实面试复盘入库时每题只有一组问答,追问被并进了回答,判断讲清程度的模型只看追问,所以真实面试里的讲不清引擎看不到;另外,部分剧本只把目标方面设成“部分讲清”,按设计本就不报。前者需要改复盘的入库方式,尚未实施。

同一剧本模拟 3 次

开发集 65 份剧本各模拟 3 次(复用首轮,追加两轮求职者回答及面试判定;相同请求复用缓存)。370 个检查点中,322 个每次结果都相同(87%);三次各自的通过数为 302、297、307,按多数次通过计为 306/370。一致率同时包含三轮都通过和三轮都失败的检查点,不等于正确率,它衡量的是剧本模拟和模型判定整条链路的波动。补跑只补齐服务限流造成的缺失,没有按分数挑选结果。

7. 性能

我们用引擎自带的生成模型造出模拟学习者,每场 6 题、每两天一场,历史从 10 场到 500 场;每档 5 位学习者,每人计时 3 次。测试机器是 Apple M3 笔记本(8 核)。

推断耗时随历史长度增长:60 次作答全量 0.005 秒,600 次 0.044 秒,3000 次 0.277 秒;新增一场面试的增量更新始终在 0.01 到 0.04 秒之间。
图 6 推断耗时(P50,对数纵轴)。全量推断随历史长度近似线性增长;从检查点续算新增一场,3000 次作答时也只要 0.038 秒。
表 15 推断耗时
历史长度观察条数全量推断 P50 / P95增量更新一场 P50增量与全量一致
60 次作答(10 场)1200.005 / 0.006 秒0.010 秒5/5
300 次作答(50 场)6000.022 / 0.029 秒0.010 秒5/5
600 次作答(100 场)12000.044 / 0.053 秒0.012 秒5/5
1200 次作答(200 场)24000.093 / 0.207 秒0.017 秒5/5
3000 次作答(500 场)60000.277 / 0.798 秒0.038 秒5/5

3000 次作答的长历史,全量推断 0.28 秒;新增一场面试,从检查点续算只要 0.038 秒,结果与全量重算逐位一致。这些是纯计算的测量,不含模型读取记录、网络和数据库的耗时。

8. 限制与引用注意事项

为了让这些数字经得起检验,下面几点请在引用时一并说明,不要写过头。

  • 剧本是虚构的,而且由开发方起草。25 份与 102 份剧本都还没有经过两位独立标注人核对;模拟面试的作答由大模型按剧本扮演,偶尔会编出剧本里没有的数字。这不是真实用户数据,真实数据校准尚未开始。
  • 正面对比的样本量小。129 个检查点,测试集只有 45 个,所以每个数都附了区间。引擎与“大模型读全部记录”的 AUC 差,95% 区间为 −0.005 到 0.129,跨过了 0,统计上还不能说一定更好;对 Mem0 的优势在统计上显著(0.035 到 0.178)。扩充到 102 份剧本后,正面对比还没有在扩充后的剧本上重跑。
  • 不是所有指标都领先。全部检查点通过率,引擎 81.4%,低于大模型读全部记录的 84.5%;主要短板在经历评估(8/14 对 13/14)。
  • “5 次结论一致”不是 100%。端到端一致率是 86.8%,和大模型持平;推断这一步本身是 100% 可复现的。
  • 预测标签来自产品评分器,不是人工判定。评分器本身的误差另有测评;AUC 只取第 1 次运行。
  • 公开数据集上不是第一。整体 AUC 低于 IRT 和 DKT,差距来自引擎不从其他用户身上学题目难度。可以说“与经典模型相当”,不要说“超过最先进模型”。
  • Mem0 的配置。Mem0 的实体链接依赖 spaCy 英文模型,对中文不起作用,所以没有启用;对比中的 Mem0 是一个特定版本与配置下的结果,不代表 Mem0 的全部能力。
  • “不花模型费用”只针对推断环节。观察器读取记录时仍要调用模型。

9. 后续与复现

接下来有三项工作。第一,在 102 份剧本上重跑正面对比:大模型与 Mem0 两个对照目前只跑了 25 份。第二,用真实数据校准:产品已经实现面试前的预测存档、面试后的勾选与校准报表,开启后即可积累“系统预测会问什么、实际问了什么、答得怎样”的数据。第三,补短板:真实面试复盘的讲清程度判断、数字矛盾识别,以及给准备度和“被问过的题”挂上依据。

全部方法、测评代码与原始结果 JSON 见 github.com/ql-link/DrawOffer-Eval,重跑命令见该仓库的说明。核心引擎代码不公开,生成的对话和模型缓存不随仓库分发,因此部分实验无法完全独立复现。更严格的实验设计、机制消融与讨论,见研究论文;系统各层的设计,见架构设计。

下载完整报告(PDF) · 测评代码与原始结果