Tác giả: Jiwon Yeom và Jimin Kim
Ngày phát hành: 14 APR 2025
Chuyên mục: Amazon Bedrock, Amazon Bedrock Agents, Best Practices, Generative AI, Technical How-to, Thought Leadership
Generative AI cho phép chúng ta hoàn thành nhiều việc hơn trong thời gian ngắn hơn. Text-to-SQL trao quyền cho mọi người khám phá dữ liệu và rút ra thông tin chi tiết bằng ngôn ngữ tự nhiên, mà không cần kiến thức chuyên sâu về cơ sở dữ liệu. Amazon Web Services (AWS) đã giúp nhiều khách hàng kết nối khả năng text-to-SQL này với dữ liệu của riêng họ, điều đó có nghĩa là nhiều nhân viên hơn có thể tạo ra thông tin chi tiết. Trong quá trình này, chúng tôi nhận thấy rằng cần có một cách tiếp cận khác trong các môi trường doanh nghiệp nơi có hơn 100 bảng, mỗi bảng có hàng chục cột. Chúng tôi cũng nhận thấy rằng việc xử lý lỗi mạnh mẽ là rất quan trọng khi xảy ra lỗi trong truy vấn SQL được tạo dựa trên câu hỏi của người dùng.
Bài viết này trình bày cách các doanh nghiệp có thể triển khai giải pháp text-to-SQL dựa trên agent có khả năng mở rộng bằng cách sử dụng Amazon Bedrock Agents, với các công cụ xử lý lỗi nâng cao và khám phá schema tự động để tăng cường hiệu quả truy vấn cơ sở dữ liệu. Giải pháp dựa trên agent của chúng tôi cung cấp hai điểm mạnh chính:
- Khám phá schema có khả năng mở rộng tự động – Metadata về schema và bảng có thể được cập nhật động để tạo SQL khi nỗ lực ban đầu để thực thi truy vấn thất bại. Điều này rất quan trọng đối với các khách hàng doanh nghiệp có nhiều bảng và cột cùng nhiều mẫu truy vấn.
- Xử lý lỗi tự động – Thông báo lỗi được đưa trực tiếp trở lại agent để cải thiện tỷ lệ thành công khi chạy các truy vấn.
Bạn sẽ thấy rằng các tính năng này giúp bạn giải quyết các thách thức về cơ sở dữ liệu quy mô doanh nghiệp, đồng thời làm cho trải nghiệm text-to-SQL của bạn trở nên mạnh mẽ và hiệu quả hơn.
Trường hợp sử dụng
Giải pháp text-to-SQL dựa trên agent có thể mang lại lợi ích cho các doanh nghiệp có cấu trúc dữ liệu phức tạp. Trong bài viết này, để hiểu cơ chế và lợi ích của giải pháp text-to-SQL dựa trên agent trong môi trường doanh nghiệp phức tạp, hãy tưởng tượng bạn là một nhà phân tích kinh doanh trong nhóm quản lý rủi ro tại một ngân hàng. Bạn cần trả lời các câu hỏi như “Tìm tất cả các giao dịch xảy ra ở Hoa Kỳ và bị gắn cờ là gian lận, cùng với thông tin thiết bị được sử dụng cho các giao dịch đó,” hoặc “Truy xuất tất cả các giao dịch của John Doe xảy ra từ ngày 1 tháng 1 năm 2023 đến ngày 31 tháng 12 năm 2023, bao gồm cờ gian lận và chi tiết người bán.” Đối với điều này, có hàng chục—hoặc đôi khi hàng trăm—bảng mà bạn không chỉ cần biết mà còn phải tạo các truy vấn JOIN phức tạp. Sơ đồ sau minh họa một schema bảng mẫu có thể cần thiết cho việc điều tra gian lận.

