zalo
Chat ngay

Làm thế nào để đánh giá một nhiệm vụ tóm tắt

Trong sổ tay này, chúng tôi đi sâu vào các kỹ thuật đánh giá cho các nhiệm vụ tóm tắt trừu tượng bằng một ví dụ đơn giản. Chúng tôi khám phá các phương pháp đánh giá truyền thống như ROUGE và BERTScore , ngoài việc giới thiệu một cách tiếp cận mới lạ hơn bằng cách sử dụng LLM làm người đánh giá.

Đánh giá chất lượng tóm tắt là một quá trình tốn thời gian vì nó liên quan đến các số liệu chất lượng khác nhau như tính mạch lạc, tính súc tích, tính dễ đọc và nội dung. Các số liệu đánh giá tự động truyền thống như ROUGEvà BERTScorevà các số liệu khác là cụ thể và đáng tin cậy, nhưng chúng có thể không tương quan tốt với chất lượng thực tế của tóm tắt. Chúng cho thấy mối tương quan tương đối thấp với các đánh giá của con người, đặc biệt là đối với các tác vụ tạo kết thúc mở ( Liu và cộng sự, 2023 ). Nhu cầu dựa vào các đánh giá của con người, phản hồi của người dùng hoặc các số liệu dựa trên mô hình ngày càng tăng trong khi vẫn cảnh giác về các thành kiến ​​tiềm ẩn. Mặc dù đánh giá của con người cung cấp những hiểu biết vô giá, nhưng thường không thể mở rộng quy mô và có thể gây tốn kém.

Ngoài các số liệu truyền thống này, chúng tôi giới thiệu một phương pháp ( G-Eval ) tận dụng Mô hình ngôn ngữ lớn (LLM) như một số liệu mới, không tham chiếu để đánh giá các bản tóm tắt trừu tượng. Trong trường hợp này, chúng tôi sử dụng gpt-4 để chấm điểm đầu ra gpt-4 của ứng viên. đã học hiệu quả một mô hình nội bộ về chất lượng ngôn ngữ cho phép phân biệt giữa văn bản trôi chảy, mạch lạc và văn bản chất lượng thấp. Việc khai thác cơ chế chấm điểm nội bộ này cho phép tự động đánh giá các đầu ra ứng viên mới do LLM tạo ra.

Cài đặt

# Installing necessary packages for the evaluation
# rouge: For evaluating with ROUGE metric
# bert_score: For evaluating with BERTScore
# openai: To interact with OpenAI's API!pip install rouge --quiet!pip install bert_score --quiet!pip install openai --quiet
from openai import OpenAI
import os
import re
import pandas as pd
# Python Implementation of the ROUGE Metric
from rouge import Rouge
# BERTScore leverages the pre-trained contextual embeddings from BERT and matches words in candidate and reference sentences by cosine similarity.
from bert_score import BERTScorer
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", ""))
<đối tượng IPython.core.display.Javascript>

Nhiệm vụ ví dụ

Đối với mục đích của sổ tay này, chúng tôi sẽ sử dụng bản tóm tắt ví dụ bên dưới. Lưu ý rằng chúng tôi cung cấp hai bản tóm tắt được tạo để so sánh và một bản tóm tắt do con người viết tham chiếu, mà các số liệu đánh giá thích ROUGEvà BERTScoreyêu cầu.

Trích đoạn ( excerpt):

Sứ mệnh của OpenAI là đảm bảo rằng trí tuệ nhân tạo tổng quát (AGI) mang lại lợi ích cho toàn thể nhân loại. OpenAI sẽ trực tiếp xây dựng AGI an toàn và có lợi, nhưng cũng sẽ coi nhiệm vụ của mình đã hoàn thành nếu công trình của mình giúp những người khác đạt được kết quả này. OpenAI tuân theo một số nguyên tắc chính cho mục đích này. Đầu tiên, lợi ích được phân bổ rộng rãi - bất kỳ ảnh hưởng nào đến việc triển khai AGI sẽ được sử dụng vì lợi ích của tất cả mọi người và tránh sử dụng có hại hoặc tập trung quyền lực không đúng mức. Thứ hai, an toàn lâu dài - OpenAI cam kết thực hiện nghiên cứu để làm cho AGI an toàn và thúc đẩy việc áp dụng nghiên cứu đó trên toàn cộng đồng AI. Thứ ba, lãnh đạo kỹ thuật - OpenAI đặt mục tiêu đi đầu trong các khả năng của AI. Thứ tư, định hướng hợp tác - OpenAI tích cực hợp tác với các tổ chức nghiên cứu và chính sách khác và tìm cách tạo ra một cộng đồng toàn cầu cùng nhau giải quyết các thách thức toàn cầu của AGI.

