コンテンツへスキップ

書店レビューのための感情分析サービス

Image1

書店オーナーとして、お客様が新しいネガティブなレビューコメントを送信するたびに、Slackチャンネルに即時通知を受け取ることを目指しています。Knative Functionを活用することで、レビューコメントを感情によって分類する単純な感情分析サービスを含むサーバーレス関数を設定できます。

どのようなKnative機能について学習しますか?

Knative Function を使用してサービスを簡単にデプロイし、Knative Servingによって管理させることで、サービスをゼロに自動スケーリングし、需要に合わせてスケールアップできるようになります。

最終成果物はどのようなものですか?

Image8

新しいレビューコメントをCloudEventとして受信し、入力テキストの感情分類をCloudEventとして返すPythonアプリケーションを含む、実行中のサーバーレスKnative Functionです。

関数の出力は、以下のもののみです。

  • 肯定的

  • 中立的

  • 否定的

インストールの前提条件

前提条件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>

この場合、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 buildsource-to-image (s2i) buildの2つのビルド方法があります。

`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'には初期化された関数を含んでいません。

解決策:正しいディレクトリにいるかどうかを確認してください。現在のディレクトリを確認するには、次のコマンドを使用できます。正しいディレクトリにいて、エラーがまだ発生する場合は、有効なKnative関数として扱われるためにcreatedフィールドと正しいタイムスタンプを含んでいる必要があるため、func.yamlを確認してください。


func run -b=s2i -v

今後、func runは自動的に関数をビルドするため、func buildの手順をスキップできます。

関数が正常に実行されている場合は、次の出力が表示されます。

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

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

Knative関数は、CloudEventをシミュレートする簡単な方法を提供しています。次のコマンドを使用してCloudEventをシミュレートし、関数をテストできます。

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

ここで、-fフラグはデータの種類(HTTPまたはcloudevent)を示し、--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 buildsource-to-image (s2i) buildの2つのビルド方法があります。

現在、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

次のコマンドを使用してクラスタ内のすべてのポッドをクエリすると、ポッドが実行されていることがわかります。

kubectl get pods

ここで、-Aはすべての名前空間内のすべてのポッドをクエリするフラグです。

そして、あなたのセンチメント分析アプリが実行されていることがわかります。

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

しかし、しばらくの間関数にCloudEventを送信せずに、再度ポッドをクエリすると、あなたのセンチメント分析アプリが含まれているポッドが**消えて**いることがわかります!

これは、関数へのリクエストがない場合、Knative Servingのオートスケーラが**自動的にゼロにスケールダウン**するためです!詳しくはKnative Autoscalingをご覧ください。


検証

Image2

デプロイ後、func CLIは関数にアクセスするためのURLを提供します。サンプルレビューコメントを使用してリクエストを送信することで、関数の動作を確認できます。

クラスタ上の関数にCloudEventを直接送信するには、Knative関数のコマンドfunc invokeを使用します。

func invoke -f=cloudevent --data='{"reviewText":"I love Knative so much"}' -v
  • -fフラグはデータの種類(HTTPまたはcloudevent)を示します。
  • --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サービスをデプロイします。ぜひご自身で試してみてください!

ヒント

続行する前に、ルートディレクトリ/startcdすることを忘れないでください。

他のMLサービスを自分でデプロイすることに自信がある場合は、この簡略化されたガイドに従ってください。

MLワークフローのデプロイへ:禁則ワードフィルター

問題が発生しても心配しないでください。詳細なチュートリアルを用意しています。

解決策 - MLワークフローのデプロイへ:禁則ワードフィルター

サイトトラフィックを理解するために、分析とCookieを使用しています。サイトの使用に関する情報は、その目的のためにGoogleと共有されます。詳細はこちら。