面试知识库

13. 面试总纲:简历映射与速背#

一句话结论:简历上每一句都能落到一个机制、一章和一组文件;背这一章,追问再翻对应章。

本章只做三件事:把简历说法映射到机制与章节、把各章速背卡收成一页、给压力题的 30 秒答法。 基准 HEAD 634f4ab(2026-09-22)。本章不评价简历里的数字,只标它对应哪套机制。

怎么用这本手册#

  1. 先背这一章:5 分钟自我介绍 + 30 张速背卡 + 压力题 10 道,够撑一轮完整面试。
  2. 被追细节就翻映射表:表里第 3 列是章号,第 4 列是文件,翻过去看那章的「机制怎么跑」。
  3. 问「为什么这么设计」翻该章「它解决什么问题」:四格是问题 → 坏法 → 修法 → 代价,代价那格一定要说。
  4. 问数字来源翻该章「数字与证据」:标 ✓ 的当场能说文件,标「仅口径 / 未验证」的先说清楚这点。
  5. 问「你踩过什么坑」翻该章「坑与易混点」:每章 ≤5 条,挑一条讲透比列五条强。

5 分钟自我介绍版#

① 做的是什么(约 40 秒) ShoppingX 是跨境电商购物 Agent:用户说一句「旅行三件套、预算 300、不要塑料」, 它自己拆意图、跨平台检索、比价、算关税运费,输出带选购理由的商品卡清单, 并把用户偏好记成可跨会话复用的长期事实。数据是 Kaggle 的多平台商品,约 150 万条。

② 架构:一环两进程(约 60 秒) 全仓只有一个 Agent,拿全部 19 个业务工具,要并行就在同一轮发多个工具调用,不派子 Agent。 多 Agent 我做过两代(同质 fork、Supervisor-Workers 读写切分),翻线上会话发现 TradeAgent 440 会话 0 次派发、SearchAgent 60 次派发全是单跳壳,就把整条派发机制删了。 部署是 API 与 worker 两个进程 + Redis Stream 队列 + MySQL,可以横着加副本。

③ 检索三段(约 50 秒) 召回、精排、精挑。召回是 BGE-M3 编码 + Qdrant dense 近邻 + payload filter, 精确需求(平台/价格/评分)当 filter 不当分;精排只有一处,在合流后的 item_picker 里 用 cross-encoder 判品类对不对;精挑是确定性加权求和,最多出 3 件。 整条链只有 planner 一次 LLM 调用,其余全可复现。

④ 记忆与控制面(约 70 秒) 记忆分两层:长期是一张事实表,key 就是身份、同 key 覆盖,每轮注入 tier-one 一批, 其余靠 recall_memories 按主题翻;短期是会话级 P_t,唯一写者是 planner。 「不许怎么跑」全写成钩子挂在 harness 上:6 个 hook 点、25 个钩子, 安全闸硬拒、效率闸连拒 2 次放行,失控防线是迭代 30 / 整轮 300 秒 / 结果截断 / 循环检测 / 三本检索账。 写边界靠三样:is_read_only 标记、PermissionEngine 按名放行不用 BYPASS、下单决议只走 HTTP。

⑤ 评测与训练(约 60 秒) 没有单一指标能评 Agent,所以每条 query 让 judge 先生成专属评分细则,分 P0 红线 / P1 规范 / P2 质量三档, 再跑「打分 → 捞 bad case → 改 prompt 或检索策略 → 重跑同一把尺子」。 训练侧做了两件:用 ESCI 人工标注微调 embedding 与 reranker;把 RL 限定在 planner 这一个单步任务, reward 靠把模型写的检索词真打进 Qdrant,不让 judge 噪声进训练回路。 reranker 离线涨了但没上线,planner 的 4B 也没接进线上——这两条我当复盘讲,不当成绩讲。

简历说法映射表#

项目一:ShoppingX#

