面灵AI→

佰聆数据 AI 应用开发一面:JSON 校验、BM25 与向量融合、温度参数

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. Python 中用于处理大模型调用产生的 JSON 格式输出、并做检查的包是什么?
  2. FastAPI 在 Python 中的使用很广,它的底层 Web 服务器组件都用了什么?
  3. Python 的元组和列表有什么区别?元组里面的元素可变吗?为什么不可变?
  4. 你有微调过大模型吗?训练过程中的学习率高低怎么判断?训练 loss 上升、eval loss 下降,就可以判断学习率过高吗?学习率过高有什么调整措施?
  5. 大模型检索,你了解什么检索算法?KNN、HNSW、哈希,还有吗?
  6. BM25 和向量检索的区别是什么?各自的优势有哪些?
  7. 两者之间如何做归一化融合,占比如何确定?除此之外还有哪些做法?
  8. 你会怎么把一个技术做成用户能用的东西?
  9. Agent 之间的交互方式有哪些?
  10. AgentScope 是怎么创建一个智能体的?给它工具之后,它有哪些技能?
  11. 模型的温度底层是怎么调节的?
  12. 反问

《参考解析》

JSON 输出校验:pydantic 是主力,jsonschema 管通用契约。 大模型返回的是字符串,第一步永远先 json.loads,失败就重试或让模型修复;解析成功后用 Pydantic v2 的 BaseModel 定义字段、类型、必填与取值范围,model_validate 一次性完成类型转换和校验,错误信息结构化,便于把校验失败的原因回喂给模型。要按 JSON Schema 校验(比如对接外部工具协议)就用 jsonschema。工程上还会配合 instructor、outlines 这类库,把 schema 直接约束到解码阶段,从「事后检查」变成「生成时就少出错」;但无论用哪种,服务端都必须再校验一次,不能信模型自称的格式正确。

FastAPI 的底层是 Starlette + Uvicorn。 FastAPI 本身主要做路由、依赖注入和基于类型注解的请求/响应校验(Pydantic),真正处理 ASGI 协议的是 Starlette;跑服务的 ASGI 服务器通常是 Uvicorn,底层用 uvloop 事件循环和 httptools 解析 HTTP。它们之间的关系可以记成:Uvicorn 负责收包和事件循环,Starlette 负责 ASGI 应用与中间件,FastAPI 在其上提供声明式 API 和 OpenAPI 文档。同步路由会跑在线程池里,异步路由才真正跑在事件循环上,所以阻塞调用(数据库驱动、文件 IO)要么用异步库,要么显式丢线程池。

元组不可变是「引用不可变」,不是「内容深不可变」。 元组创建后不能增删元素、不能替换某个位置的对象,因此可哈希、能当字典键、能作为 set 元素;但元组里若放的是列表,列表本身仍可被修改,t = ([1],); t[0].append(2) 是合法的。列表可变、支持增删改和原地排序,代价是不能哈希。至于「为什么设计成不可变」:一是语义上表达固定结构(坐标、配置项、函数多返回值),二是可安全共享、避免被调用方意外修改,三是哈希稳定,能参与缓存与字典查找。

学习率判断不能只看一条曲线。 典型的学习率过大表现是 loss 剧烈震荡、出现 NaN、梯度范数爆掉;过小则 loss 下降极慢、长时间平台。但「train loss 上升、eval loss 下降」并不是学习率过高的可靠判据——更常见的原因是正则化/数据增强在训练态和评估态行为不同、batch 统计量差异、训练集与验证集分布不同,甚至只是噪声。正确做法是同时看训练 loss、验证 loss、梯度范数和学习率曲线的相对变化,并做学习率扫描(固定其他变量,试几档量级)。调整手段包括:加 warmup、降峰值学习率、用 cosine/linear decay、梯度裁剪、增大 batch 或改用 AdamW 的 β2/eps,先排除数据与实现问题再动超参。

BM25 和向量检索是互补关系,融合要在同一尺度上做。 BM25 基于词频、逆文档频率和文档长度归一化,擅长精确匹配专有名词、型号、代码符号,可解释、无需训练,但不懂同义改写;向量检索把 query 和文档映射到同一空间,擅长语义相近但字面不同的表达,缺点是可能召回「意思像但事实不对」的内容,且对长文档切块敏感。融合常见两种:分数级加权(各自归一化后 α·bm25 + (1-α)·cos)和排名级 RRF(1/(k+rank) 相加,天然免归一化)。权重不要拍脑袋,用带标注的评测集按 NDCG/Recall@K 扫,再按 query 类型分桶(短 query、含型号的 query 提高 BM25 权重)。工程上还可以先召回再重排:两路各取 TopN,用 cross-encoder 或 LLM 重排,效果通常比单纯调权重更稳。

温度是作用在 logits 上的一个缩放系数。 模型输出 logits z,采样时计算 softmax(z / T):T 越小分布越尖,接近贪心;T 越大分布越平,低概率词也有机会被选中。T=0 通常实现为 argmax(并非真的除以零)。它只改变采样随机性,不改变模型「知道什么」,调高不会让答案更聪明,只会更发散;需要稳定结构化输出时用低温甚至贪心,需要创意发散时用高温,同时配合 top-p/top-k 截断长尾。面试里能补一句「温度、top-p、top-k、重复惩罚分别作用在哪一步」就很完整。