跳至内容

书店评论的情感分析服务

Image1

作为书店店主,您希望在客户提交新的负面评论时,在 Slack 频道中收到即时通知。利用 Knative Function,您可以设置一个包含简单情感分析服务的无服务器函数,以按情感对评论进行分类。

我们将学习哪些 Knative 特性?

使用 Knative Function 部署服务的简便性,以及让它由 Knative Serving 管理,这使您能够 将您的服务自动缩放到零,并按需进行扩展。

最终交付物是什么样的?

Image8

一个运行中的无服务器 Knative Function,其中包含一个 Python 应用程序,该应用程序接收新的评论作为 CloudEvent,并将输入文本的情感分类作为 CloudEvent 返回。

函数的输出将仅来自

  • 积极

  • 中性

  • 消极

安装先决条件

先决条件 1:安装 Knative func CLI

Image12

Knative Function 使您能够轻松地创建、构建和部署无状态的、事件驱动的函数,作为 Knative Services,方法是使用 func CLI。

为此,您需要安装 func CLI。您可以按照 官方文档 安装 func CLI。

验证

在您的终端中运行 func version 来验证安装,您应该会看到您安装的 func CLI 的版本。

故障排除

如果您看到 command not found,您可能需要将 func CLI 添加到您的 PATH 中。

实现

Image3

该过程很简单

  1. 首先,利用 func create 命令生成您的代码模板。

  2. 接下来,将您独特的代码合并到此模板中。

  3. 最后,执行 func deploy 将您的应用程序无缝部署到 Kubernetes 集群。

此工作流程确保在 Knative Functions 生态系统中从开发到部署的顺利过渡。

步骤 1:创建 Knative Function 模板

Image17

使用 func CLI 创建一个新函数

func create -l <language> <function-name>

在本例中,我们正在创建一个 Python 函数,因此该命令将是

func create -l python sentiment-analysis-app

此命令将创建一个名为 sentiment-analysis-app 的新目录以及其中的许多文件。func CLI 将为您生成一个基本的函数模板作为起点。

您可以在 此处 找到所有支持的语言模板。

验证

文件树将如下所示

start/sentiment-analysis-app
├── func.yaml
├── .funcignore
├── .gitignore
├── requirements.txt
├── app.sh
├── test_func.py
├── README.md
├── Procfile
└── func.py

步骤 2:用情感分析逻辑替换生成的代码

Image14

sentiment-analysis-app/func.py 是包含函数代码的文件。您可以用情感分析逻辑替换生成的代码。您可以使用以下代码作为起点

sentiment-analysis-app/func.py
from parliament import Context
from flask import Request, request, jsonify
import json
from textblob import TextBlob
from time import sleep
from cloudevents.http import CloudEvent, to_structured

# The function to convert the sentiment analysis result into a CloudEvent
def create_cloud_event(inputText, badWordResult, data):
    attributes = {
        "type": "moderated-comment",
        "source": "sentiment-analysis",
        "datacontenttype": "application/json",
        "sentimentResult": data,
        "badwordfilter": badWordResult,
    }

    # Put the sentiment analysis result into a dictionary
    data = {
        "reviewText": inputText,
        "badWordResult": badWordResult,
        "sentimentResult": data,
    }

    # Create a CloudEvent object
    event = CloudEvent(attributes, data)
    return event

def analyze_sentiment(text):
    analysis = TextBlob(text["reviewText"])
    sentiment = "neutral"

    if analysis.sentiment.polarity > 0:
        sentiment = "positive"
    elif analysis.sentiment.polarity < 0:
        sentiment = "negative"

    badWordResult = ""
    try:
        badWordResult = text["badWordResult"]
    except:
        pass

    # Convert the sentiment into a CloudEvent
    sentiment = create_cloud_event(text["reviewText"], badWordResult, sentiment)
    return sentiment

def main(context: Context):
    """
    Function template
    The context parameter contains the Flask request object and any
    CloudEvent received with the request.
    """

    print("Sentiment Analysis Received CloudEvent: ", context.cloud_event)

    # Add your business logic here
    return analyze_sentiment(context.cloud_event.data)

步骤 3:配置依赖项

Image9

sentiment-analysis-app/requirements.txt 文件包含函数的依赖项。将以下依赖项添加到该文件中

sentiment-analysis-app/requirements.txt
Flask==3.0.2
textblob==0.18.0.post0
parliament-functions==0.1.0
cloudevents==1.10.1

Knative Function 将在您构建函数时自动安装此处列出的依赖项。

步骤 4:配置预构建环境

Image11

为了正确使用 textblob 库,您需要下载语料库,这是一个用于训练情感分析模型的大量文本数据集合。您可以通过创建一个名为 setup.py 的新文件来执行此操作,Knative Function 将确保在安装依赖项后执行 setup.py 文件。

sentiment-analysis-app/setup.py 文件应包含以下代码,用于您的书店

sentiment-analysis-app/setup.py
from setuptools import setup, find_packages
from setuptools.command.install import install
import subprocess

class PostInstallCommand(install):
    """Post-installation for installation mode."""
    def run(self):
        # Call the superclass run method
        install.run(self)
        # Run the command to download the TextBlob corpora
        subprocess.call(['python', '-m', 'textblob.download_corpora', 'lite'])

setup(
    name="download_corpora",
    version="1.0",
    packages=find_packages(),
    cmdclass={
        'install': PostInstallCommand,
    }
)

步骤 5:在本地构建和运行您的 Knative Function(可选)

点击此处展开

Image4

在 Knative Function 中,有两种构建方式:使用 pack build 或使用 source-to-image (s2i) build.

目前,如果您需要运行 setup.py,则仅支持 s2i 构建。使用 s2i 构建时,将在安装依赖项后自动执行 setup.py 文件。