简历原句(截短)对应机制一句话章关键文件
跨多平台交互式购物 Agent,Amazon / Shopee / Lazada / SHEIN商品库是 Qdrant 单 collection,platform 走 payload filter 分平台01 / 04app/recall/qdrant_store.py、app/tools/item_search.py
自动跨平台并行检索、比价、计算到手价同轮多发 item_search;检索成功后 autopick 自动跑 price_compare + item_picker02 / 04app/harness/autopick.py、app/tools/price_compare.py、shipping_calc.py
输出附带选购理由的商品卡片清单终结工具 shopping_summary 的产出直接当最终答案,正文并进 final_text02app/tools/shopping_summary.py、app/agent/orchestrator.py
技术栈 FastAPI · Qdrant · OpenSearch · Langfuse · AG-UI · WebSocketAPI 与 worker 两进程;召回 Qdrant、品类知识库 OpenSearch 旁路;事件走 AG-UI + WebSocket;trace 进 Langfuse01 / 09 / 10app/api/server.py、app/worker.py、app/recall/kb_client.py、app/api/monitor.py
技术栈 ms-swift · vLLM训练侧:ms-swift 跑 LoRA SFT/GRPO,vLLM 做采样与评测11 / 12scripts/train/、scripts/train/gpu/
单模型主循环同轮批量发起工具调用实现跨平台 / 多槽位并行工具标 is_concurrency_safe=True,框架 gather 同轮多条;platform= / slot= 区分02 / 03app/agent/tool_registry.py、app/agent/agents.py
三层失控防线(迭代上限、循环检测、结果截断与检索预算)迭代上限 30、整轮 300s、工具结果截 4000 token、LoopDetector 滑窗 6/阈值 4、三本互不透支的检索账 8 / 2 / 602 / 06app/agent/limits.py、app/harness/hooks/repetition.py、truncation.py、retrieval_budget.py
会话级短期记忆锚定意图与偏好,抑制多轮语义漂移P_t 存 AgentState.middle_context["pt"],唯一写者 planner,当轮 item_picker 执行;换域清表05app/memory/session_pt.py、app/tools/planner.py
抽象 Agent 全生命周期 Hook Pipeline(session_start / pre_think / pre & post_tool_call / post_reflect / session_end)6 个 HOOK_POINTS 的注册表,25 个 @harness_hook 按 priority 升序跑,钩子只决策、适配器落地06app/harness/middleware.py、adapter.py、app/harness/hooks/
统一管控结果截断、工具熔断、单步断言、漂移检测截断在 truncation.py;依赖熔断分两处(Qdrant/OpenSearch 在 recall 侧、模型出口在网关);断言与漂移各一个 hook 文件06 / 04 / 09hooks/validation.py、hooks/drift.py、app/recall/qdrant_store.py、app/agent/llm_breaker.py
三类单步断言(Schema / Sequencing / Semantic)入参 schema 校验、工具先后次序校验、语义一致校验,三组判据都读已发生的事实06app/harness/hooks/validation.py、hooks/sequencing.py
Silent Drift 每 3 轮识别目标遗忘 / 探索发散 / 偏好丢失 / 成本失控,分级纠正漂移 hook 周期性比对当前轨迹与 planner 目标,命中给 nudge,不硬拒06app/harness/hooks/drift.py
四阶段状态机(规划→搜索→比较→总结)动态收缩可用工具子集阶段机 phase_machine.py 已在 10526d1 删除,改成两个事实位 progress_marks / force_conclude + 预算制06app/api/run_state.py、app/harness/hooks/budget.py
通过 pre_tool_call Hook 拦截越权调用pre_tool_call 上的闸拒工具时抛 HookRejectSignal,由适配器落成拒绝06app/harness/middleware.py、adapter.py
保留工具定义与前缀缓存不摘工具表:禁用一律在执行层回哨兵文案,工具表逐轮恒定06 / 07app/harness/sentinels.py、app/harness/formatter.py
每条 Query 动态生成专属评分细则,由 Judge 模型自动打分rubric 动态生成后按生成 prompt 全文 hash 缓存;P0 否决 / P1 扣 10 / P2 打 1-508app/eval/rubric.py、scripts/eval/run_rubric.py、data/eval/rubric_cache/
评分→定位 bad case→迭代 Prompt / 检索策略→再评测对照固定 95 条种子集重跑同一把尺子;自动修只覆盖确定性可修的一类08data/eval/queries.jsonl、app/eval/strategies.py
接入 ESCI 人工标注(ASIN join 交集)ESCI 靠 ASIN 与自建 138 万点商品库 join,产出训练与评测两套数据11scripts/train/、data/eval/product_recall_report.json
ANN 难负例挖掘 + cross-encoder 假负闸 数据管线用当时的召回模型挖 hard negative,再用 cross-encoder 按绝对阈值 0.5 闸掉疑似假负11scripts/train/(提交 ae8adab)
BGE-M3 对比精调,R@100 与端到端评测四轮 17 组对照,有效项是「同 query 多正例全展开」;端到端跑 Rubric A/B11data/eval/rubric_A_base_*.json / rubric_B_e15_*.json
reranker 分级 label × loss 函数 2×2 析因,ndcg@8 与跨语言迁移2×2 析因定最优组合(分级 label + listwise CE);离线涨、线上未接(线上只消费判别不消费排序)11app/tools/item_picker.py、提交 9d82cc4
Qwen3-4B LoRA 双通道热插拔(RL 失败一键回退)SFT / RL 两个 LoRA 适配器分通道存放,切换即回退12scripts/train/gpu/、var/train-logs/m23/output/
SFT 冷启格式率、五轮 GRPO 后 rewardSFT 只修 schema 形态,GRPO 五轮取 r3(lr 2e-5、beta 0)12var/train-logs/m23/output/、提交 8735ab0
程序化四维 reward,检索词实打 Qdrant 验证命中reward 45% 来自把生成的检索词真打进 138 万点库看 top20 命中,judge 不进训练回路12scripts/train/(S0-2 9b987ea)
实测修复计分机制层 reward hacking;单变量对照证伪文档推荐学习率逐维拆 reward 定位刷分路径;lr 按单变量对照扫,定位 LoRA-RL 的量级12提交 9b987ea、S3 训练日志

