Skip to content
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Fx Studio
  • Home
  • Code
  • iOS & Swift
  • Combine
  • RxSwift
  • SwiftUI
  • Flutter & Dart
  • Tutorials
  • Art
  • Blog
Written by chuotfx on August 1, 2025

Prompt for Coding – Code Translation với Kỹ thuật Exemplar Selection (k-NN)

Blog . Tutorials

Contents

  • Hiểu sâu hơn về Kỹ thuật Cốt lõi: Exemplar Selection (k-NN)
  • Các trường hợp áp dụng vào thực tế
  • Chiến lược Prompting cho Dịch Mã Nguồn
    • Kịch bản 1: Cần một bản dịch “Nhanh và Gọn”
    • Kịch bản 2: Hướng đến Chất lượng và Tính Quy ước (Idiomatic)
    • Kịch bản 3: Tinh chỉnh đến mức Hoàn hảo
  • Ví dụ áp dụng thực tế: Dịch từ iOS (Swift) sang Flutter
  • Ưu, Nhược điểm và Hạn chế
    • Ưu điểm
    • Nhược điểm và Hạn chế
  • Tạm kết

Chào mừng bạn đến với Fx Studio. Code Translation (Dịch mã nguồn) là một tác vụ quan trọng trong ngành phát triển phần mềm, từ việc nâng cấp hệ thống cũ sang ngôn ngữ mới, hợp nhất các codebase, cho đến việc giúp lập trình viên nhanh chóng học một ngôn ngữ mới. Các mô hình ngôn ngữ lớn (LLM) đã chứng tỏ khả năng vượt trội trong việc này, tuy nhiên, để tạo ra một bản dịch không chỉ “chạy được” mà còn “chất lượng” – tức là tuân thủ các quy ước (idiomatic), hiệu quả và dễ bảo trì – thì việc sử dụng prompt đúng kỹ thuật là vô cùng cần thiết.

Bài viết này sẽ đi sâu vào các chiến lược prompting khác nhau, tùy thuộc vào mục tiêu và yêu cầu chất lượng của bạn.

Bài viết Prompt for Coding – Bug Detection với prompting cơ bản là bài viết liên quan về 1 tác vụ khác trong lập trình với việc áp dụng các kỹ thuật prompting vào. Bạn có thể tham khảo thêm!

Hiểu sâu hơn về Kỹ thuật Cốt lõi: Exemplar Selection (k-NN)

Trước khi đi vào các kịch bản cụ thể, chúng ta cần hiểu rõ kỹ thuật nền tảng và mạnh mẽ nhất cho việc dịch mã nguồn.

“Exemplar Selection” có nghĩa là “Lựa chọn ví dụ mẫu”. Hậu tố “k-NN” là viết tắt của “k-Nearest Neighbors” (k-Láng giềng gần nhất), một thuật ngữ vay mượn từ lĩnh vực học máy. Trong ngữ cảnh prompting, nó có nghĩa là cung cấp ‘k’ ví dụ gần nhất hoặc liên quan nhất đến tác vụ bạn muốn thực hiện.

  • Exemplar Selection là gì?: Là phương pháp cung cấp cho LLM một hoặc nhiều cặp (đầu vào, đầu ra) mẫu để nó học theo. Thay vì chỉ nói cho LLM phải làm gì, bạn cho nó thấy phải làm như thế nào.
  • Tại sao nó hiệu quả cho Code Translation?: Ngôn ngữ lập trình có cú pháp và quy ước (idioms) rất chặt chẽ. Việc cung cấp một ví dụ cụ thể giúp LLM nắm bắt được những quy ước này một cách chính xác hơn nhiều so với việc mô tả bằng lời. Nó giúp giảm thiểu sự “sáng tạo” không cần thiết của LLM và giữ cho kết quả đầu ra đi đúng hướng.
  • “k” nên là bao nhiêu?:
    • k=1 (One-Shot): Cung cấp một ví dụ duy nhất. Đây là cách phổ biến và thường đủ hiệu quả cho các tác vụ dịch đơn giản.
    • k>1 (Few-Shot): Cung cấp vài ví dụ. Phương pháp này cực kỳ hữu ích khi bạn cần dịch các cấu trúc phức tạp hoặc muốn LLM học được nhiều quy tắc ngầm khác nhau.

Lưu ý quan trọng: Chất lượng quan trọng hơn số lượng. Một ví dụ mẫu tốt, rõ ràng và liên quan sẽ hiệu quả hơn nhiều so với nhiều ví dụ mẫu nhưng chất lượng kém hoặc không liên quan.

Các trường hợp áp dụng vào thực tế

