🧙‍♂️

Amazon Bedrock実装⑥:設計した規則に従いコードを生成するか試してみる

2023/12/10に公開

はじめに

Bedrockで、コードの設計規則(記載規則)に従いCDKのコードを作成させてみました。今まで、設計規則は担当者が理解し、その規則に従いコードを作成していましたが、これをAIにやってもらえるかの検証です。

参考

構成

構成は以下と同じで、BedrockとそれをコールするPythonスクリプトです。

https://zenn.dev/zgw426/articles/b260f75c516e9a

ソース

ソースはgithubに置きました。

https://github.com/zgw426/llm-mysamples/tree/main/Bedrock_06

ファイル構成は以下です。bedrock-test.pyにプロンプトを直接書いています。コード規則をそのまま書いているのでプロンプトが長いです。

$ tree
.
├── Dockerfile_RAG
├── dockerbuild-run.sh
├── dockerstop-imgdell.sh
└── work
    └── bedrock-test.py

実行方法

シェルスクリプトdockerbuild-run.shを実行すると実行環境のコンテナがビルド→実行し、実行したコンテナに入った状態でカレントディレクトリがworkに移動します。あとは、python bedrock-test.pyでpythonスクリプトを実行するだけです。

プロンプトについて

プロンプトについて

Bedrockに入力するプロンプトは以下のようにしました。
コード作成対象を間違えてEFSでなくVPCのコードを書くことがあったので、対象間違えを防止するため念押しの文言を記載しました。

Human: コード作成の制限事項とCDKコードの作成規則に準拠し、EFSを作成するコードを書いて下さい。念押ししますが、作成するのはAmazon EFSをデプロイするコードです。

コード作成の制限事項<restriction></restriction>
CDKコードの作成規則は<rule></rule>

<restriction>
・aws cdk v2 スクリプト
・プログラム言語はTypeScript
・cdkコマンドは東京リージョンの環境で実行
</restriction>
<rule>
(略 コード作成の規則を書く)
</rule>
\nAssistant:

パラメータ

プロンプトのパラメータはこのようにしました。
回答が切れないように"max_tokens_to_sample"を1500としましたが、さらに長いコードを書いてもらうなら最大値(2023年12月時点 4096)にしても良いかも。
"temperature"は0.7とし結果にブレが少なくなるようにしました。

body = json.dumps({
    "prompt": prompt,
    "max_tokens_to_sample": 1500,
    "temperature": 0.7,
    "top_k": 1,
    "stop_sequences": ["\n\nHuman"]
})

実行結果

実行結果です。ファイルを3つに分割したり、各ファイルで記載することが規則にある程度沿っています。

root@b8fdd153d25e:/work# python bedrock-test.py 
Generated completion:
 はい、コード作成の制限事項と規則を確認しました。
EFSを作成するCDKコードの例をTypeScriptで書いてみました。

\```typescript
// lib/Origin/Efs.ts

import { Stack, StackProps, CfnOutput } from 'aws-cdk-lib';
import { FileSystem, LifecyclePolicy } from 'aws-cdk-lib/aws-efs';

export interface EfsSet {
  // EFSの名前
  readonly EfsName: string;
  
  // EFSの暗号化設定
  readonly Encrypted: boolean; 
  
  // EFSのライフサイクルポリシー
  readonly LifecyclePolicy?: LifecyclePolicy;
}

export interface EfsProps extends StackProps {
  // EFS設定
  readonly EfsSet: EfsSet;
}

export class EfsStack extends Stack {

  public readonly fileSystem: FileSystem;

  constructor(scope: Construct, id: string, props: EfsProps) {
    super(scope, id, props);

    // EFS作成
    this.fileSystem = new FileSystem(this, props.EfsSet.EfsName, {
      encrypted: props.EfsSet.Encrypted,
      lifecyclePolicy: props.EfsSet.LifecyclePolicy
    });

    // 出力
    new CfnOutput(this, 'FileSystemId', {
      value: this.fileSystem.fileSystemId
    });
  }
}
\```

\```typescript
// lib/Combination/EfsStack.ts

import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { EfsStack } from '../Origin/Efs';

export interface EfsCombinationProps extends StackProps {
  // EFS設定
  readonly EfsSet: EfsSet[]; 
}

export class EfsCombinationStack extends Stack {

  constructor(scope: Construct, id: string, props: EfsCombinationProps) {
    super(scope, id, props);

    // EFSを複数作成
    for (const efsSet of props.EfsSet) {
      new EfsStack(this, `Efs${efsSet.EfsName}`, {
        EfsSet: efsSet
      });
    }
  }
}
\```

\```typescript
// bin/root-pj01-stg.ts 

import { App } from 'aws-cdk-lib';
import { EfsCombinationStack } from '../lib/Combination/EfsStack';
import { efsSet } from '../data/pj01-stg/EfsSet.json';

const app = new App();

new EfsCombinationStack(app, 'Pj01StgEfsStack', {
  EfsSet: efsSet
});
\```

このようにEFSの作成処理をOriginとCombinationに分け、
Combinationで複数のEFSを作成できるようにしてみました。
コードの規則に沿うように意識しましたが、ご確認いただけますと幸いです。
root@b8fdd153d25e:/work# 

感想

完全に期待したコードの作成はできてないですが、プロンプトの改良やKendraも併用すると精度があがりそうと思いました。プロンプトの改良については、サンプルコードも記載するなどで作成するコードがより期待に近いものになりそうな気がします。

Discussion