杭州某小厂二面

一面:

https://www.nowcoder.com/discuss/882694083573997568

嗯你好,你先简单介绍一下吧

嗯面试官你好,我叫XXX,是杭州电子科技大学计算机科学与技术的学生。我主攻 Java后端,熟悉Java基础,并发编程,熟练使用 spingboot ,spring cloud,spring AI的 ,然后中间件上我熟悉 mySQL redis,消息队列,在校期间我参与了职学通和绘镜AI两个项目的开发。主要是负责跨断续播,优惠秒杀,还有 AI助手,积分排行,任务调度等嗯 ,其中的中间件用到了 redis,spring Ai还有MQ,平时我还会在上一些博客,阅读量达到了 50,00+,累计 60余篇。

你可以简单讲一下就是这 一块是是全部是你负责的吗 ?还是说你负责的哪一块呢 ?

嗯 ,我负责的是有两个项目嘛 ,一个是一个是直学通 ,然后我负责里面的是 AI助手的一部分功能开发 ,还有就是优惠秒杀功能和积分的榜单还有就是我们跨断续播。
那么第二个项目呢 ,就是绘镜AI里面是一个图片生成类的软件嘛 ,然后我不是负责这种图片生成流程的 ,然后我是负责将图片生成这个功能嵌入到当前项目当中。

呃 ,你刚刚提到你有做就是跨多续播这一部这部分你是怎么实现的或者说你一开始的思路是什么样的 ?
可以简单讲一下吗 ?

嗯 ,是这样的 ,当用户在看视频的时候呢 ,我们前端就会15秒就会发送一个心脏请求 ,然后到我们后端嘛 ,我们后端先去检验一下当前视频有没有看完 ,如果说当前视频已经看完了 ,我们进度就不会落库。
如果说当前视频达到了我设定的预置 ,比如说 90%那么我们认为这个视频它已经看完了 ,我们就可以将它直接入库。那么如果说它没有看完的话 ,我们不可以将它直接落库 ,因为它每 1 5秒直接落库的话 ,他数据库压力很大嘛。做法就是先给他放到 redis中 ,然后我们是会发放一个 20秒后的延迟任务 ,那么我们在 20秒后延迟任务取出来去对比一下 20秒前的进度和 现在的进度它的区别有没有如果说没区别的话 ,说明用户这段时间它都没有看视频了 ,我们就可以把进度落库 ,如果说它进度发生了改变 ,说明用户还在看视频 ,我们就要丢此次的任务。
那么如果我们说我们换了设备或者说重新开始看的话 ,我们先是去读 redis中 ,然后 readis中我们数据是有 1分钟的过期时间。然后这期间呢 ,我们读取这个数据 ,它的误差是在 15秒以内 ,那么我们如果说没有在 readis中查找说明过了 1分钟。而且此时也已经落库了 ,我们就去MYSQL中读取。
如果说MYSQL也没有的话 ,说明当前视频它是没有看过的 ,就直接从零开始看就可以了。

呃 ,我可以问一下这个项目的他们的并发量是多大嘛 ,为什么需要做到就是每 15秒去做一个进度的同步呢 ?

嗯 ,主要是这样的 ,因为为了优化用户它的嗯 ,就是说你多设备看的话 ,它也非常的流畅嘛 ,然后并发量的话不清楚。


嗯 ,因为设定有一个 15秒的话 ,为什么不是 10秒为什么不是 5秒 ?我就是这个意思从设计上是处于什么考虑去做这个按时间设定的 ?

嗯 ,因为第一,5秒和 10秒 ,它其实有点太频繁了。
因为我觉得 15秒。它也是可以在接受范围内的 ,但是如果你想要改成 5秒到 10秒的话也是可以的 ,因为它也可以不写死嘛 ,然后再去动态的去挑战调整一下他那个延时任务的时间嘛 ,就是看着业务的要求来嘛。

那我可以理解就这个职目前相当是一个经验值是吧 ,就相当于现暂定。

嗯。

哦 ,明白。那你刚刚提到说 AI助手这一块也是你负责的是吗 ?


嗯。

那可以讲一下就是大概这里面你是参与了哪些部以及怎么做的 ?

大概就是我们可以有一个智能体嘛 ,然后这个智能体它是我可以往里面问问题。
或者说让他给我推荐课程。然后也可以进行下单等操作 ,就是先让用户发一个问题 ,然后我们有一个路由智能体 ,他是先去识别。用户他的意图 ,然后给他返回一个结果 ,比如说我问了一个相关于推荐的问题。
那么路由智能题就会给我返回一个recommend。那么呢我们拿到这个 recommend之后就会去 spring容器里面拿取对应的bean ,然后去调用当前智能体嘛 ,这样做的原因是我们将不同智能体它的职责分开了。
比如说推荐智能题。我给它搭配了 RAG和 ToolCalling。比如说下单智能体我就只给它配备了 ToolCalling,还有其他智能体就是就是让他们每个人负责的内容更专一嘛。
如果说当前智能体他并没有识别出用户 ,他的意图的话 ,那么就是直接让当前这个智路由智能体直接返回。还有几个功能呢就是比如说因为我们把 AI助手做成了一个微服务嘛。其他的服务也可以调用 ,比如说我在看视频的话可以留言提问嘛 ,那么我们就对外暴露了一个接口 ,比如说你用户发了一个评论之后就会去调用 AI服微服务它暴露那个接口去异步生成一个回答或者还有一个功能呢 ,还有就是说你和 AI进行交互的时候可以给它发语音识别文字或者你可以听 AI回答的语音版这些也是另分的智能体。

