Amazon Bedrock実装⑥:設計した規則に従いコードを生成するか試してみる
はじめに
Bedrockで、コードの設計規則(記載規則)に従いCDKのコードを作成させてみました。今まで、設計規則は担当者が理解し、その規則に従いコードを作成していましたが、これをAIにやってもらえるかの検証です。
参考
- Anthropic Claude models
- Amazon Bedrock テキストモデルのプロンプトテンプレートと例
構成
構成は以下と同じで、BedrockとそれをコールするPythonスクリプトです。
ソース
ソースはgithubに置きました。
ファイル構成は以下です。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