Tạo chat app đơn giản với Streamlit và Amazon Bedrock
Minh Bui
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
- Duration: 15 phút
- AWS Region: us-east-1
Architecture diagram
Task Details
- Enable Amazon Bedrock model
- Tạo EC2
- Deploy streamlit app
- 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
Type Protocol Port range Source Custom TCP TCP 8080 0.0.0.0/0 SSH TCP 22 0.0.0.0/0 Outbound rules
Type Protocol Port range Destination All traffic All All 0.0.0.0/0 Tags
Key value Name ec2-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
- VPC:
- 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:
- Xoá EC2
- Xoá security group
- Xoá iam role
Tổng kết
- Như vậy hôm nay Cloud Mentor Pro đã cùng các bạn tìm hiểu cách tạo một chat application đơn giản với Streamlit và Bedrock. Các bạn có thể tham khảo thêm về document của Streamlit và Bedrock ở đây. https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html https://docs.streamlit.io/develop/tutorials/llms/build-conversational-apps
- Chat app của chúng ta hiện tại mới chỉ ở mức thực sự sơ khai, chưa có các tính năng như lưu lịch sử chat, đăng nhập người dùng, v.v... Tuy nhiên nếu kết hợp thêm với các service khác như DynamoDB, Cognito thì việc thực hiện các chức năng vừa rồi là hoàn toàn khả thi.