先看证据,再下结论
DrawOffer 读取简历、目标岗位、模拟面试和真实面试记录,判断每个知识点的水平,指出简历说法是否夸大、经历是否讲得清楚。模型只读记录,推断不调用大模型,每个结论都能指回原话。
DrawOffer 读取你的简历、目标岗位、模拟面试和真实面试记录,判断你在每个知识点上的水平,指出简历说法是否写高、经历是否讲得清楚,并预测下一道题能否答好。这篇文章完整介绍它是怎么做到的:数据从哪里来,模型做什么、不做什么,结论怎样一步步算出来,证据不够时为什么宁可不下结论,以及你怎样查看、更正和删除它。
- 简历上的说法、面试中的作答和岗位要求是三种性质不同的记录,系统分开记录、分别处理,岗位要求只定目标,不会抬高你的水平。
- 大模型只负责把记录读成结构化的观察,并逐字摘录原话;之后的推断是确定性计算,不调用大模型,同样的输入永远得到同样的结论。
- 每个知识点的水平都带着不确定度。证据不够时,系统给出的是“证据不足”,而不是“水平低”,并安排下一次该问什么。
- 每条结论都能指回原始记录里的原话。删除一份资料,只依赖它的结论会随之消失,测评中逐一删除 85 份来源,残留结论为 0。
1. 为什么求职需要一种不同的记忆
一位求职者在几个月里会留下大量记录:几版简历、十几个收藏或投递的岗位、若干场模拟面试、几次真实面试后的复盘,以及准备过程中的勾选和笔记。一个真正有用的求职助手,应当能从这些记录里回答一些具体的问题:他的 Redis 到底掌握到哪一层?简历上写的“精通 MySQL”站得住吗?上一段实习的项目,他追问到第三层时还讲得清吗?离投递的岗位还差什么?
通用的对话记忆擅长另一类问题:记住你说过喜欢简洁的回复、记住你住在上海、记住你上周提到的某件事。它的基本做法是把对话抽成一条条“事实”,需要时检索出来交给模型。把这套做法直接搬到求职上,会遇到一个根本的困难:求职记录里的三类内容,性质完全不同。
- 简历上的说法是主张。“熟练掌握 Redis”“主导了订单系统重构”是求职者对自己的描述,它可能准确,也可能写高或写低。
- 面试中的作答是观察。一道题从哪一层开始问、追问到哪一层、在哪一层没答上来,是在特定条件下观察到的表现,是判断能力最直接的证据。
- 岗位要求是目标。“要求深入理解分布式事务”说的是这个岗位需要什么,它定义了差距,但不能说明求职者已经具备什么。
如果把这三类内容都当作可以检索的事实,就会出现两种典型的错误。第一种是把没有证据的主张当成能力:简历写了“精通”,检索时它和面试作答一起出现,模型很容易据此认为这个人很强。第二种是把“没有证据”当成“不会”:某个知识点从没被问过,模型却在被追问时给出一个偏低的判断,这对求职者是不公平的。
DrawOffer 的长期记忆围绕一个原则设计:先看证据,再下结论。它分开记录“你说了什么”“你实际答出了什么”“系统据此推断出什么”,每条结论都要能追溯到原始记录,证据不够时就明确说“还不能判断”,并告诉你再答哪一两道题就能下结论。下面依次介绍实现这个原则的每一层。
2. 总体架构
整套系统可以分成五层,数据自左向右流动。
来源层接收你在产品里留下的每一份记录:简历、岗位、投递进度、模拟面试、真实面试复盘、笔试、面试准备清单和面试后的勾选。每条记录被包成统一格式的“片段”,带有发生时间、来源位置和版本。
观察层把片段读成结构化的观察。一部分观察由规则直接读出,比如简历的经历条目、技能栏里“熟练”“了解”这样的修饰词、模拟面试每一层是否通过;另一部分需要理解语义,比如这道题对应目录里的哪个知识点、这段回答里求职者说自己负责了哪些部分,这部分由大模型完成。所有引用原话的字段,都要核对能在原文里逐字找到。
推断层把全部观察按时间顺序重放,计算每个知识点的能力估计(连同不确定度)、每段经历的分量与讲述情况,以及简历说法和面试表现之间的差距。这一层是纯数值计算,不调用大模型。
证据门槛决定一个估计能不能变成对外的结论。估计再有把握,如果直接作答的证据不够、只来自同一道题、或者只来自同一场面试,结论都会停在“证据不足”。
使用层是记忆真正发挥作用的地方:助手对话、模拟面试出题、简历段落精修、面试准备清单、答辩提纲和岗位匹配卡。它们读到的都是经过同一套过滤的结论,没过门槛的只会出现“待评估”。
3. 来源:每条记录都有出处和分量
片段是所有来源的统一信封。不管来自简历还是面试,片段都记录同样几项内容:类型、发生时间、来源(是哪一份简历的哪一行、哪一场面试的第几题)、来源的版本、可信度,以及最多 2000 字的正文。片段的编号由来源位置和版本计算得出,同样的内容永远得到同一个编号,所以重复导入不会产生重复记录。
记录被修改时,旧版本不会被直接覆盖,而是标记为“已被取代”。比如你改了简历上的一行,系统会用新的一行重新读取,旧的那一行不再参与推断,但它留下的历史依据仍然清楚。无论修改以什么顺序到达,结果都相同。
| 来源 | 切分方式 | 提供什么 | 可信度 |
|---|---|---|---|
| 模拟面试 | 每道主问题连同追问 | 逐层是否通过、要点、事实错误、经历讲述 | 已核实 |
| 真实面试复盘 | 每道题,以及每条改进点 | 被哪家公司问过、作答深度、你的自评 | 已核实 |
| 笔试 | 每道题及对错 | 对应层级上的一次作答结果 | 已核实或识别 |
| 简历 | 每段经历、技能栏每一项 | 经历、角色词、数字、熟练度说法 | 自述 |
| 岗位与投递 | 每个岗位、每次进度变化 | 目标、要求的知识点与层级 | 外部材料 |
| 准备清单与勾选 | 每个已勾选的准备项 | 练习记录,推进问题状态 | 自述 |
不同来源对能力判断的分量不同,这个分量称为来源可靠度。真实面试最直接,可靠度为 1;模拟面试的题目和评分都来自产品,与真实面试有差别,可靠度为 0.8;简历上的熟练度说法和面试后的自评只是自述,可靠度为 0.3;岗位要求、外部材料和单纯的操作行为,对能力的可靠度为 0,它们只定义目标或推进状态,不会改变对你水平的估计。
需要说明的是,这几个数值是根据经验设定的假设,而不是从数据中学到的最优值。我们在研究论文的消融实验里专门检验过:把所有正的可靠度都改成 1,整体通过的检查点数量没有变化,预测指标还略有提高。这说明目前的数值本身没有被证明更好,我们保留它们,是因为“真实面试比自述更可信”这个方向符合常识,并且能防止一句简历描述在缺少面试证据时左右判断。等有了足够的真实面试数据,这些数值会按真实结果重新校准。
4. 观察:让模型只做“读”这一件事
观察器把片段换算成观察。每条观察都说明它作用于什么对象(一个知识点、一段经历、一条简历说法),测到了什么(这一层答过了没有、角色是“参与”还是“主导”),以及依据是什么(原文中的哪一段)。观察器分两类。
规则观察器
规则观察器不调用模型,结果只由输入决定。它们读取有明确结构的内容:简历经历条目里出现的技术名称、技能栏里“熟练掌握”“了解”这类修饰词、岗位的级别(实习、校招还是社招)、模拟面试每一层是否通过、投递从笔试走到了二面。技术名称的识别有不少细节,比如英文名必须是完整的词,java 不会匹配到 javascript;“消息队列”不会被拆出“队列”去匹配数据结构里的“栈与队列”。
模型观察器
需要理解语义的地方交给模型观察器:这道面试题对应目录里的哪个知识点、问到了第几层;简历这一行写的角色和数字是什么;一道经历题的回答里,求职者说自己贡献了多大分量、是参与还是主导、每次追问的方面有没有讲清楚;岗位描述里要求了哪些知识点、要求到什么程度;两份简历里的两段经历是不是同一段。
| 对象 | 规则观察器 | 模型观察器 |
|---|---|---|
| 面试作答 | 每一层是否通过、要点、事实错误 | 题目对应的知识点与层级 |
| 经历 | 经历条目、所在组织、用到的技术 | 分量、角色、各追问方面是否讲清 |
| 简历说法 | 技能栏熟练度说法 | 每一行的角色词与数字 |
| 岗位 | 级别、技能标签 | 要求清单与要求层级 |
| 跨记录 | 数字是否一致、经历是否可能重复 | 两段经历是否同一段、两个数字是否真的矛盾 |
模型的输出不会被直接采信。每一份结构化输出先过格式校验,字段取值必须在规定范围内:比如经历的分量只能是五档之一或“未知”,角色只能是参与、负责、主导、独立完成或“未知”,填了别的词就当作未知。所有带原话的字段都要核对原文,原话必须能在原始记录里逐字找到。测评中,结论引用的 420 条原话全部能在原文中找到。
每条观察都记录输入的哈希值和观察器的版本。同样的输入、同样版本的观察器只调用一次模型,结果可以复用;观察器升级后,只有受影响的输入会被重新读取。推断参数调整时则完全不需要重新调用模型,只需用已有的观察重新计算。这也是为什么修改推断规则的成本很低:改完可以在全部历史数据上立即重算,并和旧版本逐条对比。
5. 能力推断:每个知识点都带着不确定度
能力推断的对象是知识点。DrawOffer 维护一份平台公共的知识目录,计算机方向目前收录 140 多项技术、1000 多个知识点,每个知识点标明重要程度、最深能问到第几层,部分还附有分层的评分标尺。其他岗位类别有各自的考点库。层级从浅到深依次对应“了解、熟悉、掌握、精通、专家”。
用一个分布表示“有多会”
系统不会给每个知识点记一个分数,而是记一个正态分布:均值表示目前估计的水平,方差表示有多不确定。一个从没被问过的知识点,均值停在一个偏保守的基线上,方差很大;被认真问过几次之后,均值移到证据支持的位置,方差变小。同一项技术下的知识点、目录里标为相关的知识点,在先验里彼此有一定的相关,所以答好 Redis 持久化,会让对 Redis 主从复制的估计也略微上移,但这种联动只是弱的,不能代替直接作答。
一次作答怎样改变估计
面试题在某一层上是否答过,用一个逻辑函数描述:能力越高于这一层的难度,答过的概率越大。设一道题作用于知识点的能力 z,区分度为 a,这一层的难度为 b,那么答过的概率是:
p(y = 1 | z) = σ( a · (z − b) )
σ 是逻辑函数;y = 1 表示这一层答过,y = 0 表示没答过。
来源可靠度 r 以指数的形式作用在似然上,可靠度越低,这次观察对估计的影响越小。系统先在这道题涉及的方向上做一维的拉普拉斯近似,得到新的众数和方差,再把变化按协方差传给整个状态,这是一次秩一更新:
p(z | y) ∝ N(z; m, v) · p(y | z)^r μ⁺ = μ + (c / v) · (ẑ − m) Σ⁺ = Σ + (c cᵀ / v²) · (v̂ − v)
m、v 是这道题方向上的先验均值与方差,ẑ、v̂ 是近似后的众数与方差,c = Σu。
一道题通常有多层:从某一层开题,答过了就继续追问更深一层,直到答不上来或到达这个知识点的最深层级。系统把一道题的多层结果合并成一次观测处理,并考虑评分器自身的误差:如果评分模型已知会把真实的第二层偶尔判成第三层,推断时就按这个误差矩阵读取报告的层级,而不是完全相信它。
答对一道题时,系统还会给它的前置知识点记一条较弱的观察:能讲清 B+ 树的分裂,通常也说明理解了基本的树结构。这条派生观察的权重很低,只延伸一层,而且不算“被问过”,不能单独让前置知识点下结论。
结果可以逐字节复现
推断全部使用双精度浮点、固定的迭代次数和完全确定的输入顺序,观测按发生时间、片段编号和观察排序。测评中,25 份剧本在同一进程内重复推断 5 次、换两个新进程和不同的哈希种子再推断,60 个时点的结论都逐字节相同。端到端的一致率之所以只有 86.8%,是因为观察器每次调用模型都会重新采样;推断这一步本身是 100% 可复现的。
6. 时间:久未练习,把握会回落
三个月前答好的一道题,和昨天答好的一道题,对“现在会不会”的说明力度不一样。系统在两次观测之间让估计随时间回落:均值逐渐回到基线,方差逐渐回升。设两次观测之间隔了 Δ 天,知识点的稳定度为 s:
f = exp(−Δ / s),g = √(1 − f²) μ′ = μ₀ + F (μ − μ₀) Σ′ = F Σ F + G Σ₀ G
μ₀、Σ₀ 是基线均值与参考协方差,F、G 是由各知识点的 f、g 组成的对角阵。
稳定度会随作答更新:开题这一层答过了,稳定度按间隔增长;没答过,稳定度减半。稳定度的范围在 30 到 720 天之间,所以反复答好的知识点忘得慢,刚学会的知识点忘得快。经历的技术深度与业务深度变化更慢,稳定度固定为 180 天。
这个机制的作用是让旧证据对“现在”的说明力逐渐减弱,它并不是一个经过验证的、适用于每个人的遗忘规律。我们在公开教育数据上做过检验:同一个引擎打开遗忘与关闭遗忘相比,对“隔了一天以上才再次练习”的作答,预测下一题的 AUC 在 EdNet 上平均高 0.006,在 Junyi 上高 0.003,两个数据集共 10 折全部为正。幅度不大,但方向一致。
遗忘也决定了复测的时间。一个你曾经掌握的知识点,当答题带来的提升被遗忘掉大约 65% 时,系统会把它列为“复测到期”,在下一场模拟面试里安排再问一次。只有真正掌握过的点才会进入复测,从没被直接问过、只是被相邻知识点带高的点不会出现在复测提醒里;刚答完 7 天内也不会到期。
7. 证据门槛:证据不够,就不下结论
这是整套设计里最重要的一层。一个后验分布即使很有把握,也不一定足以对外说出一个判断。比如一场面试里,求职者状态不好,连续几道题都答得不理想;如果每道题各自独立地读,这些答错会把好几个其实会的知识点都推到“缺口”一侧。又比如一道题被拆到两个知识点上,两个点各自只有半道题的证据。
所以,判断“某个知识点低于岗位要求”或“简历上的熟练度写高了”时,系统除了看后验概率,还要求直接作答的证据满足以下条件:
- 概率达到 0.7。能力落在门槛某一侧的概率不低于 0.7。
- 单个知识点至少有一道完整的主问题。180 天内至少有一道完整主问题落在它上面;一道题被拆到两个知识点时,各算半道。
- 宽泛的结论要有多个知识点支撑。判断“整项技术偏弱”时,至少要有 2 个知识点、来自不同的回答,且各自最近一次作答本身就落在这一侧,不看它们后来被其他知识点拉到了哪里。
- “缺口”要跨越两天。判定“低于门槛”时,直接作答要跨越至少一天,一场发挥失常的面试只会让估计下降,不会单独定为缺口,下一场再问到时才判定。判定“达到门槛”不受这条限制。
在参数化的模拟学习者上,“缺口要两天”这一条让状态失常那场之后被误判为缺口的比例从 27.7% 降到 12.5%,单一短板的检出率没有下降;代价是确实偏弱的学习者,缺口要晚一场才判出来。我们认为这个取舍是值得的:误判一个缺口,会让求职者把时间花在本来会的东西上,还会削弱对整个系统的信任。
我们在研究论文中用消融实验检验了这一层:把门槛换成“只看后验概率”,去掉作答次数、覆盖的知识点和时间跨度的要求,其他规则不变。结果是通过的检查点减少,问题的准确率明显下降,多出来的主要是本不该报的问题。具体数字见研究论文。
8. 问题:发现、跟踪,直到解决
能力估计本身不直接给用户看,用户看到的是“问题”:值得关注、可以行动的具体事项。每个问题的编号由类型、涉及的对象和目标计算,重新推断后编号不变,所以一个知识缺口答好后解决、过一段时间又答错时,会以同一个编号“复发”,而不是变成一条新记录。
| 问题 | 什么时候出现 | 什么时候解除 |
|---|---|---|
| 知识缺口 | 目标要求的知识点按证据门槛判定低于要求层级 | 连续两个评估时刻,低于要求的概率都不到 0.7 |
| 简历写高 / 写低 | 去掉简历自述后的估计,按门槛判定低于或高于声称的等级 | 与知识缺口相同 |
| 经历讲不清 | 某个追问方面的讲清程度低于 0.4 | 连续两个评估时刻不低于 0.55 |
| 角色写高 / 写低 | 实际角色低于或高于简历角色词的概率不低于 0.7 | 概率低于 0.5 |
| 表述不一致 | 同一经历同一指标的两个数字相差超过 30%,且确实矛盾 | 能解释或你选定其中一个数字 |
| 准确性风险 | 同一考察点两处事实错误,或经历题中方案不自洽 | 之后两次自洽的回答 |
| 复测到期 | 曾经掌握的点,把握因遗忘跌破复测线 | 再次作答 |
判断简历是否写高时,系统使用的是“去掉全部简历自述之后”的估计。这样可以避免循环论证:不能因为简历写了“精通”,就让“精通”的说法给自己作证。
问题有完整的生命周期。刚判定时是“出现”;在页面、对话或准备清单里展示给你之后,变成“已告知”;你勾选了针对它的准备项,变成“练习中”;后来的作答不再支持它,变成“已解决”;再次答错则“复发”。目标结束(比如这个投递已经有了结果)时,相关问题进入“沉睡”。你也可以随时忽略某一条问题,它就不会再出现在助手和各个页面里。
练习本身不会让问题解决。勾选了准备项、看了报告讲解,只说明你练过,不说明你会了;问题状态只能由作答改变。这条规则防止“只练不考”让记忆看起来越来越好。
9. 经历与简历说法
求职面试有相当一部分时间在问经历。DrawOffer 对每段经历单独建模:它在几份简历里分别出现在哪里、你在其中的分量和角色、技术深度和业务深度、被追问时各个方面有没有讲清楚。
同一段经历只算一段
同一段实习可能在三份简历里以不同的标题出现。系统先用规则挑出候选对:组织相同、时间重叠、标题相似,三者满足其二才进入候选;再结合模型对“是不是同一段”的判断,计算合并的概率,达到 0.8 才合并。每一次合并都记下依据,你也可以手动合并或拆开,你的更正永远优先于系统的判断。
分量、角色与讲述
经历的分量和角色只看面试中的判断,不看简历自己怎么写。角色从四档均匀分布出发,每次面试判断进来就按判断的准确率更新;只有当“实际角色低于简历角色词”的概率达到 0.7,才会提示角色写高。每个被追问的方面从 0.5 起步,讲清加 1、部分讲清加 0.5,再按可靠度加权,并以 180 天为半衰期逐渐淡化。
简历上的数字也会被核对。同一段经历、同一类指标,简历写的和面试中说的相差超过 30% 时,交给模型判断是不是同一个指标、是否真的矛盾;口径不同不算矛盾。面试中说出、简历上还没写的规模和成果数字,会作为“可补充的事实”建议写进简历。
10. 记忆在哪里被用到
记忆是为使用而存在的。所有使用方都通过同一个读取入口取得记忆,读取时统一过滤:只用你自己的记录和更正;被忽略、已沉睡的问题不出现;没过证据门槛的结论只出现“待评估”,不出现等级或问题。
- 助手对话
- 会话开始时,系统把与当前目标最相关的结论编译成一段上下文,每条带编号。助手回复中引用的编号会被逐一核对,只有本会话真正下发过的才算有效。会话中途你更正或删除了记忆,下一轮就按新的记忆重新编译。你也可以在创建会话时选择通用模式,不附带任何记忆。
- 模拟面试出题
- 出题计划按“问这一题能带来多少信息”和“复测的收益”给候选考察点排序,先补问还不能定论的点,再安排复测和诊断题。记忆推荐的题不超过本场题量的 60%,30 天内问过的原题只能作为复测出现。评分时看不到任何记忆内容,有没有弱项记录,评分看到的都一样。
- 简历段落精修
- 标出面试中考察过且没过关的行,附上追问链和练习入口;面试中说过的事实可以写进改写。
- 面试准备清单
- 列出未解决的问题、复测到期的知识点和这家公司真实问过的题,每一项都标明来自记忆。
- 答辩提纲
- 列出简历上最可能被追问、且现在守不住的 8 个点,每个点附上可能的追问、现在守到哪一层和练习入口。
- 岗位匹配卡
- 逐条要求展示面试证据:已达标、未达标还是证据不足。
面试前速览、匹配卡、复盘对比这些页面由代码直接渲染,不调用模型,也不扣积分。展示过的问题会登记为“已告知”,同一问题在同一位置每天最多登记一次。
11. 你说了算:查看、更正与删除
记忆是你的。它记了什么、依据是什么,都能看到:记忆页列出每段经历、每项技术、每条简历说法和每个问题,每条证据都指回来源(哪场模拟面试、哪次复盘、哪份简历)。
- 更正。你可以合并或拆开经历、驳回某条提及、固定某个取值、选定矛盾数字中正确的那个、忽略某个问题。更正作用在来源位置上,所以简历改字、观察器升级后,更正仍然有效。
- 这条不对。觉得某条结论不对时可以直接标记。在没有新证据之前,这条结论不再交给助手和各个页面使用;来了新证据或判断变了,再照常使用。
- 删除单条结论。删除后,这条结论不再出现,它依赖的那部分证据也不再计入。
- 删除原始资料。删掉一份简历或一场面试,相应的片段和观察一并删除,系统用剩下的记录重新推断。
- 清空记忆与注销。清空后,此前的全部观察、更正、问题记录、预测和提醒都会删除,之后的新数据照常记录;注销账号会删除全部记忆数据。
删除之所以能做得干净,是因为结论从来不是单独保存的“事实”,而是每次从剩余的来源重新推断出来的。测评中我们逐一删除了 25 份剧本里的每一份来源,共 85 次:只依赖被删来源的 176 条结论全部消失,残留的结论为 0,仍然引用被删来源的结论为 0,残留的观察也为 0。
需要说明这项保证的范围:它针对的是推断上的依赖关系,即被删除的来源不会再支撑任何结论。它不代表模型服务商的日志、缓存或所有存储副本中都不再有这份内容;那些由隐私政策和各自的数据保留规则约束。
12. 工程实现
每次读取记忆时,系统都从头组装当前状态,不缓存可变的中间结果。为了让长历史也足够快,推断引擎为每位用户的几条推断流保存检查点:新增一场面试时,从最近的检查点续算,而不是从第一条记录开始。检查点和全量重放的结果逐位一致;只要中间有迟到的记录、删除或更正,检查点就会失效并回退到更早的一个。
| 历史长度 | 观察条数 | 全量推断 P50 | 全量推断 P95 | 新增一场 P50 |
|---|---|---|---|---|
| 60 次作答(10 场) | 120 | 0.005 秒 | 0.006 秒 | 0.010 秒 |
| 600 次作答(100 场) | 1200 | 0.044 秒 | 0.053 秒 | 0.012 秒 |
| 3000 次作答(500 场) | 6000 | 0.277 秒 | 0.798 秒 | 0.038 秒 |
推断参数带版本号,每次修改都登记为一个新版本,不修改已发布的版本。新版本上线前,可以用影子对比在同一批数据上生成两个版本的结论并逐项比较;切换参数只需重新推断,不需要重新调用模型。观察器的模型调用按每位用户每天的上限执行,整理记忆的费用由平台承担。
13. 已知局限与下一步
我们希望如实说明这套设计目前做不到什么。
经历讲得清不清楚,判断得还不够好。在测评里,这是引擎落后于“把全部记录交给大模型”最多的一类检查点(经历评估 8/14,大模型 13/14)。部分原因在于真实面试复盘入库时,每道题只有一组问答,追问被并进了回答里,判断讲清程度的观察器看不到追问的结构。改进复盘的记录方式在计划中。
测评数据是虚构的。目前全部测评都使用开发团队编写的虚构求职者剧本,还没有经过独立标注人核对,也不是真实用户数据。产品已经实现了面试前预测存档、面试后勾选与校准报表,真实数据积累起来后,我们会按真实结果校准来源可靠度、遗忘速度和证据门槛。
不从其他用户身上学题目难度。在公开教育数据上,引擎与经典模型 BKT、PFA 相当,但低于会从大量学生身上学习每道题难度的 IRT 和 DKT。这是有意的选择:求职场景里的题目大多不重复,个人记录也不应被用来校准别人的结论。
固定的参数可能不适合每一个人。来源可靠度和遗忘速度目前对所有人相同。一些更细的机制已经实现并在模拟中测试过,比如区分“当场状态不好”与“确实不会”、识别“会但讲不出取舍”、估计个人的学习速度,但在模拟中它们的收益还不足以抵消代价,因此默认关闭,等真实数据来评估。