Các nền tảng web playground rất tuyệt vời để demo. Bạn dán một đoạn văn bản, xem mô hình tạo ra một bản tóm tắt gọn gàng, rồi đóng tab. Nhưng đó không phải là kỹ thuật (engineering). Công việc thực tế (production) đòi hỏi API, xử lý lỗi và mã nguồn chạy ngay cả khi bạn đang ngủ. Nếu bạn cần xử lý hàng loạt bản ghi chép cuộc họp, phiếu hỗ trợ (support tickets) hoặc các bài nghiên cứu theo lịch trình, bạn cần một pipeline.

Hướng dẫn này sẽ hướng dẫn bạn xây dựng chính xác điều đó: một script tóm tắt tài liệu tự động, nhẹ nhàng bằng Python, AWS SDK cho Python (boto3) và Amazon Bedrock. Chúng ta sẽ sử dụng Claude 3 Haiku của Anthropic, một mô hình đạt được điểm cân bằng hoàn hảo giữa tốc độ và chi phí cho các tác vụ tóm tắt văn bản.

Tại sao lại chọn Bedrock và Claude 3 Haiku?

Amazon Bedrock là một dịch vụ được quản lý (managed service) cung cấp các mô hình nền tảng (foundation models) thông qua một bộ AWS API duy nhất. Thay vì phải lắp ghép các endpoint bên ngoài và vật lộn với các mô hình thanh toán và bảo mật riêng biệt, bạn chỉ cần gọi một AWS endpoint với các quyền kiểm soát IAM tiêu chuẩn. Dữ liệu của bạn vẫn nằm trong môi trường AWS của bạn.

Claude 3 Haiku là mô hình tinh gọn nhất trong dòng Claude 3 của Anthropic. Nó được xây dựng để phản hồi nhanh và chi phí thấp, giúp nó trở nên lý tưởng cho việc tóm tắt khối lượng lớn, nơi bạn muốn có kết quả đầu ra có thể dự đoán được mà không phải trả tiền cho sức mạnh xử lý của các mô hình lớn hơn cho các tác vụ đọc đơn giản.

Những gì bạn cần

Trước khi viết bất kỳ mã nào, hãy đảm bảo bạn đã chuẩn bị sẵn những thứ sau:

  • Một tài khoản AWS đang hoạt động.
  • Python 3.9 hoặc cao hơn đã được cài đặt cục bộ.
  • AWS CLI đã được cấu hình với các thông tin xác thực có quyền gọi (invoke) các mô hình Bedrock. Nếu bạn chưa chạy aws configure, hãy thực hiện ngay bây giờ. Nếu bạn gặp lỗi quyền truy cập sau đó, có thể bạn sẽ cần gắn thêm các quyền gọi Bedrock phù hợp cho người dùng hoặc vai trò (role) IAM của mình.
  • Quyền truy cập mô hình (Model access) đã được bật riêng cho Anthropic Claude 3 Haiku trong bảng điều khiển AWS Bedrock. AWS yêu cầu bạn phải chủ động đăng ký (opt in) cho từng nhà cung cấp mô hình trước khi có thể gọi chúng.

Bước 1: Bật quyền truy cập mô hình

Bedrock không cho phép bạn gọi các mô hình ngay lập tức (out of the box). Trước tiên, bạn phải bật tùy chọn này trong bảng điều khiển.

  1. Đăng nhập vào AWS Management Console.
  2. Sử dụng thanh tìm kiếm để tìm Amazon Bedrock.
  3. Trong bảng điều hướng bên trái, chọn Model access.
  4. Nhấp vào Modify model access.
  5. Tích vào ô Anthropic (Claude 3 Haiku) và gửi yêu cầu của bạn.

Khi trạng thái chuyển sang "Access granted", bạn đã có thể gọi mô hình từ mã nguồn.

Bước 2: Thiết lập môi trường

Một môi trường Python sạch sẽ giúp giữ các phụ thuộc (dependencies) được cô lập và có thể tái lập. Mở terminal của bạn và chạy các lệnh sau:

