跳至內容

書店評論的情感分析服務

Image1

身為書店老闆,您的目標是在顧客提交新的負面評論時,於 Slack 頻道中收到即時通知。藉由運用 Knative Function,您可以設定包含簡單情感分析服務的無伺服器函式,以依據情感將評論分類。

我們將學習哪些 Knative 功能?

輕鬆使用 Knative Function 來部署您的服務,並讓 Knative Serving 管理它,這使您能夠將服務自動擴展至零,並擴展以處理需求。

最終交付成果為何?

Image8

一個執行中的無伺服器 Knative Function,其中包含一個 Python 應用程式,該應用程式接收新的評論做為 CloudEvent,並將輸入文字的情感分類做為 CloudEvent 傳回。

函式的輸出只會是

  • 正面

  • 中性

  • 負面

安裝先決條件

先決條件 1:安裝 Knative func CLI

Image12

Knative Function 可讓您使用 func CLI 輕鬆建立、建置和部署無狀態、事件驅動的函式做為Knative 服務

為此,您需要安裝 func CLI。您可以依照官方文件來安裝 func CLI。

驗證

在終端機中執行 func version 以驗證安裝,您應該會看到您所安裝的 func CLI 版本。

疑難排解

如果您看到 command not found,您可能需要將 func CLI 新增至您的 PATH。

實作

Image3

這個流程很簡單

  1. 首先使用 func create 命令來產生您的程式碼範本。

  2. 接下來,將您獨特的程式碼納入這個範本中。

  3. 最後,執行 func deploy 以將您的應用程式順暢地部署到 Kubernetes 叢集。

這個工作流程確保了從 Knative Function 生態系統中的開發到部署的順利過渡。

步驟 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 建置或使用 source-to-image (s2i) 建置

目前,如果您需要執行 setup.py,則僅支援 s2i 建置。使用 s2i 建置時,將在安裝相依性之後自動執行 setup.py 檔案。

在開始之前,請設定容器登錄檔,以將映像推送至容器登錄檔。您可以使用下列命令來設定容器登錄檔

export FUNC_REGISTRY=<your-container-registry>

在此案例中,我們將使用 s2i 建置,方法是新增旗標 -b=s2i,並新增 -v 以查看詳細輸出。

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 建置或使用 source-to-image (s2i) 建置

目前,如果需要執行 setup.py支援 s2i 建置。當使用 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 函式(Knative 服務)的 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 函式的 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 為簡單的情緒分析服務建立無伺服器函式。

下一步

Image5

接下來,我們將依照相同的步驟部署另一個 ML 服務。我們鼓勵您自行嘗試!

提示

在繼續之前,請不要忘記 cd 到根目錄 /start

如果您對自行部署其他 ML 服務感到放心,請依照這個簡化指南

前往部署 ML 工作流程:禁用詞過濾器

如果您遇到任何問題,請不用擔心,我們已為您準備好詳細的教學。

解決方案 - 前往部署 ML 工作流程:禁用詞過濾器

我們使用分析和 Cookie 來了解網站流量。您使用我們網站的資訊會因此目的與 Google 分享。 了解更多。