KubeVela – Azure OpenAI(ChatGPT)との統合

こんにちは。サイオステクノロジーの塙です。

前回は、KubeVelaのWorkflowとデプロイプロセスについて紹介しました。

今回は、Kubevelaを使用してAzure OpenAIと連携する手段を試してみたいと思います。

AI機能と連携することでどんな恩恵が得られるのかを調査します。

 

前回までの記事については、以下が参考になります。

KubeVela とは? – アーキテクチャのご紹介

KubeVela – Workflowとデプロイプロセス

概要

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)なども付与している。
  • ヘッダー部
    • Authorizationにトークンを入力します。

定義の全容については以下が参考になります。

https://github.com/kubevela/workflow/blob/main/charts/vela-workflow/templates/definitions/chat-gpt.yaml

 

■ 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に通知を送ったりすることも可能です。

 

■ フロー

この検証内容を簡単にイメージ化すると以下のような形です。

  1. k8sアプリのデプロイと、k8s deploymentのmanifestを出力する(apply – apply-deployment.cue)

  2. 受け取った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言語の定義の方で変更することが出来るので様々な活用の幅がありそうです。

本書の記載が読者のお役に立てれば幸いです。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です