Towhee自定义大模型能力接口

Towhee 允许用户自定义模型能力接口,通过创建自定义操作器(Operator)或组件,您可以将任何现有模型或自定义模型集成到 Towhee 的管道中。这种灵活性使您能够根据特定需求扩展 Towhee 的功能,构建复杂且高效的 AI 工作流。

1. 基本概念

Towhee 的核心是管道(Pipeline),它由多个操作器(Operator)组成。每个操作器执行特定的任务,如数据预处理、特征提取、模型推理等。通过自定义操作器,您可以集成任何模型或算法,以满足特定的业务需求或技术要求。

2. 创建自定义操作器

以下是创建和使用自定义操作器的步骤:

步骤 1:定义自定义操作器

首先,您需要定义一个自定义操作器类,继承自 towhee.Operator 并实现必要的方法。假设您有一个自定义的文本分类模型,您希望将其集成到 Towhee 管道中。

# my_text_classifier.py
from towhee import operator
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

@operator
class MyTextClassifier:
    def __init__(self, model_name: str = "distilbert-base-uncased-finetuned-sst-2-english"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModelForSequenceClassification.from_pretrained(model_name)
        self.model.eval()
    
    def __call__(self, text: str) -> dict:
        inputs = self.tokenizer(text, return_tensors="pt")
        with torch.no_grad():
            outputs = self.model(**inputs)
            scores = torch.nn.functional.softmax(outputs.logits, dim=-1)
            confidence, predicted_class = torch.max(scores, dim=-1)
        return {
            "text": text,
            "predicted_class": self.model.config.id2label[predicted_class.item()],
            "confidence": confidence.item()
        }

输出示例:

{'text': 'I love programming!', 'predicted_class': 'POSITIVE', 'confidence': 0.9998}
{'text': 'This movie was terrible.', 'predicted_class': 'NEGATIVE', 'confidence': 0.9985}
{'text': 'The weather is nice today.', 'predicted_class': 'POSITIVE', 'confidence': 0.9872}

3. 高级自定义:参数化操作器

您还可以为自定义操作器添加参数,以使其更加灵活。例如,支持不同的模型或配置选项:

# my_text_classifier.py
from towhee import operator
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

@operator
class MyTextClassifier:
    def __init__(self, model_name: str = "distilbert-base-uncased-finetuned-sst-2-english"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModelForSequenceClassification.from_pretrained(model_name)
        self.model.eval()
    
    def __call__(self, text: str, model_name: str = None) -> dict:
        if model_name:
            self.tokenizer = AutoTokenizer.from_pretrained(model_name)
            self.model = AutoModelForSequenceClassification.from_pretrained(model_name)
            self.model.eval()
        
        inputs = self.tokenizer(text, return_tensors="pt")
        with torch.no_grad():
            outputs = self.model(**inputs)
            scores = torch.nn.functional.softmax(outputs.logits, dim=-1)
            confidence, predicted_class = torch.max(scores, dim=-1)
        return {
            "text": text,
            "predicted_class": self.model.config.id2label[predicted_class.item()],
            "confidence": confidence.item()
        }

使用时,您可以在调用管道时传递不同的模型名称:

classification_pipe = (
    pipe.input("text", model_name="optional_model_name")
    .map(text_classifier)  # 使用自定义操作器
    .output(['text', 'predicted_class', 'confidence'])
)

results = classification_pipe(data, model_name="distilbert-base-uncased-finetuned-sst-2-english")

4. 自定义逻辑与功能

除了集成预训练模型,您还可以在自定义操作器中添加其他逻辑或功能,例如数据增强、后处理、结果过滤等。这使得 Towhee 管道能够满足更复杂的需求。

@operator
class AdvancedTextProcessor:
    def __init__(self, model_name: str):
        self.classifier = MyTextClassifier(model_name)
    
    def __call__(self, text: str) -> dict:
        # 数据预处理
        cleaned_text = self.clean_text(text)
        
        # 分类
        classification = self.classifier(cleaned_text)
        
        # 后处理
        if classification['confidence'] > 0.95:
            classification['status'] = 'high_confidence'
        else:
            classification['status'] = 'low_confidence'
        
        return classification
    
    def clean_text(self, text: str) -> str:
        # 示例清洗函数
        return text.strip().lower()

5. 整合多模型与多步骤流程

您可以在管道中集成多个自定义操作器,形成复杂的多步骤流程。例如,先进行文本清洗,再进行分类,最后进行结果过滤:

from towhee import pipe
from my_text_classifier import MyTextClassifier
from my_advanced_processor import AdvancedTextProcessor

# 定义操作器实例
text_cleaner = AdvancedTextProcessor(model_name="distilbert-base-uncased-finetuned-sst-2-english")

# 定义管道
full_process_pipe = (
    pipe.input("text")
    .map(text_cleaner)  # 清洗和分类
    .filter(lambda x: x['status'] == 'high_confidence')  # 过滤低置信度结果
    .output(['text', 'predicted_class', 'confidence'])
)

# 运行管道
results = full_process_pipe(data)

# 打印结果
for result in results:
    print(result)

6. 部署与扩展

Towhee 支持将自定义管道部署为服务,使前端应用能够通过 API 调用这些管道。这可以通过将管道与 Web 框架(如 Flask 或 FastAPI)集成来实现。

示例:使用 FastAPI 部署自定义管道

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from towhee import pipe
from my_text_classifier import MyTextClassifier

app = FastAPI()

# 定义操作器
text_classifier = MyTextClassifier()

# 定义管道
classification_pipe = (
    pipe.input("text")
    .map(text_classifier)
    .output(['text', 'predicted_class', 'confidence'])
)

# 定义请求模型
class TextRequest(BaseModel):
    text: str

@app.post("/classify")
def classify_text(request: TextRequest):
    try:
        results = classification_pipe([{"text": request.text}])
        return results[0]
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# 运行 Server
# 在命令行运行: uvicorn your_script_name:app --reload
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容