阿里国际 AI 应用研发 一面(暑期)

小伙伴投稿一面在5.10 二面在5.15 HR面在5.17, 211本+韩硕

1. 自我介绍

答案:我主要做大模型应用、RAG、Agent 编排、向量检索、Prompt 工程、模型微调和后端工程化相关方向。之前做过一个 跨境商家合规审核与风险问答平台,面向国际电商平台里的商品合规、商家风控、客服质检和运营审核场景。

这个系统接入了商品标题、商品详情、平台规则、违规案例、审核工单、商家申诉记录和多语言政策文档。用户可以问“这个商品为什么被判定为高风险”“某类商品在欧盟站点能不能上架”“这条申诉该怎么回复”,系统会先做 query 重写和意图识别,再通过混合检索召回规则和案例,最后由大模型生成带引用的审核解释。我的主要工作包括 RAG 核心链路、向量库索引、Query Rewrite、Prompt 模板、Agent 工具调用、模型评测和线上延迟优化。

2. HTTP 与 HTTPS 的核心差异是什么?

答案:HTTP 是明文传输协议,数据在传输过程中可能被窃听、篡改或伪造。HTTPS 是在 HTTP 和 TCP 之间加入 TLS/SSL,通过证书校验、密钥协商、对称加密、完整性校验来保证通信安全。

HTTPS 的核心不是“换了一个端口”,而是多了身份认证和加密传输。客户端会验证服务端证书是否合法,然后通过非对称加密或 ECDHE 协商出会话密钥,后续用对称加密传输数据。这样既保证安全性,也兼顾性能。

HTTP  默认端口 80   明文传输
HTTPS 默认端口 443  TLS 加密传输

HTTPS 解决:
1. 窃听:内容被加密
2. 篡改:有完整性校验
3. 伪造:证书验证服务端身份

3. 大文件、小内存场景下,排序方案怎么设计?

答案:小内存无法一次性把大文件全部加载进内存,通常使用外部排序。核心思路是先分块读取文件,每次只读取内存能承受的一部分,块内排序后写成临时有序文件,再用多路归并把这些有序文件合并成最终有序结果。

如果数据量极大,还需要考虑磁盘 IO、临时文件数量、归并路数、压缩格式和并行化。比如 100GB 文件、内存只有 1GB,可以每次读取 512MB 排序,生成多个 sorted chunk,再用小根堆做 k 路归并。

import heapq

def merge_sorted_files(files, output_path):
    fps = [open(f, "r") for f in files]
    heap = []

    for i, fp in enumerate(fps):
        line = fp.readline()
        if line:
            heapq.heappush(heap, (int(line.strip()), i))

    with open(output_path, "w") as out:
        while heap:
            value, idx = heapq.heappop(heap)
            out.write(str(value) + "\n")

            nxt = fps[idx].readline()
            if nxt:
                heapq.heappush(heap, (int(nxt.strip()), idx))

    for fp in fps:
        fp.close()

4. 数据库索引的作用和实现原理是什么?

答案:索引的作用是减少数据库扫描的数据量,提高查询速度。没有索引时,数据库可能需要全表扫描;有合适索引时,可以通过索引快速定位到目标数据或目标范围。

InnoDB 常用 B+ 树索引。B+ 树非叶子节点只存 key 和指针,叶子节点存完整索引项,并且叶子节点之间通过链表连接,所以既适合等值查询,也适合范围查询和排序。相比 Hash 索引,B+ 树更适合数据库里的范围条件、前缀匹配和 order by。

CREATE INDEX idx_user_time
ON order_record(user_id, created_at);

EXPLAIN
SELECT *
FROM order_record
WHERE user_id = 1001
  AND created_at >= '2026-01-01'
ORDER BY created_at DESC
LIMIT 20;

5. 事务的 ACID 特性与隔离级别有哪些?

答案:事务 ACID 分别是原子性、一致性、隔离性和持久性。原子性表示事务里的操作要么全部成功,要么全部失败;一致性表示事务前后数据满足约束;隔离性表示并发事务之间互不干扰;持久性表示事务提交后数据不会因为宕机丢失。

隔离级别包括读未提交、读已提交、可重复读、串行化。隔离级别越高,并发异常越少,但性能成本越高。MySQL InnoDB 默认是可重复读,通过 MVCC 和 Next-Key Lock 解决很多并发问题。

读未提交:可能脏读
读已提交:避免脏读,但可能不可重复读
可重复读:避免不可重复读,但仍需关注幻读
串行化:最强隔离,并发性能最低

6. 跨平台转账程序设计的核心逻辑是什么?

答案:跨平台转账最核心的是一致性、幂等性、可追踪和异常补偿。一次转账通常不是简单扣 A 加 B,而是包含下单、冻结资金、风控校验、渠道扣款、入账、状态回调、对账和补偿。

如果涉及外部支付渠道,不能依赖本地事务一次性完成。常见设计是使用状态机和最终一致性。每个阶段都有明确状态,所有请求都带幂等号,失败后可以重试,对账任务负责发现中间态异常并补偿。

transfer_state = {
    "INIT": ["FROZEN", "FAILED"],
    "FROZEN": ["DEBIT_SUCCESS", "REFUNDING"],
    "DEBIT_SUCCESS": ["CREDIT_SUCCESS", "COMPENSATING"],
    "CREDIT_SUCCESS": ["FINISHED"],
    "COMPENSATING": ["COMPENSATED", "MANUAL_CHECK"]
}

