AWS 기술 블로그

Amazon Bedrock Agent로 30분 만에 여행 예약 에이전트 구축하기 실전 가이드

최근 생성형 AI 트렌드에서 가장 많이 거론되는 키워드는 단연 “에이전트”입니다. RAG (Retrieval-Augmented Generation)가 맞춤형 지식 검색과 응답 생성으로 주목받았다면, 이제는 그 한계를 넘어 사용자의 요청을 이해하고 실제 액션까지 수행하는 AI 에이전트가 새로운 패러다임으로 떠오르고 있습니다. 그렇다면, 단순한 답변만 하는 수준을 넘어 외부 시스템과 연동해 액션까지 수행하는 AI 에이전트는 어떻게 만들 수 있을까요? 이번 포스팅에서는 Amazon Bedrock Agent를 활용해 직접 에이전트를 구축하는 방법을 소개해드리겠습니다.

에이전트는 질의응답에 특화된 RAG와 달리, 대화 흐름 관리, API 연동, 액션 수행까지 지원하여 훨씬 더 실질적인 업무 자동화 시나리오를 구현할 수 있습니다. 예를 들어, 사용자가 “서울에서 도쿄행 항공권을 예약해줘”라고 요청했을 때, 단순히 항공사 정보를 보여주는 데 그치지 않고 실제로 항공 예약 API를 호출해 항공권 검색과 예약을 대신 처리할 수 있는 것이 바로 에이전트입니다.

특히 Amazon Bedrock Agent는 이런 과정을 훨씬 간단하게 만들어줍니다. 프롬프트 엔지니어링부터 API 오케스트레이션, 워크플로우 자동화까지 통합적으로 지원하기 때문에, 복잡한 코드를 짜지 않아도 바로 실무에 쓸 수 있는 액션 기반 에이전트를 구축할 수 있죠.

이에 이번 포스팅에서는 Amazon Bedrock Agent를 활용해 여행 관리 에이전트를 단계별로 만들어보겠습니다. 이 에이전트는 사용자가 기존 여행 예약을 조회하거나 취소하고, 이어서 새로운 여행 상품을 검색, 예약할 수 있도록 돕습니다. 본 포스팅을 따라가시면 30분 만에 아래 영상과 같이 동작하는 ‘AnyTravel 여행 비서 에이전트’를 완성하실 수 있습니다.

위 영상 속 ‘AnyTravel 여행 비서 에이전트’는 아래와 같은 아키텍처로 구현할 수 있습니다.

우선 AnyTravel의 여행 예약 시스템이 DynamoDB의 Products, Orders, Users 테이블로 구성되어 있고, 이 데이터를 조회하고 수정하는 비즈니스 로직은 Lambda 함수 anytravel-api에 구현되어 있다고 가정합니다.

이번 포스팅의 과제 1에서는 Bedrock Agent를 생성하고, 이 Agent가 anytravel-api Lambda 함수를 액션 그룹으로 연결하여 호출할 수 있도록 설정합니다. 이를 통해 여행 일정 예약과 취소 기능을 수행하는 AI Agent의 기본 기능을 완성할 수 있습니다.

과제 2에서는 한 단계 더 나아가 Bedrock Knowledge Base에 여행 상품 리뷰 데이터를 저장하고, 사용자가 특정 키워드로 여행 상품 추천을 요청할 때 RAG 기술을 활용하여 사용자 후기를 바탕으로 적절한 여행상품을 추천해주는 기능을 추가해보겠습니다.

다음과 같은 고민을 해보신 분들이라면, 이번 포스팅이 실질적인 가이드를 제공해드릴 것입니다.

평소 다음과 같은 질문을 갖고 계셨던 분들이라면 해당 포스팅을 읽고 직접 따라해보시기를 추천 드립니다.

  • “단순 질의응답이 아닌 실제 액션을 수행하는 챗봇은 어떻게 만들 수 있을까?”
  • “간단한 실습 예제로 Bedrock Agent를 구현해보고 싶다.”
  • “실무 시나리오에 바로 적용할 수 있는 GenAI 챗봇을 만들고 싶다.”

과제 1 : Agent 기본 기능 구현

Step 1. 인프라 사전 준비