在我们开始之前,请配置容器注册表以将镜像推送到容器注册表。您可以使用以下命令配置容器注册表

export FUNC_REGISTRY=<your-container-registry>

在本例中,我们将通过添加标志 -b=s2i-v 来使用 s2i 构建,以查看详细输出。

func build -b=s2i -v

构建完成后,您将看到以下输出

🙌 Function built: <Your container registry username>/sentiment-analysis-app:latest

此命令将构建函数并将镜像推送到容器注册表。构建完成后,您可以使用以下命令运行函数


故障排除

❗错误:'/home/Kuack/Documents/knative/docs/code-samples' 不包含已初始化的函数

解决方案:您可能想检查您是否位于正确的目录中。您可以使用以下命令检查当前目录。如果您位于正确的目录中,但错误仍然存在,请尝试检查您的 func.yaml,因为它必须包含字段 created 以及正确的时间戳才能被视为有效的 Knative Function。


func run -b=s2i -v

将来,您可以跳过 func build 的步骤,因为 func run 将自动为您构建函数。

如果函数成功运行,您将看到以下输出

❗function up-to-date. Force rebuild with --build
Running

 on host port 8080
---> Running application from script (app.sh) ...

Knative Function 有一个简单的方法来模拟 CloudEvent,您可以使用以下命令来模拟 CloudEvent 并测试您的函数

func invoke -f=cloudevent --data='{"reviewText": "I love Knative so much"}' --content-type=application/json --type="new-review-comment" -v

其中 -f 标志表示数据的类型,可以是 HTTPcloudevent,而 --data 标志是输入文本。您可以了解有关 func invoke 的更多信息 此处

在本例中,您将获得完整的 CloudEvent 响应

Context Attributes,
  specversion: 1.0
  type: new-review-comment
  source: book-review-broker
  id: ebbcd761-3a78-4c44-92e3-de575d1f2d38
  time: 2024-05-27T04:44:07.549303Z
  datacontenttype: application/json
Extensions,
  badwordfilter: good
Data,
  {
    "reviewText": "I love Knative so much",
    "badWordResult": "",
     "sentimentResult": "positive"
  }

步骤 6:将函数部署到集群

Image10

注意

执行以下命令时,请输入 /sentiment-analysis-app

在 Knative Function 中,有两种构建方式:使用 pack build 或使用 source-to-image (s2i) build.

目前 支持 s2i 构建,如果您需要运行 setup.py。使用 s2i 构建时,将在安装依赖项后自动执行 setup.py 文件。

完成代码后,可以使用以下命令将函数部署到集群

注意

使用 -b=s2i 指定函数的构建方式。

func deploy -b=s2i -v
验证

部署完成后,您将看到以下输出

Function deployed in namespace "default" and exposed at URL:
http://sentiment-analysis-app.default.svc.cluster.local

提示

您可以通过运行以下命令找到 Knative Function(Knative Service)的 URL

kubectl get kservice

您将在输出中看到 URL

NAME                     URL                                                       LATESTCREATED                  LATESTREADY                    READY   REASON
sentiment-analysis-app   http://sentiment-analysis-app.default.svc.cluster.local   sentiment-analysis-app-00001   sentiment-analysis-app-00001   True    

Knative Serving:缩放到零

Image13

如果您使用以下命令查询集群中的所有 Pod,您将看到 Pod 正在运行

kubectl get pods

其中 -A 是查询所有命名空间中的所有 Pod 的标志。

您会发现您的情感分析应用程序正在运行

NAMESPACE   NAME                                      READY   STATUS    RESTARTS   AGE
default     sentiment-analysis-app-00002-deployment   2/2     Running   0          2m

但是,如果您等待一段时间而不向您的函数发送任何 CloudEvent,并再次查询 Pod,您会发现包含您的情感分析应用程序的 Pod 消失了

这是因为,如果函数没有请求,Knative Serving 的自动缩放器会自动缩放到零! 了解更多信息,请访问 Knative 自动缩放


验证

Image2

部署后,func CLI 会提供一个 URL 来访问您的函数。您可以通过发送包含示例评论的请求来验证函数的操作。

只需使用 Knative Function 的命令 func invoke 将 CloudEvent 直接发送到集群上的函数即可

func invoke -f=cloudevent --data='{"reviewText":"I love Knative so much"}' -v
  • -f 标志指示数据的类型,可以是 HTTPcloudevent
  • --data 标志是输入文本
  • -t 标志是 Knative Function 的 URI。
验证

如果您看到响应,则表示函数正在成功运行。

Context Attributes,
  specversion: 1.0
  type: moderated-comment
  source: sentiment-analysis
  id: 0c2d0659-a30e-4efd-bcce-803f15ff5cc5
  time: 2024-06-11T15:12:43.795405Z
  datacontenttype: application/json
Extensions,
  badwordfilter: 
  sentimentresult: positive
Data,
  {
    "reviewText": "I love Knative so much",
    "badWordResult": "",
    "sentimentResult": "positive"
  }

Image16

在本教程中,您学习了如何使用 Knative 为简单的 Sentiment Analysis 服务创建无服务器函数。

下一步

Image5

接下来,我们将按照相同的步骤部署另一个 ML 服务。我们鼓励您自己尝试!

提示

在继续操作之前,不要忘记使用 cd 命令进入根目录 /start

如果您感觉自己可以部署其他 ML 服务,请按照此简化指南操作

转到 部署 ML 工作流程:禁用词过滤器

如果您遇到任何问题,请不要担心 - 我们已经为您准备了详细的教程。

解决方案 - 转到 部署 ML 工作流程:禁用词过滤器

我们使用分析和 cookie 来了解网站流量。关于您使用我们网站的信息将与 Google 共享以供此目的。 了解更多。