Tóm tắt:

Tóm tắt tham khảo / ref_summary(do con người tạo ra)Tóm tắt đánh giá 1 / eval_summary_1(hệ thống tạo ra)Tóm tắt đánh giá 2 / eval_summary_2(hệ thống tạo ra)
OpenAI hướng đến mục tiêu đảm bảo trí tuệ nhân tạo tổng quát (AGI) được sử dụng vì lợi ích của mọi người, tránh sử dụng có hại hoặc tập trung quyền lực không đáng có. OpenAI cam kết nghiên cứu về tính an toàn của AGI, thúc đẩy các nghiên cứu như vậy trong cộng đồng AI. OpenAI tìm cách dẫn đầu về năng lực AI và hợp tác với các tổ chức nghiên cứu và chính sách toàn cầu để giải quyết các thách thức của AGI.OpenAI hướng đến mục tiêu AGI mang lại lợi ích cho toàn thể nhân loại, tránh sử dụng có hại và tập trung quyền lực. OpenAI tiên phong trong nghiên cứu về AGI an toàn và có lợi, đồng thời thúc đẩy việc áp dụng trên toàn cầu. OpenAI duy trì vị thế dẫn đầu về mặt kỹ thuật trong lĩnh vực AI trong khi hợp tác với các tổ chức toàn cầu để giải quyết các thách thức của AGI. OpenAI tìm cách dẫn đầu một nỗ lực hợp tác trên toàn thế giới để phát triển AGI vì lợi ích chung.OpenAI hướng đến mục tiêu đảm bảo AGI dành cho mọi người sử dụng, tránh hoàn toàn những thứ có hại hoặc tập trung quyền lực lớn. Cam kết nghiên cứu mặt an toàn của AGI, thúc đẩy những nghiên cứu này ở những người làm việc trong lĩnh vực AI. OpenAI muốn trở thành người đứng đầu trong lĩnh vực AI và hợp tác với các nhóm nghiên cứu, chính sách trên toàn thế giới để tìm hiểu về AGI.

Hãy dành chút thời gian để tìm ra bản tóm tắt mà bạn thích nhất và bản tóm tắt nào thực sự nắm bắt được sứ mệnh của OpenAI.

excerpt = "OpenAI's mission is to ensure that artificial general intelligence (AGI) benefits all of humanity. OpenAI will build safe and beneficial AGI directly, but will also consider its mission fulfilled if its work aids others to achieve this outcome. OpenAI follows several key principles for this purpose. First, broadly distributed benefits - any influence over AGI's deployment will be used for the benefit of all, and to avoid harmful uses or undue concentration of power. Second, long-term safety - OpenAI is committed to doing the research to make AGI safe, and to promote the adoption of such research across the AI community. Third, technical leadership - OpenAI aims to be at the forefront of AI capabilities. Fourth, a cooperative orientation - OpenAI actively cooperates with other research and policy institutions, and seeks to create a global community working together to address AGI's global challenges."
ref_summary = "OpenAI aims to ensure artificial general intelligence (AGI) is used for everyone's benefit, avoiding harmful uses or undue power concentration. It is committed to researching AGI safety, promoting such studies among the AI community. OpenAI seeks to lead in AI capabilities and cooperates with global research and policy institutions to address AGI's challenges."
eval_summary_1 = "OpenAI aims to AGI benefits all humanity, avoiding harmful uses and power concentration. It pioneers research into safe and beneficial AGI and promotes adoption globally. OpenAI maintains technical leadership in AI while cooperating with global institutions to address AGI challenges. It seeks to lead a collaborative worldwide effort developing AGI for collective good."
eval_summary_2 = "OpenAI aims to ensure AGI is for everyone's use, totally avoiding harmful stuff or big power concentration. Committed to researching AGI's safe side, promoting these studies in AI folks. OpenAI wants to be top in AI things and works with worldwide research, policy groups to figure AGI's stuff."
<đối tượng IPython.core.display.Javascript>