mkdir bedrock-summarizer && cd bedrock-summarizer
python3 -m venv venv
source venv/bin/activate
pip install boto3

Người dùng Windows nên thay thế lệnh kích hoạt bằng venv\Scripts\activate. Sau khi pip install boto3 hoàn tất, bạn đã có mọi thứ cần thiết để giao tiếp với các AWS API.

Bước 3: Viết script

Tạo một tệp có tên là summarize.py. Mục tiêu là đọc một tài liệu từ ổ đĩa, gửi nó tới Bedrock Converse API và in ra một bản tóm tắt ngắn gọn.

Dưới đây là một bản triển khai hoàn chỉnh và hoạt động được. Chúng ta sử dụng Converse API vì nó trừu tượng hóa định dạng JSON thô mà các nhà cung cấp mô hình khác nhau yêu cầu. Bạn chỉ cần truyền vào một danh sách các tin nhắn và các cài đặt suy luận (inference settings).

import boto3

def summarize_document(text: str) -> str:
    client = boto3.client("bedrock-runtime")
    
    model_id = "anthropic.claude-3-haiku-20240307-v1:0"
    
    messages = [
        {
            "role": "user",
            "content": [
                {
                    "text": (
                        "Provide a concise summary of the following document. "
                        "Focus on the main points and avoid unnecessary detail:\n\n"
                        f"{text}"
                    )
                }
            ]
        }
    ]
    
    response = client.converse(
        modelId=model_id,
        messages=messages,
        inferenceConfig={
            "temperature": 0.3,
            "maxTokens": 512
        }
    )
    
    summary = response["output"]["message"]["content"][0]["text"]
    return summary.strip()


if __name__ == "__main__":
    with open("document.txt", "r", encoding="utf-8") as f:
        document_text = f.read()
    
    result = summarize_document(document_text)
    print("\n--- Summary ---\n")
    print(result)

Một vài chi tiết thực tế đáng lưu ý ở đây:

  • boto3.client("bedrock-runtime") nhắm đến endpoint runtime xử lý việc suy luận. Hãy đảm bảo vùng (region) AWS của bạn trong ~/.aws/config hỗ trợ Bedrock và bạn đã bật Haiku trong cùng vùng đó.
  • Model ID anthropic.claude-3-haiku-20240307-v1:0 là định danh chính xác mà Bedrock yêu cầu. Hãy sao chép nó một cách chính xác.
  • Temperature được đặt là 0.3 giúp kết quả đầu ra bám sát thực tế. Đối với việc tóm tắt, bạn muốn sự nhất quán và độ trung thực với văn bản gốc, chứ không phải sự tô vẽ sáng tạo. Nếu bạn tăng temperature lên gần 1.0, mô hình sẽ bắt đầu tự ý thay đổi cách diễn đạt và đôi khi tự bịa ra các chi tiết.
  • Bản thân câu lệnh (prompt) rất cụ thể. Thay vì ném văn bản thô vào mô hình với một câu mơ hồ như "tóm tắt cái này", chúng ta yêu cầu rõ ràng các ý chính và hướng dẫn nó bỏ qua những phần rườm rà. Sự rõ ràng đó sẽ phân biệt giữa một kết quả không thể sử dụng được và một thứ mà bạn thực sự có thể đưa vào sản phẩm.

Đặt bất kỳ tệp văn bản nào bạn muốn tóm tắt vào cùng một thư mục và đặt tên là document.txt.

Bước 4: Chạy script

Với môi trường ảo đang hoạt động, hãy thực thi:

python summarize.py

Nếu thông tin xác thực và quyền truy cập mô hình của bạn chính xác, bạn sẽ thấy một bản tóm tắt gọn gàng được in ra terminal trong vòng vài giây. Nếu bạn gặp lỗi truy cập, hãy kiểm tra lại quyền IAM của mình và xác nhận rằng bạn đã bật Claude 3 Haiku trong bảng điều khiển.

Tiến xa hơn cả một script

