AI编程:[实践]PDTAC通过叠加多种设计模式,实现高可扩展的第三方系统对接
- 说明:该需求,我用不同的AI编程工具和模型,共计重复做了9次。主要目的是为了验证 AI编程:[SOP]PDTAC 循环
- 原则:简单的事情重复做,重复的事情用心做,做到极致就是专家。
一、核心需求拆解
需求拆分到何种粒度,请自行判断并控制
- 功能性需求:
- 开发一个通用的大模型API路由服务,实现对不同大模型平台API的统一调用和管理。
- 统一业务层接口,屏蔽底层平台差异,提高业务代码的可复用性和可维护性。
- 非功能性需求
- 要求符合开闭原则,达到高可扩展性的目的,以便后期我快速接入不同大模型平台的API。
- 功能拆解:
- 实现多种大模型平台API的路由功能,支持OpenAI、DashScope等主流大模型平台。
- 将多种大模型平台API的路由功能,按照模型类型,暴露为rest接口(模型类型:chat、image、video等)。
- 对话支持同步响应和流式响应。
- 核心痛点
- 架构耦合问题:业务逻辑层与不同大模型平台的SDK实现层存在深度耦合,导致系统扩展性受限。当新增模型平台时,需侵入式修改业务代码,违反开闭原则。
- 接口规范不统一:各平台在相同功能接口上存在参数结构差异(如请求体字段命名、类型规范)和响应体范式不一致(如成功状态码、错误处理机制),产生显著的适配成本。
二、方法论的实践
注意,下面的Prompt,仅仅是按照非常简陋的方式来写的,如果使用编写Prompt的技巧,可能效果会更好。
需求拆分
将需求拆分为如下功能,以便AI生成质量更高的代码
- 功能1:路由功能
- 功能2:暴露Rest接口
功能1:路由功能
一、规划阶段(Chat模式)
特别注意:新建一个会话窗口
1、给出任务,让AI反述
2、让AI给出多种方案以及优劣
- Prompt:
说明:此处合并第一步和第二步的Prompt,简化操作
特别说明:可以让AI优化下面这个提示词,然后让AI基于优化后的提示词生成内容
任务:我要用java实现一个通用的调用不同大模型平台api的路由功能,以便我可快速无感的接入新的大模型平台的api,功能要求如下:
1、对外暴露一个通用的接口,该接口可通过传入的参数,找到对应的大模型平台和对应的api,也就是路由的能力
2、设计一个高可扩展方案,实现不同大模型平台下不同api的快速开发和对接,且要求符合开闭原则
3、不同模型平台的token计费统计
4、模型调用失败后的备选方案
5、支持同步/流式调用方式
6、API调用日志记录请按照如下步骤,逐步帮我分析和解答我的问题:
1、完成这个功能我还需要考虑什么
2、请设计3种方案,并给出优劣势请在方案1和方案2进行整合,基于 注解路由 + 策略模式 + 工厂模式重新设计一个方案
3、权衡并选择最佳方案
人工权衡选择具体的方案
- Prompt
你的回答很nice,比我预期的要好,现在我根据你帮我设计的3种方案,我决定选择方案一(工厂模式 + 策略模式),但还有一些技术细节我补充给你,请按照方案一,帮我重新设计方案,具体技术细节:
1、我采用的是spring-boot + spring-ai-alibaba,它里面默认实现了openai、dashscope等大模型平台
2、我希望不同的模型类型暴露不同的接口,模型类型有:chat、image、video、translation、mutilmodel等等
3、我希望不同大模型平台的不同api的实现,通过泛型的方式,来限定入参和出参对象,避免使用者传参错误,导致调用了错误的api
4、制定计划,让AI拆解任务
让AI更精准地理解需求,生成的代码更符合期望。
- Prompt
任务:
1. 基于上面的内容,整理并输出一个MarkDown格式的代码实施计划
2. 该计划应包括需求背景、功能点、关键注意点、项目结构(含controller和test)、代码示例(含单元测试)、实施步骤(含单元测试)要求:
1. 要让一个新来的程序员看懂这个计划,直接就可以写代码
2. 该计划要对AI编程工具友好,以便我使用该计划,直接生成代码
3. 将计划写入 d:\workspace\gitee\study-ai\study-ai-route-ai\note\实施计划.md
4. 代码的存放模块路径:d:\workspace\gitee\study-ai\study-ai-route-ai\
二、行动阶段(Builder模式)
特别注意:新建一个会话窗口
1、@Notepad文档
2、分步执行(Do)【耗时】
3、分步测试(Test)【耗时】
- 按照功能,分步执行单元测试,若执行报错,则进入分步修复阶段,进行代码修正(如此循环往复2/3/4/5步骤)
- 特别注意:如果是分模块的java项目,请说明在哪个目录下执行单元测试,避免路径不对,导致执行失败。
- 小技巧:对于自己熟悉的技术栈,建议直接在IDE中去执行单元测试,亲测通过AI执行单元测试,各种报错,反而效率不高。
4、分步修复(Action)
针对执行单元测试时的报错进行修复
- 引导AI进行修复,若AI修正不达预期,可能需要人工介入。
5、分步提交(Commit)
- 将测试通过的功能代码进行提交。
帮我生成一个git提交注释,包含改动的功能点
功能2:暴露Rest接口
一、规划阶段(Chat模式)
特别注意:新建一个会话窗口
1、给出任务,让AI反述
2、让AI给出多种方案以及优劣
- Prompt:
说明:此处合并第一步和第二步的Prompt,简化操作
将大模型API路由服务,对外暴露为rest接口,供调用方调用,具体要求如下
1、基于 `LLMRouter.java` `OpenAIChatService.java` 暴露rest接口
2、不同模型类型,使用不同的Controller完成这个功能我还需要考虑什么
3、权衡并选择最佳方案
由于基础框架已确定,所以上一步未让AI提供多种设计方案,因此直接采用AI生成的内容。
4、制定计划,让AI拆解任务
- Prompt
1、基于上面的内容,整理一下代码实施计划,输出一个完成计划(它应包括需求背景、功能点、关键注意点、项目结构、代码示例、引用相关资源文件或相关代码片段、以及单元测试代码、实施步骤、验收标准)2、要让一个新来的程序员看懂这个计划,直接就可以写代码3、你的计划要以MarkDown格式输出4、你的计划要对Trae 的Builder模式友好,以便我使用该计划,通过Trae 的Builder模式直接生成代码5、代码示例的存放模块路径:d:\workspace\gitee\study-ai\study-ai-route-ai\
二、行动阶段(Builder模式)
特别注意:新建一个会话窗口
1、@Notepad文档
2、分步执行(Do)【耗时】
3、分步测试(Test)【耗时】
4、分步修复(Action)
针对执行单元测试时的报错进行修复
- 引导AI进行修复,若AI修正不达预期,可能需要人工介入。
5、分步提交(Commit)
- 将测试通过的功能代码进行提交。
三、实践中的疑难问题
[Cursor]调用OpenAI报错(缺少spring-ai-alibaba依赖)
- 问题
- 对Cursor生成的调用OpenAI API的代码,进行测试,一直报错
- 过程
- 问AI半天,问题还是无法解决
- 网上搜索,问题还是无法解决
- 经过几个小时的调试,最终还是无疾而终
- 对比:将同样的测试代码,在trae生成的工程中运行,执行正常,在cursor生成的工程中运行,执行失败(报上面的错误)
- 最后,通过对比两个工程的pom.xml文件,发现cursor工程中,少了spring-ai-alibaba-starter这个依赖,加上后,执行正常
- 错误
org.springframework.web.client.RestClientException: Error while extracting response for type [org.springframework.ai.openai.api.OpenAiApi$ChatCompletion] and content type [application/json;charset=utf-8]Caused by: java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
[Trae]兼容性问题(升级 Spring Boot 2.x 到 3.x )
- 问题
- 升级 Spring Boot 2.x 到 3.x,导致兼容性问题(启动报错找不到)
- 分析
- Spring Boot 2.x 对应 SLF4J 1.x 版本
- Spring Boot 3.x 对应 SLF4J 2.x 版本
- 过程
- 问了AI半天,发现问题还是无法解决,最后根据AI的提示,提供父pom.xml和错误堆栈信息,AI帮我分析出来:主要问题是 SLF4J 版本与 Spring Boot 3.x 版本不兼容。
- 心得
- 当AI解决问题陷入无限循环时,请提供完整的错误堆栈信息,AI效果会更佳。