嗯 ,我想问一下就是你之前提到的有一个路由智能体做一个意图识别 ,那你意图识别的时候具体是怎么识别的 ?就比如说。
呃用户会用户的描述往往很模糊 ,你是怎么去界定到具体的一个推荐或者是交易上的。

嗯 ,因为它是一个智能体 ,首先我们是在提示词里面进行了对它系统提示词里面给它设置了。然后比如说比较明确的 ,他就可以直接回答了 ,但不明确的话他会先去引导用户。
提出更准确的回答或者说用户提问的问题并不在其他智能体范围内的话。那么它毕竟本身也是一个智能体 ,可以直接返回答案的。

那如果说用户的咨询同时包含了推荐和交易 ,你们是会怎么处理呢 ?

嗯 ,应该会是一步步处理 ,先给他推荐 ,然后。然后就是交易的话要等下一步了。

呃 ,我的意思是如果因为你的推荐和交易是两个不同的智能体 ,当你用一个智能体去处理的时候 ,他会忽略掉不不符合他处理的那个信息 ,那你这个信息在走到交易智能体的这个信息 ,你们是怎么传递的呢 ?
还是说是原文传递还是说怎么去做一个相当于是跨智能体的一个交互 ?

嗯 ,是这样的 ,所有智能体 ,他们都是共用同一个上下文的,不是存在说你这个智能体它用的是一个上下文。另外一个智能体用的是另外一个上下文,也就是说它能够知道所有上下文 ,他们进行了什么交互也可以用来判断下一步的行为。

那这里就有个问题 ,如果是同一个智能体的话 ,那你为什么要去拆分成不同的智能体,如果有同样的上下文的话。哦 ,为什么不是做成这种在特定的步骤去注入特定的提示词呢 ?

嗯 ,我当时设计的时候是想因为不是所有智能体 ,他们都需要配备ToolCalling和 RAG的。
就是想的是如果说你是专门做推荐的 ,我就只需要给你推荐的知识库就好了。那么你就没必要去注入其他 ,比如说专业知识的知识库 ,我就是想让他们嗯的知识库更加垂直一点吧 ,就是说不要让他们都揉杂在一起。

嗯 ,那这里的话就是同一个上下文的话 ,其实还有一个问题 ,如果上下文过长的话 ,当前的智能体 AI的话其实在上下文过长的情况下 ,它的注意力会有损失的。
对后面的流程它会就是说它的精准度啊 ,以及一些准确率啊 ,都会有下降 ,你这种有碰到这种问题吗 ?以及你是怎么解决的 ?

嗯 ,是这样的 ,我当初在开发的时候是遇到了我们是由嗯路由智能体先返回一个路由结果嘛 ,
因为它也是个智能体。它就会把路由识别结果直接注入到上下文中 ,然后出现一些错乱 ,所以先是对他进行一个上下文的裁剪。先把路由智能体的识别结果先从上下文中裁剪出来。
然后后续的话如果是上下文过长的话 ,也会对它进行一部分的压缩。就是说呃防止它耗费过多的token。

嗯有个问题就是刚刚你提到的所有智能体共用一个上下文。
但是你给智能体其实相当于说每个智能体有不同的知识库和不同的一个工具调用那你是你在设计所是说按业务的程度去定义还是说是 ?就是说如果他有没有出现过这种他工具不调用或者说调用不准确的场景呢 ?

嗯 ,因为我们给每一个智能体它设置的 ToolCalling比较少 ,并且比较准确的嘛。
那么现在是给它路由化之后 ,他就是每个都比较准确 ,那么你在原来的时候呢 ,就是说那么多个智能就是只有一个智能体的话 ,我就要给他配备一堆的 ToolCalling我还要给他把所有的知识都放到 RAG里面就是说他就会可能会没有那么准确了。所以说才给他做了一些拆分。


也就是说一般来说你这个单人的对话流程其实本质上来是不会太长长 ,就不会出现什么我提到的那种。上一往过长导致 AIA的准确度出问题的这种场景是吗 ?

对 ,因为 AI它一般只对自己嗯只对自己的业务负责。
然后上下文他是作为一个参考 ,比如说我在上面进行了一个咨询 ,那么我可能根据这个咨询的结果再跟发进行一个推荐。或者说 ,然后我给他推荐之后我再可能根据推荐结果再给他发起一个预下单。

你刚刚提到还有个项目就是绘镜 AI,你刚刚是提到你是做哪块来把文生图是嵌到哪里 ?

