이번 편에서는 클라이언트가 대화를 주고받을 Bedrock 에이전트를 구축할 것이다. 현재까지는 아키텍처 구축 과정에서 시간 및 비용 절감을 위해 Claude 3 Haiku FM을 사용했지만, 지금부터는 Claude 3 Sonnet 기반의 에이전트를 직접 구축하여 사용할 것이다.
먼저 에이전트를 생성하자.

Edit in Agent Builder를 눌러 Agent Builder에 진입한다.

에이전트 Resoucre Role은 처음 만든다면 신규로, 혹은 기존 Role이 있다면 기존 Role을 사용하면 된다.

참고로 이 Role은 사용자가 필요로 하는 모델을 호출하는 bedrock:InvokeModel,모델델의 추론 프로파일을에 접근하는 bedrock:GetInferenceProfile, 그리고 Foundation Model에 접근하는 bedrock:GetFoundationModel 권한을 아우르고 있다.
모델은 글 작성 시점을 기준으로 Claude 3 Sonnet을 사용하였으며, 이후 Cluade 3.5 Sonnet V2로 교체하였다.
이후 지침을 작성하여 에이전트가 어떤 역할을 해야 하는지, 어떤 답변을 해야 하는지 작성하였다. 해당 지침은 서비스 운영에 중요한 정보를 담고 있는 관계로 세부적으로 다루지는 않는 점 양해 바란다.
아래 내용은 지식 기반을 처음 구축하는 과정을 정리한 것으로, 요금 문제로 채택되지 않았다. 비용 절감을 위한 최종 지식기반 구축 과정은 다음 글에 보다 상세히 설명하였다.
이어서 에이전트가 참조할 지식기반을 생성하였다. Claude 3 Sonnet 기준으로 기본적인 타로 카드들의 의미와 역할은 알고 있지만 점을 보는 상세한 방법과 리딩은 별도의 문서를 구축할 필요가 있었다. 명확히 밝히기는 어려우나 여러 카드 해석 문서와 인터뷰, 도서 등을 종합하여 기반이 될 문서를 작성하였다.
먼저 지식기반이 될 해당 문서를 버킷에 업로드했다. 해당 버킷에 따로 퍼블릭 설정을 해둘 필요는 없다.
문서 생성에 대한 상세한 내용은 7편에서 서술하겠다.

지식기반 생성은 루트 계정에서 불가능한 작업으로, 반드시 IAM 계정에서 수행해야 한다. 에이전트에게 상세한 지침을 튜닝하는 것은 함께 프로젝트를 하는 PM이 담당하기에 PM이 사용할 IAM 계정에서 지식기반 생성과 테스트가 가능하도록 아래와 같은 정책들을 부여하였다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3SpecificBucketAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::your-specific-bucket-name",
"arn:aws:s3:::your-specific-bucket-name/*"
]
},
{
"Sid": "S3ListAllMyBuckets",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "BedrockFullAccess",
"Effect": "Allow",
"Action": [
"bedrock:*"
],
"Resource": "*"
},
{
"Sid": "OpenSearchServerlessFullAccess",
"Effect": "Allow",
"Action": [
"aoss:*"
],
"Resource": "*"
},
{
"Sid": "IAMRoleManagement",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:PutRolePolicy",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetRole",
"iam:GetRolePolicy",
"iam:ListRolePolicies",
"iam:ListAttachedRolePolicies",
"iam:UpdateRole",
"iam:UpdateRoleDescription"
],
"Resource": "arn:aws:iam::*:role/service-role/AmazonBedrockExecutionRoleForKnowledgeBase_*"
},
{
"Sid": "IAMPolicyManagement",
"Effect": "Allow",
"Action": [
"iam:CreatePolicy",
"iam:DeletePolicy",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:ListPolicyVersions",
"iam:CreatePolicyVersion",
"iam:DeletePolicyVersion",
"iam:SetDefaultPolicyVersion"
],
"Resource": "*"
},
{
"Sid": "IAMPassRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:PassedToService": [
"bedrock.amazonaws.com",
"aoss.amazonaws.com",
"lambda.amazonaws.com"
]
}
}
},
{
"Sid": "LambdaAccess",
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:GetFunction",
"lambda:InvokeFunction",
"lambda:CreateFunction",
"lambda:DeleteFunction",
"lambda:UpdateFunctionCode",
"lambda:UpdateFunctionConfiguration"
],
"Resource": "*"
}
]
}
그 후 IAM계정으로 전환하여 지식기반 구축을 계속하였다.
Bedrock Agent를 사용하도록 sendMessage 함수를 업데이트
IAM policy 수정: FM에 대한 권한 대신 Agent에 대한 권한 부여

먼저 지식기반 이름을 지정하고 새 IAM Role을 생성한다. 또 데이터 소스로는 S3를 선택한다.

이어서 데이터 소스가 되는 RTF 문서를 찾아 데이터 소스로 지정한다.

이후 텍스트를 벡터화하기 위해 임베딩 모델을 선택한다. 나의 경우 Titan Text embeddings V2를 사용하였다. 또 벡터 DB의 경우 권장값인 OpenSearch Serverless를 사용하였다.
(처음에는 OpenSearch Serverless를 이용해 벡터 저장소를 구축하였으나, 구축 후 비용이 너무 많이 드는 관계로 Aurora Serverless로 재구축하였다. 다음 편에서 서술.)

스크린샷을 깜빡했는데, 여기서 다음 단계로 넘어가서 선택한 사항들에 대한 검토를 마치면 지식기반 생성이 가능하다.
참고로 버킷에 업로드된 지식기반 문서가 업데이트될 경우 이 작업 또한 다시 수행해 주어야 한다.
지식 기반 생성을 마쳤다면 다시 기존 에이전트로 돌아와서 지식기반을 연결하는 것으로 에이전트 생성이 마무리된다.
