Xây dựng API Chat với Strands và Amazon Bedrock
Trong những tháng gần đây, tôi đã khám phá nhiều cách để kết nối các tác nhân thông minh với các cơ sở kiến thức trên AWS. Một trong những phương pháp mà tôi thấy thú vị nhất là kết hợp Strands với Knowledge Base của Amazon Bedrock.
Khi bắt đầu thử nghiệm này, mục tiêu của tôi rất rõ ràng: xây dựng một API chat không chỉ cung cấp thông tin tổng quát mà còn có thể dựa vào dữ liệu ngữ cảnh — trong trường hợp này, một Knowledge Base với thông tin từ các cuốn sách Harry Potter. Tin tốt là với kiến trúc serverless của AWS và các thư viện như strands-agents, quá trình này trở nên dễ tiếp cận hơn rất nhiều.
Trong bài viết này, tôi sẽ hướng dẫn bạn cách sử dụng kho lưu trữ strands-poc để tạo tích hợp của riêng bạn từng bước một.
Nội dung bạn sẽ đạt được
- Một API với hai endpoint:
/healthvà/chat. - Một Lambda trong container sử dụng
strands-agentsđể xử lý luồng hội thoại. - Một Knowledge Base trong Amazon Bedrock được kết nối để trả lời với dữ liệu liên quan.
- Tất cả hạ tầng được triển khai với AWS CDK.
Yêu cầu trước khi bắt đầu
- Tài khoản AWS với quyền truy cập vào Bedrock và Knowledge Bases.
- Python 3.12.
- Docker và AWS CLI đã được cấu hình.
- AWS CDK đã được cài đặt.
- Quyền IAM phù hợp cho Bedrock, Lambda và API Gateway.
Kiến trúc tổng quan
Giải pháp bao gồm:
- API Gateway với hai endpoint.
- Lambda được container hóa (Python 3.12) với Strands.
- Knowledge Base trong Bedrock (nguồn dữ liệu đồng bộ hóa).
- CDK để triển khai mọi thứ.
Hướng dẫn từng bước
Bước 1: Tạo Knowledge Base trong Bedrock
- Truy cập vào bảng điều khiển Amazon Bedrock → Knowledge bases.
- Tạo một Knowledge Base mới với mô hình embeddings bạn thích.
- Cấu hình nguồn dữ liệu (ví dụ: tài liệu trong S3).
- Đồng bộ hóa nội dung và ghi lại các ID (KnowledgeBaseId, DataSourceId).
👉 Tài liệu chính thức: Tạo Knowledge Base
Bước 2: Nhân bản và cấu hình kho lưu trữ
bash
git clone https://github.com/hsaenzG/strands-poc.git
cd strands-poc
Sao chép env.template thành .env và chỉnh sửa với các giá trị thực của bạn (IDs, vùng, mô hình, v.v.).
Cài đặt các phụ thuộc địa phương:
bash
python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Bước 3: Xây dựng và triển khai Lambda
Xây dựng hình ảnh với Docker (đã chuẩn bị cho linux/amd64).
Triển khai với CDK:
bash
cdk bootstrap
cdk deploy
Điều này sẽ tạo ra API Gateway, Lambda được container hóa và tất cả cấu hình cần thiết.
Bước 4: Kiểm tra các endpoint
Kiểm tra tình trạng của API:
bash
curl https://<api_url>/prod/health
Thực hiện một truy vấn đến chat:
bash
curl -X POST https://<api_url>/prod/chat \
-H "Content-Type: application/json" \
-d '{"message": "Ai là Dumbledore?", "user_id": "nguoidung1"}'
Phản hồi sẽ đến từ mô hình, được làm phong phú với thông tin từ Knowledge Base.
Các bài học kinh nghiệm
- Quyền IAM: một phần lớn các lỗi ban đầu đến từ việc không cấp quyền đúng cho Lambda để truy cập vào Bedrock.
- Vùng: cả mô hình, KB và Lambda phải nằm trong cùng một vùng.
- Chia nhỏ tài liệu: chất lượng phản hồi phụ thuộc nhiều vào cách bạn chia nhỏ thông tin trước khi tải lên KB.
- Độ trễ: khi sử dụng Knowledge Base + mô hình ngôn ngữ, các cuộc gọi có thể mất nhiều thời gian hơn; hãy xem xét việc lưu trữ nếu bạn đưa vào sản xuất.
- Lambda trong container: thư viện Strands khá lớn và, ngay cả với layers, bạn sẽ vượt quá giới hạn kích thước của Lambda. Hãy tránh những cơn đau đầu và triển khai chức năng của bạn trực tiếp dưới dạng hình ảnh Docker.
Kết luận
Việc sử dụng Strands cùng với một Knowledge Base của Amazon Bedrock cho phép bạn tạo ra các trợ lý thông minh kết hợp sức mạnh của các LLM với kiến thức cụ thể từ dữ liệu của bạn. Ví dụ từ kho lưu trữ strands-poc chỉ là khởi đầu: bạn có thể thay thế các cuốn sách Harry Potter bằng tài liệu của công ty, các câu hỏi thường gặp hoặc cẩm nang nội bộ.
Tôi mời bạn thử nghiệm, điều chỉnh theo ngữ cảnh của bạn và cho tôi biết những trường hợp sử dụng nào bạn nghĩ ra. Tôi tin rằng bạn sẽ tìm thấy những cách ứng dụng thú vị với mô hình này!