项目实训——AI接口

AI工具挑选

  1. 魔搭社区模型

    在本地搭建使用时,本地模型受本地硬件环境影响较大,本人设备运行一个较长回答响应时间往往在二十秒往上,不利于用户使用。且项目后端为SpringBoot,魔搭社区的模型在Java环境下难以配置运行。小组项目没有更改模型的硬性需要,通过配置智能体或者Prompt提示均可实现。若想继续推进这个方案,可考虑采用Flask+本地模型运行在一个较高配置的机器上,作为一个AI服务的单独接口。

  2. 第三方AI网站

    市面上有许多第三方网站提供AI服务,这些网站的一大优势是精简了调用AI的流程,可以自由设置智能体提前设定问答的角色,有的网站甚至提供了SDK可以直接调用AI。
    在实际测试中,我们小组发现,大多数AI服务方提供的免费方案使用的都是较为落后的模型,如GLM3甚至GLM2,经过测试,这些落后模型无法满足要求。
    测试的部分网站对于上下文的理解不到位,无法完成要求,稳定性不佳。

  3. 通义千问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在线调试网站:
Echarts在线生成成功截图
没有发生错误,数据、坐标均完好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值