0

Cùng một intent, đổi ngôn ngữ thì source set của ChatGPT thay đổi bao nhiêu? Phân tích 12 cặp prompt Việt–Anh

Sau khi kiểm tra độ ổn định của source set qua nhiều lần chạy cùng một prompt, tôi muốn thử một biến khác: điều gì xảy ra khi giữ nguyên nhu cầu nhưng đổi ngôn ngữ từ tiếng Việt sang tiếng Anh?

Ở bài trước, tôi thử một câu hỏi khá cơ bản:

Nếu chạy cùng một prompt nhiều lần, source set mà ChatGPT lộ ra có ổn định không?

Kết quả của thử nghiệm 10 prompt × 5 lần chạy cho thấy source-domain set khá ổn định trong sample đó, nhưng cũng đủ để nhắc tôi rằng một screenshot đơn lẻ không nên được xem như một measurement protocol.

Sau thử nghiệm đó, tôi muốn kiểm tra một biến khác:

Nếu giữ intent gần như tương đương nhưng đổi ngôn ngữ từ tiếng Việt sang tiếng Anh, ChatGPT có tiếp tục lộ ra cùng một tập nguồn không?

Đây là câu hỏi khá thực tế với doanh nghiệp Việt Nam phục vụ khách quốc tế.

Một khách Việt có thể hỏi:

“Nên chọn khách sạn nào gần phố cổ Hội An?”

Trong khi một khách nước ngoài có thể hỏi:

“Which hotels should I consider near Hoi An Ancient Town?”

Hai câu hỏi có cùng mục tiêu thương mại, nhưng cách diễn đạt, ngôn ngữ và bối cảnh người dùng khác nhau.

Nếu chỉ đo AI Visibility bằng tiếng Việt, liệu chúng ta có đang bỏ sót một source landscape khác?

Bài này mô tả thử nghiệm R39-C của Ghim AI: 12 cặp prompt Việt–Anh tương đương về intent, tổng cộng 24 quan sát trên ChatGPT.


1. Tôi muốn đo điều gì?

Mục tiêu không phải xác định:

“ChatGPT ưu tiên tiếng Việt hay tiếng Anh?”

Đó là một câu hỏi quá rộng và sample hiện tại không đủ để trả lời.

Mục tiêu hẹp hơn:

Với hai prompt có cùng intent nhưng khác ngôn ngữ, tập domain được lộ ra trong source trace khác nhau đến mức nào?

Tôi đo ở hai cấp:

  1. Domain overlap
  2. Source-class overlap

Tức là không chỉ hỏi:

Có phải cùng website xuất hiện không?

mà còn hỏi:

Dù website khác nhau, chúng có đang đóng cùng một vai trò nguồn không?

Ví dụ:

  • website của provider;
  • editorial;
  • directory/review;
  • official source;
  • marketplace/platform.

Đây là khác biệt khá quan trọng.

Hai prompt có thể không dùng cùng domain, nhưng vẫn đi tìm cùng “loại bằng chứng”.


2. Dataset

Thử nghiệm gồm:

  • 12 cặp prompt Việt–Anh
  • 24 quan sát ChatGPT
  • 5 nhóm intent/ngành:
    • travel/hotel;
    • local services;
    • B2B/professional services;
    • ecommerce/consumer;
    • marketing/software.

Các cặp không được dịch từng chữ.

Tôi dùng nguyên tắc semantic-equivalent prompt:

Hai prompt phải thể hiện cùng một nhu cầu người dùng, nhưng được viết tự nhiên trong từng ngôn ngữ.

Ví dụ, thay vì dịch máy móc:

VI: Công ty CRM nào tốt ở Việt Nam?
EN: Which CRM company is good in Vietnam?

tôi ưu tiên kiểu:

VI:
Doanh nghiệp vừa ở Việt Nam nên cân nhắc những nhà cung cấp CRM nào?

EN:
Which CRM providers should a mid-sized business in Vietnam consider?

Intent vẫn là provider selection.

Nhưng câu hỏi nghe tự nhiên hơn trong từng ngôn ngữ.


3. Source trace không phải citation

Đây là boundary quan trọng nhất của toàn bộ experiment.

Tôi chỉ ghi nhận source trace mà ChatGPT lộ ra trong quá trình tìm nguồn.

Điều đó không đồng nghĩa với:

  • nguồn được trích dẫn trong câu trả lời cuối;
  • thương hiệu được nhắc;
  • thương hiệu được đề xuất;
  • nguồn đó có trọng số cao hơn;
  • nguồn đó “ảnh hưởng” đến câu trả lời theo một quan hệ nhân quả đã biết.

Trong dataset, một URL chỉ được đánh dấu là citation nếu nó thực sự xuất hiện như citation ở final answer.

Vì vậy trong bài này, tôi dùng từ:

  • source trace;
  • source exposure;
  • source-domain set.

Tôi tránh gọi toàn bộ chúng là “citation”.


4. Chuẩn hóa domain

Trước khi so sánh, các URL cần được chuẩn hóa về domain.

Ví dụ:

https://example.com/blog/article-a?utm_source=x
https://www.example.com/blog/article-b
https://example.com/service

đều có thể được normalize thành:

example.com

Mục tiêu là đo:

Hai prompt có đang đi tới cùng website/domain family không?

chứ không phải cùng exact URL.

Một cách normalize đơn giản trong Python:

from urllib.parse import urlparse

def normalize_domain(url: str) -> str:
    host = urlparse(url).netloc.lower()

    if host.startswith("www."):
        host = host[4:]

    return host

Trong production pipeline thực tế, logic có thể phức tạp hơn vì còn:

  • mobile subdomain;
  • country subdomain;
  • tracking redirect;
  • syndicated content;
  • canonical host;
  • platform-generated URLs.

Nhưng với experiment này, domain-level comparison là đủ để quan sát drift ban đầu.


5. Đo overlap bằng Jaccard

Để so sánh hai tập domain, tôi dùng Jaccard Index:

[ J(A,B) = \frac{|A \cap B|}{|A \cup B|} ]

Trong đó:

  • A: tập domain của prompt tiếng Việt;
  • B: tập domain của prompt tiếng Anh.

Nếu:

A = {a.vn, b.vn, c.com}
B = {b.vn, x.com, y.com}

thì:

intersection = {b.vn}
union = {a.vn, b.vn, c.com, x.com, y.com}

Jaccard:

1 / 5 = 0.2

Python:

def jaccard(a, b):
    a, b = set(a), set(b)

    if not a and not b:
        return 1.0

    return len(a & b) / len(a | b)


vi_domains = {"a.vn", "b.vn", "c.com"}
en_domains = {"b.vn", "x.com", "y.com"}

print(jaccard(vi_domains, en_domains))
# 0.2

Jaccard gần 1 → overlap cao.

Jaccard gần 0 → source set rất khác.


6. Kết quả ở cấp domain

Kết quả trên 12 cặp:

  • Mean domain Jaccard: 0.081
  • Median domain Jaccard: 0.032
  • 6/12 cặp không có domain nào trùng nhau
  • 11/12 cặp có domain Jaccard < 0.25

Nói đơn giản:

Trong sample này, đổi từ tiếng Việt sang tiếng Anh thường đi kèm với thay đổi rất lớn ở tập domain được ChatGPT lộ ra.

Một nửa số cặp có zero domain overlap.

Và chỉ 1/12 cặp có Jaccard từ 0.25 trở lên.

Đây là mức drift đủ lớn để tôi không còn thoải mái với giả định:

“Đo bằng tiếng Việt là đủ đại diện cho cùng nhu cầu bằng tiếng Anh.”


7. Nhưng domain drift không phải toàn bộ câu chuyện

Điều thú vị hơn xuất hiện khi tôi so sánh theo source class.

Tôi phân loại source theo vai trò, ví dụ:

  • provider / first-party;
  • local editorial;
  • global editorial;
  • official;
  • directory/review;
  • marketplace/platform;
  • community;
  • social/profile.

Sau đó tính Jaccard tương tự, nhưng trên tập source class thay vì domain.

