项目实训——AI接口

慈云数据 5个月前 (06-15) 技术支持 42 0

文章目录

  • AI工具挑选
  • 通义千问API实现
    • Prompt编写
    • 代码实现
    • Main方法测试
      • 输出:
      • 引入Echarts在线进行测试:

        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在线生成成功截图

        没有发生错误,数据、坐标均完好。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon