阿里云 AI 应用开发 暑期 一二面

5.16 三面结束 我看粉丝投稿的4.21 一面的 二面过完5.1

1. 自我介绍

2. 怎么理解深度学习损失函数中的最大似然估计 MLE?

答案:最大似然估计的目标是找到一组模型参数,让观测到的数据在当前模型下出现的概率最大。深度学习里的分类任务通常把模型输出看成条件概率分布 p(y|x; θ),训练时希望真实类别的概率越大越好。

实际优化时通常不会直接最大化似然,而是最大化对数似然,或者等价地最小化负对数似然。交叉熵损失本质上就是负对数似然。比如多分类中,真实标签是第 y 类,模型对这一类预测概率是 p_y,loss 就是 -log(p_y)。预测越自信且正确,loss 越小;预测越错,loss 越大。

import torch
import torch.nn.functional as F

logits = torch.tensor([[1.2, 3.4, 0.8]])
label = torch.tensor([1])

loss = F.cross_entropy(logits, label)

prob = torch.softmax(logits, dim=-1)
manual_loss = -torch.log(prob[0, label])

print(loss.item())
print(manual_loss.item())

3. 做强化学习时遇到马尔可夫过程,怎么理解?

答案:马尔可夫过程强调“未来只依赖当前状态,而不依赖更早历史”。在强化学习里,如果当前状态已经包含了决策所需的全部信息,那么智能体选择动作后,环境转移到下一个状态并得到奖励,这个过程就可以建模成 MDP。

在 Agent 系统里,纯粹的马尔可夫性很难天然满足,因为用户历史、工具返回、之前失败原因都会影响下一步决策。所以工程上通常会把历史压缩进状态里,例如任务目标、已完成步骤、工具调用结果、失败次数、剩余预算和约束条件。这样 Agent 在每一步决策时,不需要读完整历史,也能基于当前状态做近似马尔可夫决策。

state = {
    "event_type": "主干道事故",
    "location": "A路口",
    "current_step": "生成绕行策略",
    "observations": ["北向南拥堵4公里", "旁路B可通行"],
    "used_tools": ["traffic_snapshot", "similar_case_search"],
    "retry_count": 0
}

action = "call_route_planner"

4. 操作系统里的锁怎么理解?互斥锁、自旋锁、读写锁有什么别?

答案:锁用于保护共享资源,避免多个线程同时读写导致数据不一致。互斥锁适合临界区较长或者可能阻塞的场景,线程拿不到锁时会进入阻塞状态,让出 CPU。自旋锁适合临界区极短的场景,线程拿不到锁时不会睡眠,而是不断循环检查锁是否释放,避免线程上下文切换成本。读写锁适合读多写少场景,多个读线程可以同时进入,但写线程需要独占。

锁的关键不是“用了就安全”,而是要控制锁粒度、加锁顺序和临界区长度。锁粒度太大会降低并发,锁粒度太小又容易出现状态不一致。多个锁嵌套时如果顺序不固定,就容易死锁。

import threading

counter = 0
lock = threading.Lock()

def add():
    global counter
    for _ in range(100000):
        with lock:
            counter += 1

threads = [threading.Thread(target=add) for _ in range(4)]

for t in threads:
    t.start()

for t in threads:
    t.join()

print(counter)

5. 阿里云里的 DNS 协议是做什么用的?一次域名解析流程是什么?

答案:DNS 用来把域名解析成 IP 地址。用户访问一个域名时,系统通常先查浏览器缓存、操作系统缓存、hosts 文件和本地 DNS 缓存。如果都没有命中,就向递归 DNS 发起查询,递归 DNS 再从根域名服务器、顶级域名服务器、权威域名服务器逐级查询,最终拿到 A 记录或 AAAA 记录。

在云服务场景里,DNS 不只是“把域名变成 IP”,还会影响服务发现、流量调度、容灾切换和跨地域访问。如果模型服务、向量库、对象存储、网关都依赖域名访问,DNS 缓存过期、解析延迟或错误解析都可能导致整个 AI 链路超时。

dig example.com

nslookup example.com

6. 传统机器学习分类算法有哪些?实际怎么选?

答案:常见分类算法包括逻辑回归、朴素贝叶斯、KNN、决策树、随机森林、GBDT、XGBoost、LightGBM、SVM 等。逻辑回归适合线性可分、可解释性要求高的场景;朴素贝叶斯在文本分类里很常见;树模型适合结构化特征;SVM 在中小规模、高维特征下效果不错;LightGBM 和 XGBoost 在表格数据上通常很强。

如果是城市交通事件分类,结构化字段包括时间、地点、天气、道路等级、拥堵长度、告警类型,可以优先尝试 LightGBM。它对特征尺度不敏感,训练速度快,也容易解释特征重要性。深度模型不一定总是更优,尤其在中小规模结构化数据上,树模型经常更稳。

from lightgbm import LGBMClassifier
from sklearn.metrics import classification_report

model = LGBMClassifier(
    n_estimators=300,
    learning_rate=0.05,
    max_depth=-1,
    num_leaves=63
)

model.fit(X_train, y_train)
pred = model.predict(X_test)

print(classification_report(y_test, pred))

7. 聚类算法用过哪些?KMeans、DBSCAN、层次聚类怎么选?

