书店评论的情感分析服务¶
作为书店店主,您希望在客户提交新的负面评论时,在 Slack 频道中收到即时通知。利用 Knative Function,您可以设置一个包含简单情感分析服务的无服务器函数,以按情感对评论进行分类。
我们将学习哪些 Knative 特性?¶
使用 Knative Function 部署服务的简便性,以及让它由 Knative Serving 管理,这使您能够 将您的服务自动缩放到零,并按需进行扩展。
最终交付物是什么样的?¶
一个运行中的无服务器 Knative Function,其中包含一个 Python 应用程序,该应用程序接收新的评论作为 CloudEvent,并将输入文本的情感分类作为 CloudEvent 返回。
函数的输出将仅来自
-
积极
-
中性
-
消极
安装先决条件¶
先决条件 1:安装 Knative func CLI¶
Knative Function 使您能够轻松地创建、构建和部署无状态的、事件驱动的函数,作为 Knative Services,方法是使用 func CLI。
为此,您需要安装 func CLI。您可以按照 官方文档 安装 func CLI。
验证
在您的终端中运行 func version
来验证安装,您应该会看到您安装的 func CLI 的版本。
故障排除
如果您看到 command not found
,您可能需要将 func CLI 添加到您的 PATH 中。
实现¶
该过程很简单
-
首先,利用
func create
命令生成您的代码模板。 -
接下来,将您独特的代码合并到此模板中。
-
最后,执行
func deploy
将您的应用程序无缝部署到 Kubernetes 集群。
此工作流程确保在 Knative Functions 生态系统中从开发到部署的顺利过渡。
步骤 1:创建 Knative Function 模板¶
使用 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:用情感分析逻辑替换生成的代码¶
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:配置依赖项¶
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:配置预构建环境¶
为了正确使用 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(可选)¶
点击此处展开
在 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
标志表示数据的类型,可以是 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:将函数部署到集群¶
注意
执行以下命令时,请输入 /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:缩放到零¶
如果您使用以下命令查询集群中的所有 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 自动缩放。
验证¶
部署后,func
CLI 会提供一个 URL 来访问您的函数。您可以通过发送包含示例评论的请求来验证函数的操作。
只需使用 Knative Function 的命令 func invoke
将 CloudEvent 直接发送到集群上的函数即可
func invoke -f=cloudevent --data='{"reviewText":"I love Knative so much"}' -v
-f
标志指示数据的类型,可以是HTTP
或cloudevent
--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"
}
在本教程中,您学习了如何使用 Knative 为简单的 Sentiment Analysis 服务创建无服务器函数。
下一步¶
接下来,我们将按照相同的步骤部署另一个 ML 服务。我们鼓励您自己尝试!
提示
在继续操作之前,不要忘记使用 cd
命令进入根目录 /start
。
如果您感觉自己可以部署其他 ML 服务,请按照此简化指南操作
如果您遇到任何问题,请不要担心 - 我们已经为您准备了详细的教程。