AIGC-Flow项目(二)搭建项目:使用SpringBoot进行开发,设计项目基础模块

462 阅读3分钟

起个项目的名字

AIGC-FLOW是项目的建设目标,也算作是项目的一个名称,但是我想给项目起一个更有意思的名字:kluge(克鲁机)

《怪诞脑科学》:如果大脑只是一堆不兼容的系统拼凑而成……
Kluge(克鲁机),原意为由不配套的原件拼凑而成的计算机。**1962年,计算机领域的先锋人物杰克逊·葛兰荷姆在文章《如何设计克鲁机》(How to Design a Kluge)中半开玩笑地将克鲁机定义为“一整套由互不搭配的各种零件拼装起来并且表现糟糕的非兼容系统”** ,他进一步指出:“……外行人员会不假思索地欣然接受,并想当然地认为‘计算机本来就是这样’。”

这个工具有点类似,现在没有明确的解决问题的目标,只是想通过工作流的方式调用各类AI应用,并且可以调用的AI应用也仅仅是目前开放应用中的一部分,后期会不断的拼凑扩充项目。

目前预计接入的AI工具有:

语言类:ChatGPT、NewBing、讯飞星火
图像类:Midjourney、Stable-Diffusion
视频类:D-ID

非AI类工具暂时没想好,基础文件处理工具、模板工具,其他工具还待发掘。

搭建项目

创建一个SpringBoot项目

使用start.spring.io/ 构建SpringBoot项目,本次项目使用JDK17、SpringBoot 3.0.6。

<?xml version="1.0" encoding="UTF-8"?>  
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
    <parent>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-parent</artifactId>  
        <version>3.0.6</version>  
        <relativePath/> <!-- lookup parent from repository -->  
    </parent>  
    <groupId>com.lgf.kulge</groupId>  
    <artifactId>kluge-projects</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
    <name>px-yy-kluge-projects</name>  
    <description>克鲁机</description>  
    <properties>  
        <java.version>17</java.version>  
        <jda.version>5.0.0-beta.9</jda.version>  
        <dataurl.version>2.0.0</dataurl.version>  
    </properties>  
    <dependencies>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter</artifactId>  
        </dependency>  

        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-test</artifactId>  
            <scope>test</scope>  
        </dependency>  
     
        <dependency>  
            <groupId>org.projectlombok</groupId>  
            <artifactId>lombok</artifactId>  
        </dependency>  
        <dependency>  
            <groupId>cn.hutool</groupId>  
            <artifactId>hutool-all</artifactId>  
            <version>5.8.16</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.poi</groupId>  
            <artifactId>poi-ooxml</artifactId>  
            <version>4.1.2</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
        </dependency>  
    <!-- swagger -->  
        <dependency>  
            <groupId>org.springdoc</groupId>  
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>  
            <version>2.0.2</version>  
        </dependency>  

        <dependency>  
            <groupId>org.springdoc</groupId>  
            <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>  
            <version>2.0.2</version>  
        </dependency>  

        <dependency>  
            <groupId>net.dv8tion</groupId>  
            <artifactId>JDA</artifactId>  
            <version>${jda.version}</version>  
            <exclusions>  
                <exclusion>  
                    <groupId>club.minnced</groupId>  
                    <artifactId>opus-java</artifactId>  
                </exclusion>  
            </exclusions>  
        </dependency>  

        <dependency>  
            <groupId>eu.maxschuster</groupId>  
            <artifactId>dataurl</artifactId>  
            <version>${dataurl.version}</version>  
        </dependency>  
    <!--redis相关的依赖-->  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-data-redis</artifactId>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.commons</groupId>  
            <artifactId>commons-pool2</artifactId>  
        </dependency>  
        <dependency>  
            <groupId>com.alibaba</groupId>  
            <artifactId>fastjson</artifactId>  
            <version>1.2.54</version>  
        </dependency>  
    </dependencies>  

    <build>  
        <plugins>  
            <plugin>  
                <groupId>org.springframework.boot</groupId>  
                <artifactId>spring-boot-maven-plugin</artifactId>  
            </plugin>  
        </plugins>  
    </build>  
  
</project>

设置网络代理

OpenAI、Midjourney访问都需要使用魔法。

所以需要通过代理或者国外服务器部署服务。我将代理信息放到配置中。

kluge:
    proxy:  
        url: 192.168.....  
        port: 7890

