Tạo chat app đơn giản với Streamlit và Amazon Bedrock

Tạo chat app đơn giản với Streamlit và Amazon Bedrock

avatar

Minh Bui

2024.09.01

Bài viết hướng dẫn cách tạo chat app đơn giản với Streamlit và Amazon Bedrock

Introduction

Giới thiệu chung

Từ khi ChatGPT được ra mắt, đến nay việc ứng dụng GenerativeAI trong doanh nghiệp đã phổ biến rất rộng rãi. AWS cũng không ngoại lệ, hàng loạt các service về AI được cải tiến, ra mắt, cũng như cập nhật thường xuyên. Trong đó nổi bật nhất là Amazon Q for Business và Bedrock. Amazon Q thì cơ chế customize model khá là ít, do đó ở doanh nghiệp mình thì không được sử dụng, thay vào đó là Bedrock với nhiều model đa dạng và khả năng customize cao hơn. Bài viết hôm nay mình sẽ cùng tìm hiểu về Amazon Bedrock và Streamlit để build một chat app rất đơn giản.

Amazon Bedrock là gì?

Là service giúp việc phát triển Generative AI (ex: AI chat application giống như ChatGPT) trở nên dễ dàng hơn. Bedrock cho phép truy cập và sử dụng nhiều model đến từ các provider khác nhau như Anthropic, Cohere, Stability AI, v.v..

Streamlit là gì?

Là thư viện mã nguồn mở được xây dựng bằng ngôn ngữ Python, cho phép build các web application có tính tương tác tốt một cách nhanh chóng. Ngoài ra, Streamlit có nhiều tính năng giúp xây dựng các tool hiển thị hoá data, machine learning, dashboard, v.v...

Chỉ với một vài dòng code thì mình đã có thể tạo ra ngay một giao diện rất đẹp cho chat application, rất tiện lợi đúng không nào.

Mục tiêu bài lab

Mình sẽ deploy python application với Streamlit trên EC2 để tạo ra giao diện chat app và thực hiện tương tác với Bedrock Model. Ở đây mình sẽ sử dụng loại model phổ biến đó là Anthropic Claude 3 Sonnet. Message người dùng nhập vào sẽ được gửi đến model thông qua Streamlit để tạo ra response, sau đó response message sẽ được hiển thị trên giao diện trong thời gian thực.

Lab Details

  1. Duration: 15 phút
  2. AWS Region: us-east-1

Architecture diagram

Task Details

  1. Enable Amazon Bedrock model
  2. Tạo EC2
  3. Deploy streamlit app
  4. Test app

1. Enable Amazon Bedrock model

Để sử dụng được các model của Amazon Bedrock thì chúng ta cần request để enable các model này. Ở đây chúng ta sẽ enable model được sử dụng phổ biến đó là Claude 3 Sonnet của Anthropic.

Từ Bedrock console, menu bên trái chọn Model access, tìm đến model Claude 3 Sonnet và click vào Available to request sau đó nhấn vào Request model access

Màn hình Step 1 hiện ra thì sẽ nhấn Next để sang màn hình Step 2.

Ở màn hình Step 2 này, AWS sẽ yêu cầu mình sẽ cần nhập thông tin doanh nghiệp và mục đích sử dụng, tuy nhiên nếu muốn tránh lộ thông tin thì có thể nhập bừa các nội dung như bên dưới thì cũng không có vấn đề gì. Sau khi nhập xong thì nhấn Next để qua màn hình Step 3.

Ở màn hình Step 3, chúng ta nhấn Subnmit

Sau khi submit xong thì sẽ hiện ra thông báo đã submit thành công.

Chờ khoảng vài phút rồi refresh lại console, model sẽ chuyển sang trạng thái đó là Access granted, tức là đã được cấp phép sử dụng model.

2. Tạo EC2

2.1. Tạo IAM Role cho EC2

