Pascal Vogel | on 04 OCT 2023
Bài đăng này được viết bởi Pascal Vogel là Solutions Architect và Martin Sakowski là Senior Solutions Architect.
Mô hình ngôn ngữ lớn – Large language models (LLMs), đang chứng tỏ được hiệu quả cao trong việc giải quyết các nhiệm vụ chung như tạo văn bản, phân tích và tóm tắt văn bản, dịch thuật, v.v. Bởi vì các mô hình này được đào tạo trên các tập dữ liệu lớn nên nó có thể sử dụng nền tảng kiến thức tổng quát rộng rãi. Tuy nhiên, do việc đào tạo diễn ra offline và sử dụng dữ liệu có sẵn công khai nên khả năng tiếp cận kiến thức chuyên ngành, riêng tư và cập nhật của các mô hình này bị hạn chế.
Một cách để cải thiện kiến thức của mô hình ngôn ngữ lớn (LLMs) trong một lĩnh vực cụ thể là điều chỉnh chúng trên các tập dữ liệu chuyên ngành. Tuy nhiên, việc này tốn thời gian và tài nguyên, đòi hỏi kiến thức chuyên sâu và có thể không phù hợp cho một số nhiệm vụ. Ví dụ, việc điều chỉnh không cho phép LLM truy cập thông tin với độ chính xác hàng ngày.
Để giải quyết những thiếu sót này, Retrieval Augmented Generation (RAG) đang chứng tỏ là một phương pháp tiếp cận hiệu quả. Với RAG, dữ liệu bên ngoài LLM được sử dụng để tăng cường tri thức bằng cách tích hợp thông tin từ các nguồn dữ liệu có liên quan vào ngữ cảnh. Điều này cho phép tích hợp các nguồn dữ liệu khác nhau mà không cần thay đổi cấu trúc của mô hình học máy.
Các công cụ như LangChain hoặc LlamaIndex đang trở nên phổ biến nhờ khả năng tích hợp linh hoạt với nhiều nguồn dữ liệu khác nhau như cơ sở dữ liệu (vectơ), công cụ tìm kiếm và các nguồn dữ liệu công khai.
Trong ngữ cảnh của LLMs, tìm kiếm ngữ nghĩa (semantic search) là một phương pháp tìm kiếm hiệu quả, vì nó xem xét ngữ cảnh và ý định của các yêu cầu mà người dùng cung cấp thay vì tìm kiếm chính xác theo từ ngữ truyền thống. Tìm kiếm ngữ nghĩa dựa trên việc nhúng từ (word embeddings), biểu diễn các từ, câu hoặc tài liệu dưới dạng vector. Do đó, tài liệu phải được chuyển đổi thành embeddings sử dụng một embeddings model là cơ sở cho tìm kiếm ngữ nghĩa. . Vì quá trình embeddings này chỉ cần diễn ra khi tài liệu được thêm hoặc cập nhật lần đầu nên nó rất phù hợp cho điện toán theo sự kiện với AWS Lambda.
Bài đăng này giới thiệu một giải pháp cho phép bạn đặt câu hỏi bằng native languages đối với bất kỳ tài liệu PDF nào bạn tải lên. Nó kết hợp khả năng tạo và phân tích văn bản của LLM với tìm kiếm vectơ trên nội dung tài liệu. Giải pháp này sử dụng các dịch vụ serverless như AWS Lambda để chạy LangChain và Amazon DynamoDB cho bộ nhớ đàm thoại.
Amazon Bedrock được sử dụng để cung cấp quyền truy cập serverless vào các mô hình nền tảng như Amazon Titan và các mô hình được phát triển bởi các công ty khởi nghiệp trí tuệ nhân tạo hàng đầu, chẳng hạn như AI21 Labs, Anthropic và Cohere. Xem kho lưu trữ GitHub để biết danh sách đầy đủ các LLMs có sẵn và hướng dẫn triển khai.
Bạn sẽ tìm hiểu cách giải pháp hoạt động, các lựa chọn thiết kế đã được thực hiện và cách bạn có thể sử dụng nó như một bản thiết kế để xây dựng các giải pháp serverless tùy chỉnh của riêng bạn dựa trên LangChain.
Tổng quan về giải pháp
Hãy xem cách giải pháp này hoạt động ở high-level trước khi đi sâu hơn vào các thành phần cụ thể và dịch vụ AWS được sử dụng trong các phần sau. Sơ đồ sau đây cung cấp cái nhìn đơn giản về kiến trúc giải pháp và nêu bật các thành phần chính: link
Quá trình tương tác với ứng dụng web diễn ra như sau:
- Người dùng tải lên một tài liệu PDF vào một bucket của Amazon Simple Storage Service (Amazon S3) thông qua frontend của ứng dụng static web.
- Việc tải lên này kích hoạt quá trình trích xuất metadata và embedding tài liệu. Quá trình này chuyển đổi văn bản trong tài liệu thành các vector. Các vector được tải vào vector index và lưu trữ trong S3 để sử dụng sau này.
- Khi một user trò chuyện với một tài liệu PDF và gửi một yêu cầu đến phía backend, một hàm Lambda lấy chỉ index từ S3 và tìm kiếm thông tin liên quan đến yêu cầu.
- Sau đó, LLM sử dụng kết quả của vector search và các tin nhắn trước đó trong cuộc trò chuyện, cộng thêm việc sử dụng khả năng tổng quát của nó để đưa ra phản hồi cho người dùng.
Như có thể thấy trên screenshot sau, ứng dụng web được triển khai như một phần của giải pháp cho phép bạn tải tài liệu lên và liệt kê các tài liệu đã tải lên cũng như metadata liên quan của chúng, chẳng hạn như số trang, kích thước tệp và ngày tải lên. Trạng thái tài liệu cho biết tài liệu đã được tải lên thành công, đang được xử lý hay sẵn sàng cho cuộc trò chuyện.
Bằng cách nhấp vào một trong các tài liệu đã xử lý, bạn có thể truy cập vào giao diện trò chuyện, cho phép bạn gửi prompts đến phần backend. Bạn có thể có nhiều cuộc trò chuyện độc lập với mỗi tài liệu và lịch sử tin nhắn riêng biệt.
Embedding documents
Khi một tài liệu mới được tải lên S3 bucket, một thông báo sự kiện S3 (S3 event notification) kích hoạt một hàm Lambda trích xuất metadata, như kích thước tệp và số trang, từ tệp PDF và lưu trữ nó trong một DynamoDB table. Khi quá trình trích xuất hoàn tất, một tin nhắn chứa vị trí của tài liệu được đặt trên một hàng đợi Amazon Simple Queue Service (Amazon SQS). Một hàm Lambda khác kiểm tra hàng đợi này bằng cách sử dụng ánh xạ nguồn sự kiện Lambda (Lambda event source mapping). Áp dụng mẫu tin nhắn phân tách (decouple messaging pattern) cho các hàm trích xuất metadata và embedding tài liệu đảm bảo sự phân tách lỏng lẻo và bảo vệ chức năng embedding downstream cho tính toán chuyên sâu.
Hàm embedding tải tệp PDF từ S3 và sử dụng một text embedding model để tạo ra một vector của văn bản chứa trong tập tài liệu. LangChain tích hợp với các mô hình text embedding cho nhiều nhà cung cấp LLM khác nhau. Biểu diễn vector của văn bản được tải vào một FAISS index. FAISS là một cửa hàng vector mã nguồn mở có thể chạy bên trong bộ nhớ hàm Lambda bằng cách sử dụng gói Python faiss-cpu. Cuối cùng, một bản sao của FAISS index này được lưu trữ trong thùng chứa S3 bên cạnh tài liệu PDF gốc.
Generating responses
Khi prompt cho một tài liệu cụ thể được gửi qua REST API endpoint của Amazon API Gateway, nó được proxy đến một hàm Lambda mà:
1. Tải FAISS index của tài liệu PDF tương ứng từ S3 vào bộ nhớ của hàm.
2. Thực hiện tìm kiếm tương đồng (similarity search) của FAISS vector store dựa trên yêu cầu.
3. Nếu có sẵn, truy xuất một bản ghi của các tin nhắn trước đó trong cùng một cuộc trò chuyện thông qua tích hợp `DynamoDBChatMessageHistory`. Tích hợp này có thể lưu trữ lịch sử tin nhắn trong DynamoDB. Mỗi cuộc trò chuyện được xác định bằng một ID duy nhất.
4. Cuối cùng, một ConversationalRetrievalChain LangChain chuyển các thông tin bao gồm prompt được gửi bởi người dùng, kết quả của tìm kiếm vector và lịch sử tin nhắn cho một LLM để tạo ra một phản hồi.
Web application and file uploads
Một ứng dụng web tĩnh phục vụ như frontend cho giải pháp này. Nó được xây dựng với React, TypeScript, Vite và TailwindCSS và triển khai thông qua AWS Amplify Hosting, một dịch vụ CI/CD và lưu trữ được quản lý hoàn toàn cho các ứng dụng tĩnh và tạo application phía server-side nhanh, an toàn và đáng tin cậy. Để bảo vệ ứng dụng khỏi truy cập trái phép, nó tích hợp với một nhóm người dùng Amazon Cognito. API gateway sử dụng Amazon Cognito authorizer để xác thực các yêu cầu.
Người dùng tải lên các tệp PDF trực tiếp vào thùng chứa S3 bằng cách sử dụng các URL được ký trước S3 (S3 presigned URLs) được nhận thông qua API REST. Một số hàm Lambda sử dụng API endpoint để tạo, đọc và cập nhật metadata của tài liệu trong DynamoDB table.
Mở rộng và điều chỉnh giải pháp
Giải pháp được cung cấp là một bản thiết kế mà bạn có thể cải thiện và mở rộng để phát triển các trường hợp sử dụng của riêng bạn dựa trên LLMs. Ví dụ, bạn có thể mở rộng giải pháp để người dùng có thể đặt câu hỏi trên nhiều tài liệu PDF hoặc các loại nguồn dữ liệu khác. LangChain giúp việc tải các loại dữ liệu khác nhau vào vector store trở nên dễ dàng, sau đó bạn có thể sử dụng chúng cho tìm kiếm ngữ nghĩa.
Khi trường hợp sử dụng của bạn liên quan đến tìm kiếm trên nhiều tài liệu, hãy xem xét chuyển từ việc tải các vector vào bộ nhớ bằng FAISS sang một cơ sở dữ liệu vector riêng biệt. Có một số lựa chọn cho cơ sở dữ liệu vector trên AWS. Một tùy chọn serverless là Amazon Aurora Serverless v2 với phần mở rộng pgvector cho PostgreSQL. Hoặc, các cơ sở dữ liệu vector được phát triển bởi đối tác của AWS như Pinecone hoặc MongoDB Atlas Vector Search có thể được tích hợp với LangChain. Ngoài tìm kiếm vector, LangChain cũng tích hợp với các nguồn dữ liệu ngoài truyền thống, chẳng hạn như dịch vụ tìm kiếm doanh nghiệp Amazon Kendra, Amazon OpenSearch và nhiều nguồn dữ liệu khác.
Giải pháp được trình bày trong bài đăng này sử dụng tìm kiếm tương đồng để tìm thông tin trong cơ sở dữ liệu vector mà phù hợp nhất với yêu cầu được cung cấp bởi người dùng. Điều này hoạt động tốt trong trường hợp sử dụng presented, bạn cũng có thể sử dụng các phương pháp khác, chẳng hạn như tối đa hóa lợi ích cực đại (maximal marginal relevance), để tìm thông tin phù hợp nhất để cung cấp cho LLM. Khi tìm kiếm trên nhiều tài liệu và nhận được nhiều kết quả, các kỹ thuật như MapReduce có thể cải thiện chất lượng của các phản hồi của LLM.
Tùy thuộc vào trường hợp sử dụng của bạn, bạn cũng có thể muốn chọn một LLM khác nhau để đạt được sự cân bằng lý tưởng giữa chất lượng kết quả và chi phí. Amazon Bedrock là một dịch vụ được quản lý hoàn toàn, giúp các mô hình nền (FMs) từ các công ty khởi nghiệp trí tuệ nhân tạo hàng đầu và Amazon có sẵn qua một API, vì vậy bạn có thể lựa chọn từ một loạt các FMs để tìm ra mô hình phù hợp nhất với trường hợp sử dụng của bạn. Bạn có thể sử dụng các mô hình như Amazon Titan, Jurassic-2 từ AI21 Labs, hoặc Anthropic Claude.
Để tối ưu hóa trải nghiệm người dùng của ứng dụng trí tuệ nhân tạo tạo ra, hãy xem xét việc truyền các phản hồi của LLM đến frontend của bạn theo thời gian thực bằng cách sử dụng luồng phản hồi Lambda (Lambda response streaming) và triển khai cập nhật dữ liệu theo thời gian thực bằng cách sử dụng AWS AppSync subscriptions hoặc Amazon API Gateway WebSocket APIs.
Phần kết luận
Các dịch vụ serverless của AWS giúp bạn dễ dàng tập trung hơn vào việc xây dựng các generative AI applications, cung cấp automatic scaling, high availability được tích hợp sẵn và mô hình thanh toán trả tiền theo mức sử dụng. Điện toán theo hướng sự kiện với AWS Lambda rất phù hợp cho các tác vụ theo yêu cầu, chuyên sâu về điện toán như embedding tài liệu và điều phối LLM linh hoạt.
Giải pháp trong bài đăng này kết hợp khả năng của LLM và tìm kiếm ngữ nghĩa để trả lời các câu hỏi ngôn ngữ tự nhiên hướng đến tài liệu PDF. Nó đóng vai trò như một kế hoạch có thể được mở rộng và điều chỉnh để phù hợp với các trường hợp sử dụng AI mang tính tổng quát hơn.
Triển khai giải pháp bằng cách làm theo hướng dẫn trong kho lưu trữ GitHub.
Để biết thêm tài nguyên học tập không có máy chủ, hãy truy cập Serverless Land.
TAGS: contributed, serverless