Skip to main content

Ứng dụng ChatGPT API trong production - khó khăn và cách giải quyết

· 12 min read
Nguyễn Ngọc Duy Luân

Như bài viết của chị Huyền Chip có chia sẻ, ChatGPT API (cụ thể là model gpt-3.5-turbo), dùng để build ra các ứng dụng vui vẻ thì dễ, nhưng để đưa vào sử dụng thực tế trong các hệ thống vận hành, hoặc các hệ thống data sẽ có nhiều vấn đề phát sinh. Đây là khó khăn và cách giải quyết khi team mình áp dụng ChatGPT API cho một số tính năng của Elton Data.

info
  • Trong post này mình sẽ gọi tắt là ChatGPT API, hãy hiểu nó là API của OpenAI, sử dụng model gpt-3.5-turbo nhé, chứ câu nào cũng lặp lại cụm từ dài dài này thì chắc hết hơi :D
  • Tất cả prompt trong post này mình đều viết bằng Tiếng Việt. Vâng, ChatGPT hiểu được tiếng Việt, và trả về kết quả cũng rất đúng. Mình dùng tiếng Việt thì Elton Data chủ yếu có khách hàng tại Việt Nam và các ứng dụng bên dưới đa số đều cần tiếng Việt.

Bài toán cần giải quyết

Có 3 chức năng trong Elton Data cần đến ChatGPT API

  • Một chú assistant chatbot để user có thể hỏi một số câu generic, ví dụ như câu GAQL để truy vấn dữ liệu từ Google Ads viết như thế nào cho đúng, hoặc Các metrics, dimensions có thể dùng với Google Analytics là gì.. để nhập vào data pipeline. Tính năng này thì quá đơn giản và là use case điển hình của ChatGPT, nên mình bỏ qua, sẽ không đề cập gì tới trong post này.
  • Viết document cho các bảng, cột đã được tạo ra trong data platform: Elton Data có tính năng Data Dictionary, nó tự động scan một data source như BigQuery, ghi nhận lại tất cả dataset, table và field của từng table, sau đó có giao diện để data ownership hoặc data stewardess có thể vào nhập giải thích, cách tính, hoặc các mô tả khác. Là một người đã từng docs rất nhiều bảng dữ liệu, mình nhận thấy công việc này không vui, mất thời gian và mang tính lặp đi lặp lại => Có thể nhờ ChatGPT tạo ra các dòng mô tả.
  • Phân loại video: Cái này thì không nằm trực tiếp trong Elton Data nhưng là một trong các dịch vụ mà Elton có cung cấp, đó là quét data của các trang Youtube, TikTok và đưa insight cho khách hàng khi họ cần nghiên cứu, theo dõi, đánh giá hiệu quả của influencer. Nhu cầu phát sinh là cần phân loại video để dễ theo dõi và so sánh về performance. => Có thể nhờ ChatGPT phân loại giùm, thay vì phải build model từ đầu.
  • Hỏi câu hỏi thông thường, trả về số query từ database: Cái này thú vị, sẽ thảo luận trong post này

Suy nghĩ và cách tiếp cận

ChatGPT hoạt động bằng cách:

  1. Bạn đưa một câu hỏi, một câu hướng dẫn cho ChatGPT API (prompt)
  2. API trả về cho bạn một kết quả nào đó (result)
  3. Bạn lấy kết quả đó đem đi áp dụng tiếp theo ý muốn của bạn

Ví dụ đơn giản, đây là prompt gửi cho ChatGPT

Cho bảng dữ liệu trong database với tên mdx_customer_sales_orders_online_only, với các cột bao gồm id, customer_id, customer_name, customer_email, product_id, product_name, amount, discount_amount. 

Hãy tạo mô tả cho từng cột này.

Câu trả lời của ChatGPT là

1. id: là một số duy nhất được định danh cho mỗi đơn hàng được đặt trên trang web của cửa hàng. Đây là một cột kiểu số nguyên.

2. customer_id: đây là một số định danh duy nhất cho mỗi khách hàng trong hệ thống. Đây là một cột kiểu số nguyên.

3. customer_name: đây là tên đầy đủ của khách hàng. Đây là một cột kiểu chuỗi ký tự.

4. customer_email: đây là địa chỉ email của khách hàng. Đây là một cột kiểu chuỗi ký tự.

