🎯初步开发和实现功能阶段
🎯初步开发和实现功能阶段:
0. 解决依赖和配置问题
- 配置yml文件,写好api秘钥和使用的模型
- 接入langchain4j的Spring依赖和openai依赖
✅ 正确
1. 开发数据模型层
- 使用@Description注解和@Data注解在ai的model包下创建两种结果模版
- 进行需求分析后,得出应用需要有两种返回结果:原生html和原生多文件两种模式
- 结果类型:HtmlCodeResult(描述和HTML代码)和MultiFileCodeResult(描述和三种代码)
✅ 正确
2. 枚举类定义
- 将这两种模式写入枚举类CodeGenTypeEnum
✅ 正确
3. 开发服务层
- 首先写一个接口AiCodeGeneratorService
- 系统根据用户输入和配套提示词(使用@SystemMessage注解导入txt提示词文件),用数据模型约束返回的格式
❓ 问题1:这个模版是定义了一堆描述注解和变量,ai是会根据注解自动识别自己的内容属于哪个变量吗?
-
✅ 答案: 是的!AI会根据@Description注解自动识别字段含义,LangChain4j会扫描类的字段和注解,生成JSON Schema告诉AI返回格式,AI按照这个Schema返回对应格式的JSON
-
引入步骤0的大模型,创建ai代码生成器服务,将服务接入服务工厂
❓ 问题2:这算实现了接口吗?为什么不实现也可以?不实现哪来的AiCodeGeneratorService.class?
- ✅ 答案: 这是动态代理实现!LangChain4j的AiServices.create(AiCodeGeneratorService.class, chatModel)会在运行时自动生成接口的实现类,类似Spring的@Repository接口,不需要手写实现
4. 开发数据保存器 和数据解析器
❓ 问题3:由于解析器没有使用这里仍然存疑,到底是不是识别的,没有解析器如何识别和分类的?就仅凭一个注解?
- ✅ 答案: 在结构化输出模式下,AI确实会自动识别!AI直接返回符合模板格式的JSON,LangChain4j自动转换成对象,完全不需要解析器。识别机制就是基于@Description注解生成的JSON Schema。
❌ 原始错误认知:
"模版是最终返回结果的格式,ai不会自动识别,只是在解析器处理后以特定格式返回"
✅ 修正认知:
在结构化输出中,AI直接返回结构化JSON,LangChain4j自动转换,不需要解析器
❌ 删除错误部分:
"首先看解析器:需要解析的回答需要提取三部分内容,三部分的提取规则用静态变量的模式存储..."
原因: 结构化输出阶段根本不使用解析器
文件保存器开发:
- 定义根目录
- 根据根目录和雪花算法生成的特定文件名加上路径分隔符创建出唯一路径
- 创建写入内容的方法,将路径和指定文件名(index.html、style.css、script.js等)组合得到具体文件地址,通过工具类写入内容
- 分成两种保存器:一种保存html,一种保存多文件,创建路径,写入文件,返回文件路径
❌ 原始错误:
"多文件使用解析器当时set方法对应的get方法获取内容"
✅ 修正:
多文件保存使用模板类的@Data注解生成的getter方法获取内容,分别保存(如result.getHtmlCode()、result.getCssCode()等)
5.开发门面类
-
统一分发任务:判断非空,通过switch分发到两个单独的生成并保存逻辑
-
调用AI服务:服务接口调用大模型,根据传入的用户信息和项目内置提示词
-
✅ 关键修正:AI服务直接返回结构化对象(HtmlCodeResult/MultiFileCodeResult),不是字符串!LangChain4j框架根据@Description注解已经自动完成了转换
-
文件保存:将result对象传入保存器,保存器根据@Data注解生成的getter方法(如result.getHtmlCode())获取对应内容进行保存
-
用户体验:整合生成和保存方法,让用户不关心内部逻辑
🔑 关键认知纠正:
- AI确实会自动识别 - 基于@Description注解和JSON Schema
- 不需要解析器 - 结构化输出直接返回对象
- 动态代理机制 - 框架自动生成接口实现
- getter方法来源 - @Data注解生成,非解析器
- 在结构化输出模式下,没有"字符串→对象"的转换步骤,AI直接返回结构化对象!
✅ 至此初步完成结构化输出阶段
然后进行流式输出改造。