跳到内容

书评情感分析服务

Image1

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

我们将学习哪些 Knative 功能?

易于使用 Knative Function 来部署您的服务,并由 Knative Serving 管理,这使您能够自动将服务缩减到零,并根据需求进行扩展。

最终交付成果是什么样的?

Image8

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

该函数的输出将仅为

  • 正面

  • 中性

  • 负面

安装先决条件

先决条件 1:安装 Knative func CLI

Image12

Knative Function 使您能够通过 func CLI 轻松创建、构建和部署无状态、事件驱动的函数作为Knative Services

要做到这一点,您需要安装 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> -t cloudevents

在这种情况下,我们将创建一个处理 CloudEvents 的 Python 函数,因此命令将是

func create -l python sentiment-analysis-app -t cloudevents

此命令将在其中创建一个名为 sentiment-analysis-app 的新目录和一堆文件。func CLI 将为您生成一个基本的函数模板以供开始。

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

验证

文件 tree -a 将如下所示

start/sentiment-analysis-app
.
├── .func
│   └── local.yaml
├── .funcignore
├── .gitignore
├── func.yaml
├── function
│   ├── __init__.py
│   └── func.py
├── pyproject.toml
├── README.md
└── tests
    └── test_func.py

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

Image14

sentiment-analysis-app/function/func.py 是包含函数代码的文件。

您可以将生成的代码替换为情感分析逻辑。您可以将以下代码作为起点

sentiment-analysis-app/function/func.py
import logging
from cloudevents.http import CloudEvent
from textblob import TextBlob

def new():
    return Function()

class Function:
    async def handle(self, scope, receive, send):
        """ Handle all HTTP requests to this Function. The incoming CloudEvent is in scope["event"]. """
        logging.info("Request Received")

        # 1. Get the incoming CloudEvent
        request_event = scope["event"]

        # 2. Extract the data payload from the event, analyze and create CloudEvent
        response_event = self.analyze_sentiment(request_event.data)

        # 3. Send the response
        logging.info(f"Sending response: {response_event.data}")
        await send(response_event)

    def create_cloud_event(self, inputText, badWordResult, data):
        attributes = {
            "type": "moderated-comment",
            "source": "sentiment-analysis",
            "datacontenttype": "application/json",
            "sentimentResult": data,
            "badwordfilter": badWordResult,
        }

        data = {
            "reviewText": inputText,
            "badWordResult": badWordResult,
            "sentimentResult": data,
        }

        return CloudEvent(attributes, data)

    def analyze_sentiment(self, text):
        review_text = text.get("reviewText", "")
        analysis = TextBlob(review_text)
        sentiment = "neutral"

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

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

        return self.create_cloud_event(review_text, badWordResult, sentiment)

步骤 3:配置依赖项

Image9

sentiment-analysis-app/pyproject.toml 文件包含项目配置以及函数的依赖项。将 textblob 依赖项添加到依赖项数组中

sentiment-analysis-app/pyproject.toml
[project]
name = "function"
description = ""
version = "0.1.0"
requires-python = ">=3.9"
readme = "README.md"
license = "MIT"
dependencies = [
    "httpx",
    "cloudevents",
    "pytest",
    "pytest-asyncio",
    "textblob", # <-- add this dependency
]
authors = [
    { name="Your Name", email="you@example.com"},
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.pytest.ini_options]
asyncio_mode = "strict"
asyncio_default_fixture_loop_scope = "function"

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

步骤 4:在本地构建和运行您的 Knative 函数(可选)

点击此处展开

Image4

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

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

export FUNC_REGISTRY=<your-container-registry>

在这种情况下,我们将通过添加 -b=s2i 标志使用 s2i 构建,并使用 -v 查看详细输出。

func build -b=s2i -v

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

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

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

func run -b=s2i -v

故障排除

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

解决方案:您可能需要检查您是否在正确的目录中。您可以使用以下命令检查当前目录。

pwd

如果您在正确的目录中,并且错误仍然发生,请尝试检查您的 func.yaml,因为它必须包含 created 字段和正确的时间戳才能被视为有效的 Knative 函数。


将来,您可以跳过 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"
  }

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

Image10

注意

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

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

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

注意

使用 -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 函数(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 Autoscaling


验证

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 函数的 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 为简单的情感分析服务创建无服务器函数。

接下来,我们将按照相同的步骤部署另一个 ML 服务。

提示

在继续之前,请不要忘记 cd 到根目录 /start

转到部署 ML 工作流:坏词过滤器

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