青天明镜映红尘
Java后端
·2025-10-28
AI零代码生成平台 第十一期项目优化小结 # 性能优化 目前不同用户的AI调用,是串行的,相当于同时只能给一个用户用。 因为我们使用的chatModel是Spring注入的属性,默认在同一个JVM中只存在一个实例 (A中注入C,B中注入C,A和B的C是同一个实例) 解决方案:多例模式 - 首先将推理模型和智能路由模型的配置,设置在配置文件中 - 为每一种模型创建配置类,并且注册成Bean(多例) - 修改各自类中原有的注入方式,要用Spring上下文的getBean # 缓存优化 缓存策略设计:缓存十页经典应用 - 缓存中有数据,就用缓存中的数据 - 缓存中没有数据,就查询数据库,写回到缓存中 缓存应该合理设置过期时间 项目中的实现:Spring-data-redis 缓存key的设计:将查询的对象,先转json,再转成md5,为什么要转成Md5,节省空间,避免bigkey 启动类需要加上@EnableCaching开启缓存,但是使用注解模式的弊端是不够灵活,在项目中要自定义CacheManager - 设置过期时间 - 序列化器 - 单独针对某个cache设置过期时间 # 实时性优化 vue工程化项目,采用的是异步打包的方式,可能项目生成完成后,打包还没有完成,导致页面无法正常展示 解决方式: - 同步打包 - 前端轮询打包状态,完成后刷新 - 异步打包完成后,通过SSE向前端推送进度 - 美团noCode的方案:后端连接vite服务器,后端直接把代码修改告诉vite,自动构建页面 # 限流 因为AI的对话是要消耗token的,必须要防刷,否则造成极大的成本负担,使用redisson限流 Redisson实现基于令牌桶的RRateLimiter算法 实现: - 接口级别限流 - 用户级别限流 - IP级别限流 使用自定义注解 + AOP实现 - 使用前置增强 - 创建一个唯一的限流key - 使用redisson的限流器 - 设置限流器参数 - 尝试获取令牌 生成key,也要根据限流类型进行区分 - 接口级别:方法名 - 用户级别:用户ID - IP级别:客户端IP # 安全审查 防止用户输入非法信息,将prompt发送给AI前进行检查 利用到langchain4j的advisor机制,类似于拦截器 - 拒绝过长的token - 拒绝敏感词 - 拒绝注入攻击 可以在AI服务工厂中集成护轨,也可以单独给某个方法使用护轨 # 稳定性优化 ## 重试策略 使用重试策略 设置maxRetries 设置重试护轨**(对应对话记忆治理扩展,如果没有调用工具,让AI重新调用工具)** **使用输出护轨,可能导致流式输出的响应不及时** ## 工具调用优化 防止AI重复调用工具,或者调用工具不稳定 - 设置AI最大调用次数 - 提供退出工具 # 成本优化 根据不同的业务类型,使用不同的模型*(改配置文件的base-url,模型名称和api-key),因为不同的模型,价格是不一样的 将默认提示词的结果保存到数据库中
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP