news 2026/8/30 0:25:46

nlp_structbert_sentence-similarity_chinese-large 模型服务化:使用FastAPI构建RESTful API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nlp_structbert_sentence-similarity_chinese-large 模型服务化:使用FastAPI构建RESTful API

nlp_structbert_sentence-similarity_chinese-large 模型服务化:使用FastAPI构建RESTful API

你是不是也遇到过这样的场景?手里有一个训练好的中文文本相似度模型,比如nlp_structbert_sentence-similarity_chinese-large,效果很不错,但每次想用都得打开Jupyter Notebook,加载模型,写一堆预处理代码。自己用还行,可怎么让其他同事、其他系统也能方便地调用呢?

这时候,把模型“服务化”就成了关键一步。简单说,就是给你的模型造一个“服务窗口”,别人只要发个标准的HTTP请求,就能拿到预测结果,就像访问一个网站一样简单。今天,我们就来聊聊怎么用FastAPI这个又快又现代的Python框架,给这个强大的中文句子相似度模型,搭建一个既专业又好用的RESTful API服务。

整个过程,我们会从最基础的接口设计开始,一路讲到生产级部署的考量,比如异步处理、限流、API文档,最后用Docker打包,让你得到一个随时可以上线运行的服务。即使你之前没怎么接触过Web开发,跟着走一遍,也能轻松搞定。

1. 为什么选择FastAPI来服务化你的模型?

在开始动手之前,你可能会问,Python的Web框架那么多,Flask、Django都很流行,为什么偏偏是FastAPI?这得从我们模型服务化的几个核心需求说起。

首先,性能要够快。模型推理本身可能就挺耗时的,如果Web框架再慢吞吞,整体响应时间就没法看了。FastAPI底层基于Starlette(用于Web处理)和Pydantic(用于数据验证),并且天生支持异步编程(async/await)。这意味着当你的API在等待模型完成计算时,它可以去处理其他请求,极大地提高了并发处理能力,特别适合这种I/O(主要是模型推理计算)密集型的任务。

其次,开发要简单直观。没人愿意在繁琐的配置和样板代码上浪费时间。FastAPI的语法非常现代和简洁,通过Python类型提示(Type Hints)来声明请求和响应的数据结构,框架会自动帮你处理数据验证、序列化和生成API文档。你只需要关注核心的业务逻辑——也就是如何调用你的模型。

再者,自动生成交互式API文档。FastAPI会自动基于你的代码生成OpenAPI规范文档,并提供Swagger UI和ReDoc两种风格的交互式文档界面。这意味着你的API使用者(可能是前端工程师、其他服务,或者你自己)可以立刻在浏览器里看到所有接口、尝试发送请求,而不用你额外写一大堆说明文档。

最后,“生产就绪”特性。它内置了对标准协议(如OAuth2、JWT)的支持,很容易添加认证、限流等中间件,并且和Docker、Kubernetes等部署工具链配合得很好。对于我们这个模型API来说,从开发到上线,FastAPI提供了一条很顺畅的路径。

所以,综合来看,FastAPI在性能、开发体验和功能性上取得了很好的平衡,是构建现代模型API服务的一个绝佳选择。接下来,我们就一步步把它用起来。

2. 搭建你的开发环境

工欲善其事,必先利其器。我们先来把需要的工具和库准备好。确保你已经安装了Python(建议3.8及以上版本)。

首先,创建一个新的项目目录,并进入该目录:

mkdir structbert_similarity_api cd structbert_similarity_api

然后,我们创建一个虚拟环境来隔离项目依赖。这是Python开发的一个好习惯,可以避免不同项目间的包版本冲突。

python -m venv venv

激活虚拟环境:

  • 在Windows上:venv\Scripts\activate
  • 在macOS/Linux上:source venv/bin/activate

激活后,你的命令行提示符前通常会显示(venv),表示已经在这个虚拟环境里了。

接下来,安装核心依赖。我们将主要用到以下几个库:

  • fastapi: 我们的主角,Web框架。
  • uvicorn: 一个轻量级、超快的ASGI服务器,用于运行FastAPI应用。
  • transformers: Hugging Face的库,用于加载和运行我们的structbert模型。
  • torch: PyTorch,因为structbert模型基于它。
  • pydantic: 用于数据验证和设置管理(FastAPI已依赖它,但显式安装可以确保版本)。
  • python-multipart: 用于处理可能的文件上传(虽然本文用不到,但FastAPI推荐安装)。

你可以通过以下命令一次性安装:

pip install fastapi uvicorn transformers torch pydantic python-multipart

如果你的网络环境下载PyTorch较慢,可以参照PyTorch官网的指令,使用镜像源安装。

环境准备好后,我们就可以开始构思和设计API了。

3. 设计你的模型API接口

设计API,其实就是定义客户端(调用方)和服务端(你的模型)之间的“通信协议”。一个好的设计应该直观、一致且健壮。对于句子相似度模型,核心功能很明确:输入两个句子,输出一个相似度分数。

3.1 定义请求与响应格式

我们使用Pydantic模型来严格定义数据格式。在项目根目录创建一个名为main.py的文件,我们从这里开始写代码。

首先,导入必要的模块,并定义我们的数据模型:

from fastapi import FastAPI, HTTPException from pydantic import BaseModel, Field from typing import List, Optional import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification import numpy as np import asyncio import time # 定义请求体模型:客户端需要发送什么数据 class SimilarityRequest(BaseModel): text1: str = Field(..., min_length=1, description="第一个中文句子") text2: str = Field(..., min_length=1, description="第二个中文句子") # 可以添加更多可选参数,例如是否返回详细特征等 # return_details: Optional[bool] = False # 定义响应体模型:服务端会返回什么数据 class SimilarityResponse(BaseModel): similarity_score: float = Field(..., ge=0.0, le=1.0, description="句子相似度得分,范围[0,1]") model_name: str = Field(default="nlp_structbert_sentence-similarity_chinese-large", description="使用的模型名称") inference_time_ms: Optional[float] = Field(None, description="模型推理耗时,单位毫秒")

代码解释

  • SimilarityRequest: 定义了客户端POST请求必须携带的JSON数据。它有两个必填字段text1text2,都是字符串类型,并且我们通过Field(..., min_length=1)确保它们不是空字符串。...表示该字段是必需的。注释里展示了如何添加可选字段。
  • SimilarityResponse: 定义了服务端返回的JSON数据格式。包含核心的相似度分数similarity_score,我们通过ge=0.0, le=1.0约束其值在0到1之间。同时返回模型名称和可选的推理耗时,方便调试和监控。
  • 使用Pydantic的好处是,FastAPI会自动利用这些定义来验证传入的数据。如果客户端发送的text1是数字,或者缺失了某个必填字段,FastAPI会直接返回一个清晰的422错误响应,而不会让错误数据进入我们的业务逻辑。

3.2 初始化FastAPI应用与模型

main.py中继续添加代码,初始化FastAPI应用,并加载我们的核心模型。

# 初始化FastAPI应用实例 app = FastAPI( title="中文句子相似度计算API", description="基于nlp_structbert_sentence-similarity_chinese-large模型,提供句子相似度计算服务。", version="1.0.0" ) # 全局变量,用于在应用启动时加载模型和分词器 MODEL_NAME = "IDEA-CCNL/Erlangshen-Roberta-330M-Similarity" # 示例模型,实际请替换为你的模型路径 tokenizer = None model = None device = torch.device("cuda" if torch.cuda.is_available() else "cpu") @app.on_event("startup") async def load_model(): """ 在应用启动时自动加载模型和分词器。 使用async函数避免阻塞事件循环。 """ global tokenizer, model print(f"正在加载模型 {MODEL_NAME} 到设备: {device}...") try: # 加载分词器 tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) # 加载模型 model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME) model.to(device) model.eval() # 设置为评估模式 print("模型加载完毕!") except Exception as e: print(f"模型加载失败: {e}") # 在生产环境中,这里可能需要更严格的错误处理,比如让应用启动失败 raise e

代码解释

  • 创建app实例时,我们传入了标题、描述和版本,这些信息会自动展示在生成的API文档里。
  • 我们定义了全局变量tokenizermodel,并在@app.on_event("startup")装饰的函数中加载它们。这个函数会在FastAPI应用启动时自动执行一次,确保服务启动后模型就准备好了,而不是在每次请求时都加载,这能极大提升响应速度。
  • device自动检测是否有可用的GPU(CUDA),有则用GPU,没有则用CPU。GPU能显著加速Transformer模型的推理。
  • 重要提示:代码中的MODEL_NAME是一个示例。你需要将其替换为nlp_structbert_sentence-similarity_chinese-large模型在Hugging Face Hub上的准确标识符,或者本地模型文件的路径。如果模型在本地,例如./my_local_model,就写这个路径。

4. 实现核心的相似度计算端点

现在,我们来创建最重要的部分——处理请求并返回相似度得分的API端点(Endpoint)。

main.py中继续添加:

def calculate_similarity(text1: str, text2: str) -> float: """ 核心函数:计算两个句子的相似度。 注意:这是一个同步的、计算密集型的函数。 """ if tokenizer is None or model is None: raise RuntimeError("模型未正确加载,请检查服务状态。") # 1. 文本编码 inputs = tokenizer(text1, text2, return_tensors="pt", truncation=True, padding=True, max_length=512) inputs = {k: v.to(device) for k, v in inputs.items()} # 将数据移动到GPU/CPU # 2. 模型推理(不计算梯度) with torch.no_grad(): outputs = model(**inputs) # 3. 后处理,获取相似度分数 # 假设模型输出logits,我们通过softmax获取概率,并取正类(相似)的概率 # 具体处理方式需要根据你实际模型的输出格式调整 logits = outputs.logits probabilities = torch.softmax(logits, dim=-1) # 这里假设索引1代表“相似”的分数,请根据你的模型确认 similarity_score = probabilities[:, 1].item() # 取batch中第一个样本的“相似”概率 # 另一种常见情况:模型直接输出相似度分数(如cosine similarity),则可能是: # similarity_score = torch.sigmoid(logits).item() # 请务必查阅你所使用模型的文档或源码! return similarity_score @app.post("/v1/similarity", response_model=SimilarityResponse) async def get_similarity(request: SimilarityRequest): """ 计算两个句子的相似度。 - **text1**: 第一个句子 - **text2**: 第二个句子 """ start_time = time.time() try: # 将计算密集型任务放到线程池中执行,避免阻塞异步事件循环 loop = asyncio.get_event_loop() # run_in_executor 将同步函数 `calculate_similarity` 放到后台线程中运行 score = await loop.run_in_executor(None, calculate_similarity, request.text1, request.text2) inference_time_ms = (time.time() - start_time) * 1000 return SimilarityResponse( similarity_score=round(score, 4), # 保留4位小数 inference_time_ms=round(inference_time_ms, 2) ) except RuntimeError as e: raise HTTPException(status_code=503, detail=f"服务暂时不可用: {str(e)}") except Exception as e: # 记录详细的错误日志,但返回给客户端的消息可以更通用 print(f"处理请求时发生错误: {e}") raise HTTPException(status_code=500, detail="内部服务器错误,处理请求失败。")

