Java在AI时代的崛起:从传统机器学习到AIGC的全栈解决方案

Java在AI时代的崛起:从传统机器学习到AIGC的全栈解决方案
个人名片

🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[[email protected]]
📱个人微信:15279484656
🌐个人导航网站www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?
  • 专栏导航:
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

Java在AI时代的崛起:从传统机器学习到AIGC的全栈解决方案

在人工智能浪潮席卷全球的今天,Python凭借其丰富的AI生态系统成为了机器学习和深度学习的首选语言。然而,作为企业级应用开发的王者,Java在AI领域的表现同样不容小觑。本文将深入探讨Java在AI生态中的定位、技术栈以及在AIGC时代的机遇与挑战。

一、Java AI生态概览:多样化的技术选择

Java在AI领域的技术栈可以用"百花齐放"来形容,从传统机器学习到现代深度学习,从自然语言处理到计算机视觉,Java都有相应的解决方案。

1.1 深度学习框架:接轨主流AI技术

Deep Java Library (DJL) - 统一的深度学习接口

DJL是Amazon开源的Java深度学习库,其最大的优势在于提供了统一的API来操作不同的深度学习后端。

// DJL示例:使用预训练模型进行图像分类importai.djl.Application;importai.djl.Model;importai.djl.inference.Predictor;importai.djl.modality.Classifications;importai.djl.modality.cv.Image;importai.djl.modality.cv.ImageFactory;importai.djl.repository.zoo.Criteria;importai.djl.repository.zoo.ModelZoo;importai.djl.repository.zoo.ZooModel;publicclassImageClassificationExample{publicstaticvoidmain(String[] args)throwsException{// 加载预训练的ResNet模型Criteria<Image,Classifications> criteria =Criteria.builder().optApplication(Application.CV.IMAGE_CLASSIFICATION).setTypes(Image.class,Classifications.class).optFilter("layer","50").optEngine("PyTorch").build();try(ZooModel<Image,Classifications> model =ModelZoo.loadModel(criteria)){try(Predictor<Image,Classifications> predictor = model.newPredictor()){Image image =ImageFactory.getInstance().fromUrl("https://example.com/cat.jpg");Classifications classifications = predictor.predict(image);System.out.println("预测结果:"); classifications.items().forEach(classification ->System.out.printf("%s: %.2f%%\n", classification.getClassName(), classification.getProbability()*100));}}}}
Deeplearning4j - 企业级深度学习解决方案

DL4J专为Java生态系统设计,特别适合需要与现有Java应用集成的场景。

// DL4J示例:构建简单的神经网络importorg.deeplearning4j.nn.conf.MultiLayerConfiguration;importorg.deeplearning4j.nn.conf.NeuralNetConfiguration;importorg.deeplearning4j.nn.conf.layers.DenseLayer;importorg.deeplearning4j.nn.conf.layers.OutputLayer;importorg.deeplearning4j.nn.multilayer.MultiLayerNetwork;importorg.deeplearning4j.nn.weights.WeightInit;importorg.nd4j.linalg.activations.Activation;importorg.nd4j.linalg.lossfunctions.LossFunctions;publicclassSimpleNeuralNetwork{publicstaticvoidmain(String[] args){// 构建神经网络配置MultiLayerConfiguration conf =newNeuralNetConfiguration.Builder().seed(123).weightInit(WeightInit.XAVIER).updater(neworg.nd4j.linalg.learning.config.Adam(0.001)).list().layer(0,newDenseLayer.Builder().nIn(784)// 输入层大小.nOut(128)// 隐藏层大小.activation(Activation.RELU).build()).layer(1,newOutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nIn(128).nOut(10)// 输出类别数.activation(Activation.SOFTMAX).build()).build();MultiLayerNetwork model =newMultiLayerNetwork(conf); model.init();System.out.println("神经网络构建完成,参数数量: "+ model.numParams());}}

1.2 传统机器学习框架:成熟稳定的选择

Weka - 学术界的宠儿

Weka提供了丰富的机器学习算法和可视化工具,既可以通过GUI操作,也可以编程调用。