Đánh giá bằng cách sử dụng ROUGE

ROUGE , viết tắt của Recall-Oriented Understudy for Gisting Evaluation, chủ yếu đánh giá sự chồng chéo của các từ giữa đầu ra được tạo ra và văn bản tham chiếu. Đây là một số liệu phổ biến để đánh giá các tác vụ tóm tắt tự động. Trong số các biến thể của nó, ROUGE-Lcung cấp thông tin chi tiết về sự khớp nối liền kề dài nhất giữa các bản tóm tắt do hệ thống tạo ra và bản tóm tắt tham chiếu, đánh giá mức độ hệ thống giữ lại bản chất của bản tóm tắt gốc.

# function to calculate the Rouge score
def get_rouge_scores(text1, text2): rouge = Rouge() return rouge.get_scores(text1, text2)
rouge_scores_out = []
# Calculate the ROUGE scores for both summaries using reference
eval_1_rouge = get_rouge_scores(eval_summary_1, ref_summary)
eval_2_rouge = get_rouge_scores(eval_summary_2, ref_summary)
for metric in ["rouge-1", "rouge-2", "rouge-l"]: for label in ["F-Score"]: eval_1_score = eval_1_rouge[0][metric][label[0].lower()] eval_2_score = eval_2_rouge[0][metric][label[0].lower()] row = { "Metric": f"{metric} ({label})", "Summary 1": eval_1_score, "Summary 2": eval_2_score, } rouge_scores_out.append(row)
def highlight_max(s): is_max = s == s.max() return [ "background-color: lightgreen" if v else "background-color: white" for v in is_max ]
rouge_scores_out = ( pd.DataFrame(rouge_scores_out) .set_index("Metric") .style.apply(highlight_max, axis=1)
)
rouge_scores_out
 Tóm tắt 1Tóm tắt 2
Hệ mét  
rouge-1 (Điểm F)0,4888890,511628
rouge-2 (Điểm F)0,2307690,163265
rouge-l (Điểm F)0,4888890,511628
<đối tượng IPython.core.display.Javascript>

Bảng này cho thấy ROUGEđiểm số để đánh giá hai bản tóm tắt khác nhau so với một văn bản tham khảo. Trong trường hợp của rouge-1, Tóm tắt 2 vượt trội hơn Tóm tắt 1, cho thấy sự chồng chéo tốt hơn của từng từ và đối với rouge-l, Tóm tắt 2 có điểm số cao hơn, ngụ ý sự khớp chặt chẽ hơn trong các chuỗi chung dài nhất và do đó có khả năng tóm tắt tổng thể tốt hơn trong việc nắm bắt nội dung chính và thứ tự của văn bản gốc. Vì Tóm tắt 2 có nhiều từ và cụm từ ngắn được trích trực tiếp từ đoạn trích, nên sự chồng chéo của nó với bản tóm tắt tham khảo có thể cao hơn, dẫn đến ROUGEđiểm số cao hơn.

Trong khi ROUGEcác số liệu tương tự, chẳng hạn như BLEU và METEOR , cung cấp các biện pháp định lượng, chúng thường không nắm bắt được bản chất thực sự của một bản tóm tắt được tạo ra tốt. Chúng cũng tương quan tệ hơn với điểm số của con người. Với những tiến bộ trong LLM, vốn rất giỏi trong việc tạo ra các bản tóm tắt trôi chảy và mạch lạc, các số liệu truyền thống như ROUGEcó thể vô tình làm giảm giá trị của các mô hình này. Điều này đặc biệt đúng nếu các bản tóm tắt được diễn đạt khác nhau nhưng vẫn tóm tắt chính xác thông tin cốt lõi.

Đánh giá bằng cách sử dụng BERTScore

ROUGE dựa vào sự hiện diện chính xác của các từ trong cả văn bản dự đoán và tham chiếu, không giải thích được ngữ nghĩa cơ bản. Đây là lúc BERTScore xuất hiện và tận dụng các nhúng ngữ cảnh từ mô hình BERT, nhằm mục đích đánh giá sự giống nhau giữa câu dự đoán và câu tham chiếu trong ngữ cảnh của văn bản do máy tạo ra. Bằng cách so sánh các nhúng từ cả hai câu, BERTScorenắm bắt được sự giống nhau về ngữ nghĩa mà các số liệu dựa trên n-gram truyền thống có thể bỏ qua.