代码解释

  1. 核心计算函数 (calculate_similarity):

    • 这是一个普通的同步Python函数。它接收两个字符串,使用加载好的分词器进行编码(tokenizer),生成模型需要的张量(tensors)。
    • truncation=Truemax_length=512确保过长的句子会被截断,以适配模型的最大输入长度。
    • with torch.no_grad():上下文管理器告诉PyTorch不要跟踪计算图,节省内存并加速推理。
    • 最关键的一步:如何从模型输出outputs中得到相似度分数?这取决于模型的具体设计。示例代码展示了两种常见情况:一种是分类模型(输出logits,通过softmax得到概率),另一种是回归模型(直接输出相似度分数)。你必须根据nlp_structbert_sentence-similarity_chinese-large模型的实际情况进行调整!查看模型的文档、源码或示例,确认其输出格式。
  2. 异步API端点 (/v1/similarity):

    • 使用@app.post装饰器定义了一个POST请求的端点,路径是/v1/similarity。使用版本号(如v1)是个好习惯,便于未来升级。
    • response_model=SimilarityResponse告诉FastAPI,这个接口的返回值要符合我们之前定义的SimilarityResponse模型,框架会自动帮我们做数据验证和转换。
    • 函数定义为async def。虽然模型推理本身是同步的CPU/GPU密集型操作,但我们使用asyncio.get_event_loop().run_in_executor(None, ...)将这个同步函数放到一个单独的线程池中执行。这样,当模型在计算时,FastAPI的事件循环不会被阻塞,可以继续处理其他 incoming 的请求(比如新的HTTP连接),从而显著提升服务的并发能力。
    • 我们记录了推理时间,并包含在响应中,方便性能分析。
    • 使用HTTPException来抛出明确的错误,比如模型未加载(503服务不可用)或其他内部错误(500)。

5. 为你的API添加更多实用功能

一个基础的API已经完成了。但要让它在生产环境中更可靠、更易用,我们还需要添加一些“配件”。

5.1 健康检查端点

运维或监控系统需要知道你的服务是否健康。添加一个简单的健康检查端点:

@app.get("/health") async def health_check(): """ 健康检查端点。 用于监控服务是否正常运行。 """ # 可以添加更复杂的健康检查逻辑,例如检查模型是否加载、数据库连接等 if tokenizer and model: return {"status": "healthy", "model_loaded": True} else: raise HTTPException(status_code=503, detail="Model not loaded")

5.2 请求限流(Rate Limiting)

为了防止某个客户端过度使用API导致服务崩溃,或者进行基本的访问控制,我们需要限流。FastAPI本身不内置限流,但我们可以用中间件轻松实现。这里使用slowapiredis(作为存储后端)来实现一个简单的示例。

首先安装额外依赖:

pip install slowapi redis

然后在main.py中添加限流逻辑:

from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded from fastapi import Request # 初始化限流器,使用客户端的IP地址作为标识 limiter = Limiter(key_func=get_remote_address) app.state.limiter = limiter # 添加限流异常处理器 app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # 将限流装饰器应用到我们的核心端点上 @app.post("/v1/similarity", response_model=SimilarityResponse) @limiter.limit("5/minute") # 限制每个IP每分钟最多5次请求 async def get_similarity(request: SimilarityRequest, request: Request): # 注意这里注入了Request对象 # ... 函数内部实现与之前相同,略 ... pass

注意slowapi的限流装饰器需要将Request对象作为参数注入函数。同时,你需要一个Redis服务在运行。对于更简单的场景,也可以使用内存存储(slowapiMemoryLimiter),但重启服务后状态会丢失。

5.3 API密钥认证(简单示例)

对于内部或需要授权的API,认证是必须的。这里展示一个简单的API Key认证方式。

main.py中添加:

from fastapi import Depends, HTTPException, status from fastapi.security import APIKeyHeader API_KEY_NAME = "X-API-Key" api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False) # 这里假设有一个合法的API Key列表,实际应从安全的环境变量或数据库读取 VALID_API_KEYS = {"your-secret-api-key-123", "another-test-key"} async def verify_api_key(api_key: str = Depends(api_key_header)): if api_key not in VALID_API_KEYS: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="无效或缺失的API Key" ) return api_key # 在需要认证的端点上添加依赖 @app.post("/v1/similarity", response_model=SimilarityResponse) @limiter.limit("5/minute") async def get_similarity( request: SimilarityRequest, request: Request, api_key: str = Depends(verify_api_key) # 添加认证依赖 ): # ... 函数内部实现 ... pass

现在,客户端在调用/v1/similarity时,必须在HTTP请求头中携带X-API-Key: your-secret-api-key-123,否则会收到403错误。

6. 运行、测试与查看文档

代码写完了,让我们来试试看它能不能工作。

6.1 启动开发服务器

在项目根目录下,运行:

uvicorn main:app --reload --host 0.0.0.0 --port 8000
  • main:appmain是文件名(不含.py),app是我们在代码中创建的FastAPI实例。
  • --reload:开启热重载,代码修改后服务器会自动重启,非常适合开发。
  • --host 0.0.0.0:让服务监听所有网络接口,这样同一局域网内的其他设备也能访问。
  • --port 8000:指定端口为8000。

看到输出中包含"Application startup complete."和模型加载成功的提示,就说明服务启动成功了。

6.2 使用自动生成的交互式文档

FastAPI最酷的功能之一来了。打开你的浏览器,访问:

  • Swagger UI 文档:http://127.0.0.1:8000/docs
  • ReDoc 文档:http://127.0.0.1:8000/redoc

你会看到一个非常专业的交互式API文档页面(Swagger UI)。里面列出了我们定义的所有端点(/health,/v1/similarity)。你可以直接点击POST /v1/similarity旁边的 “Try it out” 按钮,在页面上输入两个句子,然后点击 “Execute” 发送请求。结果会直接显示在页面上。这比用curl或者 Postman 手动测试方便太多了!

6.3 使用Python客户端测试

当然,我们也可以写一个简单的Python脚本来测试。创建一个test_client.py文件:

import requests import json API_URL = "http://127.0.0.1:8000/v1/similarity" API_KEY = "your-secret-api-key-123" # 如果启用了认证 headers = { "Content-Type": "application/json", "X-API-Key": API_KEY # 如果启用了认证 } data = { "text1": "今天天气真好", "text2": "今天的天气非常不错" } response = requests.post(API_URL, headers=headers, json=data) if response.status_code == 200: result = response.json() print(f"请求成功!") print(f"句子1: {data['text1']}") print(f"句子2: {data['text2']}") print(f"相似度得分: {result['similarity_score']}") print(f"推理耗时: {result.get('inference_time_ms', 'N/A')} ms") else: print(f"请求失败,状态码: {response.status_code}") print(f"错误信息: {response.text}")

运行这个脚本,看看是否能得到正确的相似度分数。

7. 使用Docker容器化部署

开发测试没问题了,接下来我们要考虑如何把它部署到服务器上。Docker容器化是当前最主流的方式,它能确保应用在任何环境下的运行一致性。

在项目根目录创建一个Dockerfile文件:

# 使用官方Python轻量级镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖列表文件 COPY requirements.txt . # 安装系统依赖(如果需要)和Python包 # 例如,如果模型需要某些系统库,在这里安装 # RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ && rm -rf /var/lib/apt/lists/* RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口(与uvicorn运行的端口一致) EXPOSE 8000 # 启动命令 # 使用 --host 0.0.0.0 让容器外可访问 # 生产环境建议去掉 --reload CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

然后,创建一个requirements.txt文件,列出所有依赖:

fastapi==0.104.1 uvicorn[standard]==0.24.0 transformers==4.35.2 torch==2.1.0 pydantic==2.5.0 python-multipart==0.0.6 slowapi==0.1.8 redis==5.0.1 # 根据你的PyTorch版本和CUDA需求,可能需要指定不同的torch版本 # 例如对于CUDA 11.8: torch==2.1.0+cu118 --extra-index-url https://download.pytorch.org/whl/cu118

现在,可以构建Docker镜像了:

docker build -t structbert-similarity-api .

构建完成后,运行容器:

docker run -d --name similarity-api -p 8000:8000 structbert-similarity-api
  • -d: 后台运行。
  • --name: 给容器起个名字。
  • -p 8000:8000: 将宿主机的8000端口映射到容器的8000端口。

现在,你就可以通过宿主机的http://localhost:8000/docs访问容器内运行的服务了。无论是在本地测试服务器,还是在云服务器上,只要安装了Docker,部署过程都是一样的,非常简单可靠。

8. 总结与后续优化建议

走完这一趟,我们已经成功地将一个本地的nlp_structbert_sentence-similarity_chinese-large模型,封装成了一个具备完整功能的、生产可用的RESTful API服务。我们不仅实现了核心的相似度计算,还考虑了性能(异步处理)、安全性(API Key认证)、可用性(健康检查、限流)和可维护性(自动文档、容器化)。