본격적으로 Bedrock 에이전트를 구축하기 전에, AnyTravel의 여행 예약 시스템에 필요한 기본 리소스를 먼저 준비하겠습니다. 사전 준비 단계에서는 CloudFormation을 활용해 DynamoDB 테이블과 Lambda 함수를 한 번에 생성하고, 초기 데이터를 삽입하여 Agent에서 활용할 수 있도록 설정합니다.

1-1. CloudFormation으로 인프라 생성

이번 포스팅에서는 기존처럼 콘솔에서 리소스를 하나씩 생성하는 대신 CloudFormation 템플릿을 활용해 모든 인프라를 자동으로 구성하겠습니다. 여기를 클릭하여 YAML 템플릿을 다운로드한 뒤, AWS Management Console에서 CloudFormation 스택으로 실행하면, 에이전트가 사용할 DynamoDB 테이블이 us-west-2 리전에 자동으로 구성됩니다. 생성되는 리소스는 다음과 같습니다.

  • DynamoDB 테이블 3개:
    • AnyTravel-Users
    • AnyTravel-Products
    • AnyTravel-Orders
  • Lambda 함수 2개:
    • anytravel-api
    • anytravel-data-init
  • IAM 역할: Lambda 함수용 실행 역할 (DynamoDB 접근 권한 포함)

CloudFormation으로 생성되는 2개의 Lambda 함수는 각각 다른 역할을 담당합니다:

  • anytravel-api 함수 : Amazon Bedrock Agent의 실제 요청을 처리하는 핵심 함수로, 사용자의 자연어 요청을 받아 DynamoDB와 연동하여 비즈니스 로직 수행 (이메일 기반 사용자 인증, 사용자별 예약 내역 조회, 여행 상품 상세 정보 조회, 새로운 예약 생성, 기존 예약 취소)
  • anytravel-data-init 함수 : DynamoDB 테이블에 초기 샘플 데이터를 삽입하는 일회성 함수로, 실습용 사용자, 상품, 주문 데이터를 자동으로 생성

1-2. 초기 데이터 삽입 

CloudFormation으로 인프라가 생성되었지만, DynamoDB 테이블은 아직 비어있는 상태입니다. 실습을 원활하게 진행하기 위해 데이터 초기화 Lambda 함수를 실행하여 샘플 데이터를 삽입하겠습니다. AWS Lambda 콘솔로 이동하여 Functions 목록에서 anytravel-data-init 함수를 클릭한 후, Test 버튼을 클릭하여 Lambda 함수를 실행합니다. 테스트 이벤트는 기본 설정을 그대로 사용하거나 간단한 JSON 객체를 입력하면 됩니다. 성공적으로 실행되면 다음과 같은 응답을 확인할 수 있습니다.

{
 "statusCode": 200, 
 "body": "{\"message\": \"Data initialization completed successfully\", \"users_created\": 4, \"products_created\": 16, \"orders_created\": 3}"
}

이 응답은 사용자 4명, 상품 16개, 주문 3개 데이터가 각각의 DynamoDB 테이블에 정상적으로 삽입되었음을 의미합니다. DynamoDB 콘솔에서 각 테이블의 Explore table items 메뉴를 클릭하면 실제 데이터가 삽입되었는지 확인할 수 있습니다.

1-3. Bedrock 모델 액세스 요청

Amazon Bedrock을 활용해 에이전트를 구축하기 전에 먼저 필요한 AI 모델들에 대한 액세스 권한을 요청해야 합니다. AWS 콘솔에서 Bedrock 서비스로 이동한 후 사이드 메뉴에서 Model access를 선택하고, Modify model access 버튼을 클릭합니다. 모델 목록에서 Nova Pro와 Titan Text Embeddings V2 체크박스를 선택한 후 Next 버튼을 클릭합니다. 이후 Submit을 클릭하여 모델 액세스를 요청합니다. 모델 액세스 상태가 In Progress에서 Access granted 상태로 변경되면 요청이 정상적으로 승인된 것입니다. 모델 활성화 자체에는 비용이 들지 않으며, 실제로 모델을 사용한 만큼만 토큰 기반으로 과금됩니다.