5. product_id: đây là một số định danh duy nhất cho mỗi sản phẩm được bán trên trang web của cửa hàng. Đây là một cột kiểu số nguyên.

6. product_name: đây là tên sản phẩm. Đây là một cột kiểu chuỗi ký tự.

7. amount: đây là giá trị của đơn hàng được đặt bởi khách hàng, trước khi giảm giá. Đây là một cột kiểu số thực.

8. discount_amount: đây là số tiền giảm giá được áp dụng cho đơn hàng. Đây là một cột kiểu số thực.

Nhưng nếu bạn thử gửi lại cùng câu hỏi đó, ở lần thứ hai thì nó lại trả ra theo một định dạng khác hoàn toàn, rồi có thêm một số câu nhận xét và thông tin thêm nữa chứ.

Đây là mô tả cho từng cột trong bảng dữ liệu mdx_customer_sales_orders_online_only:

id: đây là một trường dữ liệu kiểu số nguyên duy nhất (primary key) được tự động tăng giá trị cho mỗi hàng trong bảng. Nó giúp phân biệt các đơn hàng khác nhau và được sử dụng trong việc tham chiếu đến các đơn hàng trong các bảng dữ liệu khác.

customer_id: đây là một trường dữ liệu kiểu số nguyên dùng để định danh khách hàng. Nó được sử dụng để liên kết với bảng dữ liệu khách hàng khác và thực hiện các truy vấn liên quan đến khách hàng.

customer_name: đây là một trường dữ liệu kiểu văn bản dùng để lưu trữ tên của khách hàng. Nó giúp xác định danh tính khách hàng và được sử dụng trong các báo cáo và các truy vấn liên quan đến khách hàng.

customer_email: đây là một trường dữ liệu kiểu văn bản dùng để lưu trữ địa chỉ email của khách hàng. Nó giúp xác định và liên lạc với khách hàng trong các trường hợp cần thiết.

product_id: đây là một trường dữ liệu kiểu số nguyên dùng để định danh sản phẩm được mua. Nó được sử dụng để liên kết với bảng dữ liệu sản phẩm khác và thực hiện các truy vấn liên quan đến sản phẩm.

product_name: đây là một trường dữ liệu kiểu văn bản dùng để lưu trữ tên của sản phẩm được mua. Nó giúp xác định sản phẩm và được sử dụng trong các báo cáo và các truy vấn liên quan đến sản phẩm.

amount: đây là một trường dữ liệu kiểu số thập phân dùng để lưu trữ tổng số tiền được tính cho đơn hàng, trước khi giảm giá được áp dụng. Nó được sử dụng để tính toán tổng doanh thu và được sử dụng trong các báo cáo liên quan đến doanh thu.

discount_amount: đây là một trường dữ liệu kiểu số thập phân dùng để lưu trữ số tiền giảm giá được áp dụng cho đơn hàng. Nó được sử dụng để tính toán tổng doanh thu sau khi giảm giá được áp dụng và được sử dụng trong các báo cáo liên quan đến doanh thu.

ChatGPT trả về câu trả lời theo dạng free text, như một đoạn hội thoại và mang tính ngẫu nhiên cao, mỗi lần nói mỗi khác, giống như con người khi giao tiếp với nhau, không phải lúc nào cũng có thể nói đúng 1 mẫu câu, theo đúng syntax. Vậy làm sao để trích xuất (parse) thông tin mình cần từ đoạn free text này?

Giải quyết vấn đề kết quả trả về không theo cấu trúc mong muốn

Thế là mình nghĩ: À, hay là mình ra lệnh cho nó trả về theo đúng cấu trúc mình mong muốn đi, thế là mình thêm yêu cầu vào đoạn prompt của mình như sau:

Cho bảng dữ liệu trong database với tên mdx_customer_sales_orders_online_only, với các cột bao gồm id, customer_id, customer_name, customer_email, product_id, product_name, amount, discount_amount.

Hãy tạo mô tả cho từng cột này. Mỗi cột một dòng mới, theo định dạng <tên cột> || <mô tả cột>. Chỉ trả về mô tả cột, không thêm thứ gì khác.

Và đúng như dự đoán, ChatGPT trả về kết quả như sau

