Skip to content

Commit 7b00e33

Browse files
Merge pull request #64 from wowzoo/master
new demos
2 parents ee9314a + 7eb436c commit 7b00e33

31 files changed

+1136
-29
lines changed

genai/genai-app-demo/01-prompt-engineering-demo/README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,23 @@
77
88
1. [Prompt Demo](./frontUI/app/pages/1_Prompt_Demo.py)
99
- 질문/답변 형식의 일반적인 GenAI 데모입니다.
10-
2. [Review Summary Demo](./frontUI/app/pages/2_Review_Summary_Demo.py)
10+
2. [Review Summary Demo](./frontUI/app/pages/2_Review_Summary.py)
1111
- 무신사에서 판매중인 상품의 리뷰들을 모아 분석해서 색상, 핏, 소재, 세탁, 가격 등의 항목으로 보여줍니다.
12-
3. [Review Comment Demo](./frontUI/app/pages/3_Review_Comment_Demo.py)
12+
3. [Review Comment Demo](./frontUI/app/pages/3_Review_Comment.py)
1313
- 무신사의 고객들이 작성한 리뷰를 분석해서 상품에 대한 구매자의 Sentiment 를 추측하고 이에 적합한 답변을 생성해 줍니다.
14-
4. [Product Identify Demo](./frontUI/app/pages/4_Product_Identify_Demo.py)
14+
4. [Product Identify Demo](./frontUI/app/pages/4_Product_Identify.py)
1515
- 신발 이미지를 올리면 이미지를 분석해서 상품에 대한 정보와 이와 비슷한 아디다스 신발을 추천해 줍니다.
1616
- 현재는 Claude 3의 정보로만 신발을 추천해 주는데 고객사의 상품 데이터로 DB를 구축하면 고객사의 상품에서만 추천을 할 수 있다고 가이드합니다.
1717
5. [Video ShotForm](./frontUI/app/pages/5_Video_ShotForm.py)
1818
- 무신사는 MUSINSA TV 라는 유투브 채널을 운영중인데 다양한 동영상들이 있습니다. 대부분 길이가 10분 이상인 동영상들인데 숏폼이 유행하는 현재 트렌드에 맞게 이러한 동영상의 핵심만 요약해서 1분 내외의 짧은 동영상으로 바꾸어 줍니다.
19-
19+
6. [Product Block](./frontUI/app/pages/6_Product_Block.py)
20+
- 이미지를 식별해서 광고용으로 쓸 수 있는 이미지 인지 아닌지 판단합니다.
21+
7. [Image Generation](./frontUI/app/pages/7_Image_Generation.py)
22+
- 텍스트를 입력으로 받아 텍스트가 묘사하는 이미지를 생성합니다.
23+
8. [Image Variation](./frontUI/app/pages/8_Image_Variation.py)
24+
- 주어진 이미지를 바탕으로 새로운 이미지를 만들어 냅니다.
25+
9. [Image Replace](./frontUI/app/pages/9_Image_Replace.py)
26+
- 주어진 이미지에서 특정 키워드를 제공 받아 키워드에 해당하는 부분만 남기고 이미지를 바꿉니다.
2027

