Spring Boot 整合智谱AI

示例代码

https://github.com/Afterlll/ai-demo

智谱AI官网

https://open.bigmodel.cn/overview

使用智谱API SDK

1. 引入 SDK

 <!--https://open.bigmodel.cn/dev/api#sdk_install-->
 <dependency>
     <groupId>cn.bigmodel.openapi</groupId>
     <artifactId>oapi-java-sdk</artifactId>
      <version>release-V4-2.0.2</version>
</dependency>

2. 封装智谱AI通用配置类

/**
 * 智谱AI配置类
 *
 * @author wangkeyao
 */
@Configuration
@ConfigurationProperties(prefix = "ai")
@Data
public class AiConfig {
    private String apiKey;

    @Bean
    public ClientV4 getClientV4() {
        return new ClientV4.Builder(apiKey).build();
    }
}

3. 封装智谱AI通用请求方式


/**
 * 智谱AI通用方法
 *
 * @author wangkeyao
 */
@Component
public class AiManager {
    @Resource
    private ClientV4 client;

    // 默认的是0.95,认为此时是稳定的
    // 较稳定的随机数
    public static final float STABLE_TEMPERATURE = 0.05f;
    // 不稳定的随机数
    public static final float UNSTABLE_TEMPERATURE = 0.99f;

    /**
     * 通用请求方法
     *
     * @param aiChatMessages AI聊天消息
     * @param stream 是否开启流式
     * @param temperature 随机性
     * @return AI响应信息
     */
    public String doRequest(List<ChatMessage> aiChatMessages, Boolean stream, Float temperature) {
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(stream)
                .invokeMethod(Constants.invokeMethod)
                .temperature(temperature)
                .messages(aiChatMessages)
                .build();
        try {
            ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
            return invokeModelApiResp.getData().getChoices().get(0).getMessage().toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 简化消息传递
     *
     * @param systemMessage 系统信息
     * @param userMessage 用户信息
     * @param stream 是否开启流式
     * @param temperature 随机性
     * @return AI响应信息
     */
    public String doRequest(String systemMessage, String userMessage, Boolean stream, Float temperature) {
        // 构造请求
        List<ChatMessage> aiChatMessages = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
        aiChatMessages.add(systemChatMessage);
        aiChatMessages.add(userChatMessage);
        return doRequest(aiChatMessages, stream, temperature);
    }

    /**
     * 同步请求
     *
     * @param systemMessage 系统信息
     * @param userMessage 用户信息
     * @param temperature 随机性
     * @return AI响应信息
     */
    public String doSyncRequest(String systemMessage, String userMessage, Float temperature) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, temperature);
    }

    /**
     * 同步请求(答案较稳定)
     *
     * @param systemMessage 系统信息
     * @param userMessage 用户信息
     * @return AI响应信息
     */
    public String doSyncStableRequest(String systemMessage, String userMessage) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, STABLE_TEMPERATURE);
    }

    /**
     * 同步请求(答案较随机)
     *
     * @param systemMessage 系统信息
     * @param userMessage 用户信息
     * @return AI响应信息
     */
    public String doSyncUnStableRequest(String systemMessage, String userMessage) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, UNSTABLE_TEMPERATURE);
    }

    /**
     * 通用流式请求
     *
     * @param aiChatMessages AI聊天消息
     * @param temperature 随机性
     * @return AI响应信息(流式)
     */
    public Flowable<ModelData> doStreamRequest(List<ChatMessage> aiChatMessages, Float temperature) {
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.TRUE)
                .invokeMethod(Constants.invokeMethod)
                .temperature(temperature)
                .messages(aiChatMessages)
                .build();
        ModelApiResponse modelApiResponse = client.invokeModelApi(chatCompletionRequest);
        return modelApiResponse.getFlowable();
    }

    /**
     * 通用流式请求(简化消息传递)
     *
     * @param systemMessage 系统信息
     * @param userMessage 用户信息
     * @param temperature 随机性
     * @return AI响应信息(流式)
     */
    public Flowable<ModelData> doStreamRequest(String systemMessage, String userMessage, Float temperature) {
        List<ChatMessage> aiChatMessages = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
        aiChatMessages.add(systemChatMessage);
        aiChatMessages.add(userChatMessage);
        return doStreamRequest(aiChatMessages, temperature);
    }
}

