面试题库
共 328 题,当前筛选 2 题。
课程全部30 天从前端工程师到 Agent 工程师5 天提示词工程零基础Claude 高效使用:从对话到 Claude CodeCodex 与 OpenAI Agents SDK 高效使用7 天 MCP:把工具接进任何 Agent7 天 Agent Skills:把经验做成可复用能力5 天上下文工程14 天 RAG:从检索到可信回答14 天用 Agent 搭一条 AI 短剧生产线
标签
全部#security2#cost6#distributed-systems6#reliability6#idempotency5#message-bus5#operations4#architecture3#deployment3#observability3#redis-streams3#scalability3
还有 29 个标签收起标签
#database2#error-handling2#long-term-memory2#ordering2#rag2#scheduling2#sharding2#sse2#state-machine2#atomicity1#chunking1#configuration1#consistent-hashing1#data-modeling1#fan-out1#fencing-token1#interrupt-merge1#lease1#pgvector1#reconnect1#redis1#reporting1#retrieval-quality1#schema-design1#split-brain1#stateless1#system-design1#tool-design1#vector-database1
30 天从前端工程师到 Agent 工程师
D12 长期记忆:pgvector、embedding、chunking、memory_search 工具
把记忆检索包装成 memory_search 这样的工具时,参数设计上要注意什么?What matters when designing the parameters of a retrieval tool such as memory_search?
国内高频海外高频深入#tool-design#security#long-term-memory分析过程 · 先想清楚再作答
- 这题看着是接口设计题,真正的区分度在安全。多数人会答 query 和 limit,答完就停;能不能说出「哪些参数绝对不能给模型」,决定了这题的分数。
- 先说 query:描述里要写清它不是用户原话,而是模型自己组织的检索语句,并给一个合法示例。用户问「我有什么忌口」,模型应该用「用户的食物忌口」去检索——这是从 D5 那条「格式类字段要给合法示例」延续下来的。
- 再说 limit:可选、默认 5、上限 10。上限的理由不是防呆,是上下文预算——一条记忆约 400 token,10 条就是 4000 token 进请求。模型传 50 时按工具协议回一条可读错误让它改,而不是静默截断成 10,否则模型永远不知道自己传错了。
- 然后是关键的一条:**绝不给 user_id 这类身份参数**。用户身份只能来自会话上下文。做成参数等于把「查谁的记忆」交给一段概率生成的文本,配上一句提示词注入就是现成的越权读取漏洞。一句话收尾:提示词管意图,代码管权限。
- 返回格式同样要说:空结果必须显式返回一句「没有找到相关记忆,请不要凭空推测」,返回空串模型会当成没有约束然后自己编;把相似度分数一起返回,模型才能区分「你说过」和「我印象里你好像提过」;设一条相似度下限,宁可不返回也不要拿噪声污染上下文。
- 可以预期的追问:检索不到的时候该怎么办?答案是分两层——工具层如实返回空并禁止推测,提示词层要求模型转而向用户确认,而不是把「没检索到」当成「用户没有偏好」。
How to reason about it · think before answering
- It looks like an API design question; the discriminating part is security. Most candidates name query and limit and stop. Saying which parameters must never be exposed to the model is what earns the point.
- On query: the description must state that it is a retrieval phrase the model composes, not the user's literal words, and give a concrete example. Asked 'what are my dietary restrictions', the model should search for 'the user's food allergies and restrictions'.
- On limit: optional, default 5, capped at 10. The cap is a context budget, not idiot-proofing — a memory is roughly 400 tokens, so ten of them put 4000 tokens into the request. When the model asks for 50, return a readable validation error naming the field, the valid range and an example, rather than silently clamping, or it never learns it was wrong.
- The critical rule: never expose an identity parameter such as user_id. Identity comes from the session. Making it a parameter hands 'whose memories to read' to probabilistically generated text, and one prompt injection turns it into a privilege-escalation read. Prompts govern intent; code governs permission.
- Cover the response shape too: an empty result must say so explicitly and forbid guessing, because an empty string reads to the model as 'no constraints' and invites fabrication; return similarity scores so the model can distinguish a firm memory from a vague one; and set a minimum score, since no result beats a noisy one.
- Expect: what should happen on a miss? Two layers — the tool returns empty honestly and forbids speculation, and the prompt instructs the model to ask the user instead of treating 'not found' as 'no preference'.
答题要点
- query 必填,描述里说明它是模型组织的检索语句而非用户原话,并给一个合法示例
- limit 可选、默认 5、上限 10,上限的依据是上下文预算;超限按工具协议回可读错误让模型改,不要静默截断
- 绝不把 user_id 这类身份参数交给模型,身份只能来自会话——否则一句提示词注入就是越权读取
- 空结果要显式说「没找到,请不要凭空推测」,返回空串模型会自己编
- 返回相似度分数并设下限,宁可不返回也不要用低相关记忆污染上下文
Key points
- query is required; document it as a model-composed retrieval phrase, not the user's literal words, with an example
- limit is optional, defaults to 5 and caps at 10 on context-budget grounds; over the cap, return a readable validation error instead of silently clamping
- Never expose user_id or any identity parameter — identity comes from the session, or prompt injection becomes a privilege-escalation read
- An empty result must say so explicitly and forbid speculation, or the model fabricates
- Return similarity scores and enforce a minimum, since no result beats a noisy one
D14 部署运维:compose 多 worker、心跳、健康检查、优雅停机、dev/prod 隔离;W2 复盘
怎么设计 dev 与 prod 的隔离,防止本地开发影响线上数据?How do you isolate dev from prod so local development cannot touch production data?
国内高频海外高频基础#operations#security#configuration分析过程 · 先想清楚再作答
- 这题看着基础,但它筛的是「有没有踩过」。踩过的人第一句会说事故形态,没踩过的人第一句说「用不同的配置文件」。
- 先说事故形态:同一套代码、经常还是同一个 Redis,你在本机起一个 Worker 调试,它连的却是线上那条流,把真实用户的消息捞走执行了。**这类事故没有任何报错,两边日志都显示一切正常**——从代码角度看它确实老老实实处理了一条消息。正因为没有报错,它可能持续很久才被发现。
- 然后按成本分层给方案:命名空间(同一套基础设施,键名带前缀)、独立实例(各自的 Redis 与数据库)、独立环境(网络、凭证、账号全分开)。生产系统最终要走到第三层,但第一层成本最低也最容易漏,所以是重点。
- 第一层的关键实现细节是拿分点:前缀只能在一个函数里拼。散落到各处去拼字符串,二十个键名里漏掉一个就等于没隔离,而漏掉的那个通常是最新加、最没被测过的功能。这一点比「要加前缀」本身更能体现工程经验。
- 再补三件必须一起做的事:凭证分开(本机那把 key 只能连开发库,配置写错也波及不到线上);破坏性操作要认环境(清库、重放死信、重算索引这类脚本第一行先读环境变量,生产上要求显式确认);生产禁止降级实现(离线用的内存实现在生产上一旦因配置疏漏被走到,进程会安静起来、各自在自己内存里干活,健康检查还全是绿的,这类故障能藏好几个小时——启动时直接报错退出比事后排查便宜得多)。
- 可以预期的追问:为什么不干脆只用独立实例,省掉前缀这一层?答:独立实例解决的是「连错了地址」,前缀解决的是「连对了地址但走错了命名空间」——两者失效的方式不同。而且前缀几乎零成本,在共享测试环境、多人并行开发时还能顺带隔离每个人的数据。防御要分层,最便宜那层没理由不做。
How to reason about it · think before answering
- This looks basic, but it screens for whether you have been burned. People who have start with the failure shape; people who have not start with use different config files.
- Describe the failure: same codebase, often the same Redis, and you start a worker locally to debug — except it is connected to the production stream and it claims and executes a real user's message. There is no error anywhere and both sides log business as usual, because from the code's point of view it did dutifully process one message. Precisely because nothing errors, this can run for a long time before anyone notices.
- Then give layered options by cost: namespacing (shared infrastructure, prefixed keys), separate instances (its own Redis and database), and separate environments (network, credentials, accounts all split). Production eventually wants the third layer, but the first is the cheapest and the easiest to get wrong, so that is where the focus belongs.
- The implementation detail in layer one is where the points are: the prefix may only be assembled in one function. Scatter string concatenation around the codebase, miss one key out of twenty, and you have no isolation at all — and the one you missed is usually the newest, least tested feature. This point signals real experience more than add a prefix does.
- Add three companions. Split credentials, so the local key can only reach the dev database and a misconfiguration cannot reach production. Make destructive operations environment-aware: scripts that truncate tables, replay dead letters or rebuild indexes read the environment variable on their first line and demand explicit confirmation in production. And forbid fallback implementations in production: if a config slip makes production take the in-memory path, processes come up quietly, each working in its own memory, with every health check green — that kind of fault hides for hours, so failing fast at startup is far cheaper than diagnosing it later.
- Expect: why not just use separate instances and skip prefixes? Because separate instances solve connected to the wrong address while prefixes solve connected to the right address but the wrong namespace — the two fail differently. Prefixes are also nearly free, and they incidentally isolate each developer's data in a shared test environment. Defence should be layered, and there is no reason to skip the cheapest layer.
答题要点
- 先说事故形态:本机 Worker 连上线上流,把真实用户消息捞走执行,且两边日志都显示正常、没有任何报错,所以能藏很久
- 按成本分三层:命名空间(键名前缀)、独立实例(各自 Redis 与库)、独立环境(网络凭证账号全分开)
- 前缀只能在一个函数里拼——散落各处漏掉一个键就等于没隔离,而漏掉的通常是最新加、最没测过的功能
- 凭证分开,本机 key 只能连开发库;破坏性脚本第一行读环境变量并在生产要求显式确认
- 生产禁止降级到内存实现:配置疏漏时进程会安静起来、健康检查全绿,故障能藏几小时,应在启动时直接报错退出
- 独立实例防「连错地址」、前缀防「地址对了但命名空间错了」,失效方式不同,最便宜那层没理由不做
Key points
- Lead with the failure shape: a local worker attached to the production stream claims and runs a real user's message, with normal logs on both sides and no error, so it hides for a long time
- Three layers by cost: namespacing (key prefixes), separate instances (own Redis and DB), separate environments (network, credentials, accounts)
- The prefix must be assembled in exactly one function — scattered concatenation misses one key and voids the isolation, usually the newest and least tested feature
- Split credentials so the local key only reaches dev; destructive scripts read the environment first and require explicit confirmation in production
- Forbid the in-memory fallback in production: on a config slip processes come up quietly with green health checks and the fault hides for hours — fail fast at startup instead
- Separate instances prevent wrong address, prefixes prevent right address wrong namespace — different failure modes, and the cheapest layer is free