package com.lgf.kluge.config.proxy;  
  
import lombok.Data;  
import org.springframework.boot.context.properties.ConfigurationProperties;  
import org.springframework.stereotype.Component;  
  
/**  
* 网络代理  
*/  
  
@Data  
@Component  
@ConfigurationProperties(prefix = "kluge.proxy")  
public class NetProxyProperties {  
    /**  
    * 代理地址  
    */  
    private String url;  
    /**  
    * 代理端口  
    */  
    private Integer port;  
}

引入ChatGPT

Maven引入OpenAI的SDK,GitHub有人封装好了SDK,直接拿来用。

       <dependency>  
            <groupId>com.unfbx</groupId>  
            <artifactId>chatgpt-java</artifactId>  
            <version>1.0.13</version>  
        </dependency>  

将OpenAI的token、model等信息放到application.yml中

openai:  
  model: "gpt-3.5-turbo"  
  tokens: "sk-1234561231321122131"  

image.png

在对话工具模块,创建ChatGPT相关的配置信息。

package com.lgf.kluge.modulars.aiTooles.chat.openai.config;  
  
import lombok.Data;  
import org.springframework.boot.context.properties.ConfigurationProperties;  
import org.springframework.stereotype.Component;  
  
import java.util.List;  
import java.util.Map;  
  
@Data  
@Component  
@ConfigurationProperties(prefix = "openai")  
//@EnableConfigurationProperties  
public class OpenAIProperties {  
    private String proxyUrl;  
    private Integer proxyPort;  
    private String model;  
    private List<String> tokens;  
    private Map<String,String> prompt;  
  
}

package com.lgf.kluge.modulars.aiTooles.chat.openai.config;  
  
import com.lgf.kluge.config.proxy.NetProxyProperties;  
import com.unfbx.chatgpt.OpenAiClient;  
import com.unfbx.chatgpt.interceptor.OpenAILogger;  
import okhttp3.OkHttpClient;  
import okhttp3.logging.HttpLoggingInterceptor;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
import java.net.InetSocketAddress;  
import java.net.Proxy;  
import java.util.concurrent.TimeUnit;  
  
@Configuration  
public class OpenAIConfig {  
@Autowired  
private NetProxyProperties netProxyProperties;  
  
@Autowired  
private OpenAIProperties openAIProperties;  
  
  
  
  
// private String modu  

    /**  
    * OpenAI服务  
    * @return  
    */  
    @Bean  
    public OpenAiClient getOpenAiClient(){  
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(this.netProxyProperties.getUrl(), this.netProxyProperties.getPort()));  
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());  

        OkHttpClient okHttpClient = new OkHttpClient  
        .Builder()  
        .proxy(proxy)//自定义代理  
        .addInterceptor(httpLoggingInterceptor)//自定义日志  
        .connectTimeout(120, TimeUnit.SECONDS)//自定义超时时间  
        .writeTimeout(120, TimeUnit.SECONDS)//自定义超时时间  
        .readTimeout(120, TimeUnit.SECONDS)//自定义超时时间  
        .build();  
        OpenAiClient client=OpenAiClient.builder()  
        .apiKey(openAIProperties.getTokens())  
        .keyStrategy(new FirstKeyStrategy())  
        // .apiHost(this.apiHost)  
        .okHttpClient(okHttpClient)  
        .build();  

        return client;  
    }  
}
package com.px.kluge.modulars.aiTooles.chat.openai.config;  
  
import com.unfbx.chatgpt.function.KeyStrategyFunction;  
  
import java.util.List;  
  
/**  
* 自定义的key使用策略,总是使用第一个  
*/  
public class FirstKeyStrategy implements KeyStrategyFunction<List<String>, String> {  

    /**  
    * 暂时只使用第一个,以后再写调用队列,通过多个账号token来跳过访问频率限制  
    * @param keys  
    * @return  
    */  
    @Override  
    public String apply(List<String> keys) {  
        return keys.get(0);  
    }  
}

明天计划

  • 搭建完成工作流模块
  • 初步实现工作流自动化执行
  • 时间允许的话实现调用ChatGPT来进行工作流转,写一篇推文
  • 初步可以运行了再提交代码到GitHub

这个东西有用么?先自我怀疑一下

上一篇:AIGC-Flow项目(一)为什么要写这个工具:以工作流的方式实现GPT、Midjourney、Stable-Diffusion等AI能力整合