文章目录
- AI工具挑选
- 通义千问API实现
- Prompt编写
- 代码实现
- Main方法测试
- 输出:
- 引入Echarts在线进行测试:
AI工具挑选
-
魔搭社区模型
在本地搭建使用时,本地模型受本地硬件环境影响较大,本人设备运行一个较长回答响应时间往往在二十秒往上,不利于用户使用。且项目后端为SpringBoot,魔搭社区的模型在Java环境下难以配置运行。小组项目没有更改模型的硬性需要,通过配置智能体或者Prompt提示均可实现。若想继续推进这个方案,可考虑采用Flask+本地模型运行在一个较高配置的机器上,作为一个AI服务的单独接口。
-
第三方AI网站
市面上有许多第三方网站提供AI服务,这些网站的一大优势是精简了调用AI的流程,可以自由设置智能体提前设定问答的角色,有的网站甚至提供了SDK可以直接调用AI。
在实际测试中,我们小组发现,大多数AI服务方提供的免费方案使用的都是较为落后的模型,如GLM3甚至GLM2,经过测试,这些落后模型无法满足要求。
测试的部分网站对于上下文的理解不到位,无法完成要求,稳定性不佳。
-
通义千问API
最终定下AI工具通义千问的API,刚开始不想选择成熟AI应用的API,是因为这些成熟的AI工具API都需要Token收费。
但是小组成员反复寻找不同企业的AI服务,终于发现通义千问的qwen-turbo模型限时免费、且在结束活动后也赠送一定的免费Token,粗略计算后发现可以满足需求。
通义千问API实现
Prompt编写
Prompt,指的是给定给AI系统的一段文本信息或指令,其目的是引导或激发AI模型产生特定的输出或执行相应的操作。它相当于与AI进行交互时提出的问题或任务说明,帮助模型理解用户的需求和期望的回应内容或行为。Prompt技术通过为AI提供上下文、场景信息和用户意图的线索,使得模型能更准确地生成符合情境的响应,提高交互的自然性和有效性。
根据我们项目的要求编写Prompt:
你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容: 分析需求: {数据分析的需求或者目标} 原始数据: {csv格式的原始数据,用,作为分隔符} 请根据这两部分内容,按照以下指定格式生成内容(此外不要输出任何多余的开头、结尾、注释) 【【【【【 {前端 Echarts V5 的 option 配置对象js代码,只是option的值,合理地将数据进行可视化,不要生成任何多余的内容,比如注释} 】】】】】 {明确的数据分析结论、越详细越好,不要生成多余的注释}
代码实现
public static String callWithMessage(String message) throws NoApiKeyException, ApiException, InputRequiredException { Generation gen = new Generation(); Constants.apiKey = "通义千问申请apiKey"; MessageManager msgManager = new MessageManager(2); Message systemMsg0 = Message.builder().role(Role.SYSTEM.getValue()).content("你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供内容:\n分析需求:\n{数据分析的需求或者目标}\n原始数据:\n{csv格式的原始数据,用,作为分隔符}\n请根据这两部分内容,按照以下指定格式生成内容(此外不要输出任何多余的开头、结尾、注释)\n【【【【【{前端 Echarts V5 的 option 配置对象js代码,只是option的值,合理地将数据进行可视化,不要生成任何多余的内容,比如注释}\n】】】】】\n{明确的数据分析结论、越详细越好,不要生成多余的注释}").build(); Message userMsg1 = Message.builder().role(Role.USER.getValue()).content(message).build(); msgManager.add(systemMsg0); msgManager.add(userMsg1); QwenParam params = QwenParam.builder().model("qwen-turbo") .messages(msgManager.get()) .seed(1234) .topP(0.8) .resultFormat("message") .enableSearch(false) .maxTokens(1500) .temperature((float) 0.85) .repetitionPenalty((float) 1.0) .build(); GenerationResult result = gen.call(params); // 只取出了有效数据 return result.getOutput().getChoices().get(0).getMessage().getContent(); }
GenerationResult result = gen.call(params); 取出的数据非常多,大多为一些状态的内容,项目只需要使用有效的内容,在此阶段处理为String信息。
Main方法测试
public static void main(String[] args) { String jsonString = null; try { String message = "分析需求:\\n分析网站用户的增长情况\\n原始数据:\\n日期,用户数\\n1号,10\\n2号,20\\n3号,30"; jsonString = callWithMessage(message); } catch (ApiException | NoApiKeyException | InputRequiredException e) { System.out.println(e.getMessage()); } System.out.println(jsonString); }
进行测试,
按照Prompt要求的格式传入数据,调用AI方法,向通义千问传递发送请求,得到数据
输出:
【【【【【 ```javascript option = { title: { text: '网站用户增长情况', subtext: '日期 vs 用户数', x: 'center' }, xAxis: { type: 'category', data: ['1号', '2号', '3号'], axisLabel: { interval: 0 } }, yAxis: { type: 'value', name: '用户数' }, series: [{ name: '用户增长', type: 'line', data: [10, 20, 30], smooth: true }] }; ``` 】】】】】 数据分析结论:根据数据,网站用户在1号至3号期间呈现出线性增长趋势。1号有10名用户,2号增加到20名,3号进一步增长至30名用户。这是一个稳定的上升态势,对于网站运营者来说,需要关注这个增长速度是否可持续,以及是否有提升用户活跃度的策略。 进程已结束,退出代码为 0
引入Echarts在线进行测试:
Echarts在线网站
将代码部分手动粘贴到Echarts在线调试网站:
没有发生错误,数据、坐标均完好。
-