京东 AI应用开发(后端) 一面(JDY)

1. 做一下自我介绍

2. 讲一下你做过的系统架构,别只说用了哪些中间件

架构最好按数据流讲,而不是按技术名词堆。入口层是网关、鉴权和限流,业务层负责请求编排、规则判断和状态推进,异步层用 MQ 解耦高峰流量和补偿任务,存储层通常拆成 MySQL、Redis、检索索引和对象存储,旁路再挂监控、日志、配置中心和任务调度。真正有价值的是你能指出瓶颈会出现在哪里,比如检索召回抖动、缓存热点倾斜、下游依赖变慢、消费积压或者数据库回查索引失效。

3. RAG 的原理你怎么讲,真正落地时它在系统里承担什么角色

RAG 不是“检索一下再回答”这么简单,它本质上是把外部知识注入生成过程,降低模型纯参数记忆带来的不确定性。通常流程是文档清洗、切块、向量化、索引构建、召回、重排、上下文组装和答案生成。落地时它更像知识访问层,而不是答案本身。好的 RAG 系统不只是能找到相关段落,还要让模型在证据边界内作答,没证据时能够拒答。

def rag_pipeline(query):
    chunks = retrieve(query)
    ranked = rerank(query, chunks)
    context = build_context(ranked[:5])
    return llm_generate(query, context)

4. 向量数据库的作用是什么,它和普通检索系统的边界在哪里

向量数据库主要解决语义相似检索问题,适合处理问法不稳定、表达多样但语义相近的场景。它把文本映射成高维向量,再用 ANN 索引做近似最近邻搜索。但它不是全文检索替代品,精确关键词、结构字段过滤、时间约束和强规则查询,传统倒排索引通常更稳。实际系统里很少只用一种检索,而是向量召回、关键词召回和规则过滤混合使用。

5. 为什么有些场景会选择多智能体,而不是单智能体把事情全做完

多智能体不是因为“更高级”,而是因为任务边界真的可以拆。比如规划、执行、审计、复核天然是不同职责,拆开之后上下文更短,行为也更容易约束。单智能体优点是链路短、调试简单、状态集中,但一旦任务变成多阶段推理加工具调用,它很容易上下文污染。多智能体的代价是通信成本、错误放大和治理复杂度都会上升,所以只有职责边界足够清晰时才值得上。

6. 如果让你现场展示项目代码,你会重点讲哪一部分才能体现深度

不会直接展示 controller 或 CRUD,我会挑能体现系统复杂度的部分,比如检索编排层、工具路由、消息幂等消费、缓存一致性控制或者任务状态机。因为这些位置能体现你是不是只会堆框架,还是理解数据流、故障场景和边界控制。展示代码时也别只念逻辑,要说明这个实现解决了什么问题、为什么不用更简单的方案、上线后踩过哪些坑。

7. Redis 的 ZSet 在你的系统里适合拿来做什么,为什么不用 List 或普通 Set

ZSet 最典型的价值是既要去重,又要排序,还要支持按 score 范围查询。比如延迟任务调度、热度排行、限时窗口统计、会话活跃度排序都很适合。List 更适合简单队列,Set 适合纯去重,但都不适合按权重或时间戳排序。ZSet 真正好用的地方在于它把“唯一成员 + 有序 score”绑在一起,很多业务场景天然就是这个模型。

redisTemplate.opsForZSet().add("delay_task", "task_1001", System.currentTimeMillis() + 30000);
Set<String> tasks = redisTemplate.opsForZSet()
        .rangeByScore("delay_task", 0, System.currentTimeMillis());

8. 消息队列在你这个系统里真正承担什么作用

消息队列至少承担三件事:主链路解耦、失败补偿和流量整形。主链路里不适合同步阻塞的动作,比如审计日志、异步通知、画像更新、二级索引刷新,都可以异步化。失败补偿场景下,MQ 让系统具备重试和重放能力。流量整形则体现在高峰请求先入队,消费端按可承载速度处理。真正成熟的系统用 MQ 不是为了“快”,而是为了把不确定性从主请求里剥出去。

9. 多线程在项目里一般会用在哪些地方,线程池参数你是怎么考虑的

多线程不是为了“提高并发”这句空话,而是看任务是否能拆并且值不值得拆。常见用法是并行聚合下游接口、异步日志落盘、批量任务分片和后台补偿。线程池参数要结合任务类型来定,CPU 密集型和 IO 密集型差别很大,队列大小、拒绝策略和最大线程数也要看系统是否允许堆积。如果线程池只是凭经验写死,很容易在下游抖动时把自己先拖死。

ExecutorService executor = new ThreadPoolExecutor(
        8, 16, 60, TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(200),
        new ThreadPoolExecutor.CallerRunsPolicy()
);

10. 说一说JVM 内存模型

如果只是讲堆、栈、方法区,那还停留在结构层。更关键的是 Java 内存模型约束了线程之间如何看见共享变量,涉及主内存、工作内存、可见性、原子性和有序性。很多并发 bug 不是因为对象放在哪个区,而是线程更新后的值为什么别的线程看不到,或者为什么指令重排导致状态异常。面试里讲 JMM,更重要的是把它和 volatile、锁、CAS 这些机制连起来。

11. 垃圾回收机制如果结合线上问题来讲,你会

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

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

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

全部评论
同学,考虑一下多多吗,招实习生啦:https://careers.pddglobalhr.com/campus/intern?t=FFEgIPlwIe
点赞 回复 分享
发布于 今天 11:13 上海

相关推荐

评论
点赞
收藏
分享

创作者周榜

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