0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

みなさんこんにちは!
英語のCUDOSダッシュボードを社内展開したいけれど、「日本語化されていればもっと活用できるのに・・・」と感じたことはありませんか?
本記事では、AWSのコスト管理や最適化に役立つCUDOSダッシュボードを、Bedrockを使って日本語化する手順を、実際のコード付きで解説します。AIの力で作業効率を大幅にアップさせたい方、CUDOSをもっと身近に使いたい方は、ぜひ最後までご覧ください!

全体像

今回は以下の流れで日本語のダッシュボードを作成します。1で翻訳対象となるダッシュボードの定義ファイルを取得します。2ではBoto3を使用してPythonスクリプトからBedrockを呼び出すことで翻訳を行います。最後に3で翻訳済みの定義ファイルを使用してQuickSightにダッシュボードを作成します。

  1. 定義ファイル取得
  2. 翻訳実行
  3. 翻訳済みの定義ファイルよりダッシュボードを作成

イメージを以下に示します。

image1.drawio.png

翻訳の対象

今回はCUDOSの各ビジュアルのタイトルを対象に翻訳を行っていきます(赤枠部分)。

image2.drawio.png

翻訳してみた

0.前提

以下の前提条件を満たしている必要があります。

  • 英語版のCUDOSダッシュボードをデプロイしていること
    デプロイ方法についてはDeployment in Global Regionsをご確認ください。
  • CloudShellにcid-cmd コマンドツールがインストールされていること
  • 翻訳を実行する環境にはPythonライブラリのpyyamlboto3をインストールしていること

1.定義ファイル取得

CUDOSのダッシュボードを日本語化するため、まずは元となる定義ファイル(yaml形式)を取得します。CloudShellで以下コマンドを実行します。

cid-cmd export

コマンド実行時に[dashboard-export-method] Please choose export methodとエクスポート方法を確認されますが、今回は定義ファイルを取得したいのでdefinitionを選択しましょう。これによって2つのYAMLファイルが出力されます。各ファイルの概要を以下に示します。

  1. <エクスポート時に指定したファイル名>.yaml
    ダッシュボード名やID等を記載したファイルです。インポート時はこのファイルを使用します。
  2. <エクスポート時に指定したファイル名>-definition.yaml
    ダッシュボードのデータソース、配置等を記載したファイルです。今回はこのファイルに対して翻訳を行います。

2.翻訳実行

翻訳にはAmazon Bedrockの「Nova lite」モデルを利用しました。Pythonでスクリプトを作成し、YAMLファイル内の日本語化したい部分を抽出してモデルに入力します。プロンプトは、HTMLタグや専門用語を保持するようにしています。翻訳結果は元の構造を維持したまま新しいYAMLファイルとして保存します。実際に使用したコードを以下に示します。

import boto3
import json
import os

INPUT_FILE = "インプットファイルのパス"
MODEL_ID = "amazon.nova-lite-v1:0"
PROMPT_TEMPLATE = f"""入力に含まれる文字を日本語に翻訳してください。ただし翻訳を行う際は条件に記載した内容を考慮してください。
入力:
 [input]
条件:
1. 入力にHTMLの要素が含まれる場合は、要素はそのまま保持して翻訳すること。
2. 専門用語や固有名詞は可能な限り翻訳せずにそのまま保持すること。
出力:
1. 翻訳の結果のみ出力してください。翻訳前の単語や説明文などは含めないでください。
2. HTMLの要素を含むものは、HTMLの要素を含めたテキストで出力してください。それ以外は翻訳されたテキストのみを出力してください。 
"""

def generate_prompt(input_text):
    # プロンプトの入力を置き換え
    return PROMPT_TEMPLATE.replace("[input]", input_text)

def translate_text(client, input_text):
    # モデルへの入力を作成
    input_text = input_text.replace("\\xa0", "")
    prompt = generate_prompt(input_text)
    inf_params = {"topP": 1.0, "topK": 1, "temperature": 0.0}
    request_body = {
        "schemaVersion": "messages-v1",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"text": prompt}
                ]
            }
        ],
        "inferenceConfig": inf_params
    }
    # モデルを呼び出して翻訳を実行
    response = client.invoke_model(
        modelId=MODEL_ID,
        body=json.dumps(request_body),
        contentType = "application/json"
    )
    # レスポンスから翻訳結果を抽出
    response_json = json.loads(response.get("body").read())
    output = response_json['output']['message']['content'][0]['text']
    output = output.replace("```html\n", "")
    output = output.replace("\n```", "")
    return output

def translate_visual_title(client, visual_content):
    # タイトルを翻訳
    if "Title" in visual_content and "RichText" in visual_content["Title"]["FormatText"]:
        visual_content["Title"]["FormatText"]["RichText"] = translate_text(client=client, input_text=str(visual_content["Title"]["FormatText"]["RichText"]))
    elif "Title" in visual_content and "PlainText" in visual_content["Title"]["FormatText"]:
        visual_content["Title"]["FormatText"]["PlainText"] = translate_text(client=client, input_text=str(visual_content["Title"]["FormatText"]["PlainText"]))    

def translate_visuals(client, sheet):
    # Visual毎にタイトルを翻訳
    for visual in sheet["Visuals"]:
        for visual_type, visual_content in visual.items():
            translate_visual_title(client, visual_content)

if __name__ == "__main__":
    # AWS Bedrockクライアントの初期化
    try:
        client = boto3.client(
            service_name='bedrock-runtime',
            region_name='ap-northeast-1'
        )
    except KeyError as e:
        print(f"環境変数 {e} が設定されていません。")
        exit(1)
    except Exception as e:
        print(f"AWSクライアント初期化エラー: {e}")
        exit(1)

    # YAMLファイルを読み込み
    with open(INPUT_FILE, 'r', encoding='utf-8') as file:
        data = yaml.safe_load(file)
    sheets = data.get('Sheets', {})

    # シート毎に翻訳を実行
    for sheet in sheets:
        translate_visuals(client, sheet)

    # 翻訳結果をYAMLファイルに保存
    with open(INPUT_FILE.replace(".yaml", "-japanese.yaml"), "w", encoding="utf-8") as f:
        yaml.dump(data, f, allow_unicode=True)

3.翻訳済みの定義ファイルよりダッシュボードを作成

日本語化した定義ファイルをインポートするために以下コマンドを実行します。

cid-cmd deploy --resources <エクスポート時に指定したファイル名>.yaml

実行後に以下のようにビジュアルのタイトルが日本語に翻訳されていれば成功です。

image3.drawio.png

終わりに

いかがでしたでしょうか。今回はBedrock(Nova lite)を活用し、CUDOSの定義ファイルを日本語化する方法を紹介しました。AI翻訳を活用することで、作業効率が大幅に向上しました。この記事が参考になりましたら、「いいね」や「記事のストック」をしていただけると嬉しいです!


  • AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
  • その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?