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在线调试网站:
没有发生错误,数据、坐标均完好。