7. 什么是数据库回表?

答案:回表指的是通过二级索引查到主键后,还需要再去聚簇索引里查询完整数据。InnoDB 中主键索引的叶子节点存整行数据,二级索引的叶子节点通常存索引列和主键值。如果查询字段不在二级索引里,就需要回表。

减少回表的一种方式是覆盖索引,也就是查询所需字段都包含在索引里。这样数据库只查二级索引就能返回结果,不需要再查聚簇索引。

CREATE INDEX idx_user_status_amount
ON payment_order(user_id, status, amount);

-- 如果只查 user_id、status、amount,可能走覆盖索引
SELECT user_id, status, amount
FROM payment_order
WHERE user_id = 1001
  AND status = 'SUCCESS';

8. RAG 的应用场景有哪些?

答案:RAG 适合知识更新快、需要接入私有数据、要求答案可追溯的场景。比如企业知识库问答、客服辅助、法务合规、风控审核、医疗问答、运维排障、售后工单分析、代码知识库检索和多语言政策解释。

在跨境合规场景里,平台规则经常更新,不适合完全依赖模型参数记忆。RAG 可以把最新规则、历史违规案例和审核说明放进知识库,用户提问时先检索,再生成答案,并给出引用来源。

rag_scene = {
    "query": "这个商品在德国站点为什么不能上架",
    "retrieval_sources": ["平台规则", "历史违规案例", "欧盟合规文档"],
    "output": "审核原因 + 规则引用 + 修改建议"
}

9. RAG 的核心流程是什么?

答案:RAG 的核心流程是文档接入、清洗切分、向量化、索引构建、查询理解、检索召回、rerank、上下文构造、大模型生成和答案校验。线上系统还要补充权限过滤、缓存、评测、日志追踪和版本管理。

真正影响效果的不是某一个步骤,而是整条链路。文档切分不好会导致证据碎片化,embedding 不合适会导致召回偏差,rerank 不好会把无关内容塞给模型,prompt 不好会导致答案不引用证据。

def rag(query):
    rewritten = rewrite_query(query)
    candidates = hybrid_retrieve(rewritten, top_k=50)
    docs = rerank(rewritten, candidates, top_k=8)
    context = build_context(docs)
    answer = llm_generate(query, context)
    return verify_with_citations(answer, docs)

10. Query 重写的目的是什么?

答案:Query 重写的目的是提升检索召回质量。用户原始问题经常口语化、指代不清、关键词缺失,直接拿去检索可能召回不到正确文档。Query 重写会把问题补全成更适合检索的形式,比如补充实体、站点、时间范围、业务术语和同义表达。

但 Query 重写不能改变用户原意。工程上通常会保留原 query,同时生成多个 rewritten query,分别用于关键词检索和向量检索,再做融合。对于高风险场景,重写结果还需要可解释和可回退。

def rewrite_query(query, state):
    if "这个商品" in query and state.get("product_id"):
        return f"{query} 商品ID:{state['product_id']} 站点:{state.get('site', '')}"
    return query

11. Prompt 的标准写法是什么?

答案:一个稳定的 Prompt 通常要包含角色、任务目标、上下文、约束条件、输出格式和拒答规则。对于 RAG 场景,还要明确要求答案只能基于给定证据,不能编造引用,证据不足时要说明无法判断。

Prompt 不应该写成一大段散文,而应该结构清晰。尤其是企业应用里,输出格式最好固定成 JSON、表格或分段文本,方便后处理和评测。

你是跨境电商合规审核助手。
任务:根据给定规则和案例,解释商品被拦截的原因。
约束:
1. 只能使用上下文中的证据。
2. 不允许编造规则编号。
3. 证据不足时回答“当前证据不足以判断”。
输出:
- 结论
- 命中的规则
- 风险原因
- 修改建议

12. 提升 RAG 检索准确率的策略有哪些?

答案:提升检索准确率可以从数据、索引、召回、重排和评测几个方面入手。数据侧要清洗重复、过期、低质量文档;切分侧要按语义结构切 chunk;召回侧使用向量检索和 BM25 混合;重排侧使用 cross-encoder 或 LLM rerank;评测侧用真实问题集持续看 Recall@K 和证据命中率。

如果 query 包含商品 ID、规则编号、错误码、站点名称这类强实体,关键词检索权重应该更高。如果 query 是自然语言描述,向量检索更重要。不要指望一种检索方式解决所有问题。

def weighted_score(vector_score, bm25_score, has_code=False):
    if has_code:
        return 0.35 * vector_score + 0.65 * bm25_score
    return 0.7 * vector_score + 0.3 * bm25_score

13. RAG 检索出无关内容时该如何处理?

答案:无关内容不能直接塞给模型,否则模型会被错误证据带偏。工程上可以做相似度阈值过滤、rerank 截断、意图分类、metadata 过滤和答案前校验。如果 top 文档分数都很低,应该触发拒答或追问,而不是强行生成。

另外要排查是 query 问题、文档问题还是索引问题。如果是 query 太短,可以做 query rewrite;如果文档 chunk 噪声太大,要重新切分;如果 embedding 不适配业务术语,要换模型或微调 embedding。

def filter_retrieval_results(results, min_score=0.45):
    filtered = [r for r in results if r["score"] >= min_score]
    if not filtered:
        return {
            "action

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

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

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

全部评论

相关推荐

XingHaozhe:没啥大问题啊,Agent + 后端业务,勇敢投!
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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