// Weka示例:使用决策树进行分类importweka.classifiers.trees.J48;importweka.core.Instances;importweka.core.converters.ConverterUtils.DataSource;importweka.filters.Filter;importweka.filters.unsupervised.attribute.Remove;publicclassWekaClassificationExample{publicstaticvoidmain(String[] args)throwsException{// 加载数据集DataSource source =newDataSource("path/to/dataset.arff");Instances dataset = source.getDataSet();// 设置类别属性(最后一列)if(dataset.classIndex()==-1){ dataset.setClassIndex(dataset.numAttributes()-1);}// 创建决策树分类器J48 tree =newJ48(); tree.setUnpruned(true);// 不剪枝// 训练模型 tree.buildClassifier(dataset);// 输出决策树System.out.println("决策树模型:");System.out.println(tree);// 10折交叉验证weka.classifiers.Evaluation eval =newweka.classifiers.Evaluation(dataset); eval.crossValidateModel(tree, dataset,10,newjava.util.Random(1));System.out.println("交叉验证结果:");System.out.println("准确率: "+ eval.pctCorrect()+"%");System.out.println("召回率: "+ eval.weightedRecall());System.out.println("F1-Score: "+ eval.weightedFMeasure());}}
Smile - 现代化的机器学习库

Smile提供了高性能的机器学习算法实现,API设计简洁现代。

// Smile示例:随机森林分类importsmile.classification.RandomForest;importsmile.data.DataFrame;importsmile.data.formula.Formula;importsmile.io.Read;importsmile.validation.CrossValidation;publicclassSmileRandomForestExample{publicstaticvoidmain(String[] args)throwsException{// 读取数据DataFrame data =Read.csv("path/to/data.csv");// 定义公式(目标变量 ~ 特征变量)Formula formula =Formula.lhs("target");// 训练随机森林RandomForest model =RandomForest.fit(formula, data,100);// 100棵树// 交叉验证double[] accuracy =CrossValidation.classification(10, formula, data,(f, x)->RandomForest.fit(f, x,100));System.out.printf("随机森林交叉验证准确率: %.2f%% (+/- %.2f%%)\n",smile.math.MathEx.mean(accuracy)*100,smile.math.MathEx.sd(accuracy)*100);// 特征重要性double[] importance = model.importance();String[] features = data.names();System.out.println("特征重要性排序:");java.util.stream.IntStream.range(0, importance.length).boxed().sorted((i, j)->Double.compare(importance[j], importance[i])).limit(10).forEach(i ->System.out.printf("%s: %.4f\n", features[i], importance[i]));}}

1.3 自然语言处理框架:文本智能处理

Stanford CoreNLP - 功能全面的NLP工具包
// Stanford CoreNLP示例:文本分析管道importedu.stanford.nlp.pipeline.StanfordCoreNLP;importedu.stanford.nlp.pipeline.CoreDocument;importedu.stanford.nlp.ling.CoreAnnotations;importedu.stanford.nlp.sentiment.SentimentCoreAnnotations;importjava.util.Properties;publicclassCoreNLPExample{publicstaticvoidmain(String[] args){// 配置处理管道Properties props =newProperties(); props.setProperty("annotators","tokenize,ssplit,pos,lemma,ner,sentiment"); props.setProperty("coref.algorithm","neural");StanfordCoreNLP pipeline =newStanfordCoreNLP(props);// 待分析文本String text ="Java在人工智能领域展现出强大的潜力。"+"企业级应用中,Java的稳定性和可维护性是重要优势。";// 创建文档并进行注释CoreDocument document = pipeline.processToCoreDocument(text);// 输出分析结果System.out.println("=== 句子分析 ==="); document.sentences().forEach(sentence ->{System.out.println("句子: "+ sentence.text());System.out.println("情感: "+ sentence.sentiment());System.out.println("词汇分析:"); sentence.tokens().forEach(token ->{System.out.printf(" %s [词性: %s, 词元: %s]\n", token.word(), token.get(CoreAnnotations.PartOfSpeechAnnotation.class), token.lemma());});System.out.println("命名实体:"); sentence.entityMentions().forEach(entityMention ->{System.out.printf(" %s: %s\n", entityMention.text(), entityMention.entityType());});System.out.println();});}}