Việc dịch mã nguồn bằng LLM không chỉ là một thử nghiệm thú vị mà còn có nhiều ứng dụng thực tiễn, giúp giải quyết các bài toán cụ thể trong các dự án phần mềm:

  1. Hiện đại hóa hệ thống cũ (Legacy System Modernization): Nhiều tổ chức vẫn đang vận hành các hệ thống được viết bằng ngôn ngữ cũ như COBOL, Fortran, hoặc các phiên bản Java, PHP đã lỗi thời. Việc sử dụng LLM để dịch các phần logic cốt lõi sang các ngôn ngữ hiện đại hơn (như Python, Go, Java 17+) có thể đẩy nhanh đáng kể quá trình nâng cấp, giảm thiểu rủi ro và chi phí.
  2. Chuyển đổi Framework/Thư viện: Khi một framework trở nên phổ biến hơn (ví dụ: chuyển từ Angular sang React/Vue) hoặc khi một công ty muốn thống nhất công nghệ, LLM có thể hỗ trợ dịch hàng loạt component, service từ framework cũ sang mới, giúp lập trình viên tập trung vào việc tích hợp và tối ưu thay vì viết lại từ đầu.
  3. Phát triển ứng dụng đa nền tảng: Một đội ngũ có thể viết logic cho một ứng dụng iOS bằng Swift, sau đó sử dụng LLM để dịch logic đó sang Kotlin cho Android hoặc Dart cho Flutter. Điều này giúp đảm bảo tính nhất quán về mặt logic nghiệp vụ trên các nền tảng khác nhau.
  4. Hỗ trợ Onboarding và học ngôn ngữ mới: Khi một lập trình viên quen thuộc với Python tham gia vào một dự án Go, họ có thể sử dụng LLM để dịch các đoạn code Python mà họ nghĩ ra sang Go. Quá trình này không chỉ giúp họ hoàn thành công việc mà còn là một cách học tập hiệu quả để nắm bắt cú pháp và quy ước của ngôn ngữ mới.

Chiến lược Prompting cho Dịch Mã Nguồn

Giờ đây khi đã hiểu rõ bối cảnh, hãy cùng xem xét các chiến lược áp dụng vào từng mục tiêu cụ thể.

Code Translation

Kịch bản 1: Cần một bản dịch “Nhanh và Gọn”

Khi bạn chỉ cần hiểu logic của một đoạn code ở ngôn ngữ khác hoặc cần một bản nháp nhanh, kỹ thuật Zero-Shot Prompting là lựa chọn tối ưu vì sự đơn giản của nó.

Zero-Shot Prompting là kỹ thuật đưa ra yêu cầu cho mô hình ngôn ngữ lớn (LLM) một cách thẳng thắn và trực tiếp mà không cần cung cấp bất kỳ ví dụ mẫu nào. Ví dụ: “Viết một hàm Python để đảo ngược một chuỗi.”.

  • Mục tiêu: Tốc độ và sự tiện lợi.
  • Kỹ thuật: Yêu cầu trực tiếp.
  • Prompt:
Hãy dịch hàm Python sau sang ngôn ngữ Go.

