Chuyển đến nội dung chính

Dịch thuật dựa trên Tiến hóa / Tìm kiếm

Ý tưởng: Tạo ra nhiều bản dịch ứng viên, chấm điểm chúng dựa trên một hàm thích nghi (fitness function) (chrF++, tỷ lệ chấp nhận FST, tính nhất quán dịch khứ hồi), đột biến những bản dịch tốt nhất và lặp lại. Chọn lọc tự nhiên cho bản dịch — bản dịch thích nghi nhất sẽ tồn tại.

:::info Đây là tài liệu hướng dẫn (cookbook), không phải là một triển khai hoàn chỉnh Đây là phương pháp mang tính thử nghiệm cao nhất trong chuỗi tài liệu hướng dẫn này. Nó chưa được chứng minh hiệu quả cho MT (dịch máy) ở quy mô lớn, nhưng kiến trúc của nó rất vững chắc và hệ thống harness sẽ sẵn sàng chấm điểm cho bất kỳ kết quả nào được tạo ra. :::

Khi nào nên sử dụng

  • Bạn có một hàm chấm điểm tốt nhưng không có mô hình đơn lẻ nào tạo ra kết quả nhất quán
  • Bạn muốn khám phá không gian giải pháp rộng hơn so với việc chỉ tạo ra một kết quả tham lam (greedy generation) duy nhất
  • Bạn có ngân sách tính toán cho nhiều lượt tạo song song (hàng chục ứng viên cho mỗi đầu vào)
  • Bạn quan tâm đến nghiên cứu mới lạ — phương pháp này vẫn chưa được khai phá nhiều đối với dịch máy cho ngôn ngữ nghèo tài nguyên (low-resource MT)

Cách thức hoạt động

[Generation 0] Generate N candidates (different models, temperatures, prompts)


[Score] Evaluate each candidate: chrF++, FST acceptance, fluency


[Select] Keep top K performers


[Mutate] Prompt an LLM: "improve this translation, fix these issues"


[Generation 1] Score again. Repeat for G generations.


[Output] Best-scoring candidate from final generation

Cấu trúc khung (Skeleton)

async def evolutionary_translate(source, reference=None, generations=3, pop_size=8):
# Generation 0: diverse candidates
population = []
for model in ["gemini-2.5-pro", "gpt-4o", "claude-sonnet-4-6"]:
for temp in [0.3, 0.7, 1.0]:
candidate = await translate(source, model=model, temperature=temp)
population.append(candidate)

for gen in range(generations):
# Score each candidate
scored = [(c, score(c, reference)) for c in population]
scored.sort(key=lambda x: x[1], reverse=True)

# Select top K
survivors = [c for c, s in scored[:pop_size // 2]]

# Mutate: ask LLM to improve each survivor
mutants = []
for survivor in survivors:
mutant = await improve(source, survivor, feedback=scored[0])
mutants.append(mutant)

population = survivors + mutants

return max(population, key=lambda c: score(c, reference))

Thiết kế hàm thích nghi (Fitness Function)

Hàm thích nghi quyết định tất cả. Các lựa chọn bao gồm:

MetricĐo lường điều gìTự động hóa?
chrF++ đối chiếu với bản dịch tham chiếuĐộ tương đồng ở cấp độ ký tự so với bản dịch chuẩn✅ Có
Tỷ lệ chấp nhận FSTTính hợp lệ về mặt hình thái học✅ Có (nếu có sẵn FST)
Tính nhất quán dịch khứ hồiViệc dịch ngược lại có khôi phục được văn bản gốc không?✅ Có
LLM làm giám khảo (LLM-as-judge)Một LLM khác đánh giá độ trôi chảy/độ chính xác✅ Có (nhưng có nhiễu)
Sự xuất hiện của thuật ngữ trong từ điểnCác thuật ngữ đã biết có xuất hiện chính xác không?✅ Có

:::tip Kết hợp nhiều tín hiệu Sự kết hợp có trọng số của các chỉ số sẽ tạo ra một hàm thích nghi mạnh mẽ hơn bất kỳ chỉ số đơn lẻ nào. Điều này tương tự như composite score của chính hệ thống harness. :::

Ưu điểm và Nhược điểm

✅ Khám phá các giải pháp đa dạng❌ Tốn kém tài nguyên tính toán (N × G cuộc gọi API)
✅ Có thể phát hiện ra các phương pháp mà không một mô hình đơn lẻ nào tìm thấy❌ Yêu cầu một hàm thích nghi tốt
✅ Có thể chạy song song❌ Chậm — cần nhiều lượt tạo cho mỗi bản dịch
✅ Không phụ thuộc vào mô hình (Model-agnostic)❌ Hiệu suất giảm dần sau một vài thế hệ

Kết hợp tốt với

Xem thêm