Pipeline này được thiết kế đơn giản một cách có chủ đích, nhưng nó chính là nền tảng cho việc tự động hóa thực thụ. Dưới đây là cách bạn có thể mở rộng nó mà không làm hệ thống trở nên cồng kềnh.

Xử lý hàng loạt (Batch processing). Thay vì chỉ đọc một tệp duy nhất, hãy chuyển sang sử dụng một vòng lặp duyệt qua thư mục. Chỉ cần bỏ năm mươi tệp PDF hoặc tệp văn bản vào thư mục đầu vào, lặp qua chúng và ghi các bản tóm tắt vào thư mục đầu ra. Nếu bạn muốn nạp trực tiếp các tệp PDF, bạn sẽ cần một bước tiền xử lý với các thư viện như PyPDF2 hoặc pdfplumber để trích xuất văn bản thô trước khi gửi đến Bedrock.

Chiến lược chia nhỏ (Chunking strategy). Các tài liệu quá dài có thể vượt quá giới hạn ngữ cảnh (context limit) của mô hình. Khi đó, hãy chia văn bản thành các đoạn (chunks) logic theo đoạn văn hoặc phần, tóm tắt từng đoạn riêng biệt, sau đó đưa các bản tóm tắt trung gian này quay lại mô hình để tổng hợp lần cuối. Cách tiếp cận hai giai đoạn này giúp bạn không vượt quá giới hạn token mà vẫn đảm bảo bao quát được toàn bộ tài liệu.

Xử lý lỗi (Error handling). Mã nguồn chạy thực tế (production code) nên bắt lỗi boto3.exceptions.ClientError một cách cụ thể. AWS có thể giới hạn tốc độ (throttle) các yêu cầu của bạn nếu bạn gọi API quá dồn dập. Hãy bao bọc lệnh gọi converse của bạn trong một vòng lặp thử lại (retry loop) với cơ chế chờ tăng dần (exponential backoff), hoặc sử dụng một thư viện như tenacity để xử lý giới hạn tốc độ một cách mượt mà.

Kỹ thuật đặt câu lệnh (Prompt engineering). Sự khác biệt giữa một bản tóm tắt tầm thường và một bản tóm tắt hữu ích thường nằm ở câu lệnh (prompt). Hãy yêu cầu định dạng danh sách gạch đầu dòng nếu bạn cần khả năng đọc lướt nhanh. Hãy yêu cầu một bản tóm tắt điều hành ngắn gọn trong một đoạn văn nếu đối tượng là ban lãnh đạo cấp cao. Bạn thậm chí có thể truyền vào các ràng buộc về định dạng, chẳng hạn như "Giới hạn bản tóm tắt trong ba câu" hoặc "Trả về kết quả dưới dạng JSON với các khóa topic, key_points và action_items."

Bài học thực tế quan trọng nhất

Chuyển từ một môi trường thử nghiệm chat (chat playground) sang một kịch bản (script) hoạt động thực tế chính là điểm bước ngoặt nơi AI trở thành một phần của hạ tầng. Một khi pipeline này chạy cục bộ, bạn có thể đưa nó lên một hàm AWS Lambda được kích hoạt bởi các tệp tải lên S3, lập lịch chạy trên ECS Fargate, hoặc kết nối nó vào một quy trình dữ liệu hiện có. Việc gọi API chỉ là phần dễ dàng. Giá trị kỹ thuật nằm ở việc bao bọc lệnh gọi đó trong các logic xử lý tệp, lỗi và định dạng để bạn không bao giờ phải sao chép và dán văn bản vào trình duyệt nữa.

Để biết thêm ngữ cảnh và các biến thể khác của thiết lập này, hãy xem hướng dẫn gốc trên Dev.to. Nếu bạn muốn thảo luận về kiến trúc AWS, pipeline LLM hoặc kỹ thuật đặt câu lệnh với cộng đồng những người xây dựng, hãy tham gia cuộc trò chuyện tại [GyaanSetu AI trên Telegram](https://t.me/GyaanSet