Tải bản đầy đủ (.pdf) (18 trang)

Đồ án generating code of programming languages for automatic software development

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (362.15 KB, 18 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM

ĐỒ ÁN 1
GENERATING CODE OF PROGRAMMING LANGUAGES
FOR AUTOMATIC SOFTWARE DEVELOPMENT

GV hướng dẫn: Huỳnh Tuấn Anh
SV thực hiện:
20521449 - Nguyễn Khánh
20521280 - Nguyễn Hồng Ngọc Hải

Thành phố Hồ Chí Minh, tháng 7 năm 2023


Lời cảm ơn
Lời đầu tiên, nhóm xin gửi lời cảm ơn chân thành nhất đến Thầy Huỳnh Tuấn
Anh, giảng viên đã hướng dẫn nhóm trong bộ mơn Đồ án 1. Trong q trình học tập
và thực hiện đồ án, nhóm đã nhận được sự quan tâm giúp đỡ, hướng dẫn tận tình,
tâm huyết của Thầy. Quá trình thực hiện Đồ án 1 là một q trình đầy thử thách, địi
hỏi phải dành nhiều thời gian, công sức để nghiên cứu, tìm tịi và xây dựng. Vì thế,
đây cũng là cơ hội và động lực để nhóm rèn luyện, hồn thiện bản thân bằng những
kĩ năng tích lũy được trong suốt q trình thực hiện mơn học, từ đấy tiếp thu được
nhiều kinh nghiệm quý báu cho con đường phát triển sau này.
Với sự phát triển của sức mạnh phần cứng và các thuật toán tối ưu mới, ứng dụng
của Artificial Intelligence trong những năm gần đây đang được áp dụng vào rất nhiều
lĩnh vực và môi trường khác nhau, và cũng kéo theo đó là nhiều vấn đề mới phức tạp
hơn cần được giải quyết. Đề tài của nhóm trong việc chuyển đổi ngôn ngữ giao tiếp
thông dụng sang ngôn ngữ lập trình cũng đã xuất hiện ở rất nhiều hình dạng, kiểu
dáng khác nhau và được nghiên cứu rất chun sâu trong nhiều khía cạnh. Nhóm rất


mong bài báo cáo sẽ giúp Thầy và người đọc có một cái nhìn tổng quan về hướng đi
của đề tài, cũng như thể hiện được các kiến thức liên quan đến việc giải quyết bài toán.
Do vốn kiến thức lĩnh vực vẫn còn nhiều hạn chế và khả năng tiếp thu còn giới hạn,
đồ án của nhóm khơng tránh khỏi có những thiếu sót và nhầm lẫn. Nhóm rất mong
nhận được những góp ý, chỉnh sửa đến từ Thầy để đồ án của nhóm được hồn thiện
hơn.
Lời cuối cùng, nhóm xin chân thành cảm ơn Thầy và xin kính chúc Thầy nhiều sức
khỏe, hạnh phúc và thành công trên con đường sự nghiệp giảng dạy.
Nguyễn Khánh
Nguyễn Hoàng Ngọc Hải

1


Mục lục
1 Mở đầu

3

2 Tổng quan
2.1 Giải thích bài tốn . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Bộ dữ liệu huấn luyện (Dataset) . . . . . . . . . . . . . . . . . . . . . .
2.3 Các nghiên cứu liên quan . . . . . . . . . . . . . . . . . . . . . . . . . .

4
4
4
5

3 Phương hướng tiếp cận

3.1 Tổng quát phương hướng . . . . . . . . . . . . . . . . . . . .
3.2 Thiết kế dữ liệu đầu vào . . . . . . . . . . . . . . . . . . . .
3.3 Biểu diễn câu lệnh SQL và các công việc thành phần . . . .
3.4 Xếp hạng các cột thành phần . . . . . . . . . . . . . . . . .
3.5 Huấn luyện mơ hình và suy luận kết quả . . . . . . . . . . .
3.6 Execution-guided decoding (Giải mã có định hướng thực thi)

.
.
.
.
.
.

7
7
7
8
9
10
11

4 Thử nghiệm & Đánh giá
4.1 Thử nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14
14

5 Tổng kết


16

2

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.

.
.
.
.
.
.


1

Mở đầu

Một lượng cực kỳ lớn thông tin ngày nay được lưu trữ trong các cơ sở dữ liệu
quan hệ (SQL databases). Những cơ sở dữ liệu này là nền tảng tối quan trọng của
các hệ thống như thông tin y tế, dân cư, thị trường tài chính, thương mại điện tử,
dịch vụ trực tuyến, ... Một trong những điểm thu hút chính của cơ sở dữ liệu quan
hệ là người dùng có thể sử dụng ngơn ngữ khai báo để mơ tả truy vấn họ muốn
thực hiện thay vì viết một tập hợp các lời gọi hàm, khi đấy chi tiết cách thực hiện
câu lệnh truy vấn được tóm tắt trong chi tiết thiết kế của hệ thống cơ sở dữ liệu đó,
tránh phải sửa đổi source code của ứng dụng khi có thay đổi trong tổ chức cơ sở dữ liệu.
Tuy nhiên, bất chấp sự gia tăng nhanh chóng về mức độ phổ biến của cơ sở dữ liệu
quan hệ, khả năng truy xuất thông tin từ các cơ sở dữ liệu này vẫn còn hạn chế. Điều
này một phần là do người dùng cần hiểu các ngôn ngữ truy vấn có cấu trúc phức tạp
và nhiều thành phần, và việc thành thạo các truy vấn SQL mạnh mẽ cũng được xem
là khó khăn.
Khái niệm về việc tương tác với cơ sở dữ liệu thông qua ngôn ngữ tự nhiên của
con người đã là một mục tiêu được nhắm tới từ lâu dài, với tên gọi chung là “Natural
Language Interface to Databases” (NLIDBs) hoặc “NL-to-SQL” hoặc “Textto-SQL” [Androutsopoulos et al., 1995]. Mục tiêu chính ở đây là giải bài tốn Xử lý

ngơn ngữ tự nhiên (Natural Language Processing – NLP) nhằm phân tích ngữ nghĩa
(semantic parsing): biến đổi một mô tả truy vấn dưới dạng ngôn ngữ tự nhiên trở
thành một câu lệnh SQL mà máy tính có thể xử lý được. Trong những năm gần đây,
với sự phát triển của các mơ hình học sâu (deep learning) mới, các nghiên cứu về vấn
đề này có xu hướng nghiêng về tiếp cận bài tốn bằng các mơ hình có sẵn.
Mục tiêu chính của đồ án sẽ nằm ở việc giải thích các khía cạnh của bài tốn
Text-to-SQL, cùng với đó là áp dụng các phương pháp tận dụng sức mạnh của các mơ
hình ngơn ngữ (language model) đã được huấn luyện sẵn để giải quyết bài toán. Source
code1 và các thơng số của mơ hình huấn luyện được public trên Github, đi cùng với
các thử nghiệm và thông số kết quả được thực hiện trên bộ dữ liệu WikiSQL, một bộ
dữ liệu bao gồm hơn 80000 mô tả ngôn ngữ tự nhiên và câu lệnh SQL tương ứng.

1

/>
3


2

Tổng quan

2.1

Giải thích bài tốn

Thơng thường, một câu truy vấn SQL sẽ bao gồm các thành phần chính:
• Aggregation operator (hàm tổng hợp): để truy xuất thông tin tổng quan từ
các hàng được chọn bởi câu truy vấn. Aggregation operator có thể để trống nếu
câu truy vấn khơng u cầu thơng tin tổng quan của hàng

• SELECT-clause (cột được chọn): xác định các cột được chọn để truy xuất dữ
liệu
• FROM-clause (bảng được chọn): xác định bảng dữ liệu (table) để truy xuất
• WHERE-clause (điều kiện): xác định các điều kiện để lọc dữ liệu
Ngồi ra cịn có nhiều loại clause không bắt buộc sử dụng trong một câu truy vấn
(GROUP BY, ORDER BY, HAVING, LIMIT, . . . ). Những clause này thường được sử
dụng cho các yêu cầu truy vấn nâng cao hơn.
Trong phạm vi của bài toán hiện tại, đầu vào của bài toán sẽ là dữ liệu của table
cần truy xuất dữ liệu và yêu cầu truy xuất bằng ngôn ngữ tự nhiên, đầu ra sẽ là câu
lệnh SQL tương ứng để sử dụng trên table đó để cho ra kết quả đúng như yêu cầu.

2.2

Bộ dữ liệu huấn luyện (Dataset)

WikiSQL là một bộ dữ liệu tổng hợp bao gồm 80654 mô tả ngôn ngữ tự nhiên
& câu truy vấn SQL tương ứng trên 24241 table schema. Các thành phần được phân
chia ngẫu nhiên thành 56355, 8421 và 15878 phần tử tương ứng cho bộ train, dev và
test. Mỗi phần tử dữ liệu trong dataset bao gồm một table schema, một câu truy vấn
SQL và một câu hỏi ngôn ngữ tự nhiên tương ứng với câu lệnh SQL đó. Mỗi câu lệnh
SQL có một và chỉ một SELECT-clause đi cùng với Aggregation operator tương ứng,
và có từ 0 tới 4 WHERE-clause. Hình 1 biểu diễn một phần tử trong bộ dataset với
các thành phần đã nêu trên.
Các câu truy vấn có độ dài đa dạng được trải dài trên nhiều table schema, từ đó
đặt ra thách thức cho model trong việc đáp ứng trên nhiều câu truy vấn và nhiều loại
table khác nhau. Kích cỡ lớn của bộ dataset hỗ trợ tốt việc áp dụng các kỹ thuật sử
dụng mạng neural học sâu cho bài toán và thu hút nhiều sự quan tâm đối với bài tốn.

Hình 1: Một phần tử ví dụ trong WikiSQL


4


2.3

Các nghiên cứu liên quan

Trong các nghiên cứu trước đó, nhiều phương pháp đã được đưa ra đối với bài tốn
này, trong đó có thể phân loại thành ba hướng đi chính:
• Phiên dịch sequence-to-sequence (Seq2seq):
Các mơ hình tiêu biểu: Seq2SQL của [Zhong et al., 2017], Coarse-to-Fine của
[Dong and Lapata, 2018], SeaD của [Xu et al., 2023]
Các phương pháp đi đầu cho bài toán này thường được dựa theo cấu trúc này. Một
mơ hình Seq2seq là một mơ hình đưa vào một chuỗi các phần tử (từ vựng, chữ cái,
...) và xuất ra một chuỗi các phần tử khác. Mô hình Seq2seq bao gồm 2 thành phần
chính: encoder (bộ mã hóa) và decoder (bộ phiên dịch). Encoder có vai trị trích xuất
các thơng tin chính trong chuỗi dữ liệu đầu vào và chuyển đổi nó dưới dạng các vector
ẩn và gửi tới decoder, từ đó decoder tiếp thu và trả về chuỗi dữ liệu đầu ra tương ứng.
Khó khăn:
Các phương pháp sử dụng Seq2seq thường không đạt hiệu quả cao do thứ tự của
các WHERE-clause khơng có ảnh hưởng trong câu lệnh SQL, nhưng có ảnh hưởng
đối với các Seq2seq model, và việc huấn luyện để sắp xếp thứ tự trong model thường
khá khó khăn. Các nghiên cứu sử dụng Seq2seq cũng có một vài phương pháp phụ để
giảm thiểu độ phức tạp của vấn đề trên như áp dụng Reinforcement Learning (RL)
nhưng độ cải thiện không cao. Nhưng các mơ hình mới ra mắt gần đây như SeaD của
[Xu et al., 2023] với việc áp dụng model hiệu quả và áp dụng các phương pháp giảm
nhiễu đã cải thiện đáng kể độ chính xác của kết quả dự đốn.
• Chia task nhỏ cho từng phần trong câu lệnh SQL:
Các mơ hình tiêu biểu: TypeSQL của [Yu et al., 2018], HydraNet của [Lyu et al., 2020]
Hướng giải quyết này tách việc dự đốn tồn bộ câu truy vấn trở thành dự đoán từng

thành phần trong câu truy vấn như SELECT-column, SELECT-aggregation, WHEREcolumn, WHERE-value, . . . , mỗi thành phần sẽ được xác định bởi một model con, giúp
giảm tỷ lệ câu lệnh kết quả bị lỗi cú pháp.
Khó khăn:
Việc tiếp cận này giúp tránh được vấn đề ảnh hưởng thứ tự của các Seq2seq model,
nhưng nó lại làm yếu đi mối quan hệ giữa các thành phần như mối liên kết giữa
SELECT-column và WHERE-column, giữa các WHERE-clause với nhau, . . . Cùng
với đó, các bài báo cũ về hướng này thường sử dụng các bộ không gian vector từ vựng
(word embedding/word representation) có sẵn đã được huấn luyện trước (pre-train)
như GloVe, vốn vẫn mắc những vấn đề của một model Word2vec như thiếu vector cho
các từ mới gặp lần đầu (Out-of-Vocabulary) và khó học các từ hiếm gặp.
• Áp dụng và tối ưu các pre-trained language model:
Các mô hình tiêu biểu: SQLova của [Hwang et al., 2019], IE-SQL của [Ma et al., 2020],
SeaD của [Xu et al., 2023]

5


Các nghiên cứu gần đây nhất thường xuyên sử dụng các language model huấn luyện
sẵn như BERT [Devlin et al., 2019] và BART [Lewis et al., 2019], những model đạt kết
quả rất tốt với rất nhiều bài tốn NLP khác.
Thơng thường, việc giải quyết công việc sẽ được xây dựng dựa trên các language
model có sẵn này, sau đó được tinh chỉnh (fine-tune) với dữ liệu liên quan tới các bài
tốn / cơng việc đấy. Thế nhưng việc thiết kế cấu trúc của cơng việc để có thể ăn khớp
với các language model và tối đa hóa sức mạnh của model không phải là một vấn đề
đơn giản.
Các nghiên cứu của [Hwang et al., 2019] và [Ma et al., 2020] đều thiết kế dữ liệu
đầu vào cho lớp encoder bằng cách nối tất cả các cột trong table và câu hỏi NL
lại với nhau; điều này giúp mơ hình học được mối liên kết giữa SELECT-column và
WHERE-column, cũng như mối liên kết giữa các WHERE-column trong từng điều kiện
WHERE.

Khó khăn:
Phương pháp này yêu cầu phải giải mã thành các column vector riêng cho từng cột
thành phần, và các nghiên cứu trên phải áp dụng pooling (giảm chiều) hoặc sử dụng
các layer LSTM để tạo các vector đấy, làm tăng độ phức tạp của mơ hình. Hướng thiết
kế của decoder ở đây thường giống phương pháp chia task nhỏ cho từng phần trong
câu lệnh SQL có nói tới bên trên. Như ở thiết kể tổng quan của [Hwang et al., 2019]
trong Hình 2, từng cơng việc thành phần trong bài tốn cần phải được đưa qua một
model nhỏ hơn để phân tích và đưa ra dự đốn, từ đó tăng khối lượng cơng việc và
kích cỡ mơ hình.

Hình 2: Cấu trúc tổng quan của mơ hình SQLova [Hwang et al., 2019]

6


3

Phương hướng tiếp cận

3.1

Tổng quát phương hướng

Nhóm áp dụng cấu trúc mơ hình HydraNet được đề xuất bởi [Lyu et al., 2020],
một mơ hình có kết quả rất tốt trên bộ dữ liệu WikiSQL với các điểm mạnh của việc
tối ưu hợp lý và tận dụng sức mạnh của các language model hiện đại.
Đối với phương pháp này, mơ hình đi theo hướng chia task nhỏ cho từng thành
phần, nhưng không tách thành nhiều model con cho từng thành phần riêng biệt, mà
tối ưu hóa trên một model lớn như BERT/RoBERTa. Các model kể trên sử dụng
contextualized word representations2 , giúp loại bỏ các bất cập cố hữu của Word2vec.

Đối với đầu vào của encoder, nhóm nối câu hỏi NL và một column cần thiết trong
table lại và đưa vào BERT/RoBERTa model. Sau đấy nhóm tách ra làm nhiều task ở
bước decoding: xếp hạng SELECT & WHERE column, trích xuất điều kiện, và trích
xuất khoảng giá trị của điều kiện. Ở đây decoder không trả về câu lệnh SQL nên nhóm
áp dụng thêm các luật đơn giản để sắp xếp vị trí của các thành phần và tạo câu lệnh
hồn chỉnh.
Phương pháp này có hai điểm lợi chính:
• Đầu vào của bài toán (một câu hỏi và một bộ column) rất khớp với thiết kế của
BERT/RoBERTa trong huấn luyện bài toán Question Answer Pair, từ đấy sức
mạnh của model trong bài tốn này được sử dụng một cách tối ưu.
• Bởi vì phương pháp chỉ mã hóa một column, vector [CLS] trong đầu ra của
BERT/RoBERTa sẽ bao gồm tất cả thơng tin của câu hỏi và column tương ứng,
nó cũng chính là “column vector” mà decoder cần, vì vậy ta không cần áp dụng
thêm giảm chiều hay các layer phức tạp khác, từ đấy đơn giản hóa được model
cho bài tốn.
Trong các phần sau, nhóm sẽ biểu diễn bài tốn Text-to-SQL như một bài tốn
đa cơng việc có thể giải quyết bằng việc áp dụng các pre-trained Transformer model.
Nhóm sẽ mô tả thiết kế dữ liệu đầu vào cho mô hình, phương pháp biến đổi các câu
lệnh SQL thành thiết kế này, và các cơng việc huấn luyện để trích xuất được câu lệnh
SQL.

3.2

Thiết kế dữ liệu đầu vào

Với mỗi câu hỏi q và các cột của table tương ứng c1 , c2 , . . . , ck , nhóm tạo một cặp
câu đầu vào cho mỗi cột như sau: (Concat(ϕci , tci , ci ), q), với Concat(·) là phép ghép
các chuỗi: ϕci là kiểu dữ liệu của cột ci ("string", "real", ...), tc là tên của table đang
xét và với chính cột ci đó thành một chuỗi hồn chỉnh.
Các cặp chuỗi dữ liệu sau đó được tokenize (phân tách thành chuỗi các token mà

mơ hình hiểu được) và được encode để tạo thành đầu vào cho các Transformer model.
Ví dụ, với mơ hình BERT/RoBERTa là mơ hình chính, chuỗi token đầu vào sẽ là:
2

/>
7


[CLS], x1 , x2 , ..., xm , [SEP ], y1 , y2 , ..., yn , [SEP ]
với x1 , x2 , ..., xm là chuỗi token của các cặp chuỗi dữ liệu lúc trước vừa ghép,
y1 , y2 , ..., yn là chuỗi token của câu hỏi q, [CLS] và [SEP ] là các token đặc biệt của
BERT model lần lượt để tổng hợp nội dung đầu vào và làm mốc phân chia các phần.

3.3

Biểu diễn câu lệnh SQL và các cơng việc thành phần

Trong bài tốn này, chúng ta xem như một câu lệnh SQL khơng có cấu trúc lồng
(nested structure), và có dạng cơ bản sau:
” sql ”: {
” select ” : [ ( agg1 , col1 ) , ( agg2 , col2 ) , ... ]
” from ” : [ table1 , table2 , ... ]
” where ” : [ ( wherecol1 , op1 , value1 ) , ( wherecol2 , op2 , value2 ) , ... ]
}
Chúng ta chia các thành phần trong câu lệnh SQL trên thành hai loại:
1. Các thành phần có liên hệ với column cụ thể: aggregation operator, FROMtable, WHERE-value (khoảng giá trị của điều kiện), ...
2. Các thành phần tồn cục khơng có liên hệ với column cụ thể: số
lượng phần tử SELECT (SELECT_num), số lượng phần tử điều kiện WHERE
(WHERE_num)
Đối với các thành phần loại 1, với mỗi cặp column-question (ci , q), kết quả dự

đoán của các thành phần có thể được xét như một sentence pair classification (bài toán
phân lớp từ cặp chuỗi) hoặc question answering task (bài tốn hỏi đáp). Cụ thể hơn,
nhóm biểu diễn chuỗi output embedding của mơ hình như sau:
h[CLS] , hc1i , ..., hcmi , h[SEP ] , hq1 , ..., hqn , h[SEP ]
, với hi là embedding vector của từng input token đưa vào mơ hình.
Ở đây việc phân lớp cho từng thành phần để dự đốn có thể xét đơn giản bằng một
Softmax function cho từng thành phần, với số lượng giá trị hợp lệ của từng thành
phần (số lượng phương án hợp lệ) được cung cấp sẵn. Việc tính giá trị Softmax có sử
dụng tích vơ hướng với token [CLS], là token tổng hợp tất cả thông tin của output sau
khi dự đoán. Cụ thể:
1. Với mỗi aggregation operator aj , xét tỉ lệ lựa chọn:
P (aj |ci , q) = sof tmax(W agg [j, :] · h[CLS] )
Trong q trình huấn luyện, mơ hình mask out (vô hiệu) các cột không liên quan
tới SELECT-clause.

8


2. Với mỗi condition operator oj (điều kiện WHERE), xét tỉ lệ lựa chọn:
P (oj |ci , q) = sof tmax(W op [j, :] · h[CLS] )
Trong quá trình huấn luyện, mơ hình mask out các cột khơng liên quan tới
WHERE-clause.
3. Với mỗi khoảng giá trị đầu và cuối của điều kiện, xét tỉ lệ lựa chọn:
P (yj = start|ci , q) = sof tmax(W start · hqj )
P (yj = end|ci , q) = sof tmax(W end · hqj )
Trong quá trình huấn luyện, giá trị đầu cuối của các cột không liên quan tới
WHERE-clause sẽ được gán thành 0.
Đối với các thành phần loại 2, ta xét tỉ lệ chọn thành phần z dưới dạng:
P (z|q) = P (z|ci , q)P (ci |q)
Ta phát biểu P (z|q) dưới dạng sentence pair classification, và P (ci |q) là độ tương đồng

giữa column ci và câu hỏi q. Cụ thể:
P
1. Đối với SELECT_num ns , xét tỉ lệ P (ns |q) = ci P (ns |ci , q)P (ci |q)
P
2. Đối với WHERE_num nw , xét tỉ lệ P (nw |q) = ci P (nw |ci , q)P (ci |q)
Phương thức tính tốn độ tương đồng của các column P (ci |q) sẽ được trình bày ở
phần tiếp theo

3.4

Xếp hạng các cột thành phần

Ở đây nhóm thiết kế bài tốn Text-to-SQL như một bài toán xếp hạng các lựa chọn
thành phần trong mỗi column, dựa vào điểm xếp hạng của từng thành phần để chọn
ra câu lệnh SQL hoàn chỉnh.
Với mỗi câu hỏi q, nhóm xét Sq là một bộ các cột nằm trong SELECT-clause, và
Wq là một bộ các cột nằm trong WHERE-clause, ta có Rq = Sq ∪ Wq là một bộ các
cột nằm trong câu lệnh SQL (các cột có liên quan trong câu lệnh). Cuối cùng, nhóm
xét bộ các column thành phần Cq = {c1 , c2 , ..., ck }. Hiển nhiên ta có: Rq ⊆ Cq .
Đối với bài tốn, ta có 3 cơng việc xếp hạng:
1. SELECT-rank: Xếp hạng các column ci ∈ Cq dựa vào việc SELECT-clause của
câu hỏi q có chứa ci hay khơng, hay nói cách khác ci ∈ Sq
2. WHERE-rank: Xếp hạng các column ci ∈ Cq dựa vào việc WHERE-clause của
câu hỏi q có chứa ci hay khơng, hay nói cách khác ci ∈ Wq
3. Relevance-rank (xếp hạng độ liên quan): Xếp hạng các column ci ∈ Cq dựa vào
việc câu lệnh SQL của câu hỏi q có chứa ci hay khơng, hay nói cách khác ci ∈ Rq

9



Ranking score (điểm xếp hạng) của từng công việc được thể hiện bằng classification
loss như sau:
P (ci ∈ Sq |q) = sigmoid(wsc · h[CLS] ) cho SELECT-rank
P (ci ∈ Wq |q) = sigmoid(wwc · h[CLS] ) cho WHERE-rank
P (ci ∈ Rq |q) = sigmoid(wrc · h[CLS] ) cho Relevance-rank
Với SELECT-rank P (ci ∈ Sq |q), nhóm có thể xếp hạng và chọn các cột thành phần
có kết quả tốt nhất để tạo thành SELECT-clause. Để xác định xem cần giữ lại bao
nhiêu column, ta có thể: 1: đặt ngưỡng tối thiểu và chỉ giữ lại các cột có giá trị nằm
trên ngưỡng đó; hoặc 2: xác định rõ số lượng cột SELECT bằng SELECT_num như
biểu diễn ở phần 3.3:
X
P (ns |ci , q)P (ci ∈ Rq |q)
(1)
n
ˆ s = arg max P (ns |q) = arg max
ns

ns

ci ∈Cq

Trong này nhóm chọn hướng tiếp cận số 2 và giữ lại n
ˆ s column có giá trị lớn nhất
để tạo thành SELECT-clause.
Tương tự, với WHERE-rank, nhóm xếp hạng các cột thành phần bằng tỉ lệ P (ci ∈
Wq |q) và chọn n
ˆ w có giá trị lớn nhất để tạo thành WHERE-clause, với biểu thức:
X
n
ˆ w = arg max P (nw |q) = arg max

P (nw |ci , q)P (ci ∈ Rq |q)
(2)
nw

3.5

nw

ci ∈Cq

Huấn luyện mơ hình và suy luận kết quả

Trong bước huấn luyện, mỗi phần tử mẫu (qi , Rqi ), Cqi = {cqi 1 , cqi 2 , ..., cqi ni } đầu
tiên được biến đổi thành ni cặp column-question (cqi 1 , qi ), (cqi 2 , qi ), ..., (cqi ni , qi ). Sau đó
câu lệnh SQL tương ứng của (qi , Cqi ) được phân tích và dùng để gán nhãn từng cặp
column-question cho tất cả các cơng việc được giải thích ở Phần 3.3 và 3.4.
Kết quả dùng để tối ưu là tổng hợp của cross-entropy loss cho từng công việc, của
tất cả các mẫu column-question được tạo ra từ mẫu ban đầu (qi , Cqi ). Nhóm đảo ngẫu
nhiên thứ tự của các mẫu column-question trong quá trình huấn luyện, vì vậy mỗi
batch huấn luyện sẽ chưa các mẫu từ nhiều câu hỏi và column khác nhau.
Trong bước suy luận kết quả, trước hết nhóm trích xuất các kết quả dự đốn được
của từng cơng việc trong output của mơ hình. Sau đó câu lệnh SQL được xây dựng
hoàn chỉnh bằng các bước sau:
1. Xác định số lượng thuộc tính SELECT và số lượng điều kiện WHERE
2. Xác định (các) SELECT-clause
3. Xác định (các) WHERE-clause
4. Xác định (các) column được sử dụng
Cụ thể các bước theo thứ tự:

10



1. Lấy SELECT_num và WHERE_num đã dự đoán được từ biểu thức 1 & 2
2. Xếp hạng các column ci ∈ Cq từ điểm SELECT-rank đã dự đoán, và giữ n
ˆs
column cao nhất sc
ˆ 1 , sc
ˆ 2 , ..., sc
ˆ nˆ s . Từ đó SELECT-clause sẽ trở thành:
SELECT [(agg
ˆ 1 , sc
ˆ 1 ), (agg
ˆ 2 , sc
ˆ 2 ), ..., (agg
ˆ nˆ s , sc
ˆ nˆ s )]
trong đó agg
ˆ i là aggregation operator dự đốn được từ sc
ˆ i , i = 1, 2, ..., n
ˆs
3. Xếp hạng ci ∈ Cq từ điểm WHERE-rank đã dự đoán, và giữ n
ˆ w column cao nhất
wc
ˆ 1 , wc
ˆ 2 , ..., wc
ˆ nˆ w . Từ đó WHERE-clause sẽ trở thành:
ˆ 1 ), (wc
ˆ 2 ), ..., (wc
ˆ nˆ w )]
WHERE [(wc

ˆ 1 , op
ˆ 1 , val
ˆ 2 , op
ˆ 2 , val
ˆ nˆ w , op
ˆ nˆ w , val
ˆ i là condition operator và condition value dự đốn được từ wc
trong đó op
ˆ i , val
ˆ i, i
= 1, 2, ..., n
ˆw
4. Xét Tˆ = {tˆ1 , tˆ2 , ..., tˆnt } là phép hợp của các SELECT-column (sc
ˆ 1 , sc
ˆ 2 , ..., sc
ˆ nˆ s )
và WHERE-column (wc
ˆ 1 , wc
ˆ 2 , ..., wc
ˆ nˆ w ). Từ đó FROM-clause sẽ trở thành:
FROM [tˆ1 , tˆ2 , ..., tˆnt ]

3.6

Execution-guided decoding (Giải mã có định hướng thực
thi)

Các language model sử dụng neural network dự đoán câu lệnh SQL dựa trên các
thơng tin syntactic (cú pháp, vị trí) và semantic (ngữ nghĩa) được trích xuất từ dữ liệu
đầu vào, và từ liên hệ giữa column-value mà mơ hình học được từ dữ liệu huấn luyện.

Thế nhưng đó vẫn có thể chưa đủ để đưa ra dự đoán tốt, khi mà:
1. Các giá trị và column của một database có quan hệ rời rạc và có thể thay đổi theo
thời gian mà khơng cần các constraint. Một mơ hình đã huấn luyện có thể thíếu
các dữ liệu database mới nhất và bị sai lệch kết quả bởi các quan hệ column-value
cũ trước đó
2. Model output cho từng cơng việc được dự đốn độc lập, và có thể sẽ tạo ra các cặp
đầu ra khơng hợp lệ khi kết hợp với nhau. Ví dụ: một cột có dạng chuỗi sẽ khơng
đi kèm được với condition operator như greater-than (VD: Subject > "History"),
hoặc không đi kèm được với aggregation operator (VD: SELECT MAX(Name)).
Dù rằng một mơ hình có thể học để giảm thiểu tỉ lệ xuất hiện của các cặp đầu
ra không hợp lệ, đó vẫn chưa đủ để loại bỏ hồn tồn khả năng xảy ra của các
trường hợp như thế.
Để giải quyết các vấn đề kể trên, [Wang et al., 2018] đã đưa ra phương pháp
Execution-guided decoding (EG) để thực thi các câu lệnh SQL tại thời điểm dự đoán
và đưa ra chỉnh sửa nếu database trả về lỗi thực thi hoặc output rỗng.
Về tổng quan cơ bản, góc nhìn chính của phương pháp dựa trên việc các câu lệnh
SQL được dự đốn một phần vẫn có thể được thực thi để đưa ra phương hướng cho
11


các thành phần cịn lại trong chu trình dự đốn đó. Phương pháp sử dụng góc nhìn đó
để lọc bỏ các phần khơng thể cấu thành câu lệnh hồn chỉnh, ví dụ như khi thực thi
gặp lỗi cú pháp/lỗi thực thi hoặc kết quả rỗng.
• Lỗi cú pháp: Một câu lệnh mắc lỗi cú pháp khi nó mắc lỗi sắp xếp vị trí hoặc
sai ngữ nghĩa của từ. Lỗi này thường gặp với các câu lệnh truy vấn phức tạp
nhiều thành phần, và thường gặp hơn ở các mơ hình tự hồi quy (autoregressive
model) hơn là các mơ hình dựa trên template và mơ hình slot-filling (điền thành
phần vào chỗ có sẵn)
• Lỗi thực thi: Một câu lệnh mắc lỗi thực thi khi nó có một thành phần bị xác định
sai loại dữ liệu. Lỗi này thường xảy ra dưới dạng sai lệch giữa hàm aggregation

và column mục tiêu (VD: SELECT MAX(Name)) hoặc sai lệch trong hai thành
phần so sánh (VD: Subject > "History").
• Output rỗng: Đối với hai lỗi bên trên, câu lệnh không thể được thực thi thành
công, thế nên khơng thể tạo ra câu trả lời chính xác. Nhưng nếu xét trên tất
cả các câu lệnh đều phải trả về kết quả, ta xét thêm một loại lỗi output rỗng
khi giá trị trả về là rỗng (VD: so sánh Name = "Hùng" nhưng người tên Hùng
không xuất hiện trong database). Lưu ý rằng trong các trường hợp thực tế, việc
sử dụng câu lệnh trả về kết quả rỗng vẫn là chuyện phổ biến, thường là để kiểm
tra xem có giá trị sai trong database hay khơng.
Dựa trên ý tưởng của họ, nhóm đã áp dụng Execution-guided decoding sau bước
dự đốn của mơ hình, cấu trúc sẽ được mô tả kĩ hơn ở Algorithm 1.

12


Algorithm 1 Pseudo-code của Execution-guided decoding cho HydraNet
Result: Câu lệnh SQL có thể thực thi được
1: Khởi tạo Qex rỗng để chứa câu SQL execution. Khởi tạo Qpred rỗng để chứa câu
SQL dự đoán
2:

3:
4:
5:
6:
7:
8:
9:
10:
11:

12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

Lấy k1 cặp SELECT - aggregation operator tốt nhất từ model
(agg
ˆ 1 , sc
ˆ 1 ), (agg
ˆ 2 , sc
ˆ 2 ), ..., (agg
ˆ k1 , sc
ˆ k1 )
(Lưu ý: các cột được dự đoán sc
ˆ 1 , sc
ˆ 2 , ..., sc
ˆ k1 có thể lặp lại)

for i=1 to k1 do
if sc
ˆ i không nằm trong Qex [”select”] then
Qex [”select”] = (agg
ˆ i , sc
ˆ i)
Thực thi Qex và lưu kết quả vào biến result
if result không rỗng then
Thêm (agg
ˆ i , sc
ˆ i ) vào Qpred [”select”]
end if
end if
if len(Qex [”select”]) = n
ˆ s then
▷n
ˆ s : SELECT-Rank ở biểu thức 1
break
end if
end for
ˆ 1 ), (wc
ˆ 2 ), ..., (wc
ˆ k)
Lấy k2 bộ điều kiện tốt nhất từ model (wc
ˆ 1 , op
ˆ 1 , val
ˆ 2 , op
ˆ 2 , val
ˆ k2 , op
ˆ k2 , val

2
(Lưu ý: các cột được dự đoán wc
ˆ 1 , wc
ˆ 2 , ..., wc
ˆ k2 có thể lặp lại)
for i=1 to k2 do
if wc
ˆ i không nằm trong Qex [”where”] then
Qex [”select”] = (null, wc
ˆ i)
ˆ i )]
Qex [”where”] = [(wc
ˆ i , op
ˆ i , val
Thực thi Qex và lưu kết quả vào biến result
if result không rỗng then
ˆ i ) vào Qpred [”where”]
Thêm (wc
ˆ i , op
ˆ i , val
end if
end if
if len(Qex [”where”]) = n
ˆ w then
▷n
ˆ s : WHERE-Rank ở biểu thức 2
break
end if
end for


13


4

Thử nghiệm & Đánh giá

4.1

Thử nghiệm

Nhóm thử nghiệm thiết kế của mơ hình trên bộ dữ liệu WikiSQL ở cả ba bộ train,
dev và test, sau đó so sánh với chính kết quả của bài báo gốc, cũng như với các phương
pháp tiếp cận khác cho bài toán. Bảng 1 biểu diễn các thơng số hyperparameter của
mơ hình gốc và mơ hình của nhóm.
Hyperparameters
Base model
Dropout rate
Learning rate
# of epoch
Batch size

Original paper
RoBERTa-Large
0.2
3e-5
5
256

Our implementation

RoBERTa-Base
0.15
3e-5
8
256

Bảng 1: Các thông số áp dụng cho HydraNet
Ở đây nhóm sử dụng RoBERTa-Base (12 layer encoder, 110M parameters) so với
RoBERTa-Large (24 layer encoder, 340M parameters) như thông số gốc của bài báo
vì hạn chế phần cứng, cũng như kết quả đạt được của RoBERTa-Base thấp hơn không
đáng kể so với RoBERTa-Large. Nhóm cũng chỉnh sửa tỉ lệ dropout và số lượng epoch
để phù hợp hơn với kích cỡ nhỏ hơn của mơ hình.
Model
Seq2SQL
TypeSQL
Coarse2Fine
Coarse2Fine+EG
SQLova
SQLova+EG
HydraNet
HydraNet+EG
IE-SQL
IE-SQL+EG
SeaD
SeaD+EG (SotA)
Our HydraNet
Our HydraNet+EG

Base model
Self-constructed LSTM

Self-constructed LSTM
Self-constructed LSTM
Self-constructed LSTM
BERT-Large-Uncased
BERT-Large-Uncased
RoBERTa-Large
RoBERTa-Large
BERT-Base-Uncased
BERT-Base-Uncased
BART-Large
BART-Large
RoBERTa-Base
RoBERTa-Base

Dev (lf, ex)
49.5, 60.8
—–, 74.5
72.5, 79.0
76.0, 84.0
81.6, 87.2
84.2, 90.2
83.6, 89.1
86.6, 92.4
84.6, 88.7
87.9, 92.6
84.9, 90.2
87.6, 92.9
83.0, 88.5
86.3, 92.2


Test (lf, ex)
48.3, 59.4
—–, 73.5
71.7, 78.5
75.4, 83.8
80.7, 86.2
83.6, 89.6
83.8, 89.2
86.5, 92.2
84.6, 88.8
87.0, 92.7
84.7, 90.1
87.5, 93.0
82.8, 88.2
85.9, 91.6

Bảng 2: Thông số accuracy của các model với logical form (lf) và execution (ex)
Bảng 2 biểu diễn độ chính xác (accuracy) của mơ hình của nhóm trên bộ dữ liệu
WikiSQL so với các phương pháp khác, sử dụng phương pháp đánh giá đi kèm của
WikiSQL đối với logical form (tỉ lệ khớp hoàn toàn giữa câu lệnh nhãn và câu lệnh
dự đoán được) và execution (tỉ lệ giống nhau của kết quả thu được khi chạy 2 câu
14


lệnh trên database). Các mơ hình có sử dụng kết hợp thêm Execution-guided decoding
có thêm kí hiệu EG ở đằng sau.
Nhìn tổng quan, các mơ hình có sử dụng kết hợp EG có accuracy tốt hơn so với các
mơ hình chạy thuần khoảng ~5%. So sánh với mơ hình HydraNet gốc [Lyu et al., 2020],
mơ hình của nhóm có accuracy thấp hơn không quá 1% ở tất cả các thông số, nó
chứng minh rằng mơ hình vẫn cịn khả năng tối ưu kể cả với kích cỡ nhỏ hơn. So sánh

với mơ hình có kết quả tốt nhất (State-of-the-Art) SeaD [Xu et al., 2023], mơ hình của
nhóm có accuracy thấp hơn trong khoảng dưới 2%, một kết quả tương đối ổn khi mơ
hình SeaD sử dụng BART [Lewis et al., 2019], một language model mới hơn dựa trên
BERT và GPT, và có sử dụng thêm các kỹ thuật mới như Denoising self-training (giảm
nhiễu).
Model
SQLova
SQLova+EG
HydraNet
HydraNet+EG
IE-SQL
IE-SQL+EG
SeaD
SeaD+EG (SotA)
Our HydraNet
Our HydraNet+EG

SL-col
96.8
96.5
97.6
97.6
97.6
97.6
97.7
97.9
97.5
97.5

SL-arg

90.6
90.4
91.4
91.4
94.7
94.7
91.7
91.8
91.2
91.2

W-num
98.5
97.0
98.4
98.4
98.3
98.3
96.5
98.3
98.0
98.0

W-col
94.3
95.5
95.3
97.2
96.4
97.9

—–
—–
94.5
96.9

W-op
97.3
95.8
97.4
97.5
98.7
98.5
97.7
97.9
97.0
97.1

W-val
95.4
95.9
96.1
97.6
96.8
98.3
96.7
98.4
95.6
97.2

Bảng 3: Accuracy của các mơ hình tốt gần đây với từng thành phần trên tập test

Bảng 3 thể hiện chỉ số accuracy của từng cơng việc thành phần trong bài tốn trên
test set. Tổng quan, các mơ hình có sử dụng EG thường có thông số WHERE-column
và WHERE-operator tốt hơn, thể hiện rằng việc áp dụng Execution-guided Decoding
là cần thiết để bảo đảm sự liên hệ giữa các thành phần column. Xét về các thơng số
giữa mơ hình HydraNet gốc của [Lyu et al., 2020] và mơ hình của nhóm, chênh lệch
là khơng đáng kể với tất cả các công việc (≤ 0.5%), cho thấy rằng mơ hình có độ linh
hoạt cao đối với số lượng parameter huấn luyện.

15


5

Tổng kết

Trong báo cáo này, nhóm đã áp dụng các nghiên cứu gần đây trong việc tối ưu
các language model huấn luyện sẵn như BERT/RoBERTa trên bài toán Text-to-SQL.
Phương pháp chính mà nhóm sử dụng xem xét bài tốn Text-to-SQL như một bài toán
xếp hạng dựa trên column. Phương pháp của nhóm có độ đơn giản cao, tối ưu và linh
hoạt trên nhiều kích thước mơ hình khác nhau. Nhóm tin rằng mơ hình vẫn cịn khả
năng tối ưu với phương pháp thiết kế hợp lý và vận dụng thêm các thuật tốn hiện
đại, cùng với đó có thể nâng cấp thiết kế của mơ hình để giải quyết các câu lệnh SQL
phức tạp hơn (câu lệnh lồng, có sử dụng các thành phần ORDER BY / GROUP BY
/ HAVING / ...)

16


Tài liệu
[Androutsopoulos et al., 1995] Androutsopoulos, I., Ritchie, G. D., and Thanisch, P.

(1995). Natural language interfaces to databases - an introduction. arxiv:cmplg/9503016.
[Devlin et al., 2019] Devlin, J., Chang, M.-W., Lee, K., and Toutanova, K. (2019).
Bert: Pre-training of deep bidirectional transformers for language understanding.
arXiv:1810.04805.
[Dong and Lapata, 2018] Dong, L. and Lapata, M. (2018). Coarse-to-fine decoding for
neural semantic parsing. arXiv:1805.04793.
[Hwang et al., 2019] Hwang, W., Yim, J., Park, S., and Seo, M. (2019).
A
comprehensive exploration on wikisql with table-aware word contextualization.
arXiv:1902.01069.
[Lewis et al., 2019] Lewis, M., Liu, Y., Goyal, N., Ghazvininejad, M., Mohamed, A.,
Levy, O., Stoyanov, V., and Zettlemoyer, L. (2019). Bart: Denoising sequence-tosequence pre-training for natural language generation, translation, and comprehension. arXiv:1910.13461.
[Lyu et al., 2020] Lyu, Q., Chakrabarti, K., Hathi, S., Kundu, S., Zhang, J., and Chen,
Z. (2020). Hybrid ranking network for text-to-sql. arXiv:2008.04759.
[Ma et al., 2020] Ma, J., Yan, Z., Pang, S., Zhang, Y., and Shen, J. (2020). Mention
extraction and linking for SQL query generation. pages 6936–6942.
[Wang et al., 2018] Wang, C., Tatwawadi, K., Brockschmidt, M., Huang, P.-S., Mao,
Y., Polozov, O., and Singh, R. (2018). Robust text-to-sql generation with executionguided decoding. arXiv:1807.03100.
[Xu et al., 2023] Xu, K., Wang, Y., Wang, Y., Wen, Z., and Dong, Y. (2023). Sead:
End-to-end text-to-sql generation with schema-aware denoising. arXiv:2105.07911.
[Yu et al., 2018] Yu, T., Li, Z., Zhang, Z., Zhang, R., and Radev, D. (2018). Typesql:
Knowledge-based type-aware neural text-to-sql generation. arXiv:1804.09769.
[Zhong et al., 2017] Zhong, V., Xiong, C., and Socher, R. (2017). Seq2sql: Generating structured queries from natural language using reinforcement learning.
arXiv:1709.00103.

17




×