1.4 大数据AI框架:处理海量数据的利器

Apache Spark MLlib - 分布式机器学习
// Spark MLlib示例:大规模文本分类importorg.apache.spark.sql.SparkSession;importorg.apache.spark.sql.Dataset;importorg.apache.spark.sql.Row;importorg.apache.spark.ml.Pipeline;importorg.apache.spark.ml.PipelineStage;importorg.apache.spark.ml.classification.LogisticRegression;importorg.apache.spark.ml.feature.HashingTF;importorg.apache.spark.ml.feature.Tokenizer;importorg.apache.spark.ml.feature.StopWordsRemover;publicclassSparkMLTextClassification{publicstaticvoidmain(String[] args){SparkSession spark =SparkSession.builder().appName("TextClassification").master("local[*]").getOrCreate();// 创建示例数据Dataset<Row> training = spark.createDataFrame(Arrays.asList(newJavaBean("Java是一门优秀的编程语言",1.0),newJavaBean("Python在AI领域很流行",1.0),newJavaBean("这个产品质量很差",0.0),newJavaBean("服务态度需要改进",0.0)),JavaBean.class);// 构建机器学习管道Tokenizer tokenizer =newTokenizer().setInputCol("text").setOutputCol("words");StopWordsRemover remover =newStopWordsRemover().setInputCol("words").setOutputCol("filtered");HashingTF hashingTF =newHashingTF().setNumFeatures(1000).setInputCol("filtered").setOutputCol("features");LogisticRegression lr =newLogisticRegression().setMaxIter(10).setRegParam(0.001);Pipeline pipeline =newPipeline().setStages(newPipelineStage[]{tokenizer, remover, hashingTF, lr});// 训练模型org.apache.spark.ml.PipelineModel model = pipeline.fit(training);// 创建测试数据并预测Dataset<Row> test = spark.createDataFrame(Arrays.asList(newJavaBean("Java开发效率很高",0.0),newJavaBean("这个软件有严重问题",0.0)),JavaBean.class);Dataset<Row> predictions = model.transform(test); predictions.select("text","label","prediction","probability").show(false); spark.stop();}publicstaticclassJavaBean{privateString text;privateDouble label;publicJavaBean(String text,Double label){this.text = text;this.label = label;}// getters and setterspublicStringgetText(){return text;}publicvoidsetText(String text){this.text = text;}publicDoublegetLabel(){return label;}publicvoidsetLabel(Double label){this.label = label;}}}

二、Java在AIGC时代的机遇与挑战

随着ChatGPT、GPT-4等大语言模型的爆火,AIGC(AI Generated Content)成为了AI领域的新热点。Java在这一波浪潮中面临着机遇与挑战并存的局面。

2.1 Spring AI:Java拥抱AIGC的新起点

Spring AI是Spring生态系统在AI领域的重要布局,它为Java开发者提供了友好的AIGC应用开发框架。

// Spring AI示例:构建聊天机器人importorg.springframework.ai.chat.ChatClient;importorg.springframework.ai.chat.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.openai.OpenAiChatClient;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.*;@SpringBootApplication@RestControllerpublicclassSpringAiChatApplication{privatefinalChatClient chatClient;publicSpringAiChatApplication(ChatClient chatClient){this.chatClient = chatClient;}@PostMapping("/chat")publicChatResponsechat(@RequestBodyChatRequest request){Prompt prompt =newPrompt(request.getMessage());return chatClient.call(prompt);}@GetMapping("/generate")publicStringgenerate(@RequestParamString topic){String promptText =String.format("请为我写一篇关于'%s'的技术博客大纲,包含5个主要章节", topic);Prompt prompt =newPrompt(promptText);ChatResponse response = chatClient.call(prompt);return response.getResult().getOutput().getContent();}publicstaticvoidmain(String[] args){SpringApplication.run(SpringAiChatApplication.class, args);}staticclassChatRequest{privateString message;publicStringgetMessage(){return message;}publicvoidsetMessage(String message){this.message = message;}}}