# Instantiate the BERTScorer object for English language
scorer = BERTScorer(lang="en")
# Calculate BERTScore for the summary 1 against the excerpt
# P1, R1, F1_1 represent Precision, Recall, and F1 Score respectively
P1, R1, F1_1 = scorer.score([eval_summary_1], [ref_summary])
# Calculate BERTScore for summary 2 against the excerpt
# P2, R2, F2_2 represent Precision, Recall, and F1 Score respectively
P2, R2, F2_2 = scorer.score([eval_summary_2], [ref_summary])
print("Summary 1 F1 Score:", F1_1.tolist()[0])
print("Summary 2 F1 Score:", F2_2.tolist()[0])
Một số trọng số của điểm kiểm tra mô hình tại roberta-large không được sử dụng khi khởi tạo RobertaModel: ['lm_head.dense.weight', 'lm_head.dense.bias', 'lm_head.layer_norm.bias', 'lm_head.layer_norm.weight', 'lm_head.decoder.weight', 'lm_head.bias'] - ĐIỀU NÀY ĐƯỢC mong đợi nếu bạn đang khởi tạo RobertaModel từ điểm kiểm tra của một mô hình được đào tạo trên một tác vụ khác hoặc với một kiến ​​trúc khác (ví dụ: khởi tạo mô hình BertForSequenceClassification từ mô hình BertForPreTraining). - ĐIỀU NÀY KHÔNG được mong đợi nếu bạn đang khởi tạo RobertaModel từ điểm kiểm tra của một mô hình mà bạn mong đợi là giống hệt nhau (khởi tạo mô hình BertForSequenceClassification từ mô hình BertForSequenceClassification).
Tóm tắt 1 Điểm F1: 0,9227314591407776 Tóm tắt 2 Điểm F1: 0,9189572930335999
<đối tượng IPython.core.display.Javascript>

Điểm F1 gần nhau giữa các bản tóm tắt cho thấy chúng có thể thực hiện tương tự nhau trong việc nắm bắt thông tin chính. Tuy nhiên, sự khác biệt nhỏ này cần được diễn giải thận trọng. Vì BERTScorecó thể không nắm bắt đầy đủ các chi tiết tinh tế và các khái niệm cấp cao mà người đánh giá có thể hiểu được, nên việc chỉ dựa vào số liệu này có thể dẫn đến việc hiểu sai chất lượng và sắc thái thực tế của bản tóm tắt. Một cách tiếp cận tích hợp kết hợp BERTScorevới đánh giá của con người và các số liệu khác có thể đưa ra đánh giá đáng tin cậy hơn.

Xem thêm: tìm hiểu về tài khoản Chat GPT-4 là gì? 

Ở đây chúng tôi triển khai một ví dụ về trình đánh giá văn bản không tham chiếu sử dụng gpt-4, lấy cảm hứng từ khuôn khổ G-Eval đánh giá chất lượng của văn bản được tạo ra bằng các mô hình ngôn ngữ lớn. Không giống như các số liệu như ROUGEhoặc BERTScoredựa trên việc so sánh với các bản tóm tắt tham chiếu, gpt-4trình đánh giá dựa trên đánh giá chất lượng của nội dung được tạo ra chỉ dựa trên lời nhắc nhập và văn bản, mà không có bất kỳ tham chiếu thực tế nào. Điều này làm cho nó có thể áp dụng cho các tập dữ liệu và tác vụ mới mà các tham chiếu của con người còn ít hoặc không có.

Sau đây là tổng quan về phương pháp này:

  1. Chúng tôi xác định bốn tiêu chí riêng biệt:
    1. Tính liên quan : Đánh giá xem bản tóm tắt có chỉ bao gồm thông tin quan trọng và loại trừ thông tin trùng lặp hay không.
    2. Tính mạch lạc : Đánh giá tính logic và tính tổ chức của bản tóm tắt.
    3. Tính nhất quán : Kiểm tra xem bản tóm tắt có khớp với thông tin trong tài liệu nguồn hay không.
    4. Độ trôi chảy : Đánh giá ngữ pháp và khả năng đọc hiểu của bản tóm tắt.
  2. Chúng tôi tạo ra lời nhắc cho từng tiêu chí này, lấy tài liệu gốc và bản tóm tắt làm đầu vào, tận dụng chuỗi suy nghĩ và hướng dẫn mô hình đưa ra điểm số từ 1-5 cho từng tiêu chí.
  3. Chúng tôi tạo ra điểm số từ gpt-4các lời nhắc đã xác định, sau đó so sánh chúng trong các bản tóm tắt.

