こんにちは。サイオステクノロジーの塙です。
前回は、KubeVelaのWorkflowとデプロイプロセスについて紹介しました。
今回は、Kubevelaを使用してAzure OpenAIと連携する手段を試してみたいと思います。
AI機能と連携することでどんな恩恵が得られるのかを調査します。
前回までの記事については、以下が参考になります。
概要
Kubevelaを使用してChatGPTと連携する例があったのでどのような手段で 実現しているのか試してみようと思います。
CNCFのブログの方に、PromptOpsとしてChatGPTと統合する例があったので、 そちらを参考にしてみました。
詳細は、以下の記事を参考にいただければと思います。
PromptOps in application delivery: empowering your workflow with ChatGPT
前回までの記事の中で、KubevelaではWorkflow/Pipelineの機能があると紹介しています。 この機能によるフローの中で、Azure OpenAIと連携する部分を定義することにより実現します。
記載しないこと:
- Azure OpenAIの準備、APIキーの取得
- k8s, Kubevelaのセットアップ
定義の確認と連携方法
■ chat-gpt 定義の確認
vela def
コマンドで、定義の操作ができます。
リストを表示して見ると(後述するvela-workflow addonが必要)chat-gptの定義があることを確認できます。
この定義は種類としてWorkflowStepDefinition
となっているようです。
$ vela def list
NAME TYPE NAMESPACE SOURCE-ADDON DESCRIPTION
webservice ComponentDefinition vela-system Describes long-running, scalable, containerized services
that have a stable network endpoint to receive external
network traffic from customers.
affinity TraitDefinition vela-system Affinity specifies affinity and toleration K8s pod for your
workload which follows the pod spec in path 'spec.template'.
annotations TraitDefinition vela-system Add annotations on your workload. if it generates pod, add
same annotations for generated pods.
chat-gpt WorkflowStepDefinition vela-system vela-workflow Send request to chat-gpt
...(snip)...
chat-gptの定義を確認してみましょう。(一部抜粋)
"chat-gpt": {
alias: ""
annotations: category: "External Intergration"
attributes: {}
description: "Send request to chat-gpt"
labels: {}
type: "workflow-step"
}
冒頭部で定義の名前、descriptionなどを記載しています。
Workflowから呼び出す場合に指定する名前であったり、descriptionなどを記載しています。
http: op.#HTTPDo & {
method: "POST"
url: "xxx"
request: {
body: json.Marshal({
model: parameter.model
messages: [{
if parameter.prompt.type == "custom" {
...(snip)...
if parameter.prompt.type == "diagnose" {
content: """
You are a professional kubernetes administrator.
Carefully read the provided information, being certain to spell out the diagnosis & reasoning, and don't skip any steps.
Answer in \(parameter.prompt.lang).
---
\(json.Marshal(parameter.prompt.content))
---
What is wrong with this object and how to fix it?
"""
}
role: "user"
}]
})
header: {
"Content-Type": "application/json"
Authorization: "Bearer \(token.value)"
}
}
}
この部分は、httpの動作を定義しています。
- 目的のurlに対してPOSTでクエリを投げるようになっています。
- リクエスト部
- モデル、メッセージ、roleの定義をします。
メッセージには、役割付け(k8s admin)なども付与している。
- モデル、メッセージ、roleの定義をします。
- ヘッダー部
- Authorizationにトークンを入力します。
定義の全容については以下が参考になります。
■ Workflowでの定義
Workflowでは以下のような形で、type: chat-gpt
と指定することで定義を呼び出すことが出来るようになっています。
# Use chat-gpt to diagnose the resource
- name: chat-diagnose
type: chat-gpt
properties:
token:
value: <your token>
prompt:
type: diagnose
検証内容
■ 事前準備
Kubevela アドオンを使用してVelaUXとワークフローをインストールします。
vela CLIをインストールする場合は、Install KubeVela CLIを参考にしてください。
$ vela addon enable velaux vela-workflow
■ chat-gpt 定義の編集
chat-gptの定義はvela-workflowをインストールするとデフォルトのものが登録されています。
デフォルトのurlやheaderに指定するパラメータを今回の検証用に変更する必要があります。
- headerのtokenの変更
headerのトークンとして、keyを”api-key” に変更します。
header: {
...(snip)...
"api-key": "\(token.value)"
}
- urlの変更
今回は、workflow側の定義で指定するパラメータを受け取るように変更します。
http: op.#HTTPDo & {
method: "POST"
url: "\(parameter.url.value)"
...(snip)...
- chat-gpt 定義の登録
velaコマンドで定義をKubevelaに登録します。
$ vela def apply chat-gpt.cue
■ Workflowの定義
Workflowの例を以下に示します。
- name: apply
alias: ''
type: apply-deployment
description: ''
orderIndex: 0
outputs:
- valueFrom: output.value.spec
name: resource
dependsOn: null
properties:
image: invalid
timeout: 3s
- name: chatgpttest
alias: ''
type: chat-gpt
description: ''
orderIndex: 0
inputs:
- parameterKey: prompt.content
from: resource
dependsOn: null
properties:
prompt:
type: diagnose
token:
secretRef:
key: <secret key>
name: <secret name>
url:
value: <azure openai url>
if: status.apply.failed
このWorkflowでは、2つのステップを記載します。
ステップ1
- デプロイの適用を行います
- ただ、imageをinvalidで定義しわざと失敗するようにしています。今回は、Azure OpenAIに対して、このデプロイの失敗について解析をしてくれるように連携したいため、このような仕様としています
- outputsとして、デプロイの結果を出力しています
ステップ2
- chat-gptへの問い合わせを行います
- if文にある条件でステップ1が失敗した場合にのみ、ステップ2は実行されます
- inputsとして、ステップ1で出力された結果を受け取ります。fromは、outputsのnameと同じである必要があります
- propertiesに変数として必要な情報を記載します。今回は、tokenやurlをchat-gpt定義に渡すためにここで定義します。
上記の定義をVelaUXの方で作成します。
Pipelinesの画面に行き、「New Pipeline」で新規のPipelineを作成します。
Pipelineの名前を入力し、Submitします。
新しく作成したPipelineを選択し、YAMLタブを選択します。
上記の定義を入力し、Save → Run でPipelineを実行できます。
実行すると、結果がワークフロー形式で確認出来るようになっています。applyフローの詳細を確認するとstatus failedとなっており、outputsにデプロイのマニフェストの一部が出力されています。
chatgpttestフローの詳細を確認すると、Azure OpenAIによって分析された失敗の理由がログで確認出来ます。
今回は、VelaUXのログに表示をさせるようにchat-gpt定義に記載していますが、これをメールやslackに通知を送ったりすることも可能です。
■ フロー
この検証内容を簡単にイメージ化すると以下のような形です。
-
k8sアプリのデプロイと、k8s deploymentのmanifestを出力する(apply – apply-deployment.cue)
-
受け取ったmanifestをもとにメッセージを構成し、Azure OpenAIに対するAPIを投げる。(chatgpttest – chat-gpt.cue)
Azure OpenAIからのレスポンスをロガーに渡し、VelaUXに出力
- k8sの様々なリソースに対応するには、それなりのCUE定義を用意してカスタマイズが必要となります。
(event, podのログ等からエラー情報を取得する方法もあれば良かったのですが…)
まとめ
今回は、KubeVelaとAzure OpenAIの連携についてまとめてみました。
Azure OpenAIに対しては、APIでの連携を行っていることが分かりました。
また、デプロイ時のエラーなどの一次切り分け、CICDの運用に組み込むといった有効性があることも確認出来ました。
Azure OpenAIへの問い合わせ内容はCUE言語の定義の方で変更することが出来るので様々な活用の幅がありそうです。
本書の記載が読者のお役に立てれば幸いです。