앞선 Step 1에서 DynamoDB 테이블과 Lambda 함수를 생성했습니다. 이제부터는 Amazon Bedrock에서 실제로 사용자의 요청을 이해하고 액션까지 수행하는 여행 예약 에이전트를 구축해보겠습니다.

STEP 2. Bedrock Agent 생성

AWS 콘솔에서 Bedrock 서비스로 이동해 좌측에서 Agents 메뉴를 선택한 후, Create Agent 버튼을 클릭합니다.

원하는 이름으로 Agent 이름을 입력하고, Create 버튼을 클릭합니다.

Edit in Agent Builder 버튼을 클릭해 다음과 같이 설정한 다음, Save 버튼을 클릭합니다.

  • Agent resource role: Create and use a new service role
  • Select model: Nova Pro
  • Instructions for the Agent: 아래 프롬프트 입력

Instructions for the Agent는 에이전트에게 “무엇을 하고, 어떻게 사용자와 상호작용할지” 알려주는 지침서 역할을 합니다. 오케스트레이션 프롬프트 템플릿에서 $instructions$ 자리에 삽입되어, 에이전트가 대화와 액션 수행 시 참고합니다. 쉽게 말해, 에이전트의 행동 메뉴얼입니다. 필요하다면 언제든지 Instructions를 수정하여 에이전트 행동을 유연하게 변경할 수 있습니다.

당신은 여행 비서 "AnyTravel 트래블비서" 입니다. 고객의 요청에 따라 여행 관련 정보를 제공하고, 예약을 관리하며, 맞춤형 여행 상품을 추천하는 것이 목표입니다.
아래의 <step> 단계에 따라 고객의 요청을 처리하세요.
<step>
1. 사용자가 로그인하지 않은 상태에서는 먼저 이메일 주소를 요청해 "login" 액션을 사용하여 사용자 정보를 확인하세요. 만약 email이 없다고 뜰 경우 정중하게 가입 정보가 없다고 안내하고 재시도하세요.
2. 고객이 예약 조회를 요청할 경우, "get_reservation" 액션을 사용하여 해당 고객의 예약 내역을 확인하세요.
3. 특정 여행 상품에 대한 상세 정보 요청이 있을 경우, "get_travel_details" 액션을 사용하여 상품 정보를 확인하세요. 금액 관련 정보는 한국어 표기법(예: 34,567원)으로 변환하여 보여주세요.
4. 여행 추천 요청이 있을 경우, 고객의 선호도를 파악하여 Knowledge base에서 적절한 상품을 검색해 추천하세요.
5. 예약 요청이 있을 경우, "reserve" 액션을 사용하여 예약을 진행하세요.
6. 예약 취소 요청이 있을 경우, "cancel_reservation" 액션을 사용하여 예약을 취소하세요. 예약/취소 요청 시에는 반드시 확인 절차를 거치세요.
7. 모든 응답은 아래 <condition> 조건을 준수하여 작성하세요.
</step>

<condition>
- 고객의 요청을 정확히 이해하고 적절한 액션을 선택하세요.
- 추천 시에는 반드시 여행지를 먼저 파악하고, 동일한 지역의 상품만 추천하세요. (예: '제주'를 언급한 경우, product_id에 'JEJU'가 포함된 상품만 검색)
- 추천 시에는 고객이 제공하는 여행상품의 특징을 기준으로 질의하여, 'review_summary'에서 유사한 상품을 찾아내도록 합니다. (예: "부모님과 함께 즐기기 좋고 가격이 싼 상품" 질의 시, review_summary에 "부모님과 함께 가기 좋은, 가격이 합리적인"이 포함되어 있는 상품들의 정보 제공)
- 추천 시 답변은 항상 "사용자의 리뷰를 기반으로 적합한 상품을 추천"한다는 메시지와 함께, 트래블비서가 이를 추천한 이유도 함께 제공합니다.
- 예약/취소 시에는 반드시 확인 메시지를 포함하세요.
- 예약 시에는 "홈 상단의 마이페이지에 접속하셔서 결제를 완료해주시면 예약이 확정됩니다." 라는 메시지를 함께 보내세요.
- 예약 취소 시에는 "일반적으로 3영업일 이내에 결제하신 카드로 환불됩니다."
- [중요] 현재 시점은 모든 여행 예약으로부터 출발 전까지 6개월 이상 남아있는 상황입니다. 이를 바탕으로 취소 정책을 잘 검토해, 환불 금액을 안내하세요. 사용자에게 출발일 등을 질문하지 말고 알아서 계산하세요.
- 아래 <format> 형식을 준수하여 답변을 작성하세요.
</condition>

