小红书 AI Agent 一面:八皇后与记忆读取设计
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 手撕:八皇后问题。
- 实习做的 Agent:从 query 到输出的全流程叙述。
- 上下文是怎么设计的?
- 从什么维度读取记忆?
- 读取到的旧记忆与后来的记忆冲突了怎么办?
《参考解析》
八皇后考的是回溯熟练度,边写边讲比闷头写完更得分。 标准解法是按行放置皇后,用三个集合记录已占用的列、主对角线与副对角线(col、row - col、row + col),每行尝试所有列、冲突就跳过,放满八行就记录一个解并回溯。判断合法性从 O(n) 扫描降到 O(1) 是关键优化点;想再快可以用位运算把三个集合压成整数,用 (cols | diag1 | diag2) & mask 一次取出可用列,再取最低位逐个尝试。已知解的数量是 92 个,被追问时可以顺带说这句以证明写过。面试手撕重点是结构清晰的递归函数加剪枝,以及写完主动跑一个例子验证;如果时间有余,可以提如何改成求任意 n 的通用版本。
「从 query 到输出的全流程」是 Agent 项目的必答题,讲成一条带状态和失败处理的流水线最有说服力。 建议顺序:接收 query 后先做意图与任务识别(是知识问答、需要调工具,还是要多步执行)→ 检索与上下文装配(从长期记忆、会话历史、知识库取相关内容并按 token 预算裁剪)→ 规划(拆成子步骤,决定调哪些工具、按什么顺序)→ 执行循环(工具调用、结果回填、判断是否继续或终止)→ 结果校验(格式、事实一致性、安全策略)→ 输出与写回(把有价值的结论写进记忆)。每一段都要说清失败路径:工具报错怎么重试、重试几次后降级成什么、循环怎么防止无限执行(步数与时间上限)。只说「调用大模型生成回答」会被追问到卡壳,因为面试官想听的是编排与边界控制。
上下文设计的本质是「在有限的 token 里排优先级」。 常见的分层做法是:系统指令与安全约束固定在最前(也是缓存复用的前缀),接着是用户画像与长期偏好,再是会话摘要(把较早的多轮对话压缩成要点),然后是最近若干轮的原始对话,最后是本次检索到的片段与工具返回值。裁剪策略要能说清触发时机:先按相关性丢弃检索片段,再压缩历史对话,始终保留系统指令与最近一轮。结构化比自由文本好维护——记忆条目带类型、来源、时间与置信度字段,装配时按类型选模板,这样既省 token 也让模型更容易判断该信哪条。上下文过长时还可以让模型先输出要点再继续,而不是直接截断。
记忆读取的维度,答成「分类 + 检索策略」两层最完整。 类型上一般分:事实类(用户是谁、做什么工作)、偏好类(喜欢什么风格、回答要多长)、事件类(上次聊到哪、做过什么决定)、以及任务/实体类(某个项目的关键信息)。检索维度包括:来源与作用域(当前会话、该用户历史、全局知识)、主题或实体匹配、时间新旧、相关性得分、以及写入时的置信度。工程实现通常是混合检索——结构化过滤(用户 ID、类型、时间窗口)先缩小范围,再用向量相似度或关键词排序,最后按分数与 token 预算取前若干条。还要说清写入策略:什么值得记(稳定的偏好与结论)、怎么去重(同义合并)、怎么衰减(长期未命中的记忆降权或过期),否则记忆库会越滚越大、检索质量越来越差。
记忆冲突的处理要分类讨论,不能一刀切。 偏好与身份类信息通常以「最新一次显式表达」为准(用户换城市、换目标岗位),做法是新记录写入时把旧记录置为失效并保留历史版本,而不是物理删除,这样出问题可回溯。事实类冲突更适合按来源可信度与时效打分:用户明说的 > 从对话推断的 > 模型总结的,越近的权重越高;当两条记忆分数接近时,正确做法是把矛盾显式带进上下文(「关于 X,此前记录是 A,后来变更为 B」),让模型基于时间与来源判断,或在回答前向用户澄清一句,而不是在检索层偷偷选一条。设计上还要让用户可以查看和删除记忆,这既是合规要求,也是排查「模型为什么这么说」最有效的手段。
面得快要主动适应节奏:先给结论再展开,别铺垫。 十五分钟一题意味着面试官只给你一到两轮展开的机会,答题结构应是「一句话结论 + 三个要点 + 一个例子」,把最有信息量的判断放在前三句;如果对方追问细节,再往下讲实现。手撕题同理,先说清思路与复杂度再动手写,写完跑一个用例,比反复修改代码更省时间。可以在反问环节补问团队当前 Agent 的评测方式与记忆方案的迭代方向,把快问快答的场次也变成一次有效的信息交换。