使用modelscope在本地部署文本情感分析模型并对外提供api接口

使用modelscope部署StructBERT情感分类-中文-通用-base模型,并提供api接口

本地部署modelscope环境

环境安装 · 文档中心

为了简化部署,直接使用官方提供的docker镜像部署环境

拉取镜像

使用cpu镜像

bash 复制代码
docker pull modelscope-registry.cn-beijing.cr.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-py311-torch2.3.1-1.28.0

启动容器

挂载容器内的/home目录到本地,作为开发目录

arduino 复制代码
docker run -it --rm -p 8080:8080 --name modelscopelocal -v <本地目录>:/home <镜像> bash

本地目录和镜像替换为实际的内容 启动后,会直接进入容器中

bash 复制代码
 docker run -it --rm -p 8080:8080 --name modelscopelocal -v D:\workspace\modelscope:/home 6e724d5e15e8 bash
root@470b3a2a6460:/#

使用模型进行预测

在开发目录下创建一个python文件main.py,使用模型对输入文本进行情感分析

python 复制代码
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

semantic_cls = pipeline(Tasks.text_classification, 'iic/nlp_structbert_sentiment-classification_chinese-base')
result = semantic_cls(input=['哪次能看到你挖石油不漏','今晚什么游戏啊 主播可以说一声吗'])
print(result)

在命令行运行python main.py 输出结果如下:

json 复制代码
[{'scores': [0.8981053829193115, 0.10189458727836609], 'labels': ['正面', '负面']}, {'scores': [0.8091937899589539, 0.19080623984336853], 'labels': ['正面', '负面']}, {'scores': [0.896651029586792, 0.10334893316030502], 'labels': ['负面', '正面']}]

启动一个fastapi服务提供api接口

开发目录下创建一个app.py文件

python 复制代码
## 腾讯元宝自动生成
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

app = FastAPI(title="情感分析API", description="提供文本情感分析的REST接口", version="1.0.0")

# 加载模型(保持不变)
try:
    sentiment_pipeline = pipeline(
        task=Tasks.text_classification,
        model='iic/nlp_structbert_sentiment-classification_chinese-base'
    )
except Exception as e:
    raise RuntimeError(f"模型加载失败: {str(e)}")

# 请求数据结构(保持不变)
class TextListRequest(BaseModel):
    texts: List[str]

# 响应数据结构(新增 text 字段)
class AnalysisResult(BaseModel):
    text: str           # 原始输入文本(新增)
    labels: List[str]   # 情感标签(如 ["正面", "负面"])
    scores: List[float] # 对应标签的概率分数(如 [0.89, 0.11])

class AnalysisResponse(BaseModel):
    results: List[AnalysisResult]  # 每个文本的完整结果

# /analysis 接口(核心修改点)
@app.post("/analysis", response_model=AnalysisResponse)
async def analyze_text(request: TextListRequest):
    try:
        raw_results = sentiment_pipeline(input=request.texts)
        
        # 新增:将原始文本与预测结果绑定(按顺序一一对应)
        formatted_results = [
            AnalysisResult(
                text=request.texts[i],       # 原始文本
                labels=result["labels"],     # 标签
                scores=result["scores"]      # 分数
            ) 
            for i, result in enumerate(raw_results)  # 按索引匹配原始文本
        ]
        
        return {"results": formatted_results}
        
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"预测失败: {str(e)}")

# 其他代码(健康检查、启动命令等)保持不变

# 可选:添加健康检查接口
@app.get("/health", description="服务健康检查")
async def health_check():
    return {"status": "ok", "message": "服务运行正常"}

# 启动命令(运行时执行)
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        app="app:app",  # 模块名:应用实例名
        host="0.0.0.0",  # 允许外部访问
        port=8080,       # 端口号
        reload=True      # 开发模式自动重载(生产环境建议设为False)
    )

启动服务python app.py

访问分析接口

在容器外访问接口

css 复制代码
curl --location --request POST 'http://localhost:8080/analysis' \
--header 'Content-Type: application/json' \
--data-raw '{"texts": ["南征北战"]}'

返回结果如下

json 复制代码
{
    "results": [
        {
            "text": "南征北战",
            "labels": [
                "正面",
                "负面"
            ],
            "scores": [
                0.8927718997001648,
                0.10722804069519043
            ]
        }
    ]
}
相关推荐
uncle_ll4 天前
Llama 3 私有化落地全栈实战:从 Ollama 极速部署到 LLaMA Factory LoRA 定制微调
llm·nlp·llama·ollama·大模型微调
墨心@4 天前
阶段 1:一次模型调用
自然语言处理·nlp·agent·codex
阿图灵7 天前
基于 GRU 的 Seq2Seq 中英机器翻译:从 Tatoeba 语料到 BLEU 0.195
深度学习·gru·nlp·机器翻译·seq2seq
网络工程小王7 天前
【HCIE-AI】4.NLP 核心任务与技术演进学习笔记
人工智能·深度学习·自然语言处理·nlp·transformer
Lee_jerome8 天前
python神经网络编程入门(三十五)——Transformer 整体架构——一张图看懂全貌
nlp·transformer·encoder·注意力机制·decoder·交叉注意力·self-attention
Lee_jerome9 天前
python神经网络编程入门(三十三)——多头注意力(Multi-Head Attention)
深度学习·nlp·transformer·注意力机制·多头注意力·self-attention
Lee_jerome11 天前
python神经网络编程入门(三十)——Transformer 从 RNN 到注意力:模型为什么需要“瞄一眼“
rnn·深度学习·nlp·transformer·attention·注意力机制·序列建模
阿图灵11 天前
基于 LSTM 的中文电商评论情感分类:从数据处理到 91% 准确率实战
人工智能·深度学习·分类·nlp·lstm·情感分类
方品13 天前
【无标题】
服务器·人工智能·深度学习·nlp
今日无bug14 天前
用 Prompt 做 NLP 任务开发:几分钟构建一个推理系统
llm·nlp