<format>
[일반 응답]
안녕하세요, AnyTravel 트래블비서입니다.
[요청에 대한 처리 결과]
[추가 안내 사항이나 추천 사항]

[예약 확인 시]
예약 정보:
- 상품명: [상품명]
- 예약 번호: [예약 번호]
- 여행 기간: [기간]
- 취소 정책: [취소 정책]

[추천 시]
고객님을 위한 맞춤 추천 여행 상품을 소개해드립니다.

1. [상품명 1]
여행 기간: [기간]
가격: [가격]

✓ 이전 여행객들의 후기 요약
"[review_summary를 자연스러운 문장으로 구성]"
예시: "많은 여행객들이 관광 명소를 효율적으로 둘러볼 수 있는 일정 구성과 현지 맛집 탐방이 인상적이었다고 평가했습니다."

✓ 트래블비서의 추천 이유
"[입력받은 keyword와 연관지어 추천 이유를 설명]"
예시: "고객님께서 찾으시는 '자유여행'과 '맛집 탐방' 콘셉트에 잘 맞는 상품입니다. 특히 저녁 시간대가 자유롭게 구성되어 있어 현지 맛집을 자유롭게 방문하실 수 있습니다."

2. [상품명 2]
여행 기간: [기간]
가격: [가격]

✓ 이전 여행객들의 후기 요약
"[review_summary를 자연스러운 문장으로 구성]"

✓ 트래블비서의 추천 이유
"[입력받은 keyword와 연관지어 추천 이유를 설명]"

추가 안내사항:
- 위 상품들은 실시간 예약 가능한 상품입니다.
- 더 자세한 일정이나 다른 상품을 찾으시면 말씀해 주세요.
</format>

이제 Agent의 역할과 기본 구성이 완료되었습니다.

STEP 3. Action group 생성 및 연결

이제 에이전트가 실제 액션을 수행할 수 있도록, Lambda 함수와 연결되는 Action Group을 생성해보겠습니다. Action Group은 Bedrock Agent가 외부 시스템이나 API를 호출하여 실제 동작을 수행할 수 있도록 설정하는 단위입니다. Action Group을 구성하면 에이전트가 Knowledge Base에서 정보를 검색하고, Lambda 함수를 호출해 예약 처리, 데이터 저장/조회 등 실질적인 작업을 수행할 수 있습니다.

좌측에서 Agents 메뉴를 선택해 이전에 생성한 agent를 선택한 후, Edit in Agent Builder 버튼을 클릭합니다. Action groups 옵션에서 Add 버튼을 클릭하여 원하는 이름으로 Action group을 생성합니다.

Action group type에서 Define with function details를 선택한 다음, Action group invocation 옵션에서 다음과 같이 설정합니다.

  • Select how to define the Lambda function: Select an existing Lambda function
  • Select Lambda function: anytravel-api (앞서 Step 1에서 배포한 Lambda 함수).
  • Function version: LATEST

다음은 Action group function 옵션을 설정할 차례입니다. 여기서 설정하는 각 함수의 이름과 Parameters의 Description은 Bedrock Agent가 사용자의 자연어 요청을 이해하고 적절한 함수를 선택하는 데 핵심적인 역할을 합니다. Agent는 이 설명들을 참고하여 언제 어떤 함수를 호출해야 하는지 판단하므로, 명확하고 구체적으로 작성하는 것이 중요합니다.

Action group function 1 옵션에서 다음과 같이 설정합니다.

  • Name: login
  • Enable confirmation of action group function: Disabled
  • Parameters: Add parameter 버튼 클릭
    • Name: email
    • Description: 로그인에 사용할 사용자의 이메일 주소입니다. (예: user@example.com) 주의: 유저에게는 userId를 직접 물어보지 말고 이 “login” 액션을 수행함으로써 Users table에서 userId를 찾아 이를 이후 액션에 활용합니다.
    • Type: string
    • Required: True