Kết quả:

  • Mean domain Jaccard: 0.081
  • Mean source-class Jaccard: 0.417

Khoảng cách này khá lớn.

Nghĩa là:

Hai prompt Việt và Anh có thể dùng các domain rất khác nhau, nhưng vẫn đi tìm các kiểu nguồn tương tự.

Ví dụ:

Prompt tiếng Việt:

provider-a.vn
baovietnam.vn
directory-a.vn

Prompt tiếng Anh:

provider-b.com
travel-editorial.com
directory-b.com

Domain gần như khác hoàn toàn.

Nhưng source-role có thể vẫn là:

provider
editorial
directory

Đây là lý do tôi nghĩ measurement pipeline không nên chỉ lưu URL.

Nên lưu cả:

source_url
domain
source_class
language
locality
prompt_id
run_id

Nếu không, chúng ta sẽ thấy “nguồn đổi hết” nhưng không biết cấu trúc bằng chứng có thật sự đổi không.


8. Locality: tiếng Việt local hơn trong sample này

Tôi tiếp tục gắn nhãn nguồn theo phạm vi:

VN scope
vs
global / non-VN scope

Kết quả trung bình theo từng cặp:

  • prompt tiếng Việt: 85.4% VN-source share
  • prompt tiếng Anh: 52.5% VN-source share

Ở mức mô tả:

Prompt tiếng Việt trong sample này lộ ra nhiều nguồn Việt Nam hơn prompt tiếng Anh.

Nhưng tôi không nghĩ dữ liệu này đủ để nói:

“ChatGPT ưu tiên nguồn Việt khi người dùng hỏi tiếng Việt.”

Đó sẽ là causal claim quá mạnh.

Một số prompt tiếng Anh vẫn giữ tỷ lệ nguồn Việt Nam rất cao.

Đặc biệt với local commercial intent.

Trong khi một số prompt B2B/professional hoặc marketing/software lại chuyển mạnh sang nguồn global khi đổi sang tiếng Anh.

Tức là biến “language” dường như đang tương tác với:

  • vertical;
  • intent;
  • entity locality;
  • wording;
  • backend/search state.

Nó không hoạt động như một switch đơn giản.


9. Một vài cặp đáng chú ý

Một số pair trong dataset:

Pair Intent VI domains EN domains Domain Jaccard VI VN share EN VN share
R39C-01 provider selection 10 11 0.000 100% 72.7%
R39C-04 provider selection 9 9 0.000 100% 88.9%
R39C-08 comparison 7 12 0.000 100% 0%
R39C-10 provider selection 6 5 0.222 100% 100%
R39C-11 provider selection 3 6 0.286 75% 50%

R39C-10 là một ví dụ khá hay.

Cả VI và EN đều giữ 100% VN-source share nhưng domain overlap vẫn chỉ 0.222.

Nghĩa là:

Cả hai ngôn ngữ đều vẫn “local”, nhưng chúng tìm tới những domain local khác nhau.

Đây là lý do locality và domain overlap phải được đo riêng.


10. Provenance: không tạo pseudo-independent observations

Có một điểm kỹ thuật tôi muốn ghi rõ.

R39-C được chạy sau R39-A.

Trong R39-A, 11/12 prompt tiếng Việt tương ứng đã được chạy cùng ngày với exact prompt text.

Thay vì chạy lại rồi giả vờ coi đó là observation độc lập mới, tôi reuse các VI traces đó.

Cụ thể:

  • R39C-01: VI và EN được chạy fresh;
  • R39C-02 → R39C-12: VI reuse same-day trace từ R39-A;
  • EN được chạy fresh cho R39-C.

Trong ledger, reused rows được đánh dấu provenance.

Ví dụ:

REUSED_R39A_SAME_DAY_TRACE_FROM_<run_id>

Tôi thấy việc này quan trọng vì experiment log rất dễ bị “phồng” sample size nếu mỗi lần reuse dữ liệu lại được tính như một run mới.

Reuse dữ liệu không sai.

Nhưng provenance phải rõ.


11. Time confound

