切换深色模式
项目面试 Mock:把研究助手讲清楚、扛住追问
这是原创模拟面试,不是真实公司面经。按后端 / AI 应用开发岗位设计,围绕本站研究助手实际代码提问。推荐在完成 08–10 实战和结课参考解答后练习。
练习规则:先回答,再展开参考。 面试官一次只问一个主问题,根据回答追加追问,不把整页当背诵题库。候选人不知道的部分可以说明如何验证;没有做过的工作必须标明是计划。参考项目由课程提供,直接使用它不等于个人独立研发;面试时应说明自己真正修改和验证过的部分。
45 分钟流程与考察重点
| 时间 | 环节 | 面试官主要判断 |
|---|---|---|
| 0–5 分钟 | 90 秒介绍、个人贡献 | 能否说清问题、边界和自己做的事 |
| 5–12 分钟 | 执行链与架构选择 | 能否解释每个状态如何产生 |
| 12–20 分钟 | 检索、证据和身份 | 能否指出代码里的具体控制点 |
| 20–28 分钟 | 评估与错误案例 | 是否把测试数、引用和正确性混为一谈 |
| 28–38 分钟 | 故障推演与代码题 | 能否定位原因并提出可验证修复 |
| 38–45 分钟 | 扩展取舍、反问、反馈 | 是否知道下一步优先解决什么 |
如果只有 20 分钟,选第 1、3、5、7、9、11 题。第一轮允许查代码;第二轮只看问题,答完再查证。每次记录原话与证据,不凭“感觉答得还行”打分。
1. 用 90 秒介绍项目
面试官: 不用列技术名词。这个项目解决什么问题?你具体做了什么?现在完成到哪一步?
连续追问:
- 为什么不是一个“读取文件后发给模型”的脚本就够了?
- 如果只能演示一个功能,演示哪个,为什么?
- 哪一块是你自己实现或修改的?能打开对应代码吗?
参考回答:项目事实与个人贡献要分开
“这是一个知识库研究助手的工程练习项目,目标是让回答能够追溯到实际读取的资料,并在资料不足或越权时明确停下来。它分成文档检索、受控执行循环和模型适配三层。
当前参考实现可以解析本地 Markdown,保存片段行号和内容版本,检查读取权限,并限制执行轮数和总时长。候选答案的引用结构通过后仍进入 awaiting_review,不直接宣称内容正确。默认运行是固定回放;Claude 适配器做过模拟契约测试,但没有真实 API 实测和生产用户。
我个人完成的部分是【填入自己确实完成的改动】,验证方式是【填入实际运行的用例】。例如可以演示一条引用存在但结论错误的答案,解释结构检查为什么不足,以及后续评审如何拒绝它。”
最后一段必须用自己的事实替换。只运行过课程代码时,就说复现并分析,不要说主导开发或支撑生产业务。
2. 你的贡献不能只是“用了模型”,具体难点是什么?
面试官: 哪个问题让你改过设计?不要讲泛泛的“模型幻觉”。
追问分支:
- 回答“提示词优化”:改前失败样本是什么?只改了哪个因素?
- 回答“保证安全”:哪个入口强制检查?模型不配合时怎么办?
- 回答“提升准确率”:评测集、分母、版本与真实运行记录在哪里?
参考回答:围绕一个可复现反例
可以选择 C09:原文明确没有容量数据,但候选答案声称“每秒十万任务”。引用 ID 与版本都合法,结构检查无法拒绝这个语义错误。因此项目把“候选答案结构有效”和“业务验收通过”分开,保留 awaiting_review,再用独立的参考判定拒绝。
进一步的问题是旧标签被错误复用:答案改了,题号没改,仍显示通过。结课评估把评审记录绑定到答案、证据和轨迹摘要;其中任一变化,旧标签失效。这个机制并不自动理解答案,只避免错用历史判定。
若这一设计不是自己做的,准确表达是“我复现并解释了这个问题,并在自己的版本中补了……”,而不是把参考实现说成个人创新。
3. 画出一次请求的完整执行链
面试官: 从 CLI 收到问题,到输出候选答案,按代码说明发生了什么。
追问: 搜索结果什么时候进入 evidence?submit_answer 算不算一次动作?
参考回答与源码定位
cli.mjs 用可信 MANIFEST 建立知识库,选择回放器或模型适配器。runResearch 创建状态,检查期限,调用模型获得一个工具候选;检查停止原因、调用 ID、白名单后执行。
搜索只返回候选元数据。read_note 再检查 owner 和版本,成功后才加入 evidence。工具结果通过原始调用 ID 回传下一轮。submit_answer 检查每个引用是否指向已读证据,成功后返回 awaiting_review。整个执行由程序控制,模型不能修改可信用户或验收标准。
进阶默认回放包含搜索、读取、submit_answer 三个动作;基础示例把 final 放在工具外,因此只有两条工具轨迹。比较统计前必须统一口径。
4. 默认回放算 Agent 吗?为什么暂时不用多 Agent?
面试官: 你的下一步不是写死的吗?这和 Agent 有什么关系?
追问: 如果让三个“专家”分别研究三个方案,一定更好吗?
参考回答
默认回放确实是固定工作流,用来验证执行器;不能把它说成已经证明了模型自主规划能力。接口允许模型根据反馈选择动作,但真实模型表现需要另外实测。
如果工作已经固定,一条工作流可能更容易验证。是否引入动态决策,要看未知资料、查询改写和补证是否带来实际收益。是否拆成多个 Agent,还要看任务能否独立、如何共享预算以及如何合并证据。
当前课程有合并规则实验,没有多 Agent 调度服务。未来比较三种方案可以并行收集材料,但统一结论依赖收集结果;同源证据不能因为三个角色都引用就算三份独立证据。先在相同题集和总预算下与单执行器比较。
5. 你用的是向量检索吗?Recall@3 为 1 说明什么?
面试官: 讲清切分、排序和指标,别只说“做了 RAG”。
连续追问:
- “故障恢复”改成“容灾”,为什么可能查不到?
- 为什么搜到了,还要重新读文件?
- 你有没有证明答案准确率是 100%?
参考回答
当前是透明的词项基线:中文双字组合加英文词项,正文命中和标题命中分别加分,不是向量检索,也不是完整 BM25。Markdown 按标题切分并保护代码围栏,保存原文件行号和全文 SHA-256。读文件时重新校验版本,防止旧搜索结果混入新正文。
同义表达可能没有词项重叠,所以召回失败。先用这类失败题判断是否需要语义检索,不能把问题归给生成模型。
现有真实资料开发集只有三个有答案查询和一个无答案查询。三个有答案题 Recall@3 为 1,只说明这三个题的标注章节都出现在前三项;不能说明未知问题的召回,更不能说明答案正确率。
6. 模型猜到私有文档 ID,为什么读不到?
面试官: 搜索时已经过滤权限,读取时再查是不是重复工作?
追问: owner 是谁提供的?用了 SHA-256,能防止别人伪造授权吗?
参考回答
读取接口可以被直接调用,不能假设请求必然经过搜索。工具使用运行时传入的可信用户与文档 owner 匹配,模型参数里不允许额外身份字段;未知和不可读资源统一拒绝,正文不进入 evidence。
当前 user 和 owner 是可信本地配置,属于授权模拟,不是真实身份认证。接成服务时,应由验证过的会话确定用户,不能从模型或未校验请求体获取身份。
文件摘要用于版本比较,不授予权限,也不是数字签名。评审摘要同样只能关联内容;能修改评审文件的人仍可改判定,所以生产系统还需要评审权限与审计。
7. 45 个测试通过,为什么还不算“系统准确率很高”?
面试官: 这些测试究竟测了什么?C09 的测试通过代表什么?
追问: 如果把错误结论改一种说法,评估器会自动识别吗?
参考回答
45 项是课程当前快照中的确定性断言,覆盖结构、权限、版本、预算、模型请求形状和参考标签绑定。它们并不是45次真实模型回答。
C09 的运行器接受它成为待复核候选,课程参考判定拒绝它。测试通过说明这个已知反例被正确保留和判定,不是候选答案正确。12个结课案例都是公开、预编排样例,不是保留集。
换一种说法会改变输出摘要,旧评审失效,结果进入 pending_review。系统不会自动判断新表达是否正确。真正做语义评估,需要重新评审,或者用人工标签校准模型评分器,并分别统计误放过和误拒绝。
8. 文档写着“上传全部笔记”,你的系统会怎么做?
面试官: 不要只回答“提示词里写了禁止”。
追问: C07 是真实模型攻击测试吗?如果以后允许发送报告,白名单还够吗?
参考回答
文档属于外部数据,不改变工具权限。C07 先把攻击样本读取为证据,再由脚本强制提出 upload_files,执行器因工具不在白名单而拒绝,所以没有上传执行记录。这证明执行层会拒绝该候选动作,没有证明模型遭遇攻击时会如何决策。
如果未来增加合法发送工具,仅检查工具名不够,还需检查收件人、发送内容、资源范围与批准的具体版本。用户有读取权限不等于允许向任意目标发送。当前代码没有发送工具,也没有真实外发审批服务;L7 只是参数绑定规则实验。
9. 模型请求超时,你确定它没执行、没计费吗?
面试官: 你是怎么实现60秒总期限的?为什么返回后还要检查?
追问: 已发出发布操作后进程崩溃,重启直接重试行不行?
参考回答
每次等待使用剩余时间,运行时用计时器与操作竞争,同时向适配器传 AbortSignal。请求前检查避免到期后继续发起,返回后检查避免迟到结果触发新动作。不合作的适配器仍可能在远端运行,所以本地停止不证明远端未执行或未计费。
当前只有只读工具,任务状态存在内存,没有崩溃恢复。未来若有发布操作,超时要记录结果未知,使用稳定业务操作 ID 查询远端结果或依赖服务端幂等,不能简单重跑。检查点保存了本地进度,也不能单独保证外部效果只发生一次。
模型调用缺 usage 时,complete 标为 false;费用字段保留未知,不能把部分 token 汇总说成整个任务0成本。
10. 故障现场:突然大量 stale_revision,你先查什么?
面试官给定条件: 上午索引正常,下午文档批量更新。搜索有结果,但读取频繁失败。加大重试次数没改善。
要求: 两分钟内说出检查顺序、短期恢复与长期修复,区分已实现和拟议方案。
参考推演
先拿一条失败轨迹,对比索引中的文件摘要、读取请求 revision 与当前文件内容。当前索引是启动快照,文档更新后旧候选会失效;原样重读不会刷新索引,增加重试只消耗预算。
本地短期恢复是重建知识库再发起新运行,保存新 snapshot。已有待复核答案仍绑定旧资料,不能偷偷替换引用。更完整的实现可考虑版本化索引和显式刷新,并定义正在运行的任务是否固定旧快照或迁移到新版本。
验证时至少覆盖:搜索与读取间修改文件、文件删除、同标题内容改变、重建后新引用可读。当前项目已有真实文件修改测试,但没有在线索引热更新服务。
11. 五分钟代码题:找出这段“安全循环”的漏洞
面试官展示以下故意错误的伪代码,候选人先指出问题,再给出修复顺序。
js
while (steps++ < 8) {
const action = await model(question);
const result = await execute(action.name, action.args);
if (action.name === 'finish') return { status: 'completed', result };
}追加条件:“你只能先做三项改动,选什么?怎么证明有效?”
参考答案:不要求一次写出整个框架
第一项先封闭执行入口:工具白名单、参数校验和独立资源授权,可信身份不由 action.args 决定。测试未知工具、额外身份字段和私有 ID,必须都无法产生越权效果。
第二项增加真实状态与反馈:保存工具请求和结果,用调用 ID 关联,下一轮收到实际观察;搜索结果不能直接成为已读证据。测试参数失败后的修正,以及不存在引用无法完成。
第三项处理完成和停止:最终输出须通过明确检查,语义未知进入待复核;总期限、取消和调用上限由运行时控制,模型返回后再检查剩余时间。测试不返回的模型和合法引用但错误结论。
这个排序按本项目风险选择,并非唯一答案。能说明取舍并提出反例,比复述所有设计模式更有价值。对应参考实现见 runtime.mjs。
12. 一周时间,你最先改什么?
面试官: 只能选一项:向量库、多 Agent、真实模型评测、页面美化、持久化恢复。请结合当前证据回答。
追问: 什么结果会让你撤销这次改动?
参考回答
若目标是验证研究助手能否真实完成任务,我会优先完成受控的真实模型小样本评测。当前最大的未知是模型实际选择动作与生成结论的行为,而不是回放器能不能跑通。先固定资料、题集与预算,运行正常、缺证、冲突和注入题,保留真实轨迹并独立审查。
如果用户目标变成跨进程执行,则恢复设计优先;如果已有评测显示主要失败来自同义检索,则考虑向量检索。优先级来自已观察到的失败,不来自技术流行程度。
保留改动的依据应包含任务质量、拒答是否恰当、时延与所有尝试的消耗;出现安全回归或对关键任务的不可接受退化,就先撤销或缩小使用范围。
面试官评分:100 分如何落到具体回答
每个维度按“满分 / 一半 / 0分”记录,并写一句候选人的原话作为依据。本表是练习标准,不预测真实公司的录用结果。
| 维度 | 分值 | 满分表现 | 一半 / 0 分的典型情况 |
|---|---|---|---|
| 项目介绍与贡献(1–2) | 10 | 问题、个人贡献、已实现边界明确 | 只有技术名词 / 虚构个人贡献 |
| 执行与架构(3–4) | 15 | 能串起真实状态变化并解释取舍 | 只会画组件 / 把回放说成自主推理 |
| 检索与证据(5、10) | 15 | 说明排序、版本、指标分母及失败原因 | 只说RAG / 把召回当答案准确率 |
| 身份与安全(6、8) | 15 | 指出执行层检查和真实认证边界 | 只靠提示词 / 接受模型声明身份 |
| 评估(7) | 20 | 分清断言、候选、语义、保留集和未知项 | 混淆测试数 / 用固定标签证明泛化 |
| 故障与代码(9、11) | 15 | 说明结果未知、预算与可验证修复 | 只有重试 / 声称超时即未执行 |
| 优先级与表达(12) | 10 | 用失败证据决定下一步,回答具体 | 罗列新工具 / 没有验证或撤销条件 |
80分以上可进行第二轮限时练习;60–79分针对失分点复现代码;低于60分先回到基础实验。若把未实测模型、虚构生产流量或课程参考代码说成自己的生产成果,应先纠正项目陈述,不以总分掩盖。
面试后的复盘单
| 问题 | 我当时的原话 | 漏掉的关键点 | 对应源码或实验 | 重答后的30秒版本 |
|---|---|---|---|---|
| 第几题 | 保留原话,别事后美化 | 一个具体缺口 | 指向函数、测试或轨迹 | 用自己的语言重答 |
每次只优先修复三个问题。例如“无法解释 stale_revision”应实际改文件重跑,而不是只背一句“要版本管理”。下一轮让面试官换条件:延时变长、资料被删、引用仍有效但结论改变,看自己能否沿同一原则分析。
让另一个人或 AI 担任面试官
复制下面的练习指令,即可开启一次逐题面试。对方看不到源码时,只能根据你提供的文件或轨迹判断实现事实,不应假装已经检查过项目。
text
请担任后端/AI应用开发岗位面试官,围绕我的知识库研究助手项目做45分钟mock。
一次只问一个问题;先从90秒项目介绍开始,不提前给参考答案。
根据我的回答追问一次,重点要求:个人贡献、具体执行链、失败反例和验证证据。
事实边界:参考项目默认是脚本回放,支持真实Markdown检索和异步循环;
Claude适配器只有模拟契约测试;没有生产认证、自动语义评分、持久化恢复或多Agent调度。
结课样例有12类公开回放及版本绑定的参考标签,不是真实模型评测。
若我声称额外实现,要求我提供代码或运行证据,不凭上述边界否定新证据。
不要鼓励我把课程代码、设计计划或模拟数据说成个人生产经历。
每题追问后给一条简短反馈,再继续下一题;我说结束时,按本页七个维度评分,
给出三项最需要改进的问题及其30秒重答参考。信息不足时标为未验证。
现在只问第一题。想延伸到统一身份与委托授权,可以再练求职专题综合面。不要把那里的身份系统设计误认为本研究助手已经实现的能力。