Trong bản trình diễn này, chúng tôi sử dụng một hàm chấm điểm trực tiếp, gpt-4tạo ra một điểm số rời rạc (1-5) cho mỗi số liệu. Việc chuẩn hóa điểm số và lấy tổng có trọng số có thể tạo ra điểm số liên tục, mạnh mẽ hơn, phản ánh tốt hơn chất lượng và tính đa dạng của các bản tóm tắt.

# Evaluation prompt template based on G-Eval
EVALUATION_PROMPT_TEMPLATE = """
You will be given one summary written for an article. Your task is to rate the summary on one metric.
Please make sure you read and understand these instructions very carefully.
Please keep this document open while reviewing, and refer to it as needed.
Evaluation Criteria:
{criteria}
Evaluation Steps:
{steps}
Example:
Source Text:
{document}
Summary:
{summary}
Evaluation Form (scores ONLY):
- {metric_name}
"""
# Metric 1: Relevance
RELEVANCY_SCORE_CRITERIA = """
Relevance(1-5) - selection of important content from the source. \
The summary should include only important information from the source document. \
Annotators were instructed to penalize summaries which contained redundancies and excess information.
"""
RELEVANCY_SCORE_STEPS = """
1. Read the summary and the source document carefully.
2. Compare the summary to the source document and identify the main points of the article.
3. Assess how well the summary covers the main points of the article, and how much irrelevant or redundant information it contains.
4. Assign a relevance score from 1 to 5.
"""
# Metric 2: Coherence
COHERENCE_SCORE_CRITERIA = """
Coherence(1-5) - the collective quality of all sentences. \
We align this dimension with the DUC quality question of structure and coherence \
whereby "the summary should be well-structured and well-organized. \
The summary should not just be a heap of related information, but should build from sentence to a\
coherent body of information about a topic."
"""
COHERENCE_SCORE_STEPS = """
1. Read the article carefully and identify the main topic and key points.
2. Read the summary and compare it to the article. Check if the summary covers the main topic and key points of the article,
and if it presents them in a clear and logical order.
3. Assign a score for coherence on a scale of 1 to 5, where 1 is the lowest and 5 is the highest based on the Evaluation Criteria.
"""
# Metric 3: Consistency
CONSISTENCY_SCORE_CRITERIA = """
Consistency(1-5) - the factual alignment between the summary and the summarized source. \
A factually consistent summary contains only statements that are entailed by the source document. \
Annotators were also asked to penalize summaries that contained hallucinated facts.
"""
CONSISTENCY_SCORE_STEPS = """
1. Read the article carefully and identify the main facts and details it presents.
2. Read the summary and compare it to the article. Check if the summary contains any factual errors that are not supported by the article.
3. Assign a score for consistency based on the Evaluation Criteria.
"""
# Metric 4: Fluency
FLUENCY_SCORE_CRITERIA = """
Fluency(1-3): the quality of the summary in terms of grammar, spelling, punctuation, word choice, and sentence structure.
1: Poor. The summary has many errors that make it hard to understand or sound unnatural.
2: Fair. The summary has some errors that affect the clarity or smoothness of the text, but the main points are still comprehensible.
3: Good. The summary has few or no errors and is easy to read and follow.
"""
FLUENCY_SCORE_STEPS = """
Read the summary and evaluate its fluency based on the given criteria. Assign a fluency score from 1 to 3.
"""
def get_geval_score( criteria: str, steps: str, document: str, summary: str, metric_name: str
): prompt = EVALUATION_PROMPT_TEMPLATE.format( criteria=criteria, steps=steps, metric_name=metric_name, document=document, summary=summary, ) response = client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": prompt}], temperature=0, max_tokens=5, top_p=1, frequency_penalty=0, presence_penalty=0, ) return response.choices[0].message.content
evaluation_metrics = { "Relevance": (RELEVANCY_SCORE_CRITERIA, RELEVANCY_SCORE_STEPS), "Coherence": (COHERENCE_SCORE_CRITERIA, COHERENCE_SCORE_STEPS), "Consistency": (CONSISTENCY_SCORE_CRITERIA, CONSISTENCY_SCORE_STEPS), "Fluency": (FLUENCY_SCORE_CRITERIA, FLUENCY_SCORE_STEPS),
}
summaries = {"Summary 1": eval_summary_1, "Summary 2": eval_summary_2}
data = {"Evaluation Type": [], "Summary Type": [], "Score": []}
for eval_type, (criteria, steps) in evaluation_metrics.items(): for summ_type, summary in summaries.items(): data["Evaluation Type"].append(eval_type) data["Summary Type"].append(summ_type) result = get_geval_score(criteria, steps, excerpt, summary, eval_type) score_num = int(result.strip()) data["Score"].append(score_num)
pivot_df = pd.DataFrame(data, index=None).pivot( index="Evaluation Type", columns="Summary Type", values="Score"
)
styled_pivot_df = pivot_df.style.apply(highlight_max, axis=1)
display(styled_pivot_df)
Loại tóm tắtTóm tắt 1Tóm tắt 2
Loại đánh giá  
Sự mạch lạc53
Sự nhất quán55
Sự lưu loát32
Sự liên quan54
<đối tượng IPython.core.display.Javascript>