위와 같이 구성함으로써 Bedrock Agent가 Lambda 함수 내의 login 함수를 언제 액션으로 호출해야 하는지, 어떤 파라미터를 포함해 호출해야 하는지를 가이드합니다. 같은 방식으로 특정 사용자의 예약 내역을 가져오는 get_reservation 함수, 특정 여행 상품의 자세한 정보를 가져오는 get_travel_detail 함수, 실제 예약을 수행하는 (그에 따라 Order 테이블을 업데이트하는) reserve 함수, 예약을 취소하는 (그에 따라 Order 테이블을 업데이트하는) cancel_reservation 함수를 액션그룹으로 동일하게 추가해보겠습니다.

Add action group function 버튼을 4번 클릭하여 Action group function 2, 3, 4, 5를 추가로 생성합니다. 이후 아래와 같이 각 함수를 액션그룹으로 연결합니다.

Action group function 2 정보를 다음과 같이 입력합니다:

  • Name:get_reservation
  • Enable confirmation of action group function:Disabled
  • Parameters: Add parameter 버튼 클릭
    • Name: userId
    • Description: 예약 내역을 조회할 사용자의 고유 ID입니다. login 액션을 통해 얻어낼 수 있습니다.
    • Type: string
    • Required: True

Action group function 3 정보를 다음과 같이 입력합니다:

  • Name:get_travel_detail
  • Enable confirmation of action group function:Disabled
  • Parameters: Add parameter 버튼 클릭
    • Name: productId
    • Description: 상세 정보를 조회할 여행 상품의 고유 ID입니다. (예: JEJU-BigPromotion01) 이 정보가 없다면 먼저 get_reservation 함수를 수행하세요.
    • Type: string
    • Required: True

Action group function 4 정보를 다음과 같이 입력합니다:

  • Name:reserve
  • Enable confirmation of action group function:Disabled
  • Parameters 1: Add parameter 버튼 클릭
    • Name: productId
    • Description: 예약할 여행 상품의 고유 ID입니다. (예: JEJU-BigPromotion01)
    • Type: string
    • Required: True
  • Parameters 2: Add parameter 버튼 클릭
    • Name: userId
    • Description: 예약 내역을 조회할 사용자의 고유 ID입니다.(예: gildong2)
    • Type: string
    • Required: True

Action group function 5 정보를 다음과 같이 입력합니다:

  • Name: cancel_reservation
  • Enable confirmation of action group function:Disabled
  • Parameters 1: Add parameter 버튼 클릭
    • Name: productId
    • Description: 예약할 여행 상품의 고유 ID입니다. (예: JEJU-BigPromotion01)
    • Type: string
    • Required: True
  • Parameters 2: Add parameter 버튼 클릭
    • Name: userId
    • Description: 예약 내역을 조회할 사용자의 고유 ID입니다.(예: gildong2)
    • Type: string
    • Required: True

하단의 Create 버튼을 클릭해서 Action Group을 생성합니다. 추가된 Action Group 을 확인하고, Save and exit 버튼을 클릭합니다.

STEP 4. 여행 조회 /취소 테스트

Action Group 생성이 완료되었으니 이제 실제로 에이전트가 여행 예약 조회와 취소 기능을 제대로 수행하는지 테스트해보겠습니다. 에이전트는 사용자의 자연어 요청을 이해하고 적절한 Lambda 함수를 호출하여 DynamoDB에서 데이터를 조회하거나 수정할 수 있어야 합니다.

먼저 생성한 에이전트를 활성화해야 합니다. Agent Builder 화면에서 우측 상단의 Prepare 버튼을 클릭하여 에이전트 설정을 적용한 후, Test 버튼을 클릭하여 테스트 환경으로 이동합니다. 준비 과정이 완료되면 우측에 테스트 채팅 창이 나타나며 실제 대화를 통한 기능 테스트가 가능합니다.

사용자의 예약 내역을 조회하는 기능부터 테스트해보겠습니다. 테스트 창에서 다음과 같이 입력해보세요.

gildong@amazon.com으로 예약된 내역을 조회해주세요.

