起个项目的名字
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"
在对话工具模块,创建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能力整合