项目二:SREOps(另一个仓库,本手册未覆盖)#

下面 5 行不在本仓代码里,本手册没有对应章节。列出的「最近的可类比机制」只是面试时好串的对照,不是同一套实现。

简历原句(截短)本仓最近的可类比机制章
分层自适应调查引擎:规则预处理 → Tier1 Runbook / Tier2 向量检索 / Tier3 ReAct Loop 递进「能确定性算的不交给模型」同一思路:autopick 自动比价精挑、picker 确定性加权02 / 04
假设驱动式调查:先生成 3-5 条根因假设再定向取证,达标即终止终结判据写在机制里而不是提示词里(终结工具 + 看门狗 + 迭代上限)02
Runbook 冷启动与自增长闭环:Tier3 经人工确认后提炼成结构化 Runbook评测飞轮的「bad case → 沉淀策略 → 再评测」,自动只收确定性可修的那一类08
LLM 修复操作安全治理:白名单结构化工具替代自由 shell;高风险人工审批写边界三样:is_read_only 标记 + 按名 ALLOW 不用 BYPASS + 决议只走 HTTP03
事务化修复:预生成补偿操作、CAS 漂移检测、三级递进门禁下单的幂等键(run_id + 顺序无关指纹)与「订单号撞了重分不覆盖」03

专业技能段#

简历原句(截短)对应机制一句话章关键文件
熟悉 Skills、MCP 等扩展机制7 份内置 skill:目录(name + description)常驻 system prompt,正文由模型调 Skill 按需读;MCP 工具按只读白名单挂载14 / 03skills/、app/agent/tool_registry.py
了解 RAG 全链路商品侧 dense 召回 + cross-encoder 精排;品类知识库走 OpenSearch Hybrid(KNN 0.7 / BM25 0.3)旁路04app/recall/、app/tools/category_insight.py
Agent Harness / Loop 架构设计主循环交 AgentScope,「不许怎么跑」全在 harness 的 6 点 25 钩02 / 06app/harness/
embedding / reranker 对比精调ESCI join + hard negative 挖掘 + 假负闸;离线与端到端两套评测口径11scripts/train/
LLM 的 LoRA SFT + GRPO 全流程(数据构造、reward 设计与标定、离线 / 端到端评测)只训 planner 单步;reward 程序化、判据可复算;dev92 做选型尺子12scripts/train/、var/train-logs/m23/
数据库:MySQL、索引、事务起服形态闸拒绝 SQLite;配额预扣、thread 归属都靠条件 UPDATE 而不是进程内变量;17 条 Alembic 迁移10app/db/holds.py、app/db/runs.py、migrations/versions/
Redis:缓存、分布式锁、常见缓存问题检索缓存 L2 在 Redis(正常 900s / 空结果 60s 挡穿透)+ singleflight 锁;队列走 Redis Stream;去重窗口 SET NX EX04 / 10app/recall/search_cache.py、app/api/server.py
JUC 并发编程 / Java 基础本仓是 Python,对应处是异步并发的同类问题:同轮 batch 的原子性、占槽那段不能有 await03 / 10app/agent/orchestrator.py、app/db/holds.py