配置文件示例:

# application.ymlspring:ai:openai:api-key: ${OPENAI_API_KEY}chat:options:model: gpt-3.5-turbo temperature:0.7max-tokens:1000server:port:8080logging:level:org.springframework.ai: DEBUG 

2.2 Java AIGC应用架构设计

基于Java技术栈构建AIGC应用的典型架构:

// AIGC服务抽象层设计publicinterfaceAigcService{/** * 文本生成 */GeneratedContentgenerateText(TextGenerationRequest request);/** * 图像生成 */GeneratedContentgenerateImage(ImageGenerationRequest request);/** * 代码生成 */GeneratedContentgenerateCode(CodeGenerationRequest request);/** * 流式文本生成 */Flux<String>generateTextStream(TextGenerationRequest request);}@Service@Slf4jpublicclassAigcServiceImplimplementsAigcService{privatefinalChatClient chatClient;privatefinalImageClient imageClient;privatefinalRedisTemplate<String,Object> redisTemplate;publicAigcServiceImpl(ChatClient chatClient,ImageClient imageClient,RedisTemplate<String,Object> redisTemplate){this.chatClient = chatClient;this.imageClient = imageClient;this.redisTemplate = redisTemplate;}@Override@Cacheable(value ="text-generation", key ="#request.hashCode()")publicGeneratedContentgenerateText(TextGenerationRequest request){ log.info("生成文本内容,prompt: {}", request.getPrompt());try{// 构建提示词Prompt prompt =buildPrompt(request);// 调用大语言模型ChatResponse response = chatClient.call(prompt);// 构建响应returnGeneratedContent.builder().content(response.getResult().getOutput().getContent()).type(ContentType.TEXT).model(request.getModel()).timestamp(System.currentTimeMillis()).usage(buildUsage(response)).build();}catch(Exception e){ log.error("文本生成失败", e);thrownewAigcException("文本生成失败: "+ e.getMessage());}}@OverridepublicFlux<String>generateTextStream(TextGenerationRequest request){returnFlux.create(sink ->{try{Prompt prompt =buildPrompt(request);// 流式调用 chatClient.stream(prompt).subscribe( response ->{String content = response.getResult().getOutput().getContent(); sink.next(content);}, error ->{ log.error("流式生成失败", error); sink.error(error);},()-> sink.complete());}catch(Exception e){ sink.error(e);}});}privatePromptbuildPrompt(TextGenerationRequest request){PromptTemplate template =newPromptTemplate(request.getTemplate());return template.create(request.getVariables());}privateUsagebuildUsage(ChatResponse response){returnUsage.builder().promptTokens(response.getMetadata().getUsage().getPromptTokens()).completionTokens(response.getMetadata().getUsage().getGenerationTokens()).totalTokens(response.getMetadata().getUsage().getTotalTokens()).build();}}

2.3 AIGC应用的微服务架构

// 网关层:统一入口和负载均衡@RestController@RequestMapping("/api/v1/aigc")@Slf4jpublicclassAigcGatewayController{privatefinalAigcOrchestrationService orchestrationService;privatefinalRateLimitService rateLimitService;@PostMapping("/generate")publicResponseEntity<GeneratedContent>generate(@RequestBodyGenerationRequest request,@RequestHeader("User-Id")String userId){// 限流检查if(!rateLimitService.isAllowed(userId)){returnResponseEntity.status(429).build();}// 路由到对应的服务GeneratedContent content = orchestrationService.generate(request);returnResponseEntity.ok(content);}@GetMapping("/generate/stream")publicResponseEntity<Flux<ServerSentEvent<String>>>generateStream(@RequestParamString prompt,@RequestHeader("User-Id")String userId){Flux<ServerSentEvent<String>> stream = orchestrationService .generateStream(prompt).map(content ->ServerSentEvent.<String>builder().data(content).build());returnResponseEntity.ok().header("Content-Type","text/event-stream").body(stream);}}// 编排服务:协调多个AI服务@ServicepublicclassAigcOrchestrationService{privatefinalMap<String,AigcService> aigcServices;privatefinalModelLoadBalancer loadBalancer;publicGeneratedContentgenerate(GenerationRequest request){// 根据请求类型选择合适的服务AigcService service =selectService(request.getType());// 选择最优模型String model = loadBalancer.selectBestModel(request); request.setModel(model);return service.generate(request);}privateAigcServiceselectService(ContentType type){returnswitch(type){case TEXT -> aigcServices.get("textService");case IMAGE -> aigcServices.get("imageService");case CODE -> aigcServices.get("codeService");default->thrownewUnsupportedOperationException("不支持的内容类型: "+ type);};}}