Các vấn đề chính khi triển khai giải pháp text-to-SQL trong môi trường phức tạp này bao gồm, nhưng không giới hạn ở:
- Lượng thông tin bảng và schema sẽ trở nên quá mức, điều này sẽ đòi hỏi cập nhật thủ công trên các prompt và giới hạn khả năng mở rộng của nó.
- Kết quả là, giải pháp có thể yêu cầu xác thực bổ sung, ảnh hưởng đến chất lượng và hiệu suất của việc tạo SQL.
Bây giờ, hãy xem xét giải pháp của chúng tôi và cách nó giải quyết những vấn đề này.
Tổng quan giải pháp
Amazon Bedrock Agents quản lý liền mạch toàn bộ quy trình từ diễn giải câu hỏi đến thực thi truy vấn và diễn giải kết quả, mà không cần can thiệp thủ công. Nó tích hợp liền mạch nhiều công cụ, và agent phân tích và phản hồi các kết quả không mong muốn. Khi các truy vấn thất bại, agent tự động phân tích thông báo lỗi, sửa đổi truy vấn và thử lại—một lợi ích chính so với các hệ thống tĩnh.
Tính đến tháng 12 năm 2024, tính năng Amazon Bedrock với dữ liệu có cấu trúc cung cấp hỗ trợ tích hợp cho Amazon Redshift, mang lại khả năng text-to-SQL liền mạch mà không cần triển khai tùy chỉnh. Đây là giải pháp được khuyến nghị là giải pháp chính cho người dùng Amazon Redshift.
Dưới đây là các khả năng mà giải pháp này cung cấp:
- Thực thi text-to-SQL với khả năng tự động khắc phục sự cố:
a. Agent có thể diễn giải các câu hỏi ngôn ngữ tự nhiên và chuyển đổi chúng thành các truy vấn SQL. Sau đó, nó thực thi các truy vấn này đối với cơ sở dữ liệu Amazon Athena và trả về kết quả.
b. Nếu việc thực thi truy vấn thất bại, agent có thể phân tích các thông báo lỗi được trả về bởi AWS Lambda và tự động thử lại truy vấn đã sửa đổi khi thích hợp. - Khám phá schema động
a. Liệt kê các bảng – Agent có thể cung cấp một danh sách toàn diện các bảng trong cơ sở dữ liệu phát hiện gian lận. Điều này giúp người dùng hiểu các cấu trúc dữ liệu có sẵn.
b. Mô tả schema bảng – Người dùng có thể yêu cầu thông tin chi tiết về schema của các bảng cụ thể. Agent sẽ cung cấp tên cột, kiểu dữ liệu và các comment liên quan, giúp người dùng hiểu rõ về cấu trúc dữ liệu.
Giải pháp sử dụng các công cụ cơ sở dữ liệu trực tiếp để khám phá schema thay vì truy xuất dựa trên vector store hoặc định nghĩa schema tĩnh. Cách tiếp cận này cung cấp độ chính xác hoàn toàn với chi phí vận hành thấp hơn vì nó không yêu cầu cơ chế đồng bộ hóa và liên tục phản ánh cấu trúc cơ sở dữ liệu hiện tại. Truy cập schema trực tiếp thông qua các công cụ dễ bảo trì hơn so với các cách tiếp cận được mã hóa cứng đòi hỏi cập nhật thủ công, và nó cung cấp hiệu suất và hiệu quả chi phí tốt hơn thông qua tương tác cơ sở dữ liệu theo thời gian thực.
Quy trình làm việc như sau:
- Người dùng đặt câu hỏi cho Amazon Bedrock Agents.
- Để phục vụ câu hỏi của người dùng, agent xác định hành động thích hợp để gọi:
a. Để thực thi truy vấn được tạo với sự tự tin, agent sẽ gọiathena-query.
b. Để xác nhận schema cơ sở dữ liệu trước, agent sẽ gọi công cụathena-schema-reader:
* Truy xuất danh sách các bảng có sẵn bằng cách sử dụng endpoint/list_tablescủa nó.
* Lấy schema cụ thể của một bảng nhất định bằng cách sử dụng endpoint/describe_tablecủa nó.
c. Hàm Lambda gửi truy vấn đến Athena để thực thi.
d. Athena truy vấn dữ liệu từ bucket dữ liệu Amazon Simple Storage Service (Amazon S3) và lưu trữ kết quả truy vấn trong bucket đầu ra S3.
e. Hàm Lambda truy xuất và xử lý kết quả. Nếu xảy ra lỗi:
* Hàm Lambda nắm bắt và định dạng thông báo lỗi để agent hiểu.
* Thông báo lỗi được trả về cho Amazon Bedrock Agents.
* Agent phân tích thông báo lỗi và cố gắng giải quyết nó. Để thử lại với truy vấn đã sửa đổi, agent có thể lặp lại các bước 2–5.
f. Agent định dạng và trình bày các phản hồi cuối cùng cho người dùng.
Sơ đồ kiến trúc sau đây cho thấy quy trình làm việc này.

