佰聆数据 AI 应用开发一面:JSON 校验、BM25 与向量融合、温度参数
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- Python 中用于处理大模型调用产生的 JSON 格式输出、并做检查的包是什么?
- FastAPI 在 Python 中的使用很广,它的底层 Web 服务器组件都用了什么?
- Python 的元组和列表有什么区别?元组里面的元素可变吗?为什么不可变?
- 你有微调过大模型吗?训练过程中的学习率高低怎么判断?训练 loss 上升、eval loss 下降,就可以判断学习率过高吗?学习率过高有什么调整措施?
- 大模型检索,你了解什么检索算法?KNN、HNSW、哈希,还有吗?
- BM25 和向量检索的区别是什么?各自的优势有哪些?
- 两者之间如何做归一化融合,占比如何确定?除此之外还有哪些做法?
- 你会怎么把一个技术做成用户能用的东西?
- Agent 之间的交互方式有哪些?
- AgentScope 是怎么创建一个智能体的?给它工具之后,它有哪些技能?
- 模型的温度底层是怎么调节的?
- 反问
《参考解析》
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、重复惩罚分别作用在哪一步」就很完整。