에이전트는 먼저 login 함수를 호출하여 이메일을 통해 사용자 ID를 확인한 후, get_reservation 함수를 호출하여 Orders 테이블에서 해당 사용자의 예약 내역을 검색합니다. 초기 데이터에 따르면 gildong 사용자는 파리스페인 자유여행 패키지를 예약한 상태이므로 해당 정보들이 표시됩니다.

다음으로 기존 예약을 취소하는 기능을 테스트해보겠습니다. 앞서 조회한 예약 중 하나를 취소해보겠습니다. 입력창에 다음과 같이 입력해보세요.

파리스페인 여행 패키지를 취소해주세요.

에이전트는 현재 로그인된 사용자 정보를 바탕으로 cancel_reservation 함수를 호출하여 해당 사용자의 특정 상품 예약을 Orders 테이블에서 삭제합니다. 취소가 성공적으로 처리되면 취소 완료 메시지와 함께 삭제된 예약 정보가 표시됩니다.

예약 취소가 정상적으로 처리되었는지 확인하기 위해 다시 예약 내역을 조회해보겠습니다. 입력창에 다음과 같이 입력해보세요.

현재 예약된 내역을 확인해주세요.

이를 통해 예약 취소 기능이 정상적으로 작동하여 DynamoDB Orders 테이블에서 해당 데이터가 실제로 삭제되었음을 확인할 수 있습니다.

지금까지 Amazon Bedrock Agent와 DynamoDB, Lambda 함수를 연동하여 기본적인 여행 예약 에이전트를 구축했습니다. 사용자 인증, 예약 조회, 예약 생성, 예약 취소 등 핵심 기능들이 모두 정상적으로 작동하는 것을 확인했죠. 하지만 실제 여행 예약 서비스에서는 이런 기본 기능 외에도 사용자에게 개인화된 여행 상품 추천을 제공하는 것이 매우 중요합니다.

현재 에이전트는 사용자가 이미 예약한 상품이나 정확한 상품 식별자를 제공했을 때만 관련 정보를 조회할 수 있습니다. 하지만 실제 사용자들은 “제주도로 가족 여행을 가고 싶은데 어떤 상품이 좋을까요?” 또는 “100만원 이하의 유럽 여행 상품을 추천해주세요”와 같은 자연스러운 질문을 합니다. 이런 요청에 적절히 응답하려면 에이전트가 여행 상품 데이터를 이해하고 사용자의 요구사항에 맞는 상품을 찾아서 추천할 수 있어야 합니다.

과제 2 : RAG를 이용한 추천 기능 추가

이제 여행 예약 에이전트에 RAG(Retrieval-Augmented Generation) 기반의 상품 추천 기능을 추가해보겠습니다. RAG는 외부 데이터 소스에서 관련 정보를 검색한 후 이를 바탕으로 더 정확하고 맥락에 맞는 답변을 생성하는 기술입니다. 이를 통해 에이전트는 단순한 데이터베이스 조회를 넘어서 사용자의 의도를 파악하고 적합한 여행 상품을 추천할 수 있게 됩니다. RAG 기술에 대한 자세한 정보나 Bedrock을 통해 RAG를 구축하는 가이드를 얻고 싶으시다면 이전 시리즈인 Amazon Bedrock Knowledge base로 30분 만에 멀티모달 RAG 챗봇 구축하기 실전 가이드를 참고해주세요.

Step 5. 리뷰 데이터 준비 및 S3 업로드

먼저, Bedrock Knowledge Base와 연동할 S3 버킷을 생성합니다. AWS Management Console에서 us-west-2 (오레곤) 리전으로 이동한 뒤, 새로운 S3 버킷을 생성하세요. 버킷 이름은 전세계에서 고유해야 하고, 이후 Knowledge Base 설정 시에도 활용해야 하므로 기억하기 쉬운 이름을 지정하는 것이 좋습니다. (예: anytravel-products-[본인 이름]) 그 외 옵션은 기본값을 유지한 채 버킷을 생성합니다.

버킷 생성이 완료되면, Bedrock Knowledge Base에서 사용할 여행 상품 데이터 파일 anytravel-product-details.csv 을 다운로드 받아 해당 버킷에 미리 업로드합니다.

Step 6. Bedrock Knowledge base 생성 및 Agent에 연결