Hướng dẫn thực hiện
Để triển khai giải pháp, hãy sử dụng các hướng dẫn trong các phần sau.
Xử lý lỗi thông minh
Giải pháp text-to-SQL dựa trên agent của chúng tôi triển khai xử lý lỗi thực tế giúp các agent hiểu và phục hồi sau các sự cố. Bằng cách cấu trúc lỗi với các yếu tố nhất quán, trả về các lỗi không gây gián đoạn nếu có thể và cung cấp các gợi ý theo ngữ cảnh, hệ thống cho phép các agent tự sửa lỗi và tiếp tục quá trình suy luận của chúng.
Hướng dẫn cho Agent
Hãy xem xét các thành phần prompt chính làm cho giải pháp này trở nên độc đáo. Xử lý lỗi thông minh giúp tự động hóa việc khắc phục sự cố và tinh chỉnh truy vấn bằng cách cho phép agent hiểu loại lỗi và phải làm gì khi lỗi xảy ra:
Execution and Error Handling:
- Execute the query via the /athena_query endpoint
- If the execution fails, carefully analyze the error message and hint provided by the Lambda function
- Based on the error type received from the Lambda function, take appropriate action:
- After identifying the issue based on the error message and hint:
1. Modify your query or API request to address the specific problem
2. If needed, use schema discovery tools (/list_tables, /describe_table) to gather updated information
3. Reconstruct the query with the necessary corrections
4. Retry the execution with the modified query or request
Prompt cung cấp hướng dẫn về cách tiếp cận các lỗi. Nó cũng nêu rõ rằng các loại lỗi và gợi ý sẽ được cung cấp bởi Lambda. Trong phần tiếp theo, chúng tôi giải thích cách Lambda xử lý các lỗi và chuyển chúng cho agent.
Chi tiết triển khai
Dưới đây là một số ví dụ chính từ hệ thống xử lý lỗi của chúng tôi:
ERROR_MESSAGES = {
'QUERY_EXECUTION_FAILED': {
'message': 'Failed to execute query',
'hint': 'Please use fully qualified table names. Example: SELECT * FROM fraud_data.customers LIMIT 1'
},
'QUERY_RESULT_ERROR': {
'message': 'Error occurred while getting query results',
'hint': 'Check if the tables and columns in your query exist and you have proper permissions. Examples: "customers", "transactions", or "devices".'
},
'MISSING_QUERY': {
'message': 'Query is required',
'hint': 'No query was provided. Please provide a SQL query to execute'
}
}
def create_query_response(query_result, status_code=200):
if query_result.get('error'):
error_info = ERROR_MESSAGES.get(query_result['error'])
return {
'error': query_result['error'],
'message': error_info['message'],
'hint': error_info['hint']
}
return query_result
Các loại lỗi này bao gồm các kịch bản chính trong tương tác text-to-SQL:
- Lỗi thực thi truy vấn – Xử lý lỗi cú pháp và sự cố tham chiếu bảng, hướng dẫn agent sử dụng tên bảng và cú pháp SQL chính xác.
- Sự cố truy xuất kết quả – Giải quyết các vấn đề về quyền và tham chiếu cột không hợp lệ, giúp agent xác minh schema và quyền truy cập.
- Xác thực API – Xác minh rằng các yêu cầu cơ bản được đáp ứng trước khi thực thi truy vấn, giảm thiểu các lệnh gọi API không cần thiết.
Mỗi loại lỗi bao gồm cả thông báo giải thích và gợi ý có thể hành động, cho phép agent thực hiện các bước khắc phục thích hợp. Việc triển khai này cho thấy việc bật xử lý lỗi thông minh có thể đơn giản như thế nào; thay vì xử lý lỗi theo cách truyền thống trong Lambda, chúng tôi trả về các thông báo lỗi có cấu trúc mà agent có thể hiểu và hành động.
Khám phá schema động
Khám phá schema là yếu tố then chốt để giữ cho Amazon Bedrock Agents tiêu thụ thông tin schema gần đây nhất và có liên quan nhất.
Hướng dẫn cho Agent
Thay vì thông tin schema cơ sở dữ liệu được mã hóa cứng, chúng tôi cho phép agent khám phá schema cơ sở dữ liệu một cách linh hoạt. Chúng tôi đã tạo hai endpoint API cho mục đích này:
Schema Discovery:
- Use /list_tables endpoint to identify available tables in the database
- Use /describe_table endpoint to get detailed schema information for specific tables
- Always use the most recent and relevant table schemas, as the database structure may change frequently
- Before constructing queries, ensure you have up-to-date schema information
Chi tiết triển khai
Dựa trên hướng dẫn của agent, agent sẽ gọi endpoint API thích hợp.
Endpoint /list_tables liệt kê các bảng trong một cơ sở dữ liệu được chỉ định. Điều này đặc biệt hữu ích khi bạn có nhiều cơ sở dữ liệu hoặc thường xuyên thêm các bảng mới:
@app.post("/list_tables", description="Retrieve a list of all tables in the specified database")
def list_tables(event, database_name):
query = f"SHOW TABLES IN {database_name}"
result = execute_and_get_results(query, s3_output)
if isinstance(result, dict) and 'error' in result:
return create_api_response(event, 400, get_error_response('QUERY_RESULT_ERROR'))
return create_api_response(event, 200, result)
Endpoint /describe_table đọc schema của một bảng cụ thể với các chi tiết. Chúng tôi sử dụng lệnh “DESCRIBE”, bao gồm các comment cột cùng với các chi tiết schema khác. Các comment này giúp agent hiểu rõ hơn ý nghĩa của các cột riêng lẻ:
@app.post("/describe_table", description="Retrieve the schema information of a specific table")
def describe_table(event, database_name, table_name):
query = f"DESCRIBE {database_name}.{table_name}"
result = execute_and_get_results(query, s3_output)
if isinstance(result, dict) and 'error' in result:
return create_api_response(event, 400, get_error_response('QUERY_RESULT_ERROR'))
formatted_result = {
"table_name": table_name,
"database": database_name,
"columns": result
}
return create_api_response(event, 200, formatted_result)
Khi triển khai trình đọc schema động, hãy cân nhắc bao gồm các mô tả cột toàn diện để tăng cường sự hiểu biết của agent về mô hình dữ liệu.
Các endpoint này cho phép agent duy trì sự hiểu biết cập nhật về cấu trúc cơ sở dữ liệu, cải thiện khả năng tạo các truy vấn chính xác và thích ứng với các thay đổi trong schema.
Minh họa
Bạn có thể không trải nghiệm phản hồi chính xác như ảnh chụp màn hình được trình bày do tính chất không xác định của các mô hình ngôn ngữ lớn (LLMs).
Giải pháp có sẵn để bạn triển khai trong môi trường của mình với dữ liệu mẫu. Clone repository từ liên kết GitHub này và làm theo hướng dẫn README. Sau khi bạn triển khai hai stack—AwsText2Sql-DbStack và AwsText2Sql-AgentStack—hãy làm theo các bước sau để đưa giải pháp vào hoạt động:
- Truy cập Amazon Bedrock console và chọn Agents.
- Chọn AwsText-to-SQL-AgentStack-DynamicAgent và kiểm tra bằng cách đặt câu hỏi trong cửa sổ Test ở bên phải.
- Ví dụ về tương tác:
- Nhóm nhân khẩu học hoặc ngành nào thường xuyên bị những kẻ lừa đảo nhắm đến nhất? Trình bày dữ liệu tổng hợp.
- Những phương pháp hoặc kỹ thuật cụ thể nào thường được những kẻ phạm tội sử dụng trong các trường hợp gian lận được báo cáo?
- Chúng ta có thể xác định những mẫu hoặc xu hướng nào về thời gian và địa điểm xảy ra sự cố gian lận?
- Hiển thị chi tiết khách hàng đã thực hiện giao dịch với người bán ở Denver.
- Cung cấp danh sách tất cả người bán cùng với tổng số giao dịch họ đã xử lý và số lượng giao dịch đó bị gắn cờ là gian lận.
- Liệt kê năm khách hàng hàng đầu dựa trên số tiền giao dịch cao nhất mà họ đã thực hiện.