4. 配置 application.yml

ai:
  apiKey: XXXXXXXXXXXXXXX

5. 测试使用

/**
 * @author wangkeyao
 */
@SpringBootTest
class AiManagerTest {

    @Resource
    private AiManager aiManager;

    @Test
    void doRequest() {
        System.out.println(aiManager.doSyncUnStableRequest("使用系统默认", "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan"));
    }
}


注意:使用 Debuger 模式可能会出现以下问题。

此时通过以下的配置解决。

### Spring Boot 集成 Spring AI 实现 Chat2DB 功能 #### 1. 技术栈介绍 为了实现Chat2DB功能,技术选型至关重要。JeecgBoot是一个企业级低代码开发平台[^1],虽然主要聚焦于前后端分离架构下的快速开发,但其采用的技术组件如Spring Boot, MyBatis Plus等同样适用于构建复杂的数据库交互应用。 对于将Spring BootSpring AI结合以实现Chat2DB的功能而言: - **Spring Boot**: 提供了一个简洁的方式去创建独立运行(运行jar包)、生产级别的基于Spring的应用程序。 - **Spring AI**: 增强了Spring框架的能力,使其能够更方便地集成AI服务,比如自然语言处理(NLP),这有助于解析用户的聊天输入并转换为SQL查询语句。 #### 2. 构建环境准备 确保本地环境中已安装好必要的工具和服务,包括但不限于JDK、Maven以及MySQL/MariaDB等关系型数据库管理系统。 #### 3. 创建Spring Boot项目 可以通过Spring Initializr网站或者IDE插件新建一个Spring Boot工程,在依赖项中加入`spring-web`, `mybatis-spring-boot-starter` 和其他可能需要用到的数据访问层库。 ```xml <dependencies> <!-- Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis.plus.version}</version> </dependency> <!-- Other dependencies... --> <!-- For integrating with Spring AI services --> <dependency> <groupId>io.spring.ai</groupId> <artifactId>spring-ai-core</artifactId> <version>${spring.ai.version}</version> </dependency> </dependencies> ``` #### 4. 数据源配置 编辑application.properties文件来设置数据源连接参数,以便应用程序能顺利连通目标数据库实例。 ```properties # DataSource settings spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` #### 5. 添加NLP处理器 利用Spring AI提供的API接口定义自定义的NLP处理器类,用于接收来自前端的消息请求,并将其转化为结构化的查询命令发送给后台数据库执行。 ```java @Service public class NlpProcessor { @Autowired private JdbcTemplate jdbcTemplate; public String processMessage(String message){ // Use Spring AI to parse the natural language input into SQL query. QueryBuilder builder = new QueryBuilder(); String sqlQuery = builder.buildFromNaturalLanguage(message); List<Map<String,Object>> resultMaps = jdbcTemplate.queryForList(sqlQuery); StringBuilder responseText = new StringBuilder("Here is your data:\n"); for (Map<String, Object> map : resultMap) { responseText.append(map.toString()).append("\n"); } return responseText.toString(); } } ``` 请注意上述例子中的`QueryBuilder`假定是由Spring AI所提供的抽象类或接口,实际使用时需参照具体文档说明进行调整。 #### 6. 控制器层设计 最后一步是在控制器层暴露RESTful API端点,允许外部系统调用此服务完成对话到数据库操作的过程。 ```java @RestController @RequestMapping("/api/chat2db") public class ChatController { @Autowired private NlpProcessor nlpProcessor; @PostMapping(value="/query", produces="text/plain;charset=UTF-8") public ResponseEntity<String> handlePost(@RequestBody String requestBody){ try{ String processedResult = nlpProcessor.processMessage(requestBody); return new ResponseEntity<>(processedResult, HttpStatus.OK); }catch(Exception e){ logger.error(e.getMessage(),e); return new ResponseEntity<>("Error occurred while processing request.",HttpStatus.INTERNAL_SERVER_ERROR); } } } ``` 以上就是关于如何在Spring Boot基础上引入Spring AI特性从而达成Chat2DB效果的大致流程概述。当然,具体的实施细节还需要依据实际情况灵活变通。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值