嗯 ,因为 ComfyUI呢它底层是一个嗯工作流节点嘛 ,然后我们可以将工作流节点导出为 Json。
然后用户将参数提出来 ,直接放到 Json中就直接可以给ComfyUI它进行一个生图嘛 ,然后我不是负责搭建这个工作流的 ,我是负责将用户的参数啊填入啊 ,然后再生成任务我跟用户进行交互的这部分。

那嗯那你现在也用了springAI,包括现在主流上有很多不同的智能体框架 ,你有没有都使用一下或者了解一下呢 ?

嗯 ,我现在用的主要还是 spring AI,因为我比如说我职学通那个项目用 spring AI呢是因为嗯 ,它是我更希望它是作为一个独立服务存在于我原本的项目当中就是说跟原来的项目嵌入的更好。
然后我第二个项目用 spring AI呢 ,其实它是比较轻量的 ,因为嗯也就是只用到了一个翻译的功能嘛。那么其他的智能体框架的话 ,我认为他们是更注重于智能体的开发上因为侧重不同吧。

呃 ,我的意思就是如果说过去要参与这种智能体开发可能得了解一下不同的智能体,他对。就是说比如说记忆对上下文那种额外处理啊 ,这些你有去了解或者学习过,就比如说呃 OpenClaw,cloud code包括之前火的 OpenCL(OpenCoder/OpenCode),还有现在火的 AgentFarm(Farmer/Agent) 这种。

嗯 ,有去了解过 ,但是没有很深入 ,但是如果说后续进入了的话还是会。
比较深入的去学习它的。

嗯那前的市面上现在其实很多这种智能体都很火动 ,而且 scare的概念和 MCP的概念你有了解吗 ?

嗯 ,了解过的。

那如果是让你用 spring AI实现类似的方式的话 ,你会怎么实现呢 ?

说实话 ,我不是很擅长明白这个

明白,用 Spring AI的时候你一般是用的几种模式呢?像 langchain有普通的有几种不同的范式 ,springAI里面你一般都属于是哪几种。

嗯 , spring AI的话 ,我目前就是将直接将系统提示词放在 nacos中 ,然后直接将它拉取过来。
然后再给它注入 toolcalling,然后再给它注一个 RAG,就是比较规范化吧比较一般吧 ,这个流程。

明白就是像它里面其实应该有一些就是这种思考模式 ,你有使用过吗就是 read模式就是一般来说就是先思考再去做事情 ,然后直到拿到结果了才最终才输出。

嗯 ,这个没有用过。

哦明白呃 ,我刚刚翻了一下你的博客 ,我看你们你算法方面其实是涉及的很多的。还有包括设计模式啊 ,你可以简单讲一下你有没有带来项目里面有用到的哪些设计模式吗 ?

设计模式的话 ,我先从第一个项目来讲吧 ,就是我在动态锁的时候用到了工厂模式加策略模式嘛 ,
因为我们就是说一个项目中 ,它不可能说只有一个地方用到了 redisson锁。那么我但是它每一个锁它的要求都是不一样的 ,那么我就不用每次去自己创建一个锁 ,我让工厂模式给我创建一个锁。那么策略模式呢 ,就是我们开发者来自己选择搭配这个锁还有一个嗯。
我还在就是说我在计算优惠券金额的时候我也用到了策略模式。因为我们有很多种优惠券嘛有比如说没有限额的 ,比如说满多少减多少还有折扣啊。这些也是比较适合策略模式的 ,也就是说如果我要添加一种优惠券规则的话 ,我直接新增一个类就好了。
我不需要去改动原来的代码,嗯对嗯就是对扩展开放嘛 ,然后其他的策略模式吧。嗯 ,其他设计模式我再想想。嗯 ,还有就是动态代理嘛 ,然后动态代理比较多的话就是 AOP嘛 ,AOP的话用的比较多 ,比如说事务啊。
还有说我用动态锁的时候也其实也是用到了 AOP,这个就是代理模式。

嗯 ,那像你现在你有没有了解过 Agent的和你正常的 API调用到底区别到底在哪里 ?有自己理解吗。


比如说我正常去调用一个 API的话 ,他就是可能说没有上下文 ,那么我 Agent呢。我是可以给它携带一个完整的上下文。并且我可以给他增加一个 RAG让他更加准确。
然后我还可以给他增加一个ToolCalling让他去调用别的 API,比如说给我返回一些别的。

目前的你的你的技术栈主要是 Java对吧 ,你有了解过其他的比如说 langchain这种框架吗 ?

嗯 ,还没有。


我这边基本问完了嗯稍等一下。

(三面聊了一下公司具体,不分享了)

#发面经攒人品#
全部评论

相关推荐

肖先生~:先别说工资,现在有个工作就不错了
点赞 评论 收藏
分享
03-29 18:59
运城学院 Java
程序员小白条:咱们要对自己的简历和学历有清晰的认知,不要动不动就大厂了....都26届了,没实习还想着大厂,唉
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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