Việc reuse cũng tạo ra một hạn chế.

VI và EN không phải lúc nào cũng được chạy cùng một phút.

Trong khoảng thời gian giữa hai run, có thể thay đổi:

  • backend;
  • index;
  • cache;
  • search state;
  • result depth;
  • ranking.

Vì vậy observed drift có thể liên quan đến:

language
+
timing
+
backend/search state
+
wording
+
intent interpretation

chứ không thể cô lập language như causal variable duy nhất.

Đây là lý do tiêu đề bài dùng:

“đổi ngôn ngữ thì source set thay đổi bao nhiêu?”

chứ không dùng:

“ngôn ngữ làm ChatGPT đổi nguồn như thế nào?”

Hai câu đó khác nhau rất nhiều về mức độ claim.


12. Nếu xây pipeline đo bilingual AI Visibility

Từ experiment nhỏ này, tôi sẽ không xây pipeline kiểu:

1 prompt
→ 1 language
→ 1 run
→ final answer

Tôi sẽ ưu tiên:

Intent
├── VI prompt
│   ├── run 1
│   └── source set
│
└── EN prompt
    ├── run 1
    └── source set

Sau đó lưu tối thiểu:

prompt_id
intent_id
language
vertical
run_id
run_timestamp
source_url
normalized_domain
source_class
source_language
source_locality
exposed
cited
mentioned_brand
recommended_brand

Từ đó mới tính:

domain overlap
source-class overlap
locality shift
mention shift
citation shift
competitor shift

Điểm tôi muốn tránh là gom tất cả vào một “AI Visibility Score” quá sớm.

Nếu không biết layer nào thay đổi thì score rất khó debug.


13. Source trace, citation, mention và recommendation nên tách riêng

Ví dụ một domain xuất hiện trong search trace không có nghĩa:

retrieved
= cited
= mentioned
= recommended

Một pipeline tốt nên tách các stage:

discovered
↓
retrieved / exposed
↓
cited
↓
brand mentioned
↓
brand recommended

Đây cũng là lý do tôi xem experiment VI–EN như một source-layer experiment.

Nó chưa trả lời:

“Brand visibility cuối cùng khác nhau thế nào?”

Để trả lời câu đó, cần thêm layer mention/recommendation/citation ở final answer.


14. Experiment này hỗ trợ kết luận gì?

Tôi nghĩ có hai câu có thể nói tương đối an toàn.

Kết luận 1

Trong sample 12 cặp:

Các prompt Việt–Anh tương đương về intent thường lộ ra các source-domain set khác nhau đáng kể.

Bằng chứng:

  • 6/12 zero-overlap;
  • 11/12 có domain Jaccard < 0.25;
  • mean = 0.081.

Kết luận 2

Domain drift lớn hơn source-role drift.

Bằng chứng:

  • domain Jaccard mean = 0.081;
  • source-class Jaccard mean = 0.417.

Điều này gợi ý:

Khi debug AI Visibility, nên đo cả “AI dùng domain nào” và “AI đang tìm loại nguồn nào”.


15. Experiment này không hỗ trợ kết luận gì?

Không nên dùng dataset này để nói:

  • ChatGPT có fixed language-ranking rule;
  • tiếng Việt luôn được ưu tiên khi prompt tiếng Việt;
  • tiếng Anh luôn lấy nguồn global;
  • doanh nghiệp bắt buộc phải dịch toàn bộ site sang tiếng Anh;
  • làm bilingual content sẽ tự động tăng AI Visibility;
  • source exposure = citation;
  • language là nguyên nhân duy nhất;
  • kết quả áp dụng cho Gemini, Perplexity hoặc mọi phiên bản ChatGPT;
  • 12 cặp là đủ để đại diện mọi ngành.

Ngoài ra:

  • sample nhỏ;
  • ChatGPT-only;
  • source trace only;
  • timing không hoàn toàn đồng nhất;
  • source-class taxonomy có yếu tố human labeling.

16. Điều tôi thay đổi trong cách đo sau experiment này