여행 예약 에이전트가 제대로 동작하려면, 단순히 AI 모델에게 질문하는 것만으로는 부족합니다. 여행 상품 같은 구체적인 데이터를 LLM이 참고할 수 있도록, 별도의 지식 저장소가 필요하죠. 이때 사용하는 기능이 바로 Bedrock Knowledge Base 입니다. Bedrock Knowledge Base는 RAG(Retrieval-Augmented Generation) 방식을 기반으로, S3나 데이터베이스 같은 외부 데이터를 연결하고 임베딩과 벡터 검색을 통해 관련 정보를 찾아 LLM이 더 정확하고 맥락 있는 답변을 생성할 수 있게 도와줍니다.

그렇다면, Amazon Bedrock의 RAG 기능을 설정하고 관리하는 Bedrock Knowledge Base를 생성해보겠습니다. Bedrock Console에 접속한 뒤 좌측 사이드바에서 Knowledge Bases 를 클릭해 생성 화면에 접속하고, ‘Create’ -> ‘Knowledge Base with vector store’ 버튼을 클릭합니다.

Knowledge Base Name에 knowledge-base-travel 를 입력하고, Data Source로 S3를 선택한 후 Next 버튼을 클릭합니다.

Browse S3 버튼을 클릭해, 사전 준비 단계에서 생성한 버켓을 선택한 뒤 anytravel-product-details.csv 파일을 지정합니다.

Embeddings model로 Titan Text Embeddings V2를 선택합니다. Vector Store는 ‘Quick create a new vector store – Recommeded’ 를 선택하고, Vector store type은 Amazon OpenSearch Serverless로 설정합니다.

모든 설정을 마쳤다면 Next 버튼을 클릭하고, 마지막으로 ‘Create Knowledge Base’ 버튼을 클릭해 Knowledge Base를 생성합니다. 생성에는 몇 분 정도 소요됩니다.

Knowledge base가 성공적으로 생성되었습니다. Data Source에서 생성한 Knowledge Base를 선택하고, Sync 버튼을 클릭하여 동기화를 진행합니다. Status가 Syncing -> Available로 표시되면 데이터가 성공적으로 동기화된 것입니다.

(Model Access 에러 발생 시, 이전 포스팅 ‘Bedrock model access 요청하기파트를 참고해주세요.)

생성한 knowledge-base-travel를 클릭한 뒤 ‘Test knowledge Base’ 버튼을 클릭해 Knowledge Base 테스트를 진행해보겠습니다. ‘Select model’ 버튼을 클릭하고 Amazon의 Nova Pro 모델을 선택한 후, ‘Apply’ 버튼을 눌러 설정을 완료합니다.

이제 오른쪽 사이드바에서 Knowledge base를 테스트할 준비가 되었습니다. 이제 S3에서 불러온 여행 상품 데이터에 대해 실제로 질의해볼 수 있습니다. 아래와 같이 질의해봅니다.

유럽 여행 상품들에 대해 알려주세요.

질문 결과, csv 파일에 있는 상품 데이터가 잘 검색되어 답변으로 나오는 것을 확인할 수 있습니다.

이제, 앞서 과제 1 에서 생성한 Agent와 Knowledge base를 연결해보겠습니다. 좌측에서 Agents 메뉴를 선택해 이전에 생성한 agent를 선택한 후, Edit in Agent Builder 버튼을 클릭합니다. Knowledge bases 옵션에서 Add 버튼을 클릭하여 생성한 knowledge base를 선택하고, Knowledge base instructions for agent에 아래 프롬프트를 입력합니다. Knowledge base instructions for agent는 에이전트에게 “Knowledge Base를 어떻게 활용해서 질문에 답할지”를 알려주는 지침서 역할을 합니다. 즉, Knowledge Base에 있는 정보를 사용해 답변하는 방법을 정의하는 부분입니다.

고객이 제공한 여행지를 기준으로 추천할 여행 상품을 검색합니다.
고객이 제공하는 여행상품의 특징을 기준으로 'review_summary'에서 유사한 상품을 찾아냅니다.

추가된 Knowledge base를 확인하고, Save and exit 버튼을 클릭합니다.

Step 7. 여행 상품 추천 테스트

Bedrock Agent와 Knowledge Base를 테스트해보겠습니다. Agent에서 Test 버튼을 클릭하고 우측 Prepare 버튼을 클릭합니다.