答案:KMeans 适合簇近似凸形、簇数量提前知道、数据规模较大的场景,但对异常点和初始中心敏感。DBSCAN 不需要提前指定簇数量,能识别噪声点,也能发现任意形状的簇,但对密度参数比较敏感。层次聚类适合数据量较小、需要观察聚类树结构的场景,解释性好,但计算成本高。

在 AI 应用里,聚类常用于用户问题分组、历史工单归类、异常事件发现和评估集构建。比如交通调度平台里,可以把历史事故文本和路况特征编码后聚类,把相似事故归为同一类,用于召回相似案例和生成调度预案。

from sklearn.cluster import DBSCAN
from sklearn.preprocessing import normalize

X = normalize(event_embeddings)

cluster = DBSCAN(eps=0.25, min_samples=5, metric="cosine")
labels = cluster.fit_predict(X)

print(labels[:20])

8. 大语言模型中,用户输入 query 后,大模型推理的完整链路是什么?

答案:完整链路通常包括接入层鉴权、限流、输入安全检测、会话状态加载、意图识别、上下文构造、RAG 检索、工具规划、模型推理、流式输出、后处理、安全过滤、日志审计和指标上报。不是用户问题直接丢给模型就结束。

如果是 Agent 场景,query 进入后会先判断是否需要调用工具。例如用户问“某路段事故是否需要封控”,系统要先查实时拥堵、事故等级、历史案例、管制规则,再构造上下文给模型。推理阶段还会用 KV Cache 加速,输出阶段通过 SSE 或 WebSocket 流式返回,最后记录 trace,方便排查模型为什么做出这个结论。

def handle_query(user, query):
    auth(user)
    query = safety_filter(query)

    state = load_state(user.session_id)
    intent = classify_intent(query, state)

    evidence = retrieve_evidence(query, intent)
    tool_results = run_tools_if_needed(intent, query, state)

    prompt = build_prompt(query, state, evidence, tool_results)
    answer = call_llm(prompt)

    answer = output_guardrail(answer)
    save_trace(user.session_id, query, answer)

    return answer

9. Transformer 里的多头注意力机制有什么优势?

答案:多头注意力的核心优势是让模型在不同表示子空间里同时学习不同关系。单头注意力只能形成一套注意力分布,多头注意力可以让不同 head 分别关注局部词法、长距离依赖、实体关系、位置关系和因果关系。

具体计算时,输入会被投影成多组 Q、K、V,每个头独立计算注意力,然后把多个头的结果拼接,再经过线性层融合。多头机制提升了表达能力,但也带来了计算和显存压力,所以现在很多推理优化会使用 MQA、GQA、KV Cache 量化等方式减少 KV 存储成本。

import torch
import torch.nn as nn

mha = nn.MultiheadAttention(
    embed_dim=768,
    num_heads=12,
    batch_first=True
)

x = torch.randn(2, 128, 768)
out, attn = mha(x, x, x)

print(out.shape)
print(attn.shape)

10. 现在大模型的 CoT 和深度思考能力是怎么训练出来的?

答案:CoT 能力主要来自预训练、指令微调、推理数据增强和偏好优化。预训练让模型学到大量语言模式和知识;指令微调让模型学会按照问题输出步骤化答案;推理数据增强会引入数学、代码、逻辑、多跳问答等包含中间推理过程的数据;偏好优化会让模型更偏向正确、稳定、可验证的推理路径。

更强的深度思考能力通常还会引入过程监督、结果监督、拒绝采样、搜索式生成和强化学习。比如同一道题采样多条推理路径,再用验证器选出正确答案,或者训练模型在中间步骤自检。工程上则会通过隐藏思考、草稿区、工具调用和验证器结合,让模型不是单次生成,而是“生成—检查—修正”。

def self_consistency(model, prompt, n=5):
    answers = []
    for _ in range(n):
        ans = model.generate(prompt, temperature=0.8)
        answers.append(extract_final_answer(ans))

    return max(set(answers), key=answers.count)

11. 针对 Agent 项目,记忆模块和规划模块怎么设计?

答案:记忆模块负责让 Agent 知道“之前发生过什么”,规划模块负责决定“下一步做什么”。记忆一般分为短期记忆、任务记忆和长期记忆。短期记忆保存最近对话和当前状态,任务记忆保存已完成步骤、工具结果和失败原因,长期记忆保存用户偏好、历史案例和可复用经验。

规划模块不能只靠模型自由发挥,最好结合状态机和工具约束。比如交通调度 Agent 里,规划阶段会先判断事件类型,再选择是否查询实时路况、是否检索历史案例、是否调用路径规划工具。每一步执行后更新状态,规划器根据状态决定继续、重试、降级还是结束。

agent_state = {
    "goal": "生成事故绕行和资源调度方案",
    "memory": {
        "short_term": ["用户要求优先保障救护车通行"],
        "task": ["已查询实时路况", "已检索3个相似案例"],
        "long_term": ["该区域早高峰容易出现二次拥堵"]
    },
    "plan": ["classify_event", "query_traffic", "retrieve_cases", "generate_plan"]
}

12. 向量检索会涉及哪些相似度计算方法?大规模数据怎么做高效检索?

答案:常见相似度包括余弦相似度、内积、欧氏距离和曼哈顿距离。文本 embedding 检索里常用余弦相似度,如果向量已经归一化,余弦相似度和内积排序等价。图像或多模态场景中也经常用内积和 L2 距离。

大规模向量检索不能暴力计算所有向量相似度,通常使用 ANN 近似最近邻

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

AI-Agent面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论

相关推荐

评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务