水滴 AI 全栈一面:幻觉治理、Token 成本与计算机基础
- 轮次
- 一面
- 结果
- 挂
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 实习做了很多内容,哪个是你主要负责的?
- 第一个项目和 AI 相关吗?只是做了 AI 服务集成?
- 智能问答平台的整个链路是怎样的?
- 如何防止或减少大模型幻觉?多轮对话场景下呢?记忆机制怎么做的?
- 项目里用到子 Agent 吗?还是简单的问答调用?
- 语义识别怎么降低 token 成本?预筛选怎么做的?
- 降低 token 成本的方式有哪些?大模型的 KV Cache 机制讲一下。
- 如何分析一个算法的时间复杂度?两层循环的时间复杂度是多少?
- Function Calling、MCP、Skills 讲一下?有自己写过 Skills 的实践吗?
- 进程和线程的区别?JVM 中哪些部分是线程共享的,哪些是独有的?
- 两个线程同时对一个变量修改一万次,为什么最终值可能小于两万?
- 一个网址从输入到展示经历哪些过程?
- TCP 为什么是三次握手而不是四次?
《参考解析》
幻觉治理:分“减少发生”和“发生后兜底”。减少发生:RAG 提供可引用的上下文、提示词要求“只依据资料回答、不知道就说不知道”、降低温度、把复杂问题拆成可验证的小步、对关键实体做规则校验。多轮场景要把历史压缩成结构化记忆(用户目标、已确认事实、待办),而不是把全部对话塞进上下文;每轮检索时用当前意图加历史关键实体做查询改写。兜底:输出后做事实校验(与知识库/数据库比对)、敏感操作二次确认、低置信转人工、答案附来源。评测用忠实度和人工抽检,不能只看“回答流畅”。
Token 成本:手段包括:语义缓存(相似问题直接复用答案)、意图预筛选(先用小模型/规则判断要不要走大模型)、检索压缩(只喂相关片段)、历史摘要与滑窗、模型分级(简单问题小模型、复杂问题大模型)、结构化输出减少废话、批处理与流式。KV Cache 是推理时缓存已计算 token 的 Key/Value 矩阵,后续 token 直接复用,避免重复计算注意力;它省的是算力/首 token 延迟,不省输入 token 的计费,但前缀稳定(把固定系统提示放前面)能提高缓存命中。注意缓存会占显存,长上下文和多会话要设上限。
Function Calling、MCP、Skills:Function Calling 是模型按 schema 输出“要调用哪个函数、参数是什么”,由应用执行后把结果回传;MCP 是标准化的工具/资源接入协议,解决“接一次到处用”;Skills 是把某类任务的流程、约束、示例封装成可按需加载的知识包,解决“怎么做”。三者层次不同:Function Calling 是调用机制,MCP 是连接协议,Skills 是任务方法论。写过 Skills 的话,讲清目录结构、触发描述、渐进式加载和验证方式。
并发与 JVM:两个线程各执行 count++ 一万次,count++ 不是原子操作,包含读、加、写三步,可能交错导致丢失更新;加上 CPU 缓存可见性和指令重排,最终值通常小于两万。解决用 AtomicInteger、synchronized 或 LongAdder。JVM 线程共享:堆、方法区/元空间、运行时常量池、直接内存;线程独有:程序计数器、虚拟机栈、本地方法栈。进程是资源分配单位,线程是 CPU 调度单位,线程共享进程内存,切换开销更小。
URL 访问流程:浏览器解析 URL → 查 DNS(浏览器缓存、系统缓存、hosts、递归解析)→ 建 TCP 连接(三次握手,HTTPS 再加 TLS 握手)→ 发 HTTP 请求 → 经过 CDN/负载均衡/网关到后端 → 后端处理并返回 → 浏览器解析 HTML、构建 DOM/CSSOM、布局、绘制、执行 JS → 加载子资源。缓存、重定向、HTTP/2 多路复用都会影响过程。
三次握手:核心是双方确认“自己的发送和接收能力都正常”,并同步初始序列号。两次不够:服务端无法确认客户端收到了自己的 SYN-ACK;四次可以但没必要,因为服务端的 SYN 和 ACK 可以合并成一个报文。四次挥手则是因为 TCP 全双工,两个方向要分别关闭。