다음 질문을 입력한 후, Run 버튼을 클릭하여 응답을 확인합니다.

제주도에 부모님을 모시고 갈 건데, 주요 관광명소를 갈 수 있는 코스로 여행하고 싶어요. 
그리고 너무 비싸지 않으면 좋겠어요. 추천해주세요.

이러한 테스트를 통해 RAG 기반의 추천 시스템이 정상적으로 작동하며, 사용자에게 실질적인 도움을 제공할 수 있음을 확인할 수 있습니다. 이제 우리의 여행 예약 에이전트는 단순한 예약 관리를 넘어서 지능적인 상품 추천까지 제공하는 여행 에이전트로 발전했습니다.

마무리

이번 포스팅에서는 Amazon Bedrock Agent를 활용해 단순한 질의응답을 넘어서, 실제로 액션까지 수행할 수 있는 지능형 여행 관리 에이전트를 구축하는 방법을 단계별로 살펴보았습니다.

이번 포스팅에서 구현한 에이전트의 핵심 구성 요소들을 정리하면 다음과 같습니다:

  • Knowledge Base를 통한 맞춤형 데이터 활용 – S3에 저장된 여행 상품 데이터를 RAG 방식으로 연동하여 사용자의 다양한 요구사항에 맞는 개인화된 추천을 제공할 수 있게 했습니다.
  • Lambda와 Action Group을 통한 실질적인 예약 처리 – 단순한 정보 제공을 넘어서 실제 DynamoDB와 연동하여 사용자 인증, 예약 생성, 예약 취소 등 핵심 기능들을 구현했습니다.
  • Instructions 프롬프트를 통한 에이전트 행동 정의 – 에이전트가 어떤 상황에서 어떻게 행동해야 하는지, Knowledge Base를 언제 활용해야 하는지를 명확히 정의하여 일관성 있는 서비스를 제공하도록 했습니다.

이를 통해 에이전트가 사용자의 요청 이해 → 관련 정보 검색 → 실제 예약 처리 → 결과 반환까지 이어지는 업무 흐름을 자동화할 수 있음을 확인했습니다.

오늘 구축한 여행 예약 에이전트는 단순한 데모를 넘어서 실제 비즈니스 환경에서도 충분히 활용 가능한 수준입니다. 특히 다음과 같은 영역으로 확장할 수 있습니다:

  • 다양한 업종으로의 확장 – 여행업뿐만 아니라 전자상거래, 고객 서비스, 예약 관리 등 다양한 분야에서 동일한 패턴을 적용할 수 있습니다.
  • 멀티모달 기능 추가 – 텍스트뿐만 아니라 이미지, 음성 등을 처리할 수 있는 기능을 추가하여 더욱 풍부한 사용자 경험을 제공할 수 있습니다.
  • 실시간 데이터 연동 – 해당 가이드에서는 정적인 CSV 파일을 사용했지만, 실시간 재고 정보, 가격 변동, 날씨 정보 등을 연동하여 더욱 정확하고 최신의 정보를 제공할 수 있습니다.

Amazon Bedrock Agent는 단순히 AI 모델을 사용하는 것을 넘어서, 실제 비즈니스 프로세스를 자동화하고 사용자에게 실질적인 가치를 제공할 수 있는 강력한 도구입니다. 이번 포스팅에서 실습을 통해 구축한 여행 예약 에이전트가 여러분의 프로젝트에서 AI를 활용한 자동화 시스템을 구현하는 데 도움이 되기를 바랍니다.

Yoonseo Kim

Yoonseo Kim

김윤서 솔루션즈 아키텍트는 고객들의 비즈니스 문제를 AWS의 기술을 통해 해결하고 구현하는 데 도움을 드리고 있습니다.

Jiwon Kim

Jiwon Kim

AWS Cloud Support Intern으로서, AI와 클라우드 기술이 실제 문제 해결에 어떻게 활용될 수 있는지를 탐구하고 있습니다. 최근에는 AI 워크로드에 최적화된 인프라 설계와 서비스 확장성 확보에 관심을 두고 다양한 접근 방식을 시도하며 최적의 아키텍처를 모색하고 있습니다.