**Python Code:**
```python
def get_user_permissions(user):
  if user.is_admin:
    return ["read", "write", "delete"]
  elif user.is_editor:
    return ["read", "write"]
  else:
    return ["read"]
  • Kết quả mong đợi: Một đoạn code chạy được, nhưng có thể không hoàn toàn tuân thủ các quy ước của ngôn ngữ đích.

Kịch bản 2: Hướng đến Chất lượng và Tính Quy ước (Idiomatic)

Đây là kịch bản phổ biến nhất, khi bạn cần một bản dịch chất lượng để tích hợp vào dự án. Ở đây, chúng ta sẽ áp dụng Exemplar Selection (One-Shot).

  • Mục tiêu: Bản dịch chính xác, dễ đọc, và tuân thủ phong cách của ngôn ngữ đích.
  • Kỹ thuật: Cung cấp một ví dụ mẫu chất lượng.
  • Prompt:
Bạn sẽ dịch code từ Python sang Go. Hãy tuân thủ theo phong cách và cấu trúc trong ví dụ sau.

**# Ví dụ Mẫu**
# Python Input:
````python
def check_age(age):
  if age >= 18:
    return "Adult"
  else:
    return "Minor"
````

# Go Output (Theo phong cách mong muốn):
````go
func CheckAge(age int) string {
  if age >= 18 {
    return "Adult"
  }
  return "Minor"
}
````
---
**# Yêu cầu: Bây giờ, hãy dịch hàm Python sau sang Go theo đúng phong cách trên.**
# Python Input:
````python
def get_user_permissions(user):
  # ... (code cần dịch)
````

Kịch bản 3: Tinh chỉnh đến mức Hoàn hảo

Khi chất lượng là yêu cầu tuyệt đối, ví dụ như dịch các module quan trọng, việc kết hợp nhiều kỹ thuật sẽ giúp bạn đạt được kết quả tốt nhất.

  • Mục tiêu: Bản dịch ở mức production-ready, đã được rà soát và tối ưu.
  • Kỹ thuật: Kết hợp Exemplar Selection + Role Prompting + Self-Refine.
  • Prompt (Ví dụ kết hợp):
**Bước 1: Thiết lập vai trò và cung cấp mẫu**

Hãy đóng vai một lập trình viên Go nhiều kinh nghiệm. Dịch đoạn code Python sau sang Go, tuân thủ nghiêm ngặt theo ví dụ mẫu.

[Dán ví dụ mẫu và code cần dịch vào đây]

**Bước 2: Yêu cầu tự hoàn thiện**

Sau khi có bản dịch đầu tiên, hãy tự rà soát lại dựa trên các tiêu chí sau:
1.  Code đã thực sự "idiomatic" theo phong cách Go chưa?
2.  Có thể cải thiện hiệu năng hoặc cách xử lý lỗi không?
3.  Tên biến và hàm đã thực sự rõ ràng chưa?

**Bước 3: Cung cấp phiên bản cuối cùng**

Dựa trên những phân tích trên, hãy đưa ra phiên bản code Go hoàn thiện nhất.

Ví dụ áp dụng thực tế: Dịch từ iOS (Swift) sang Flutter

Hãy xem xét một kịch bản phức tạp hơn: dịch một màn hình đơn giản từ code iOS (Swift/UIKit) sang Flutter.

Bối cảnh: Chúng ta cần chuyển đổi một UIViewController hiển thị thông tin sản phẩm sang một Widget trong Flutter.

Prompt áp dụng Kịch bản 3:

Bạn là một lập trình viên Flutter chuyên nghiệp với kinh nghiệm sâu sắc về cả iOS (Swift/UIKit).

Nhiệm vụ của bạn là dịch một `UIViewController` viết bằng Swift sau đây sang một `StatelessWidget` của Flutter.

Hãy tuân thủ nghiêm ngặt theo phong cách và cấu trúc của ví dụ mẫu dưới đây, đặc biệt là cách bố cục widget và quản lý theme.

**--- VÍ DỤ MẪU ---**

**# iOS (Swift/UIKit) Input:**
````swift
// Một UIViewController đơn giản hiển thị "Hello World"
class GreetingViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground

        let label = UILabel()
        label.text = "Hello, World!"
        label.font = .systemFont(ofSize: 24, weight: .bold)
        label.translatesAutoresizingMaskIntoConstraints = false
        
        view.addSubview(label)
        
        NSLayoutConstraint.activate([
            label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
}
````

**# Flutter Output:**
````dart
import 'package:flutter/material.dart';

class GreetingScreen extends StatelessWidget {
  const GreetingScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(
          'Hello, World!',
          style: Theme.of(context).textTheme.headlineSmall?.copyWith(
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    );
  }
}
````

**--- YÊU CẦU DỊCH ---**

Bây giờ, hãy áp dụng đúng phong cách trên để dịch `ProductDetailViewController` sau đây sang Flutter.

**# iOS (Swift/UIKit) Input:**
````swift
class ProductDetailViewController: UIViewController {
    // Giả sử product được truyền vào
    let product: Product 
    
    // ... (init method)

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground
        
        let productNameLabel = UILabel()
        productNameLabel.font = .systemFont(ofSize: 28, weight: .bold)
        productNameLabel.text = product.name
        
        let productPriceLabel = UILabel()
        productPriceLabel.font = .systemFont(ofSize: 20)
        productPriceLabel.textColor = .secondaryLabel
        productPriceLabel.text = "$\(product.price)"

        let stackView = UIStackView(arrangedSubviews: [productNameLabel, productPriceLabel])
        stackView.axis = .vertical
        stackView.spacing = 8
        stackView.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(stackView)
        
        NSLayoutConstraint.activate([
            stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
}
````

Phân tích kết quả mong đợi:

Với prompt trên, LLM được kỳ vọng sẽ tạo ra một Widget Flutter:

  • Sử dụng Scaffold và Center để bố cục cơ bản.
  • Dịch UIStackView thành Column trong Flutter.
  • Ánh xạ UILabel thành Text widget.
  • Sử dụng Theme.of(context).textTheme để áp dụng các style văn bản một cách nhất quán, thay vì hard-code font size.
  • Cấu trúc của widget sẽ nhận một đối tượng product tương tự như cách UIViewController nhận.

Ưu, Nhược điểm và Hạn chế

Dù mạnh mẽ, việc dùng LLM để dịch code cũng có những ưu, nhược điểm cần cân nhắc.

Ưu điểm

  • Tốc độ vượt trội: LLM có thể dịch hàng trăm, hàng nghìn dòng code trong vài phút, một công việc có thể tốn của lập trình viên nhiều ngày hoặc nhiều tuần.
  • Giảm chi phí: Tăng tốc độ đồng nghĩa với việc giảm giờ công của lập trình viên, từ đó giảm chi phí phát triển cho các dự án nâng cấp hoặc chuyển đổi.
  • Xử lý mã lặp đi lặp lại (Boilerplate): LLM rất giỏi trong việc dịch các đoạn code có cấu trúc lặp đi lặp lại, giúp lập trình viên thoát khỏi các công việc nhàm chán.
  • Hỗ trợ học tập: Là một công cụ tuyệt vời để so sánh cú pháp và các mẫu thiết kế giữa các ngôn ngữ.

Nhược điểm và Hạn chế

  • Không đảm bảo chính xác 100%: Bản dịch của LLM có thể chứa các lỗi tinh vi về logic, quản lý bộ nhớ, hoặc xử lý đa luồng mà mắt thường khó phát hiện. Luôn luôn phải review và kiểm thử kỹ lưỡng.
  • Thiếu hiểu biết về ngữ cảnh tổng thể: LLM chỉ dịch những gì nó thấy trong prompt. Nó không hiểu được logic nghiệp vụ, kiến trúc toàn hệ thống, hay mục đích sâu xa của đoạn code, dẫn đến các bản dịch có thể không tối ưu về mặt kiến trúc.
  • Rủi ro bảo mật: Tuyệt đối không dán mã nguồn chứa thông tin nhạy cảm, khóa API, thuật toán độc quyền vào các dịch vụ LLM công khai. Luôn sử dụng các phiên bản nội bộ hoặc tuân thủ chính sách bảo mật của công ty.
  • Phụ thuộc vào chất lượng ví dụ: Hiệu quả của kỹ thuật Exemplar Selection phụ thuộc hoàn toàn vào chất lượng của ví dụ mẫu. Ví dụ sai hoặc không tốt sẽ dẫn đến kết quả sai hàng loạt.

Tạm kết

Tóm lại, việc sử dụng LLM để dịch mã nguồn không phải là một phép màu, mà là một kỹ năng. Nó đòi hỏi người lập trình viên phải đóng vai trò là một người chỉ huy, cung cấp những mệnh lệnh (prompt) rõ ràng, bối cảnh đầy đủ và các ví dụ chất lượng. Hãy xem LLM như một người trợ lý (co-pilot) cực kỳ nhanh nhẹn nhưng cần sự giám sát, thay vì một phi công tự động (auto-pilot).

Bảng tóm tắt:

Mục tiêu của bạn Chiến lược Prompting Khi nào nên dùng?
Nhanh, cần bản nháp Zero-Shot Khi cần hiểu nhanh logic hoặc không yêu cầu cao về chất lượng.
Chất lượng, đúng quy ước Exemplar Selection Hầu hết các trường hợp dịch code để sử dụng trong dự án.
Hoàn hảo, sẵn sàng cho production Kết hợp (Exemplar + Role + Self-Refine) Khi dịch các thành phần quan trọng, yêu cầu độ tin cậy tuyệt đối.

Chìa khóa để thành công nằm ở việc lựa chọn đúng chiến lược cho đúng mục tiêu, và quan trọng nhất là không bao giờ bỏ qua bước kiểm tra, đánh giá và tinh chỉnh lại kết quả cuối cùng.

Cảm ơn bạn đã dành thời gian đọc tài liệu này. Hy vọng những kiến thức và ví dụ được chia sẻ sẽ giúp bạn khai thác hiệu quả sức mạnh của các mô hình ngôn ngữ lớn trong công việc lập trình hàng ngày. Chúc bạn thành công!

Chào thân ái và hẹn gặp lại ở các bài viết sau!

FacebookTweetPinYummlyLinkedInPrintEmailShares0

Related Posts:

  • Bug Detection
    Prompt for Coding - Bug Detection với prompting cơ bản
  • Prompt Engineering
    Prompt Engineering trong 10 phút
  • prompt
    Prompt trong 10 phút
  • hallucination
    Vấn đề Ảo Giác (hallucination) khi tương tác với Gen…
Tags: AI, blog, Prompt engineering, Prompt for Coding
Written by chuotfx

Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Donate – Buy me a coffee!

Fan page

Fx Studio

Tags

Actor Advanced Swift AI api AppDistribution autolayout basic ios tutorial blog ci/cd closure collectionview combine concurrency crashlytics dart dart basic dart tour Declarative delegate Dependency deploy design pattern fabric fastlane firebase flavor flutter GCD iOS MVVM optional Prompt engineering Prompt for Coding protocol Python rxswift Swift Swift 5.5 SwiftData SwiftUI SwiftUI Notes tableview testing TravisCI unittest

Recent Posts

  • Prompt for Coding – Code Translation với Kỹ thuật Exemplar Selection (k-NN)
  • Mô phỏng chiến lược SNOWBALL giúp AI “Nhớ Lâu” hơn trong cuộc trò chuyện
  • Prompt for Coding – Bug Detection với prompting cơ bản
  • Cẩm Nang Đặt Câu Hỏi Chain of Verification (CoVe): Từ Cơ Bản Đến Chuyên Gia
  • Chain of Verification (CoVe): Nâng Cao Độ Tin Cậy Của Mô Hình Ngôn Ngữ Lớn
  • Mixture of Thought (MoT) – Từ Suy Luận Logic đến Ứng Dụng Sáng Tạo
  • Prompt Injection (phần 2) – Chiến Lược Phòng Thủ và Kỹ Thuật Giảm Thiểu Rủi Ro
  • Prompt Injection (phần 1) – Phân Tích về Các Kỹ Thuật Tấn Công
  • Bản chất của Prompt Engineering là Quản lý sự Mơ hồ
  • Inject Marker : Từ Chỉ Dẫn Đơn Giản Đến Công Cụ Khoa Học Để Làm Chủ AI

You may also like:

  • Prompt for Coding - Bug Detection với prompting cơ bản
    Bug Detection
  • Prompt Engineering - Người lập trình ngôn ngữ tự nhiên
    feature_bg_blog_015
  • CO-STAR - Công thức vàng để viết Prompt hiệu quả cho LLM
    feature_prompt_04
  • Bản chất của Prompt Engineering là Quản lý sự Mơ hồ
    feature_bg_blog_017
  • Prompt Injection (phần 1) - Phân Tích về Các Kỹ…
    feature_bg_blog_018

Archives

  • August 2025 (1)
  • July 2025 (10)
  • June 2025 (1)
  • May 2025 (2)
  • April 2025 (1)
  • March 2025 (8)
  • January 2025 (7)
  • December 2024 (4)
  • September 2024 (1)
  • July 2024 (1)
  • June 2024 (1)
  • May 2024 (4)
  • April 2024 (2)
  • March 2024 (5)
  • January 2024 (4)
  • February 2023 (1)
  • January 2023 (2)
  • November 2022 (2)
  • October 2022 (1)
  • September 2022 (5)
  • August 2022 (6)
  • July 2022 (7)
  • June 2022 (8)
  • May 2022 (5)
  • April 2022 (1)
  • March 2022 (3)
  • February 2022 (5)
  • January 2022 (4)
  • December 2021 (6)
  • November 2021 (8)
  • October 2021 (8)
  • September 2021 (8)
  • August 2021 (8)
  • July 2021 (9)
  • June 2021 (8)
  • May 2021 (7)
  • April 2021 (11)
  • March 2021 (12)
  • February 2021 (3)
  • January 2021 (3)
  • December 2020 (3)
  • November 2020 (9)
  • October 2020 (7)
  • September 2020 (17)
  • August 2020 (1)
  • July 2020 (3)
  • June 2020 (1)
  • May 2020 (2)
  • April 2020 (3)
  • March 2020 (20)
  • February 2020 (5)
  • January 2020 (2)
  • December 2019 (12)
  • November 2019 (12)
  • October 2019 (19)
  • September 2019 (17)
  • August 2019 (10)

About me

Education, Mini Game, Digital Art & Life of coders
Contacts:
contacts@fxstudio.dev

Fx Studio

  • Home
  • About me
  • Contact us
  • Mail
  • Privacy Policy
  • Donate
  • Sitemap

Categories

  • Art (1)
  • Blog (56)
  • Code (11)
  • Combine (22)
  • Flutter & Dart (24)
  • iOS & Swift (102)
  • No Category (1)
  • RxSwift (37)
  • SwiftUI (80)
  • Tutorials (96)

Newsletter

Stay up to date with our latest news and posts.
Loading

    Copyright © 2025 Fx Studio - All rights reserved.