- Chọn Show trace và kiểm tra từng bước để hiểu công cụ nào được sử dụng và lý do của agent để tiếp cận câu hỏi của bạn, như được hiển thị trong ảnh chụp màn hình sau.

- (Tùy chọn) Bạn có thể kiểm tra code interpreter của Amazon Bedrock Agents bằng cách bật nó trong Agent settings. Làm theo hướng dẫn tại Enable code interpretation in Amazon Bedrock và hỏi agent “Tạo biểu đồ cột hiển thị ba thành phố hàng đầu có nhiều trường hợp gian lận nhất.”

Các best practice
Dựa trên cuộc thảo luận của chúng tôi về khám phá schema động và xử lý lỗi thông minh, dưới đây là các best practice chính để tối ưu hóa giải pháp text-to-SQL dựa trên agent của bạn:
- Sử dụng khám phá schema động và xử lý lỗi – Sử dụng các endpoint như
/list_tablesvà/describe_tableđể cho phép agent thích ứng linh hoạt với cấu trúc cơ sở dữ liệu của bạn. Triển khai xử lý lỗi toàn diện như đã trình bày trước đó, cho phép agent diễn giải và phản hồi các loại lỗi khác nhau một cách hiệu quả. - Cân bằng thông tin tĩnh và động – Mặc dù khám phá động rất mạnh mẽ, hãy cân nhắc đưa thông tin quan trọng, ổn định vào prompt. Điều này có thể bao gồm tên cơ sở dữ liệu, mối quan hệ bảng chính hoặc các bảng thường được sử dụng hiếm khi thay đổi. Đạt được sự cân bằng này có thể cải thiện hiệu suất mà không làm mất đi tính linh hoạt.
- Điều chỉnh cho môi trường của bạn – Chúng tôi đã thiết kế mẫu để luôn gọi
/list_tablesvà/describe_table, và việc triển khai của bạn có thể cần điều chỉnh. Hãy xem xét khả năng và giới hạn của công cụ cơ sở dữ liệu cụ thể của bạn. Bạn có thể cần cung cấp ngữ cảnh bổ sung ngoài các comment cột. Hãy nghĩ đến việc bao gồm mô tả cơ sở dữ liệu, mối quan hệ bảng hoặc các mẫu truy vấn phổ biến. Điều quan trọng là cung cấp cho agent của bạn càng nhiều thông tin liên quan càng tốt về mô hình dữ liệu và ngữ cảnh kinh doanh của bạn, cho dù thông qua metadata mở rộng, các endpoint tùy chỉnh hay hướng dẫn chi tiết. - Triển khai bảo vệ dữ liệu mạnh mẽ – Mặc dù giải pháp của chúng tôi sử dụng Athena, vốn vốn không hỗ trợ các hoạt động ghi, điều quan trọng là phải xem xét bảo vệ dữ liệu trong môi trường cụ thể của bạn. Bắt đầu bằng các hướng dẫn rõ ràng trong prompt (ví dụ: “chỉ các hoạt động chỉ đọc”), và cân nhắc các lớp bổ sung như Amazon Bedrock Guardrails hoặc hệ thống đánh giá dựa trên LLM để đảm bảo rằng các truy vấn được tạo phù hợp với các chính sách security của bạn.
- Triển khai ủy quyền theo lớp – Để tăng cường quyền riêng tư dữ liệu khi sử dụng Amazon Bedrock Agents, bạn có thể sử dụng các dịch vụ như Amazon Verified Permissions để xác thực quyền truy cập của người dùng trước khi agent xử lý dữ liệu nhạy cảm. Chuyển thông tin nhận dạng người dùng, chẳng hạn như JWT token, cho agent và hàm Lambda liên quan của nó, cho phép kiểm tra ủy quyền chi tiết đối với các chính sách được xây dựng trước. Bằng cách thực thi kiểm soát truy cập ở cấp độ ứng dụng dựa trên quyết định của Verified Permissions, bạn có thể giảm thiểu việc tiết lộ dữ liệu ngoài ý muốn và duy trì sự cô lập dữ liệu mạnh mẽ. Để tìm hiểu thêm, hãy tham khảo Enhancing data privacy with layered authorization for Amazon Bedrock Agents trong AWS Security Blog.
- Xác định chiến lược điều phối tốt nhất cho agent của bạn – Amazon Bedrock cung cấp cho bạn tùy chọn để tùy chỉnh chiến lược điều phối của agent. Điều phối tùy chỉnh cung cấp cho bạn toàn quyền kiểm soát cách bạn muốn các agent của mình xử lý các tác vụ đa bước, đưa ra quyết định và thực thi quy trình làm việc.
Bằng cách triển khai các best practice này, bạn có thể tạo ra một giải pháp text-to-SQL không chỉ sử dụng toàn bộ tiềm năng của các agent AI mà còn duy trì security và tính toàn vẹn của hệ thống dữ liệu của bạn.
Kết luận
Tóm lại, việc triển khai giải pháp text-to-SQL dựa trên agent có khả năng mở rộng bằng cách sử dụng các dịch vụ AWS mang lại những lợi thế đáng kể cho enterprise workloads. Bằng cách sử dụng khám phá schema tự động và xử lý lỗi mạnh mẽ, các tổ chức có thể quản lý hiệu quả các cơ sở dữ liệu phức tạp với nhiều bảng và cột. Cách tiếp cận dựa trên agent thúc đẩy việc tạo và tinh chỉnh truy vấn động, dẫn đến tỷ lệ thành công cao hơn trong việc truy vấn dữ liệu. Chúng tôi muốn mời bạn dùng thử giải pháp này ngay hôm nay! Truy cập GitHub để tìm hiểu sâu hơn về chi tiết của giải pháp và làm theo hướng dẫn triển khai để kiểm tra trong tài khoản AWS của bạn.
Về tác giả

Jimin Kim là Prototyping Architect trong nhóm AWS Prototyping and Cloud Engineering (PACE), làm việc tại Los Angeles. Với chuyên môn về Generative AI và SaaS, cô ấy thích giúp khách hàng thành công trong công việc kinh doanh của họ. Ngoài công việc, cô ấy trân trọng những khoảnh khắc bên vợ và ba chú mèo calico đáng yêu của mình.

Jiwon Yeom là Kiến trúc sư giải pháp (Solutions Architect) tại AWS, làm việc tại Thành phố New York. Cô tập trung vào Generative AI trong ngành dịch vụ tài chính và đam mê giúp khách hàng xây dựng các giải pháp AI có khả năng mở rộng, bảo mật và lấy con người làm trung tâm. Ngoài công việc, cô thích viết lách và khám phá những hiệu sách ẩn.