id || trường dữ liệu kiểu số nguyên duy nhất (primary key) được tự động tăng giá trị cho mỗi hàng trong bảng
customer_id || trường dữ liệu kiểu số nguyên dùng để định danh khách hàng
customer_name || trường dữ liệu kiểu văn bản dùng để lưu trữ tên của khách hàng
customer_email || trường dữ liệu kiểu văn bản dùng để lưu trữ địa chỉ email của khách hàng
product_id || trường dữ liệu kiểu số nguyên dùng để định danh sản phẩm được mua
product_name || trường dữ liệu kiểu văn bản dùng để lưu trữ tên của sản phẩm được mua
amount || trường dữ liệu kiểu số thập phân dùng để lưu trữ tổng số tiền được tính cho đơn hàng, trước khi giảm giá được áp dụng
discount_amount || trường dữ liệu kiểu số thập phân dùng để lưu trữ số tiền giảm giá được áp dụng cho đơn hàng

Với prompt như trên, kết quả trả về đã theo format nhất định. Giờ chỉ cần parse từng line một, tách string theo dấu ||, vậy là đã có data đủ để lưu vào database rồi.

Mình thử nghiệm nhiều chục lần thì vẫn thấy format đúng như vậy, nên có thể tự tin áp dụng cho việc ghi chú data platform rồi.

Thỉnh thoảng ChatGPT cũng trả về thêm một số câu dẫn, câu giải thích, mô tả thêm mà không cần thiết, khi đó mình chỉ cần check điều kiện là có || trong line thì mới lấy, như vậy sẽ loại bỏ được các câu nói không cần thiết.

Screenshot thực tế một bảng vừa được ChatGPT tự điền mô tả cột

Câu trả lời chưa tự nhiên, chưa theo đúng "tông" mong muốn

Các bạn nhìn cách mà ChatGPT trả về ở kết quả cuối cùng, nhìn nó cứ không tự nhiên thế nào ấy khi ứng dụng vào mục đích sử dụng của tính năng Data Dictionary.

info

Dành cho bạn nào chưa biết, tính năng Data Dictionary, hay đôi khi gọi là Data Catalog, cho phép bạn tạo ra một catalog các bảng, cột có trong hệ thống data của mình, và hiểu được ý nghĩa của chúng. Ví dụ, đọc tên bảng mdx_customer_sales_orders_online_only bạn có thể biết là bảng này chỉ chứa dữ liệu của đơn hàng online, nhưng nếu đi vào từng cột thì chưa chắc bạn nắm được hết ý nghĩa, hay thậm chí là cách tính toán như thế nào. Ví dụ, cột amount là giá trị đơn hàng, dễ hiểu, nhưng bạn có biết là nó đã bao gồm thuế hay chưa? Hay đã có giảm giá trong đó chưa? Có tính giá trị quà tặng gì vào không?

Thế nên nhờ có data dictionary, người tạo hoặc người quản lý dữ liệu này có thể vào ghi chú (documentation) để những người sử dụng data khác cùng biết, không phải hỏi lại và hạn chế sai sót trong khi sử dụng data.

Bởi vì người sử dụng chính của tính năng Data Dictionary trong Elton Data thường là các team Data Engineer, Data Scientist, Data Analyst hoặc các bạn Business Analyst, những người đã có kiến thức cơ bản về cách sử dụng data, nên việc giải thích theo kiểu trường dữ liệu kiểu số thập phân dùng để lưu trữ tổng số tiền được tính cho đơn hàng nghe nó chưa hay.

Điều tuyệt vời là ChatGPT có một thứ gọi là system_role, bạn có thể dùng 1 câu prompt để nói cho ChatGPT biết nó đang đóng vai trò gì, nó là ai. Trong tình huống này, mình set system_role như sau:

submit_payload = [
{'role': 'system', 'content': 'You are a helpful IT assistant with expertise in database management and documentation'},
{'role': 'user', 'content': <Câu prompt của bạn>},
]

Khi đó, ChatGPT trả về theo một cách rất khác

id || ID của đơn hàng.
customer_id || ID của khách hàng đặt hàng.
customer_name || Tên khách hàng đặt hàng.
customer_email || Địa chỉ email của khách hàng.
product_id || ID của sản phẩm được đặt hàng.
product_name || Tên của sản phẩm được đặt hàng.
amount || Tổng số tiền thanh toán cho đơn hàng.
discount_amount || Số tiền được giảm giá (nếu có) cho đơn hàng.

Rõ ràng đây là cái mình cần, đây sẽ là phong cách của các bạn user khi viết document cho các bảng dữ liệu mà họ đã tạo ra từ những transformation, và người dùng đọc vào cũng rất dễ hiểu, dễ hiểu hơn cả phong cách document ban đầu. Quá tuyệt vời.

Trong thực tế, khi sử dụng Elton Data, user sẽ được yêu cầu nhập Mô tả của bảng trước khi có thể nhấn nút tự điền mô tả cho các cột, như vậy sẽ càng tăng thêm độ chính xác của câu trả lời từ ChatGPT do nó có thêm context: bảng này đang chứa dữ liệu gì, dùng làm gì. Và đằng nào user cũng phải nhập mô tả bảng, nên họ cũng thực hiện điều này nhẹ nhàng, nhanh chóng. Họ cũng có thể chọn tự điền mô tả bằng tiếng Việt hoặc tiếng Anh, tùy theo convention của công ty.

User được chọn điền mô tả bằng Tiếng Việt hoặc Tiếng Anh

Sau khi ChatGPT đã trả về kết quả, user sẽ cần kiểm tra lại một lượt xem ChatGPT điền có đúng hay không, có cần bổ sung thêm chi ghú hay mô tả gì đặc biệt hay không.

So với việc phải nhập mô tả cho từng cột một, trong một bảng master có khoảng 10 dimensions và 30 metrics, thì quá trình này nhanh gọn lẹ và dễ chịu hơn nhiều.

Ứng dụng ChatGPT để phân loại video

Ngoài cung cấp công cụ để xây dựng data platform trong Elton Data, công ty mình còn cung cấp thêm dịch vụ tìm hiểu, khai thác và thu thập data của các influencer trên TikTok và YouTube (thật ra ban đầu mình làm ra cho mình xài :D sau này có một số công ty khác cũng cần nên sẵn bán luôn để cover chút chi phí hạ tầng hihi).

Theo thời gian, phát sinh nhu cầu như sau: Cần biết từng bạn influencer thường làm video về chủ đề gì, để khách hàng có thể tìm đến họ và hợp tác với các dạng sản phẩm tương ứng. Một nhãn hàng mỹ phẩm rõ ràng không thể tiếp cận và rủ ông Duy Luân vốn làm nội dung về công nghệ.

Ngoài ra, còn cần phải biết tỉ lệ các loại nội dung ra sao, vì có bạn làm video theo phong cách lifestyle nhưng thỉnh thoảng cũng có chia sẻ về từng sản phẩm một, trong khi một influencer khác thì chuyên làm video lifestyle mà thôi. Các nhãn hàng muốn biết để chọn cách hợp tác và tuyến nội dung phù hợp.

Okay, vậy thì mình đem đi phân loại, và với giới hạn về nhân lực mà vẫn muốn phân loại được lượng lớn video thì dựa vào tiêu đề và / hoặc mô tả của video. Nhưng theo kinh nghiệm của mình, mô tả của video thường chèn thêm nhiều thông tin gây nhiễu nên mình chỉ chọn dùng tiêu đề mà thôi.

Theo suy nghĩ thông thường, mình sẽ cần cho người vào đánh label cho vài nghìn video, sau đó dùng làm training data để xây một model để làm text classification, sau đó deploy model này lên server để serve qua đường API hay gọi hàm gì đó.

Nhưng một hôm mình đang đi bơi, chợt nghĩ: Ủa, sao mình không nhờ ChatGPT làm nhỉ? Vì nó có khả năng đoán rất tốt, đôi khi tốt hơn so với một người không chuyên, mà có thể làm với số lượng lớn trong thời gian ngắn. Vậy thì rõ ràng mình sẽ tiết kiệm được thời gian, chi phí rồi.

Áp dụng các bài học đã học từ vụ làm data dictionary cho Elton Data ở trên, mình tạo câu prompt sau:

generative_command = f"""
Cho các chủ đề video sau: news, technology, lifestyle, comedy, inspirational_video, cooking, pets, parenting.
Hãy phân loại các tiêu đề video sau thành những chủ đề bên trên. Chỉ cần phân loại những video được yêu cầu, mỗi video 1 chủ đề duy nhất.
Các video được cung cấp theo dạng: <video_id> ### <tiêu đề video>

Trả về mỗi dòng là một kết quả theo định dạng: <video_id> || <tên video> || <tên chủ đề>
{youtube_video_strings}
"""