30 张速背卡#

#hint展开一句章
1一环:单模型单环无子 Agent并行靠同轮多发 item_search,2026-09-16 按 440/60/0 删掉派发01
2两进程:API 入队 / worker 跑 loopserver.py 只准入与入队,worker.py 领任务调 run_agent01
3三道跨进程闸run_holds 用户级并发 / QUEUE_MAX_DEPTH / WORKER_CONCURRENCY01 / 10
4终结工具 6 个 + 1 个看入参TERMINAL_TOOLS 6 个;ask_user(closes_turn=True) 按入参算终结02
5普通轮 4 次模型调用planner 预置 → item_search → 自动比价精挑 → shopping_summary02
6停不下来先软后硬催 1 次 → 看门狗 45s 软 + 30s 硬 → max_iters 30 硬停02
7终结工具产出 = 最终答案模型补的复述丢掉,工具正文并进 final_text(ddaf043)02
8research 是函数不是子 Agent固定三步无反馈环,次数上界 = len(targets) ≤302
9440 / 60 / 0TradeAgent 440 会话 0 派发、SearchAgent 60 次全是单跳壳03
10删载体不删原则派发机制整条删,写边界三样保证一样不少03
11三样保证is_read_only + 按名 ALLOW 不用 BYPASS + 决议只走 HTTP03
12幂等键 = run_id + 顺序无关指纹框架拿不到 tool_call_id,改用排过序的载荷 hash03
13三段:召回 → 精排 → 精挑召回只挂 dense,cross-encoder 只在 picker 跑一次,精挑封顶 3 件04
14精确需求当 filter,不当分平台/价/评分走 payload filter,品牌/排除词走召回后确定性过滤04
15两级缓存 + 空结果 60sL1 进程 + L2 Redis,只缓存「编码 + 召回」两步04
16错误分级 = 告诉模型别重试DependencyDown → metadata code=dependency_down → 贴「别重试」04
17长期 = 事实表,短期 = P_tmemory_facts 跨会话 / middle_context["pt"] 本次会话05
18key 即身份,同 key 覆盖改主意就用原 key 写新值,没有删除口给模型05
19记忆只经上下文生效注入给模型 → 模型写进 item_search 入参;机制侧硬淘汰腿删了05
20注入 tier-one,工具翻旧账constraint 全进 + 最近补到 8 条;其余靠 recall_memories05
216 点 25 钩,按关切分 8 文件钩子只决策,换模型 / 拒工具 / 写 state 都在 adapter.py06
22安全闸硬拒,效率闸连拒 2 次放行ESCAPE_AFTER_REJECTS=2,安全闸不得声明 escape_key06
23三本账:检索 8 / 站外 2 / 研究 6互不透支,retrieval_budget.py06
24不摘工具,回哨兵工具表逐轮恒定保前缀缓存,禁用全在执行层回文案06
25三层压缩:标记 / 削工具 / LLM 摘要粗活在前细活在后,超 trigger_ratio 0.8 才花 LLM07
26命中率靠前缀不靠标记每轮会变的一律放 system 之后07
27三档:P0 否决 / P1 扣 10 / P2 打 1-5P0 一条 fail 总分直接 008
28先校尺子再改 Agentq28 同一份输出三次采样 0 / 0 / 9008
29断路器只认「对面挂了」429 不计、总超时不计、首 token 超时计且真掐09
30离线 +26%,端到端 0排序腿涨了,线上三个消费点全是判别腿11

备选两张(问到训练侧再加):「只训 planner 一个单步」(12)、「目录常驻正文按需」(14)。

压力题 10 道#

Q1. 为什么把多 Agent 删了?是不是没做出来? 两代都跑起来过(同质 fork、Supervisor-Workers 读写切)。删的依据是线上会话:TradeAgent 440 会话 0 次派发, SearchAgent 60 次派发全是单跳壳(派出去只调一次 item_search 就回来)。载体删掉,写边界三样保证原样留下。→ 第 3 章