用下来感觉,FastAPI确实让这类任务的开发变得很顺畅,特别是自动生成文档和基于类型提示的数据验证,节省了大量时间。Docker化部署也让环境问题变得简单。

当然,这只是一个起点。如果你打算将这个API用于真实的业务场景,还可以考虑以下几个优化方向:

  • 性能优化:如果请求量很大,可以考虑使用模型推理服务器(如TorchServe、Triton Inference Server)来替代直接在Web服务中加载模型,它们提供了更专业的批处理、模型版本管理等功能。
  • 监控与日志:集成像Prometheus和Grafana这样的监控工具,收集API的请求量、响应时间、错误率等指标。使用结构化的日志库(如structlog)记录详细的请求和错误信息。
  • 配置管理:将API Key、模型路径、限流规则等配置项从代码中抽离,使用环境变量或配置文件管理,这样更安全,也更容易在不同环境(开发、测试、生产)间切换。
  • API网关:在服务前面加一层API网关(如Kong, Tyk),可以统一处理认证、限流、路由、负载均衡等跨服务的功能。
  • 测试:为你的API编写完整的单元测试和集成测试,确保代码更改不会破坏现有功能。

希望这篇教程能帮你顺利跨出模型服务化的第一步。从“玩具脚本”到“真正可用的服务”,这一步虽然有些繁琐,但带来的便利性和协作效率的提升是巨大的。动手试试吧,遇到问题多在社区里交流,祝你成功!


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 0:23:54

【低轨卫星终端功耗优化黄金法则】:20年航天嵌入式专家亲授C语言级省电实战的7大不可绕过陷阱

第一章:低轨卫星终端功耗建模与C语言优化边界界定低轨卫星终端受限于星载能源、散热能力与体积约束,其嵌入式软件的功耗特性必须在算法设计初期即纳入建模闭环。功耗建模需同时耦合硬件行为(如射频收发占空比、基带处理负载、电源域切换延迟&…

作者头像 李华
网站建设 2026/8/24 21:29:46

暗黑2存档编辑新体验:3大核心功能与4步实战指南

暗黑2存档编辑新体验:3大核心功能与4步实战指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款基于Vue.js技术栈的开源暗黑2存档编辑器,专为解决单机玩家面临的装备获取难、属性分配不当…

作者头像 李华
网站建设 2026/8/27 6:14:08

零代码也能用:腾讯混元OCR图像预处理工具与技巧分享

零代码也能用:腾讯混元OCR图像预处理工具与技巧分享 1. 引言 你是不是经常遇到这样的烦恼?拍了一张身份证、发票或者合同照片,想用OCR工具把文字提取出来,结果识别出来的内容乱七八糟,该对的没对,不该错的…

作者头像 李华
网站建设 2026/8/24 21:50:42

基于cv_unet_image-colorization的AI视觉研究工具链搭建指南

基于cv_unet_image-colorization的AI视觉研究工具链搭建指南 1. 项目简介 cv_unet_image-colorization 是一个基于深度学习技术的本地化图像上色工具。这个工具采用了业界公认的高效架构,能够智能识别黑白图像中的各种元素,包括物体轮廓、自然景观和人…

作者头像 李华
网站建设 2026/8/26 21:31:22

WinForm 实现的工业视觉流程编排系统,告别硬编码

前言工业视觉、自动化检测和图像处理领域,流程化、模块化的开发方式越来越重要。传统硬编码的方式难以应对频繁变更的检测逻辑,而低代码、可视化的工作流引擎则能显著提升开发效率和系统灵活性。本文推荐一个基于 WinForm 的拖拽式视觉工作流框架——它用…

作者头像 李华
网站建设 2026/8/28 10:01:22

4个步骤解决comfyui-inpaint-nodes图像修复功能的安装故障排除

4个步骤解决comfyui-inpaint-nodes图像修复功能的安装故障排除 【免费下载链接】comfyui-inpaint-nodes Nodes for better inpainting with ComfyUI: Fooocus inpaint model for SDXL, LaMa, MAT, and various other tools for pre-filling inpaint & outpaint areas. 项…

作者头像 李华