Nhìn chung, Tóm tắt 1 có vẻ vượt trội hơn Tóm tắt 2 ở ba trong bốn hạng mục (Tính mạch lạc, Tính liên quan và Tính trôi chảy). Cả hai bản tóm tắt đều được thấy là nhất quán với nhau. Kết quả có thể cho thấy Tóm tắt 1 nhìn chung được ưa chuộng hơn dựa trên các tiêu chí đánh giá đã cho.

Hạn chế

Lưu ý rằng các số liệu dựa trên LLM có thể có xu hướng thiên về việc ưu tiên các văn bản do LLM tạo ra hơn là các văn bản do con người viết. Ngoài ra, các số liệu dựa trên LLM rất nhạy cảm với các thông báo/lời nhắc của hệ thống. Chúng tôi khuyên bạn nên thử nghiệm các kỹ thuật khác có thể giúp cải thiện hiệu suất và/hoặc đạt được điểm số nhất quán, tạo ra sự cân bằng phù hợp giữa đánh giá đắt tiền chất lượng cao và đánh giá tự động. Cũng cần lưu ý rằng phương pháp chấm điểm này hiện bị giới hạn bởi gpt-4cửa sổ ngữ cảnh của '.

Phần kết luận

Đánh giá tóm tắt trừu tượng vẫn là một lĩnh vực mở để cải thiện hơn nữa. Các số liệu truyền thống như ROUGEBLEU, và BERTScorecung cấp đánh giá tự động hữu ích nhưng có những hạn chế trong việc nắm bắt sự tương đồng về mặt ngữ nghĩa và các khía cạnh sắc thái của chất lượng tóm tắt. Hơn nữa, chúng yêu cầu đầu ra tham chiếu có thể tốn kém để thu thập/gắn nhãn. Các số liệu dựa trên LLM hứa hẹn là một phương pháp không tham chiếu để đánh giá tính mạch lạc, lưu loát và tính liên quan. Tuy nhiên, chúng cũng có khả năng thiên vị ưu tiên văn bản do LLM tạo ra. Cuối cùng, sự kết hợp giữa các số liệu tự động và đánh giá của con người là lý tưởng để đánh giá đáng tin cậy các hệ thống tóm tắt trừu tượng. Mặc dù đánh giá của con người là điều cần thiết để có được sự hiểu biết toàn diện về chất lượng tóm tắt, nhưng nó nên được bổ sung bằng đánh giá tự động để cho phép thử nghiệm hiệu quả, quy mô lớn. Lĩnh vực này sẽ tiếp tục phát triển các kỹ thuật đánh giá mạnh mẽ hơn, cân bằng giữa chất lượng, khả năng mở rộng và tính công bằng. Việc cải tiến các phương pháp đánh giá là rất quan trọng để thúc đẩy tiến bộ trong các ứng dụng sản xuất.

Hot Deal

Họ tên (*)

Số điện thoại (*)

Email (*)

Dịch vụ

Đăng ký để nhận bản tin mới nhất !