Nếu một doanh nghiệp phục vụ cả khách Việt và khách quốc tế, tôi sẽ không dùng một prompt set một ngôn ngữ nữa.

Thay vào đó:

important intent
→ VI prompt
→ EN prompt
→ compare

Và tôi sẽ hỏi lần lượt:

  1. Brand có được mention ở cả hai không?
  2. Competitor có đổi không?
  3. Domain source có đổi không?
  4. Source role có đổi không?
  5. Local vs global mix có đổi không?
  6. Website chính thức có xuất hiện ở cả hai không?
  7. Nếu không, source nào đang “đại diện” cho brand ở ngôn ngữ còn lại?

Đây là câu hỏi measurement.

Không phải câu hỏi:

“Làm SEO tiếng Anh có tốt hơn không?”


17. Một hệ quả thú vị cho GEO

Nếu source landscape theo ngôn ngữ khác nhau, thì một thương hiệu có thể ở trạng thái:

VI:
brand present
official site retrieved
local sources strong

EN:
brand absent
third-party sources dominate
competitors stronger

hoặc ngược lại.

Trong trường hợp đó, một audit chỉ chạy tiếng Việt có thể kết luận:

“Brand visibility ổn.”

Nhưng khách quốc tế lại đang nhìn thấy một ecosystem hoàn toàn khác.

Vì vậy với các ngành như:

  • travel;
  • hotel;
  • spa;
  • inbound services;
  • B2B;
  • software;
  • education;
  • export;

tôi nghĩ bilingual measurement đáng được coi là một dimension riêng.

Không phải vì “tiếng Anh tốt hơn”.

Mà vì người dùng khác ngôn ngữ có thể mở ra source landscape khác.


18. Kết luận

Sau hai experiment liên tiếp, tôi đang hình dung AI Visibility measurement theo cách ít “score-first” hơn.

Bài trước cho thấy:

Cùng một prompt cần được kiểm tra repeatability.

Bài này cho thấy:

Cùng một intent nhưng đổi language cũng có thể làm source set drift mạnh.

Điều đó dẫn tới một pipeline hợp lý hơn:

Intent
↓
Language variants
↓
Repeated runs
↓
Source normalization
↓
Domain + source-class comparison
↓
Citation / mention / recommendation layers

Thay vì:

1 prompt
↓
1 screenshot
↓
1 kết luận

Sample này còn nhỏ, và tôi không nghĩ nó chứng minh một ranking rule nào của ChatGPT.

Nhưng ít nhất nó đủ để tôi bỏ một giả định:

Một prompt set tiếng Việt không nên mặc định được dùng đại diện cho cùng nhu cầu bằng tiếng Anh.


Nguồn bài viết

Bài viết này được phát triển từ nghiên cứu gốc R39-C — Vietnamese vs English Source-Trace Drift của Ghim AI.

Bài nghiên cứu đầy đủ:
Cùng một nhu cầu, hỏi ChatGPT bằng tiếng Việt và tiếng Anh: nguồn thay đổi ra sao?

Phạm vi nghiên cứu: 12 cặp prompt Việt–Anh tương đương về intent, 24 quan sát trên ChatGPT, snapshot ngày 30/09/2026. Đây là ChatGPT-only source-trace study, không phải nghiên cứu final-answer citation và không chứng minh quan hệ nhân quả giữa ngôn ngữ và ranking.


Series: Measuring AI Visibility

Các bài trước:

  1. ChatGPT nhắc đúng thương hiệu nhưng không dẫn website chính thức: lỗi nằm ở discovery, retrieval hay citation?
    https://viblo.asia/p/chatgpt-nhac-dung-thuong-hieu-nhung-khong-dan-website-chinh-thuc-loi-nam-o-discovery-retrieval-hay-citation-Nj4vgOO2J6r

  2. Một prompt có đủ để đo source visibility trên ChatGPT? Thử nghiệm 10 prompt × 5 lần chạy
    https://viblo.asia/p/mot-prompt-co-du-de-do-source-visibility-tren-chatgpt-thu-nghiem-10-prompt-5-lan-chay-kNLr3n1bVgA


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí