Java 篇-项目实战-AI 天机学堂(从 0 到 1)-day5

java 篇: 1.基础地基 2.设计原理 3.项目实战


在线平台智能体-创建智能体:

设置模型及一些参数,把思考模式关了

添加提示词

右边测试一下

但是后面因为没有知识库,然后开始胡说了,所以需要给它添加知识库

在线平台智能体-添加知识库:

返回,看到是未发布状态,目前还没办法用程序去调用它。

视频当中是应用数据

现在变成数据连接了

拖入 Excel,没表的给 AI 生成一下

创建知识库(这里要钱,所以就没搞,就跟视频看了下):

选择数据:

数据导入成功:

智能体添加知识库:

需要返回到智能体应用中添加:

功能测试:

可以看到,添加的知识体已经生效了,大模型可以推荐课程了。

如果问他这个课程多钱,大模型是不知道的,因为在知识库中是没有这个数据的,需要添加插件,也就是我们程序中的 Tools,根据 Tools 进行查询:

在线平台智能体-内网穿透:

我们的微服务是在本地运行的,而大模型则在阿里云上,直接访问不到本地的服务。要解决这个问题,可以使用内网穿透技术。

简单来说,内网穿透就是把本地的服务开放到互联网上,这样不管谁只要能上网就能访问你的服务了。

在这里推荐 2 个免费的内网穿透服务,分别是:

https://www.cpolar.com/(https://www.cpolar.com/)

https://natapp.cn/(https://natapp.cn/)

这里以【cpolar】为例,介绍使用方法:

**第一步,下载安装 cpolar:**

参考文档进行安装:👉 文档 - cpolar 极点云官网(https://cpolar.com/docs#cpolar)

**第二步,注册账号并且登录。**

**第三步,设置 token:**

请求 https://dashboard.cpolar.com/get-started(https://dashboard.cpolar.com/get-started) 页面,查看命令 `cpolar authtoken xxxx` 后面的【xxxx】就是你自己的 token,每个人是不一样的。token 只需要设置一次。

**第四步,设置端口映射:**

例如:`cpolar http 10010` 端口改成你自己的端口。

在 cmd 控制台输入:cpolar http 10010

外网访问这个地址,就是访问我们本地 10010 端口。但是如果断开(会话关闭)之后,这个地址就会变,所以就不要断开,如果断开后不想变,那就需要充钱。

用 apifox 测试一下:

测试成功:

在线平台智能体-添加插件:

**在插件里创建工具:**

设置工具信息:

设置请求参数:

可以访问到数据

设置接口输出字段说明:

测试:

可以看到,工具已经测试成功了。

点击发布:

然后在知识库当中添加这个插件:

在这个位置设置 token

在线平台智能体-程序调用:

先发布一下:

**第一步**,导入依赖:

java 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dashscope-sdk-java</artifactId>
    <version>2.19.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.github.victools</groupId>
            <artifactId>jsonschema-generator</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-simple</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

**第二步**,编写测试用例:

java 复制代码
package com.tianji.aigc.agent;

import cn.hutool.core.map.MapUtil;
import com.alibaba.dashscope.app.Application;
import com.alibaba.dashscope.app.ApplicationParam;
import com.alibaba.dashscope.app.ApplicationResult;
import com.alibaba.dashscope.utils.JsonUtils;
import io.reactivex.Flowable;
import org.junit.jupiter.api.Test;

import java.util.Map;

public class AppTest {

    @Test

    public void testAppCall() throws Exception {
        // 构造业务参数
        String token = "xxxxxxxxxxx";
        Map<String, Object> bizParams = MapUtil.<String, Object>builder()
                .put("user_defined_tokens", MapUtil.of("tool_xxxxx", // 工具id
                        MapUtil.of("user_token", token)))
                .build();

        // bizParams.add("user_defined_tokens", JsonObject);
        ApplicationParam param = ApplicationParam.builder()
                // 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。
                .apiKey("sk-xxxxxx")
                .appId("xxxxxxxxxx") // 智能体id
                .prompt("查询课程,id为:1880533253575225346")
                .incrementalOutput(true) // 开启增量输出
                .bizParams(JsonUtils.toJsonObject(bizParams))
                .build();

        Application application = new Application();
        Flowable<ApplicationResult> result = application.streamCall(param);

        // 阻塞式的打印内容
        result.blockingForEach(data -> {
            System.out.printf("%s\n",data.getOutput().getText());
        });

    }

}

填写下 token、工具 id、apiKey、appId

工具 id:

appId:

测试一下:

在线平台智能体-集成到项目:

**第一步**,在 nacos 中增加配置

java 复制代码
tj:
  ai:
    dashscope:
      key: sk-xxxxxxxxxxx
      app-agent:
        id: xxxxxxxxx
        tools: 
          - "tool_xxxxx"
          - "tool_xxxxx"

**第二步**,编写配置类,读取上面的配置

java 复制代码
package com.tianji.aigc.config;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Data
@Configuration
@ConfigurationProperties(prefix = "tj.ai.dashscope")
public class DashScopeProperties {

    private String key;
    private AppAgent appAgent;

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class AppAgent {
        private String id;
        private List<String> tools;
    }

}

**第三步**,编写 AppAgentChatService,用来集成平台的智能体

java 复制代码
package com.tianji.aigc.service.impl;

import com.alibaba.dashscope.app.Application;
import com.alibaba.dashscope.app.ApplicationParam;
import com.alibaba.dashscope.utils.JsonUtils;
import com.tianji.aigc.config.DashScopeProperties;
import com.tianji.aigc.enums.ChatEventTypeEnum;
import com.tianji.aigc.service.ChatService;
import com.tianji.aigc.vo.ChatEventVO;
import com.tianji.common.utils.TokenContext;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
@RequiredArgsConstructor
@ConditionalOnProperty(prefix = "tj.ai", name = "chat-type", havingValue = "APP")
public class AppAgentChatService implements ChatService {

    private final DashScopeProperties dashScopeProperties;

    // 存储大模型的生成状态,这里采用ConcurrentHashMap是确保线程安全
    // 目前的版本暂时用Map实现,如果考虑分布式环境的话,可以考虑用redis来实现
    private static final Map<String, Boolean> GENERATE_STATUS = new ConcurrentHashMap<>();
    // 输出结束的标记
    private static final ChatEventVO STOP_EVENT = ChatEventVO.builder().eventType(ChatEventTypeEnum.STOP.getValue()).build();

    @Override
    public Flux<ChatEventVO> chat(String question, String sessionId) {
        // 获取对话id
        var conversationId = ChatService.getConversationId(sessionId);
        var token = TokenContext.getToken();
        var toolsMap = new HashMap<String, Object>();
        for (var tool : dashScopeProperties.getAppAgent().getTools()) {
            toolsMap.put(tool, Map.of("user_token", token));
        }
        var bizParams = Map.of("user_defined_tokens", toolsMap);

        var param = ApplicationParam.builder()
                .apiKey(dashScopeProperties.getKey())
                .appId(dashScopeProperties.getAppAgent().getId()) // 智能体id
                .prompt(question)
                .incrementalOutput(true) // 开启增量输出
                .bizParams(JsonUtils.toJsonObject(bizParams))
                .sessionId(conversationId) // 设置会话ID
                .build();

        var application = new Application();
        try {
            var result = application.streamCall(param);

            // 将Flowable 转化为 Flux 进行处理输出
            return Flux.from(result)
                    .doFirst(() -> { //输出开始,标记正在输出
                        GENERATE_STATUS.put(sessionId, true);
                    })
                    .doOnComplete(() -> { //输出结束,清除标记
                        GENERATE_STATUS.remove(sessionId);
                    })
                    .doOnError(throwable -> GENERATE_STATUS.remove(sessionId)) // 错误时清除标记
                    // 输出过程中,判断是否正在输出,如果正在输出,则继续输出,否则结束输出
                    .takeWhile(s -> GENERATE_STATUS.getOrDefault(sessionId, false))
                    .map(applicationResult -> {
                        // 获取大模型的输出的内容
                        var text = applicationResult.getOutput().getText();
                        // 封装响应对象
                        return ChatEventVO.builder()
                                .eventData(text)
                                .eventType(ChatEventTypeEnum.DATA.getValue())
                                .build();
                    })
                    .concatWith(Flux.just(STOP_EVENT));

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void stop(String sessionId) {
        // 移除标记
        GENERATE_STATUS.remove(sessionId);
    }
}

**第四步**,改 application.yml 配置

改成对应的 APP

**第五步**,测试:

在线平台智能体-工作流应用:

开始:

意图分析智能体:

条件判断:

如果选择 agent_format,需要把结果返回开关打开

java 复制代码
package com.tianji.aigc.agent;

import com.alibaba.dashscope.app.Application;
import com.alibaba.dashscope.app.ApplicationParam;
import com.alibaba.dashscope.app.ApplicationResult;
import io.reactivex.Flowable;
import org.junit.jupiter.api.Test;

_/**_
_ * 测试 工作流应用-任务型-天机AI助手_
_ */_
public class AppTest2 {

    @Test
    public void testAppCall() throws Exception {
        ApplicationParam param = ApplicationParam.builder()
                // 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。
                .apiKey(System._getenv_("ALIYUN_API_KEY"))
                .appId("7d97f87d6c64441d88f390dcce9aaf1a") // 智能体id
                // .prompt("你好")
                .prompt("课程推荐")
                .incrementalOutput(true) // 开启增量输出
                .parameter("flow_stream_mode", "agent_format")
                // .bizParams(JsonUtils.toJsonObject(bizParams))
                .build();

        Application application = new Application();
        Flowable<ApplicationResult> result = application.streamCall(param);

        // 阻塞式的打印内容
        result.blockingForEach(data -> {
            System._out_.printf("%s\n",data.getOutput().getText());
        });

    }

}

补充:

如果是高版本的 java SDK 可以直接 .

如果是低版本的可以设置参数


如果对你有帮助的话,请点赞,关注,收藏。热爱可抵一切!👍 ❤️ 🔥

相关推荐
大模型最新论文速读1 小时前
小红书提出 RedKnot:分头处理 kv 缓存,延时降低 60%效果还提升
论文阅读·人工智能·深度学习·机器学习·缓存·自然语言处理
IT策士1 小时前
Redis 从入门到精通:Python 操作 Redis
redis·python·bootstrap
mN9B2uk171 小时前
大数据量高并发的数据库优化
服务器·数据库·oracle
Database_Cool_1 小时前
PolarSearch AutoETL:让数据库内置搜索不再需要搬运工
数据库
cui17875682 小时前
物业费收缴困局的破题之路:2026年社区商业逻辑的底层重构
大数据·数据库·人工智能
周杰伦的稻香2 小时前
Go + Redis:本地部署高性能图片主色调提取服务
开发语言·redis·golang
是发财不是旺财2 小时前
Hermes 网关四层权限控制方案:让 AI Agent 安全地查数据库
数据库·安全·agent·openclaw·hermes
阿正的梦工坊3 小时前
【Rust】04-借用、引用与切片
java·数据库·rust
AOwhisky3 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算