Q2. 写安全为什么不用 PermissionMode.BYPASS? BYPASS 是整档关引擎,将来新加的真写工具会被一起悄悄放行。改成按工具名逐个 ALLOW, 放行范围写死在代码里看得见,漏登记的失效方向是「多问一次」而不是「悄悄下单」; 另有一条测试断言每个非只读工具都在放行集里。→ 第 3 章

Q3. reranker 离线 ndcg 涨了,端到端没涨,怎么说? 这是我做过最完整的「优化了错误目标」的复盘:线上 rerank 分数的三个消费点全是判别(这件是不是这个品类), 不消费排序;自训模型排序更好、判别更差,所以没上线,品类门继续用现成 v2-m3 + 阈值 0.20。→ 第 11 章

Q4. 断路器为什么不把 429 算失败? 429 是「我们发太快」,不是「对面挂了」——那是令牌桶的活。把它计进断路器会让自己的限流被放大成服务不可用。 同理总超时不计(可能是单条请求太长),首 token 超时计并且真掐。→ 第 9 章

Q5. worker 的 grace 为什么是 330 秒? 必须 ≥ 单轮墙钟上限 MAIN_AGENT_TIMEOUT_SEC 300,再留 30 秒收尾。 旧默认 120 比一轮还短,等于每次发布主动掐一批还在跑的任务。k8s 侧配 365 = preStop 5 + 330 + 余量 30。→ 第 10 章

Q6. 记忆为什么从偏好条目改成事实表? 旧结构要模型同时给对 polarity / category / domain / slug 四个字段,还要引用旧条目的 dedup_key 去重; 拼错一个字符就是两条互相打架的记录,还不报错,只是推荐变糊。改成 key 即身份、同 key 覆盖, 分类退成三个值只管注入优先级。代价是 key 由模型自拟可能分叉,靠 same_fact 的 bigram Jaccard 0.6 挡一道。→ 第 5 章

Q7. 四阶段状态机为什么删了? 它是「第二套状态机」:真实进度已经写在消息历史里,再维护一份就会和事实对不上,而且收缩工具子集会破坏前缀缓存。 改成读已发生事实的两个位(progress_marks / force_conclude)+ 预算制,禁用一律在执行层回哨兵、不摘工具。→ 第 6 章

Q8. 前缀缓存怎么保住的? 命中率来自「前缀字节逐轮不变」,不是来自打不打 cache_control 标记。 所以:system 段钉死、标记恒 1 个、工具表不动;每轮会变的(记忆、会话约束、历史)一律放 system 之后当注入消息。 2026-07 那次注入块塞进前缀,命中率从 67.5% 掉到 31.6%,之后加了三遍取中位的命中率门禁盯着。→ 第 7 章

Q9. planner 训完线上没用,那这段训练算什么? 算一次完整的 RL 工程流程 + 一次诚实的负结论。分是涨的(dev92 reward 0.790 → 0.813), 但立项要治的域漂移没治好反而退步(domains_f1 0.775 → 0.654)。线上 planner 按同一套 dev92 尺子选型, 换成 API 模型 qwen3.8-flash。价值在 reward 设计:45% 靠真打 Qdrant,judge 噪声不进训练回路。→ 第 12 章

Q10. 单环怎么并行?不是退化成串行了吗? 并行在同一轮:模型一次回复里发多条 item_search(platform= 或 slot=),工具标了 is_concurrency_safe=True, 框架 gather 执行。真 LLM 验收里套装轮同轮 3~5 条、0 次派发。 子 Agent 给的是「独立上下文」,不是并行度——而我的场景恰恰需要候选在同一个上下文里合流比价。→ 第 2 / 3 章

数字速查#

只收各章「数字与证据」里标 ✓ 或「旧版核对过」的。简历里的数字不在此表,被问到直接翻对应章。