2128
## Architecture
2229
Backend를 구성하는 아키텍처입니다. Frontend는 Streamlit을 사용하였습니다.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from aws_cdk import (
2+
RemovalPolicy, Duration,
3+
aws_ec2 as ec2,
4+
aws_ecr as ecr,
5+
aws_lambda as lambda_,
6+
aws_ecr_assets as ecr_assets,
7+
aws_iam as iam,
8+
aws_elasticloadbalancingv2 as elbv2,
9+
aws_elasticloadbalancingv2_targets as targets,
10+
)
11+
from constructs import Construct
12+
from . import ECR_LAMBDA_POLICY
13+
from cdk_ecr_deployment import DockerImageName, ECRDeployment
14+
15+
16+
class ImageGen(Construct):
17+
18+
def __init__(self, scope: Construct, id_: str, vpc: ec2.Vpc, sg: ec2.SecurityGroup,
19+
role: iam.Role, listener: elbv2.ApplicationListener, bucket_name: str) -> None:
20+
super().__init__(scope, id_)
21+
22+
# Prompt Repo
23+
self.ecr_repo = ecr.Repository(
24+
self,
25+
'ImageGenRepo',
26+
repository_name='image-gen',
27+
removal_policy=RemovalPolicy.DESTROY,
28+
empty_on_delete=True
29+
)
30+
31+
self.ecr_repo.add_to_resource_policy(
32+
statement=ECR_LAMBDA_POLICY
33+
)
34+
35+
image_asset = ecr_assets.DockerImageAsset(
36+
self,
37+
'ImageGenDockerImage',
38+
directory='sample_source/containers/image_gen/',
39+
platform=ecr_assets.Platform.LINUX_AMD64
40+
)
41+
image_asset.node.add_dependency(self.ecr_repo)
42+
43+
ecr_deployment = ECRDeployment(
44+
self,
45+
'DeployImageGenImage',
46+
src=DockerImageName(image_asset.image_uri),
47+
dest=DockerImageName(
48+
f'{self.ecr_repo.repository_uri}:{image_asset.asset_hash}'
49+
)
50+
)
51+
ecr_deployment.node.add_dependency(image_asset)
52+
53+
lambda_func = lambda_.DockerImageFunction(
54+
self,
55+
'ImageGen',
56+
function_name='ImageGen',
57+
code=lambda_.DockerImageCode.from_ecr(
58+
repository=self.ecr_repo,
59+
tag_or_digest=image_asset.asset_hash
60+
),
61+
memory_size=512,
62+
timeout=Duration.seconds(300),
63+
role=role,
64+
vpc=vpc,
65+
vpc_subnets=ec2.SubnetSelection(
66+
subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS
67+
),
68+
security_groups=[sg],
69+
environment={
70+
'BEDROCK_REGION_NAME': 'us-west-2',
71+
'BUCKET_NAME': bucket_name,
72+
}
73+
)
74+
lambda_func.node.add_dependency(ecr_deployment)
75+
76+
target_group = listener.add_targets(
77+
'ImageGenTarget',
78+
target_group_name='image-gen-tg',
79+
targets=[targets.LambdaTarget(lambda_func)],
80+
conditions=[
81+
elbv2.ListenerCondition.path_patterns(['/image'])
82+
],
83+
priority=7
84+
)
85+
target_group.node.add_dependency(lambda_func)
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from aws_cdk import (
2+
RemovalPolicy, Duration,
3+
aws_ec2 as ec2,
4+
aws_ecr as ecr,
5+
aws_lambda as lambda_,
6+
aws_ecr_assets as ecr_assets,
7+
aws_iam as iam,
8+
aws_elasticloadbalancingv2 as elbv2,
9+
aws_elasticloadbalancingv2_targets as targets,
10+
)
11+
from constructs import Construct
12+
from . import ECR_LAMBDA_POLICY
13+
from cdk_ecr_deployment import DockerImageName, ECRDeployment
14+
15+
16+
class ImageReplace(Construct):
17+
18+
def __init__(self, scope: Construct, id_: str, vpc: ec2.Vpc, sg: ec2.SecurityGroup,
19+
role: iam.Role, listener: elbv2.ApplicationListener, bucket_name: str) -> None:
20+
super().__init__(scope, id_)
21+
22+
# Prompt Repo
23+
self.ecr_repo = ecr.Repository(
24+
self,
25+
'ImageReplaceRepo',
26+
repository_name='image-replace',
27+
removal_policy=RemovalPolicy.DESTROY,
28+
empty_on_delete=True
29+
)
30+
31+
self.ecr_repo.add_to_resource_policy(
32+
statement=ECR_LAMBDA_POLICY
33+
)
34+
35+
image_asset = ecr_assets.DockerImageAsset(
36+
self,
37+
'ImageReplaceDockerImage',
38+
directory='sample_source/containers/image_replace/',
39+
platform=ecr_assets.Platform.LINUX_AMD64
40+
)
41+
image_asset.node.add_dependency(self.ecr_repo)
42+
43+
ecr_deployment = ECRDeployment(
44+
self,
45+
'DeployImageReplaceImage',
46+
src=DockerImageName(image_asset.image_uri),
47+
dest=DockerImageName(
48+
f'{self.ecr_repo.repository_uri}:{image_asset.asset_hash}'
49+
)
50+
)
51+
ecr_deployment.node.add_dependency(image_asset)
52+
53+
lambda_func = lambda_.DockerImageFunction(
54+
self,
55+
'ImageReplace',
56+
function_name='ImageReplace',
57+
code=lambda_.DockerImageCode.from_ecr(
58+
repository=self.ecr_repo,
59+
tag_or_digest=image_asset.asset_hash
60+
),
61+
memory_size=512,
62+
timeout=Duration.seconds(300),
63+
role=role,
64+
vpc=vpc,
65+
vpc_subnets=ec2.SubnetSelection(
66+
subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS
67+
),
68+
security_groups=[sg],
69+
environment={
70+
'BEDROCK_REGION_NAME': 'us-west-2',
71+
'BUCKET_NAME': bucket_name,
72+
}
73+
)
74+
lambda_func.node.add_dependency(ecr_deployment)
75+
76+
target_group = listener.add_targets(
77+
'ImageReplaceTarget',
78+
target_group_name='image-replace-tg',
79+
targets=[targets.LambdaTarget(lambda_func)],
80+
conditions=[
81+
elbv2.ListenerCondition.path_patterns(['/replace'])
82+
],
83+
priority=9
84+
)
85+
target_group.node.add_dependency(lambda_func)
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from aws_cdk import (
2+
RemovalPolicy, Duration,
3+
aws_ec2 as ec2,
4+
aws_ecr as ecr,
5+
aws_lambda as lambda_,
6+
aws_ecr_assets as ecr_assets,
7+
aws_iam as iam,
8+
aws_elasticloadbalancingv2 as elbv2,
9+
aws_elasticloadbalancingv2_targets as targets,
10+
)
11+
from constructs import Construct
12+
from . import ECR_LAMBDA_POLICY
13+
from cdk_ecr_deployment import DockerImageName, ECRDeployment
14+
15+
16+
class ImageVariation(Construct):
17+
18+
def __init__(self, scope: Construct, id_: str, vpc: ec2.Vpc, sg: ec2.SecurityGroup,
19+
role: iam.Role, listener: elbv2.ApplicationListener, bucket_name: str) -> None:
20+
super().__init__(scope, id_)
21+
22+
# Prompt Repo
23+
self.ecr_repo = ecr.Repository(
24+
self,
25+
'ImageVariationRepo',
26+
repository_name='image-variation',
27+
removal_policy=RemovalPolicy.DESTROY,
28+
empty_on_delete=True
29+
)
30+
31+
self.ecr_repo.add_to_resource_policy(
32+
statement=ECR_LAMBDA_POLICY
33+
)
34+
35+
image_asset = ecr_assets.DockerImageAsset(
36+
self,
37+
'ImageVariationDockerImage',
38+
directory='sample_source/containers/image_variation/',
39+
platform=ecr_assets.Platform.LINUX_AMD64
40+
)
41+
image_asset.node.add_dependency(self.ecr_repo)
42+
43+
ecr_deployment = ECRDeployment(
44+
self,
45+
'DeployImageVariationImage',
46+
src=DockerImageName(image_asset.image_uri),
47+
dest=DockerImageName(
48+
f'{self.ecr_repo.repository_uri}:{image_asset.asset_hash}'
49+
)
50+
)
51+
ecr_deployment.node.add_dependency(image_asset)
52+
53+
lambda_func = lambda_.DockerImageFunction(
54+
self,
55+
'ImageVariation',
56+
function_name='ImageVariation',
57+
code=lambda_.DockerImageCode.from_ecr(
58+
repository=self.ecr_repo,
59+
tag_or_digest=image_asset.asset_hash
60+
),
61+
memory_size=512,
62+
timeout=Duration.seconds(300),
63+
role=role,
64+
vpc=vpc,
65+
vpc_subnets=ec2.SubnetSelection(
66+
subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS
67+
),
68+
security_groups=[sg],
69+
environment={
70+
'BEDROCK_REGION_NAME': 'us-west-2',
71+
'BUCKET_NAME': bucket_name,
72+
}
73+
)
74+
lambda_func.node.add_dependency(ecr_deployment)
75+
76+
target_group = listener.add_targets(
77+
'ImageVariationTarget',
78+
target_group_name='image-variation-tg',
79+
targets=[targets.LambdaTarget(lambda_func)],
80+
conditions=[
81+
elbv2.ListenerCondition.path_patterns(['/variation'])
82+
],
83+
priority=8
84+
)
85+
target_group.node.add_dependency(lambda_func)
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
from aws_cdk import (
2+
RemovalPolicy, Duration,
3+
aws_ec2 as ec2,
4+
aws_ecr as ecr,
5+
aws_lambda as lambda_,
6+
aws_ecr_assets as ecr_assets,
7+
aws_iam as iam,
8+
aws_elasticloadbalancingv2 as elbv2,
9+
aws_elasticloadbalancingv2_targets as targets,
10+
)
11+
from constructs import Construct
12+
from . import ECR_LAMBDA_POLICY
13+
from cdk_ecr_deployment import DockerImageName, ECRDeployment
14+
15+
16+
class ProductBlock(Construct):
17+
18+
def __init__(self, scope: Construct, id_: str, vpc: ec2.Vpc, sg: ec2.SecurityGroup,
19+
role: iam.Role, listener: elbv2.ApplicationListener) -> None:
20+
super().__init__(scope, id_)
21+
22+
# Prompt Repo
23+
self.ecr_repo = ecr.Repository(
24+
self,
25+
'ProductBlockRepo',
26+
repository_name='product-block',
27+
removal_policy=RemovalPolicy.DESTROY,
28+
empty_on_delete=True
29+
)
30+
31+
self.ecr_repo.add_to_resource_policy(
32+
statement=ECR_LAMBDA_POLICY
33+
)
34+
35+
image_asset = ecr_assets.DockerImageAsset(
36+
self,
37+
'ProductBlockDockerImage',
38+
directory='sample_source/containers/product_block/',
39+
platform=ecr_assets.Platform.LINUX_AMD64
40+
)
41+
image_asset.node.add_dependency(self.ecr_repo)
42+
43+
ecr_deployment = ECRDeployment(
44+
self,
45+
'DeployProductBlockImage',
46+
src=DockerImageName(image_asset.image_uri),
47+
dest=DockerImageName(
48+
f'{self.ecr_repo.repository_uri}:{image_asset.asset_hash}'
49+
)
50+
)
51+
ecr_deployment.node.add_dependency(image_asset)
52+
53+
lambda_func = lambda_.DockerImageFunction(
54+
self,
55+
'ProductBlock',
56+
function_name='ProductBlock',
57+
code=lambda_.DockerImageCode.from_ecr(
58+
repository=self.ecr_repo,
59+
tag_or_digest=image_asset.asset_hash
60+
),
61+
memory_size=512,
62+
timeout=Duration.seconds(300),
63+
role=role,
64+
vpc=vpc,
65+
vpc_subnets=ec2.SubnetSelection(
66+
subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS
67+
),
68+
security_groups=[sg],
69+
environment={
70+
'BEDROCK_REGION_NAME': 'us-west-2',
71+
}
72+
)
73+
lambda_func.node.add_dependency(ecr_deployment)
74+
75+
target_group = listener.add_targets(
76+
'ProductBlockTarget',
77+
target_group_name='product-block-tg',
78+
targets=[targets.LambdaTarget(lambda_func)],
79+
conditions=[
80+
elbv2.ListenerCondition.path_patterns(['/block'])
81+
],
82+
priority=6
83+
)
84+
target_group.node.add_dependency(lambda_func)

genai/genai-app-demo/01-prompt-engineering-demo/bedrock_demo/codecontrol/deploy_image.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ def __init__(self, scope: Construct, id_: str,
4444
statements=[
4545
iam.PolicyStatement(
4646
actions=[
47-
'bedrock:InvokeModel'
47+
'bedrock:InvokeModel',
48+
'bedrock:InvokeModelWithResponseStream'
4849
],
4950
resources=['arn:aws:bedrock:us-west-2::foundation-model/*'],
5051
effect=iam.Effect.ALLOW

0 commit comments

Comments
 (0)