Java后端
·2025-10-28AI零代码生成平台 第十一期项目优化小结
# 性能优化
目前不同用户的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),因为不同的模型,价格是不一样的
将默认提示词的结果保存到数据库中
1
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