数字指什么章
19 / 11 / 8业务工具数 / 只读 / 非只读(= 放行表条目数)01 / 03
6TERMINAL_TOOLS 个数(另加 ask_user(closes_turn=True))02
30 / 300s主 loop 迭代上限 / 整轮墙钟上限02
45 / 30s看门狗软催 / 硬停宽限02
8 / 2 / 6检索总量 / web_search 任务配额 / research 搜索配额02 / 06
4000 token单条工具结果截断线06
6 / 4LoopDetector 滑窗次数 / 同一工具出现次数阈值06
6 / 25harness hook 点数 / 钩子数(曾 37 → 30 → 23)06
2效率闸连拒几次后放行(ESCAPE_AFTER_REJECTS)06
$0.50单任务成本上限(token_budget.py:99)06
440 / 60 / 0删派发依据:会话数 / 派发数 / 真实用户定点调查次数01 / 03
481 会话 0 次真实用户拆出 target_refs 的次数03
30 分钟下单确认卡有效期03
30 / min(top_k,10)单平台召回池 / 多平台每平台取数04
PICK_RERANK_K=15每批送 cross-encoder 的上限04
900s / 60s检索缓存正常 TTL / 空结果 TTL04 / 09
3 次 / 30s / 5sQdrant 断路器阈值 / 恢复 / 查询超时04
0.7 / 0.3品类知识库 Hybrid 的 KNN / BM25 权重04
8 / 64 / 200每轮注入事实上限 / key 字符上限 / value 字符上限05
3 / 20 / 0.6回合后抽取一轮最多落几条 / recall_memories 回几条 / same_fact 阈值05
0.8框架压缩触发比例 ContextConfig.trigger_ratio07
24000 / 6PRUNE_TOOL_RESULTS_TOKENS / PRUNE_KEEP_RECENT07
1024 / 4缓存最小写入阈值 / 单请求标记上限(实际恒 1)07
0.674 / 0.12 / 3 遍缓存命中率门禁基线中位 / 容差 / 遍数07 / 08
67.5% → 31.6% → 78.1%2026-07 注入块塌方与修正统计口径后的命中率07
95 条 / 30 桶Rubric 种子集规模08
10 / 70P1 每条扣分 / 高分轨迹门槛08
0 / 0 / 90q28 同一份输出三次采样(尺子会抖的证据)08
175.8 / 9561.3 / 2293.8 msitem_search / planner / shopping_summary p50(07-09 旧基线)09
83.2 → 39.7 → 17.5s两轮延迟减法(round2 / round3,round3 为 q_backpack 中位)09
5 次 / 30s / 15s模型断路器阈值 / 恢复 / 首 token 预算09
0.99 / 3.0sSLO 目标线:run 成功率 / 首事件 p9509
3 / 200 / 4MAX_CONCURRENT_RUNS / QUEUE_MAX_DEPTH / WORKER_CONCURRENCY10
330 = 300 + 30WORKER_GRACE_SECONDS(k8s 侧 365)10
900sHOLD_TTL_SEC / THREAD_STALE_RUN_SEC(kill -9 后自然失效)10
2.0 美元 / 1000DAILY_QUOTA_USD / CREDITS_PER_USD(= 2000 credit/天)10
12.67 万 / 29.7 万ESCI 与商品库交集:ASIN 数 / 标注数11
R@100 .4434 → .4992(+12.6%)embedding 正例全展开的离线收益11
50.37 → 58.03;P0 11 → 7M21 端到端 A/B(共同跑通 27 条均分)11
+26.0% / +21.6%reranker r3 的英文 / 中文 ndcg@8(离线,未上线)11
38.5% / 88.6%品类门标定:误杀率 / 挡住率(现成 v2-m3 + 0.20)04 / 11
63.04% → 100%planner SFT 的 dev92 格式正确率12
0.790 → 0.813五轮 GRPO 后 dev92 reward(r3,lr 2e-5、beta 0)12
13/13、0/5skill 触发率正例 / 负例误触发08 / 14

面试前一天清单#

  1. 背熟 5 分钟自我介绍五段,掐表说一遍,超 5 分钟就砍第 5 段的训练细节。
  2. 30 张速背卡只过 hint 列,卡住的那几张翻回对应章的「速背卡」再看一遍。
  3. 压力题 10 道各说一遍 30 秒答法,重点练 Q3 / Q9 这两条负结论——先说结论再说为什么不上线。
  4. 每章「坑与易混点」扫一遍,挑 3 条能讲透的,准备回答「你踩过什么坑」。
  5. 准备一条代价话术:每个决策都能说出代价,是这套手册里最容易加分的部分。
  6. 确认能当场说出三个文件位置:app/agent/tool_registry.py、app/harness/middleware.py、app/memory/facts.py。
  7. 简历上的数字自己先默读一遍,被问到就按简历口径答,细节翻本章映射表找章号。