三、Java AI技术栈的优势与适用场景

3.1 企业级应用的天然优势

Java在AI领域的最大优势在于其在企业级应用中的成熟度和稳定性。对于需要将AI能力集成到现有业务系统中的企业来说,Java提供了无缝的集成体验。

高并发处理能力

// 异步处理大量AI请求@ServicepublicclassAsyncAigcService{@Async("aigcThreadPool")@CompletableFuture<GeneratedContent>publicCompletableFuture<GeneratedContent>generateAsync(GenerationRequest request){// 异步执行AI生成任务returnCompletableFuture.supplyAsync(()->{return aigcService.generate(request);});}publicList<GeneratedContent>batchGenerate(List<GenerationRequest> requests){List<CompletableFuture<GeneratedContent>> futures = requests.stream().map(this::generateAsync).collect(Collectors.toList());return futures.stream().map(CompletableFuture::join).collect(Collectors.toList());}}

完善的监控和运维体系

// AI服务监控@ComponentpublicclassAigcMetrics{privatefinalMeterRegistry meterRegistry;privatefinalCounter requestCounter;privatefinalTimer responseTimer;publicAigcMetrics(MeterRegistry meterRegistry){this.meterRegistry = meterRegistry;this.requestCounter =Counter.builder("aigc.requests").description("AIGC请求总数").register(meterRegistry);this.responseTimer =Timer.builder("aigc.response.time").description("AIGC响应时间").register(meterRegistry);}publicvoidrecordRequest(String model,String status){ requestCounter.increment(Tags.of("model", model,"status", status));}publicTimer.SamplestartTimer(){returnTimer.start(meterRegistry);}}

3.2 适用场景分析

最适合Java的AI场景:

  1. 企业级AI平台构建 - 需要高可用、高并发的AI服务平台
  2. 现有系统AI改造 - 为现有Java系统添加AI能力
  3. AI服务化部署 - 将AI模型包装为微服务
  4. 复杂业务逻辑AI应用 - 需要复杂业务规则的AI系统

不太适合的场景:

  1. 算法研究和原型开发 - Python更适合快速实验
  2. 纯深度学习模型训练 - GPU加速和数值计算优化不如Python
  3. 计算机视觉核心算法 - OpenCV-Python生态更完整

四、未来展望:Java AI生态的发展方向

4.1 技术发展趋势

  1. 更深度的云原生集成 - 与Kubernetes、Istio等云原生技术深度结合
  2. 边缘AI部署 - GraalVM Native Image支持边缘设备部署
  3. 企业级AI中台 - 构建统一的企业AI能力平台
  4. 多模态AI应用 - 文本、图像、语音的统一处理框架

4.2 生态完善路径

Java AI生态的完善需要在以下几个方面持续努力:

  1. 降低使用门槛 - 提供更多开箱即用的解决方案
  2. 性能优化 - 在数值计算和GPU加速方面追赶Python
  3. 社区建设 - 培养更多Java AI开发者和贡献者
  4. 标准化 - 建立Java AI框架的标准规范

结语

Java在AI时代并非被边缘化,而是在寻找自己的独特定位。虽然在算法研究和模型训练方面Python依然占据主导地位,但在企业级AI应用、AI服务化部署、以及将AI能力集成到现有业务系统方面,Java展现出了独特的优势。

随着AIGC技术的普及和企业数字化转型的深入,Java在AI领域的价值将进一步凸显。对于Java开发者来说,现在正是学习和掌握AI技术的最佳时机。通过合理利用Java的生态优势,结合现代AI技术,我们完全可以构建出高质量、高性能的AI应用系统。