submit_payload = [
{'role': 'system', 'content': 'You are a helpful video producer assistant with expertise in marketing and online video production'},
{'role': 'user', 'content': generative_command},
]

Bùm, kết quả trả ra cũng giống như mong muốn, ví dụ như sau

7216665816903814443 || #skills #LearnOnTikTok #tipsandtricks #handmade #useful #satisfying #oddlysatisfying #foryou #fypシ || lifehack
7216665746494213422 || #fyp #rescue #rescuedog #vet part2 || pets
7216665495003532590 || #xuhuong #trending #giaitri #gameshow #shorts #tiktok #truonggiang #gintuankiet || entertainment
216665482869378331 || Ai cũng phải trải qua mấy ngày cuối tháng cùng mì gói tuy nghè.o nhưng vẫn phải ăn ngon nha kkkk #nghienmigoi #ancungtiktok || food
7216664559346535687 || Cô gái tóc đỏ và anh chàng tóc đenn (bạc) 😝😝 || entertainment
7216661436041563419 || Cách khắc phục cún tấn công #dcgr #yeudongvat || pets

Parse kết quả trên, mình đã có được video_id và category mong muốn, lưu cái đó vào database, rồi ném lên data platform để tổng hợp và phân tích. Nhẹ nhàng, đơn giản và độ chính xác cao.

caution

Vẫn có một số vấn đề phát sinh khi sử dụng cách này:

  • Có những category không nằm trong danh sách đầu vào, nhưng ChatGPT vẫn trả về. Cái này tùy logic của application mà bạn có thể 1) tự tạo category mới rồi add 2) bỏ qua
  • Một số video có thể được phân loại theo 2, 3 category đều đúng, lúc đó bắt buộc chọn 1. Ví dụ: Cầm Sony ZV-1 đi biển Vũng Tàu 2 ngày 1 đêm. => Vậy video này là về lifestyle, travel hay technology? Thật ra cái nào cũng đúng cả. Suy nghĩ của mình đơn giản thế này: người đọc vô cái tiêu đề còn chưa chắc đã phân loại đúng, nên máy nó làm được tới thế là đã ổn.

Nói technical thêm một chút, thì để phân loại lượng lớn video thì mình chia cho 6 worker (dùng python rq) nhằm giảm thời gian chạy lần đầu tiên. Các lần sau chạy theo ngày, mỗi ngày vài nghìn video nên nhanh. Để nhanh hơn, mình đưa vào prompt cho ChatGPT một bộ 10 video title để phân loại, chứ mỗi tiêu đề mỗi gọi API thì vừa tốn token, vừa tốn thời gian.

Hỏi câu hỏi thông thường, trả về số query từ database

Theo như format trên, mình hoàn toàn có thể hỏi ChatGPT như sau:

Cho table X, với schema như sau <field_1>, <field_2>, <field_3>, <field_4>. Hãy tạo câu SQL để tìm doanh thu theo ngày cửa từng cửa hàng.

Tuy nhiên, mình thử nghiệm thực tế thì đôi khi câu SQL này bị generate sai, hoặc không hiểu đầy đủ ý nghĩa của cột nên có thể không đúng business logic. Thế nên ứng dụng này nghe thì hay, nhưng mình phải bỏ qua, không triển khai được.

Nên nhớ: Thà không có data, còn hơn data đưa ra mà sai => Dẫn tới nhiều quyết định sai lầm.

Tóm lại: học được gì?

  • Sử dụng ChatGPT cho ứng dụng production hoàn toàn khả thi, nhưng cần kĩ năng tạo prompt thiệt là tốt, và biết đặt ra các giới hạn cho câu trả lời để nó trả về kết quả gần với mong muốn nhất có thể.
  • Nhớ dự liệu các tình huống ChatGPT trả về kết quả không như ý để handle các exeption này
  • Việc sử dụng kết quả trả ra từ ChatGPT nên được dùng cho các tình huống không cần fact, vì rõ ràng suy luận thì ChatGPT giỏi chứ kêu nó nói fact thì nó khả năng cao là sai đấy
  • Nếu được, cần có user check lại kết quả, xem như review qua một lần