Để cho app server trong EC2 có thể thao tác với Bedrock thì trước tiên mình cần tạo một IAM Role có quyền cho phép việc này.

Vào IAM Console, thực hiện tạo IAM Role với các parameter như sau:

  • Use case: EC2
  • Policy:
    • AmazonBedrockFullAccess (full quyền thao tác với Bedrock)
  • Role name: ec2-bedrock-role

2.2. Tạo security group cho ec2

App server trong ec2 mình sẽ để cho chạy trên port 8080, do đó cần tạo security group với inbound rule allow toàn bộ kết nối từ internet đi vào, giao thức là TCP trên port 8080. Đồng thời cũng cần allow kết nối SSH vào để thực hiện setup server.

Security group sẽ có thông tin như sau:

  • Name: ec2-streamlit-sg

  • Description: Allow connection to app on port 8080

  • VPC: Default VPC

  • Inbound rules

    TypeProtocolPort rangeSource
    Custom TCPTCP80800.0.0.0/0
    SSHTCP220.0.0.0/0
  • Outbound rules

    TypeProtocolPort rangeDestination
    All trafficAllAll0.0.0.0/0
  • Tags

    Keyvalue
    Nameec2-streamlit-sg

2.3. Tạo EC2

Tạo EC2 với các setting cơ bản như sau:

  • Name: ec2-streamlit
  • OS: Amazon Linux 2023
  • Instance type: Default (t2.micro)
  • Key pair: d-key-SAA-common (Nếu chưa có thì tạo mới)
  • Network Setting:
    • VPC: (default)
    • Subnet: us-east-1a
    • Auto-assign public IP: Enable
    • Select existing security group: ec2-streamlit-sg
  • Advanced details > IAM instance profile: ec2-bedrock-role

3. Deploy streamlit app

Thực hiện kết nối SSH vào EC2 sau đó run các lệnh sau:

Lệnh cài trình quản lí package của python đó là pip:

sudo yum install -y python3-pip

Sử dụng pip để cài Streamlit:

pip install streamlit boto3

Tạo file để run Streamlit với tên là app.py và dán phần source code sample sau:

import json
import boto3
import streamlit as st

# Set page title
st.title("Amazon Bedrock Claude3 Response Streaming Demo")

# Create bedrock client
client = boto3.client("bedrock-runtime", region_name="us-east-1")

# Define model id (Claude 3 Sonnet)
model_id = "anthropic.claude-3-sonnet-20240229-v1:0"


# Streaming response message
def parse_stream(stream):
    for event in stream:
        chunk = event.get("chunk")
        if chunk:
            message = json.loads(chunk.get("bytes").decode())
            if message["type"] == "content_block_delta":
                yield message["delta"]["text"] or ""
            elif message["type"] == "message_stop":
                return "\n"


# User input
if prompt := st.text_input("Prompt"):

    # Prepare request body
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1024,
            "messages": [
                {
                    "role": "user",
                    "content": [{"type": "text", "text": prompt}],
                }
            ],
        }
    )

    # Call bedrock api and stream response
    streaming_response = client.invoke_model_with_response_stream(
        modelId=model_id,
        body=body,
    )

    # Output response to GUI
    st.subheader("Output stream", divider="rainbow")
    stream = streaming_response.get("body")
    st.write_stream(parse_stream(stream))
    st.write_stream(stream)

Chạy lệnh sau để run Streamlit với source code ở trên:

streamlit run app.py --server.port=8080

Check xem nếu server đang run như hình dưới là thành công.

4. Test app

Copy External URL ở step trên sau đó thực hiện truy cập trên trình duyệt. Giao diện chat của Streamlit sẽ xuất hiện.

Thử nhập nội dung câu hỏi vào Promp và nhấn Enter, sau đó check kết quả.

Clean up

Thực hiện xoá các resource đã tạo ở các step trên:

  1. Xoá EC2
  2. Xoá security group
  3. Xoá iam role

Tổng kết