未来的AI应用不仅需要强大的算法能力,更需要稳定可靠的工程实现。而这正是Java的强项所在。让我们拥抱AI时代,用Java构建更智能的未来!

Read more

OpenREALM:无人机实时映射框架的技术深度解析

OpenREALM:无人机实时映射框架的技术深度解析

在无人机应用日益广泛的当下,精准、高效的实时映射技术成为推动行业发展的关键。传统无人机映射方案往往存在数据处理滞后、对复杂地形适应性差等问题,难以满足精准农业、应急救援等场景的实时决策需求。OpenREALM 作为一款开源的无人机实时映射框架,创新性地融合了视觉 SLAM、单目稠密重建等前沿技术,实现了从 2D 图像拼接至 3D 表面重建的多模式映射功能。 原文链接:https://arxiv.org/pdf/2009.10492 代码链接:https://github.com/laxnpander/OpenREALM 沐小含持续分享前沿算法论文,欢迎关注... 一、引言:无人机映射技术的现状与挑战 1.1 应用背景与核心需求 人类对世界的勘测需求推动了映射技术的持续发展,而无人机的兴起为空中勘测提供了全新的解决方案。空中影像已广泛应用于精准农业、城市规划、灾害风险管理等关键领域,这些应用场景不仅对数据分辨率有较高要求,更在可用性、成本和映射效率方面提出了严苛标准。传统的有人机勘测存在操作复杂、成本高昂等局限,而无人机凭借轻量化设计、自主飞行能力强等优势,

开源浪潮下的中国力量:文心一言大模型本地部署与应用全攻略

开源浪潮下的中国力量:文心一言大模型本地部署与应用全攻略

文章目录 * 一、前言 * 1.1 模型开源意义与背景 * 1.2 文心一言大模型简介 * 1.3 测评目标与思路 * 二、文心一言大模型 * 2.1 文心一言开源概况 * 2.2 文心一言大模型技术综述 * 三、文心一言大模型深度解析 * 3.1 开源策略与生态影响 * 3.1.1 开源时间与版本介绍 * 3.2 模型特性与优势 * 四、部署实战:从 GitCode下载ERNIE-4.5-0.3B 模型到本地可交互服务 * 4.1 环境准备与部署方式 * 4.2 下载与安装步骤 * 4.3 调用示例与接口说明 * 编写部署测试脚本 * 五、

AI辅助编程的边界探索:当Copilot学会写测试

AI辅助编程的边界探索:当Copilot学会写测试

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕人工智能这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * AI辅助编程的边界探索:当Copilot学会写测试 🚀 * 1. 从“写代码”到“验代码”:AI的新战场 ⚔️ * 场景设定:一个简单的支付网关模拟器 💳 * 2. 初级实验:AI能写出“Happy Path”吗? ✅ * 3. 进阶实验:Mocking 与 外部依赖 🎭 * 4. 陷阱与幻觉:AI写测试时犯的那些错 🤪 * 案例 A:永远不会错的测试 * 案例 B:永远跑不通的断言 * 案例 C:复杂集成测试的无力 * 5. 人机协作:重新定义测试工作流 🤝 * 实践技巧:如何高效地让AI写测试?

AI绘画报错

提示输出验证失败:CheckpointLoaderSimple: - 值不在列表中:ckpt_name: 'v1-5-pruned-emaonly-fp16.safetensors' 不在 ['anything-v5-PrtRE.safetensors'] 中 模型文件夹里面没模型 这是官方链接:v1-5-pruned-emaonly.safetensors https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main 点击同一行的小下载箭头。然后把文件放在:models/checkpoints文件夹里 你还需要标准的VAE文件,也就是:vae-ft-mse-840000-ema-pruned.safetensors https://huggingface.co/stabilityai/sd-vae-ft-mse-original/tree/main 这个文件放在:models/vae文件夹里 现在你已经拥有运行所需的一切了。慢慢来。你最初生成的图片会很糟糕。但是继续尝试,很快你就能得到很棒的结果。