杭州某小厂一面
同学你好面试自我介绍吧。
嗯 ,面试官好 ,我叫XXX,是杭州电子科技大学计算机科学与技术的学生。技术上我主攻 Java后端,熟悉 Java基础,并发编程,然后还会 redis MySQl等中间件,熟练使用 spring boot , spring cloud , spring ai等,在校期间我参与了直学通和绘镜两个项目,主要实现了跨断续播、优惠秒杀、 AI助手、任务调度、积分榜单等功能。 然后技术栈上主要是使用了 redis、消息队列等,我还自主经营了技术博客在 CSDN上分享 60多篇。阅读量达到 50,000+。
嗯 ,你刚刚说用的 redis讲到你的 redis的理解呗嗯。
嗯 , redis它就是一个数据库是键值类型的 ,当然它还有很多其他的数据结构。然后我在项目中用到了很多 ,比如说我在直学通中有一个是跨断续播 ,我就是把进度存到 readis中。还有一个呢 ,就是我在榜单中也用到了 redist zset。 我在 AI助手中呢 ,我是用 redis做了它的上下文的存储。那么我在另外一个项目中绘镜 AI呢 ,我是用了 zset去给它做一个任务的队列,就是很多部分我都用到了 redis。
哦 ,那什么样的数据应该放到这个里面,嗯就是在哪些场景适合放到哪。 Redis使用场景是什么 ?
就是它比较适合于我们第一种就是我们要频繁访问的 ,比如说我要秒杀的话。这些数据他要经常访问我直接去访问数据库的话 ,这个数据库就容易被打穿 ,所以我会给他放到 redis中。 还有一种呢 ,就是说我要需要用到分布式锁,那么我在两个项目中 ,他们都是用到了 redission锁。这个还有一种呢 ,就是说我也可以给他来一点业务上功能。比如说我可以用它的zset来做任务队列 ,这都是可以的。
那你是本质是解决哪方面的问题呢 ? 它和你正常访问 mys sicle差两个之间的区别点是什么 ?
嗯 ,因为它是在内存里面的访问数据比较快 ,然后mysql它是在磁盘里面的。就是更适合持久化。
那如何应对在使用的过程 ,因为它是加载在内存里面嘛 ,在突然间断电或这种一异常情况下如何保证体内存里面还没有写入到持久化长的数据能够保持一致性的这个问题该怎么该怎么去应对嗯 ?
嗯 ,redis它是有持久化机制的一种就是 RDB一种快照 ,一种是 AOF,我们每一次进行一次增删改都给它追加到里面,一般呢 ,他是 AOF有三种机制 ,一种是你增删改一次它就有加入一次。 一种是你 1秒一次一种是你自己来决定。一般开发中呢 ,我们都选择 1秒一次。然后开发选择我们一般是 RDB加 AOF或者你单单就是 AOF。 这样就可以保证它内存里面的数据进行持久化 ,我们也可以对它进行一些集群啊 ,这种啊 ,都可以保证它这个数据的完整性。
还不错 ,可以那你刚刚有提到你这个项目里面这些上面有多一个 AI助理, AI助理我看你这边写了有咨询推荐交易答疑润色每一个环节都是你这边在做的吗 ?
嗯 ,是这样的 ,是我做的 ,然后是嗯 ,我们是用户先发过来一个请求。 然后他会先到一个路由智能体,他会先去识别当前用户它的需求。比如说我用户是要推荐路由智能体就会给我们返回 recommend,然后我们就通过 spring容器去查找 recommend它的智能体就是说不同的功能 ,它是对应了不同的智能体。 每个智能体呢 ,它是有不同的嗯 ,给它配备了不同的 RAG和 toolCalling。
那你这不同的就是你这个 AI这里每一个环节都是有不同的智能体来做的是吧。
嗯 ,然后他们是共享同一个上下文的 ,不是说嗯完全分开的就是说让功能更专一。 那比方说在咨询有一个叫咨询的智能体对吧 ,课程咨询智能体推荐的也是一个推荐的智能体交易也是交易的智能体 。
那这 123455个环节里面都有五个智能体在做这么个事情吗 ?
嗯 ,他就是比如说他们是能让这些智能体做的就让智能体做 ,如果这些智能体他做不了。就让路由智能体他自己来回答 ,因为他本身也是一个智能体嘛。
OK,那这个路由智能体我可以理解我是一个管理这一帮智能体的角色嘛。是的 ,就是说。那那你这个多智能体协作的框架和是基于哪个来写的呢 ? 是基于 spring AI写的吗 ?
springAI比较好的是可以帮我们自动的去管理bean的生命周期。然后他也帮我们封装了很多方法 ,比如说我可以直接往里面嵌入向量库,还有 tool calling,还有说我可以在里面设置系统提示词啊 ,还有上下文的存储啊 ,都是可以做到的 ,因为它都帮我们封装好了嘛。
OK,那就是你对 Spring AI这个模型不他提供的这个 API的调用层面是相对比较熟悉的嘛。那你有有没有了解过这个多智能体里面它封装的原理就是你有你有没有点开 springi里面的原代码去看过呢 ?就它背后的原理层面的东西。
嗯 ,源代码我是没看过的 ,但是大致的流程我还是能知道的。
嗯 ,简单的讲讲看看。
就是如果我们要跟智能体对话的话 ,我们是先将上下文取出来 ,然后再加上用户的回答将他们进行一个向量化。 然后去嗯大模型里面的向量库进行一个匹配 ,然后再给它返回结果。大概就是这样的流程 ,然后如果中间可以识别到可以使用tool ,我们就可以去 toolContext里面拿取方法,或者说你也可以使用到 ES,这些都是嗯 spring AI,他自己帮我们封装好的。
OK我大概了我大概了解了,那来咱们来到第二个项目绘镜 AI。这个会进你们有文生图,图生图,姿势生成,画质增强,风格化这这些也全都是你做的吗 ?
嗯 ,因为这个是基于ComfyUI做的嘛 ,然后ComfyUI它每一个生图它都是一个工作流嘛。然后我负责的话就是将工作流嵌入到这个项目里面 ,但是我不是主要开发工作流的设计的。
嗯 ,你是用了ComfyUI去搭建这一一系列的工作流对吧。
不是就是ComfyUI里面的工作流不是我搭建的 ,我负责把它嵌入到我们的项目当中。
那你能不能大概的是如何嵌入的呢 ?
就是这样的 ,因为 ComfyUI它底层是 Stable Diffusion嘛 ,然后它里面是很多个节点工作流。 我们就可以将它抽取为 Json格式 ,然后放到 Freemarker里面 ,然后用户的话它会给我们输入参数 ,然后我们将不同的参数直接嵌入到这个 Json格式里面。就可以再把它放到 redis中 ,我们就可以直接将它运行了 ,就是说其实我们每一个文生图啊 ,或者图生图啊 ,他们都是一个对应的 Json,然后只要我们填入参数之后它就可以运行起来了。
OK那这个图生图纹身图这些东西你那个生图能力背后所用的是哪个 ? 大模型啊 ?
嗯 ,我们用的是Stable Diffusion ,然后 Stable Diffusion呢,它底层就是将英文单词和图片进行映射 ,所以说嗯,我在处理的时候还要把用户的提示词给它翻译成英文 ,否则的话中文提示词。它是没办法很好的去对应生成的。
那就等于是用用了一个开源的嘛 ?
嗯对吧
那就开源的底层大模大模型这块是你有了解过吗 ?是你这边有去部署它还是别人不好了 ,你直接拿过来用做业务层面的开发。
嗯 ,是直接用别人搞好了的。
好理理解没事啊 ,我就是作为一个简单的了解 ,你也不用太紧张 ,那你综合的说一说你在会进 AI这上面所做的你这边的职责范围内的事情就你只要是做了哪方面的东西。
嗯 ,是这样的 ,当用户会给我们发一个生成图片的请求 ,我负责先把这些参数嵌入到 Freemarker的 Json格式中 ,然后再将它放到 redis中 ,并且我还要对它进行一个积分的扣除,这些积分给它冻结起来之后呢 ,我们就这个请求就直接返回了 ,然后我们再进行一个 spring task定时调用。 因为我们是多台 JVM嘛 ,我们要确保当前嗯当前 JVM它是不会重复消费的 ,所以我还要加上一个 redisson锁。并且我们不是说你抢到这个 redisson锁 ,他就可以直接执行了。因为 它ComfyUI底层是只有一个任务可以被执行的 ,其他任务都会放在他自己的工作队列。 但是这个工作队列他并不稳定 ,需要我们用嗯用 redis zset去帮他更好的运行起来。那么如果说你 ComfyUI他拿到当前任务之后他就开始执行任务。那么我们执行任务之后呃就是就是我们会有一个长连接嘛。 我们会不断地向ComfyUI发请求给它返回当前的生图进度 ,然后来提醒用户。如果生图好了的话 ,我们会直接直接把当前的生图结果入库。 OK挺好的嗯 ,那讲讲最后再问几个简单的问题啊 ,你作为大一的学生 ,你这么早就来出来找实习找工作你的背后的原因是啥呢 ? 我其实挺好奇的。
嗯 ,主要还是想提升自己的能力吧。
嗯 ,那提升的是想着给自己积攒一些公司这种实际业务项目上的东西能够快速的积积积累自己的实力对吧。
嗯
OK,那你对 AI工程师以后这个职业发展上是有有没有一个大概自己的计划呢 ?
嗯 ,我当前看在网上看到的 AI工程师 ,我觉得本质上还是有一点后端开发的吧。然后是在后端开发的基础上增添了很多 AI的新知识。 然后并且也是基于 AI去开发的。
OK,那我先简单介绍一下是这样的 ,我不是专门做技术的 ,我原来是技术背景出身的。然后呢 ,接下来等会会有个专门做技术人再来面试一下你我这边是简单的了解一下情况 ,然后我先大致跟你说一下我们团队和公司这边是在做什么事情吧 ,这个可能是你比较感兴趣想知道的点吧
(介绍公司中......)
我这边暂时没有其他的问题 ,我觉得这个还是蛮不错的 ,然后你看你等会还有时间吗 ? 有时间我等会让技术面的关在。继续面试 ,咱们把第二类面试也先面了嗯。
嗯 ,有时间。
行 ,那你稍等一会会儿啊。
二面:
https://www.nowcoder.com/discuss/882702352690470912
#发面经攒人品#