大模型翻译能力评测

1. 背景介绍

随着自然语言处理技术的飞速发展,机器翻译已经成为一个重要的研究领域。近年来,基于大模型的语言模型在机器翻译任务上取得了显著的进展。这些大模型通常具有数亿甚至数千亿的参数,能够更好地理解和生成自然语言。
但是,现在市面上可用的大模型成百上千,每个模型又都有各自的功能特性和适用场景,我们应该如何评估不同模型的翻译效果呢?解决方案可能多种多样,本文尝试采用 WMT 数据集 + BLEU 评分的机制,来相对完善地评估几个大模型的翻译能力。

首先,简单补充一些基础知识:

WMT 数据集

WMT(Workshop on Machine Translation)数据集是一系列用于机器翻译的基准数据集,它由每年举办的WMT会议提供。WMT会议是机器翻译领域的重要国际会议,自2006年起每年举行,旨在推动机器翻译技术的发展。

WMT 数据集包含了多种语言对的翻译数据,这些数据通常来自于新闻文章、议会记录、书籍以及其他公开可用的文本资源。这些数据集被广泛用于训练、评估和比较不同的机器翻译系统。其中一些知名的语言对包括英语-法语、英语-德语、英语-西班牙语等。WMT 提供了比较权威的基准数据,可供我们来评估不同模型的翻译准确率。

BLEU 评分

BLEU(Bilingual Evaluation Understudy)评分是一种用于评估机器翻译输出质量的自动评价指标。 BLEU由IBM在2002年提出,目的是为了提供一个快速、客观且成本较低的方法来评估翻译系统的性能。BLEU评分已经成为机器翻译领域最广泛使用的评价标准之一。

BLEU 通过计算匹配度(Precision)、修饰(Modified)、几何平均、最终评分等流程,最终生成一个 [0,1] 范围内的 score,其中1表示完美的匹配,即机器翻译的输出与参考翻译完全一致。我们通过不同大模型之间评分的相对值,就可以评估出翻译能力的差异。

有了这些基础知识,我们就可以来实现具体的评测程序了。
下面的程序采用 LangChain 框架,以英译中场景为例,介绍翻译评测的具体实现流程。

2. 实现流程

加载语料数据集

首先安装 datasets 库:

pip install datasets

然后我们实现一个 DataSetLoader ,用于加载 WMT 的语料数据集。wmt19 这个仓库下就包含了英汉互译的数据集。 我们假定英文为原始语言,中文为目标翻译语言。

from datasets import load_datasetclass DataSetLoader:"""数据集加载器"""def __init__(self):"""初始化方法"""# 加载英译汉数据集self.ds = load_dataset('wmt19', 'zh-en')print("加载[en-zh]数据集完成")def get_origin_content(self, idx: int) -> str:"""获取原始内容"""return self.ds['train'][idx]['translation']['en']def get_ref_trans(self, idx: int) -> str:"""获取参考翻译"""return self.ds['train'][idx]['translation']['zh']

BLEU 评分计算

接下来,我们定义一个 BleuScoreCaculator 组件,用于计算 BLEU 分数。这里直接使用 nltk.translate 包即可(需要安装):

from nltk.translate.bleu_score import sentence_bleuclass BleuScoreCaculator:"""BLEU分数计算器"""@staticmethoddef calc_score(references, hypothesis) -> float:"""计算BLEU分数"""return sentence_bleu(references, hypothesis, weights=(1,))

分词处理

除此之外,为了避免不同分词规则所造成的影响,我们再开发一个分词组件,按照统一的规则,对文本进行分词。分词库采用应用广泛的 jieba 即可:

from typing import Listimport jiebaclass Tokenizer:"""分词器"""@staticmethoddef clean_and_tokenize(text: str) -> List[str]:"""清理文本并分词:param text: 原始文本:return: 分词列表"""# 去除多余空格和标点符号trimmed = text.replace('\n', ' ').replace('  ', ' ').strip()# 使用 jieba 进行分词return list(jieba.cut(trimmed))

翻译评测

所有的基础组件已经准备就绪了,下面就可以开始完成核心的翻译评测功能。
我们采用 LangChain 框架,构造标准化的处理流程 Chain。采用一下三个候选模型:

  • glm-4-plus
  • gpt-4o
  • qwen-32b

这三个都是当前业界功能非常强大的模型,那么他们的翻译能力到底孰优孰劣呢?我们写代码看一下:

import json
from typing import List, Dict, Anyimport dotenv
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAIfrom bleu import BleuScoreCaculator
from loader import DataSetLoader
from tokenizer import Tokenizerif __name__ == '__main__':# 加载环境变量dotenv.load_dotenv()# 对比3个LLM: glm-4-plus、gpt-4o和qwen-32bchat_glm_4_plus = ChatZhipuAI(model="glm-4-plus", temperature=0.1)chat_gpt_4o = ChatOpenAI(model="gpt-4o", temperature=0.1)chat_qwen_32b = ChatOpenAI(model="qwen-32b", temperature=0.1)# 构造promptquery = """待翻译内容:{content}原始语言:{origin_lang}翻译成的目标语言:{target_lang}特别注意:直接生成翻译好的文本即可,无需任何额外信息!"""prompt = ChatPromptTemplate.from_messages([("system", "你是一个翻译专家,请根据用户需要翻译文本"),("human", query)])prompt = prompt.partial(origin_lang="英语", target_lang="汉语")# 构造Chainglm_4_plus_chain = prompt | chat_glm_4_plus | StrOutputParser()gpt_4o_chain = prompt | chat_gpt_4o | StrOutputParser()qwen_32b_chain = prompt | chat_qwen_32b | StrOutputParser()print("翻译评测开始\n\n")# 创建数据集加载器loader = DataSetLoader()# 创建分词器tokenizer = Tokenizer()# 创建BLEU分数计算器calculator = BleuScoreCaculator()count = 20  # 评测20条数据,可以视具体情况调整glm_4_plus_total_score: float = 0gpt_4o_total_score: float = 0qwen_32b_total_score: float = 0result: List[Dict[str, Any]] = []for i in range(count):# 执行翻译print(f"\n==========第{i + 1}组==========\n")origin = loader.get_origin_content(i)print(f"[原始内容]: {origin}\n")ref_trans = loader.get_ref_trans(i)print(f"[参考翻译]: {ref_trans}\n")glm_4_plus_trans = glm_4_plus_chain.invoke({"content": origin})print(f"[glm-4-plus 翻译结果]: {glm_4_plus_trans}\n")gpt_4o_trans = gpt_4o_chain.invoke({"content": origin})print(f"[gpt_4o 翻译结果]: {gpt_4o_trans}\n")qwen_32b_trans = qwen_32b_chain.invoke({"content": origin})print(f"[qwen-32b 翻译结果]: {qwen_32b_trans}\n")# 分词处理ref_tokens = tokenizer.clean_and_tokenize(ref_trans)glm_4_plus_trans_tokens = tokenizer.clean_and_tokenize(glm_4_plus_trans)gpt_4o_trans_tokens = tokenizer.clean_and_tokenize(gpt_4o_trans)qwen_32b_trans_tokens = tokenizer.clean_and_tokenize(qwen_32b_trans)# 计算BLEU分数glm_4_plus_trans_score = calculator.calc_score([ref_tokens], glm_4_plus_trans_tokens)print(f"[glm-4-plus BLEU分数]: {glm_4_plus_trans_score}\n")gpt_4o_trans_score = calculator.calc_score([ref_tokens], gpt_4o_trans_tokens)print(f"[gpt_4o BLEU分数]: {gpt_4o_trans_score}\n")qwen_32b_trans_score = calculator.calc_score([ref_tokens], qwen_32b_trans_tokens)print(f"[qwen-32b BLEU分数]: {qwen_32b_trans_score}\n")glm_4_plus_total_score += glm_4_plus_trans_scoregpt_4o_total_score += gpt_4o_trans_scoreqwen_32b_total_score += qwen_32b_trans_score# 保存结果single_result = {"origin": origin,"ref_trans": ref_trans,"glm_4_plus_trans": glm_4_plus_trans,"gpt_4o_trans": gpt_4o_trans,"qwen_32b_trans": qwen_32b_trans,"glm_4_plus_trans_score": glm_4_plus_trans_score,"gpt_4o_trans_score": gpt_4o_trans_score,"qwen_32b_trans_score": qwen_32b_trans_score,}result.append(single_result)print(f"\n{json.dumps(result)}\n")print("翻译评测完成\n\n")# 保存结果with open("./trans_result.json", "w") as f:json.dump(result, f, ensure_ascii=False, indent=4)print("[glm-4-plus BLEU平均分]: ", glm_4_plus_total_score / count)print("[gpt-4o BLEU平均分]: ", gpt_4o_total_score / count)print("[qwen-32b BLEU平均分]: ", qwen_32b_total_score / count)

3. 总结

我们测试了20条数据集,最终结果如下:

[glm-4-plus BLEU平均分]:  0.6133968696381211
[gpt-4o BLEU平均分]:  0.5818961018843368
[qwen-32b BLEU平均分]:  0.580947364126585

生成的结果 json 文件格式如下:

[{"origin": "For geo-strategists, however, the year that naturally comes to mind, in both politics and economics, is 1989.","ref_trans": "然而,作为地域战略学家,无论是从政治意义还是从经济意义上,让我自然想到的年份是1989年。","glm_4_plus_trans": "对于地缘战略家来说,无论是在政治还是经济上,自然而然会想到的年份是1989年。","gpt_4o_trans": "对于地缘战略家来说,无论在政治还是经济方面,自然而然想到的年份是1989年。","qwen_32b_trans": "然而,对于地缘战略家来说,无论是政治还是经济,自然想到的一年是1989年。","glm_4_plus_trans_score": 0.5009848620501905,"gpt_4o_trans_score": 0.42281285383122796,"qwen_32b_trans_score": 0.528516067289035
}]

可以看出,针对中文翻译,这3个大模型的 BLEU 相差不大,而且都超过了 0.5,基本可以认为翻译质量较好,能够传达原文的基本意思,错误较少,流畅性较好。其中分数最高的是 glm-4-plus,大概率是因为智谱 AI 针对中文语料做了很多 fine-tuning 和优化的工作,因为在机器翻译领域,数据是非常重要的关键因素。

本文仅采用了20条数据进行评测,结果可能存在一些偏差,而且不同的测试数据也会对结果产生影响,可以结合特定业务场景调整参数。重要的是,这里提供了一种相对客观的评估方式,可以直观地评测不同大模型的翻译效果,可以作为业务应用和技术选型的有力依据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)

找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 题目分析: 1.将p里面的字符先丢进一个hash1中,只需要在S字符里面找到多少个和他相同的has…

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…

前端的面试题

1.常用的块与行属性内标签有哪些?有什么特征? 块标签:div、h1~h6、ul、li、table、p、br、form。 特征:独占一行,换行显示,可以设置宽高,可以嵌套块和行 行标签:span、a、img、text…

48-基于单片机的LCD12864时间调控和串口抱站

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机的公交报站系统,可以手动报站,站名十个。 在lcd12864上显示时间(年月日时分秒)和站名,时间可以设置, 仿真中可以…

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间

如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间 一、前言二、准备工作三、扩展逻辑卷1. 检查现有 LVM 配置2. 扩展物理卷3. 扩展卷组4. 扩展逻辑卷四、调整文件系统大小1. 检查文件系统状态2. 扩展文件系统五、处理可能出现的问题1. 文件系统无法扩展2. 磁盘空间不足3…

Redis 分布式锁实现方案

一、概述 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级…

前端node.js

一.什么是node.js 官网解释:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 二.初步使用node.js 需要区分开的是node.js和javascript互通的只有console和定时器两个API. 三.Buffer Buffer 是一个类似于数组的 对象,用于表示固定长度的字节序列。Buffer…

构造函数与析构函数错题汇总

构造函数不能定义返回类型,也没有返回类型。 堆、栈、静态存储区。栈上的对象main函数结束就释放,堆上的需要手动释放,静态存储区的在所在作用域的程序结束时释放。这里static在main函数内,是局部变量,所以作用域为…

SQL基础入门——SQL基础语法

1. 数据库、表、列的创建与管理 在SQL中,数据库是一个数据的集合,包含了多个表、视图、索引、存储过程等对象。每个表由若干列(字段)组成,表中的数据行代表记录。管理数据库和表的结构是SQL的基础操作。 1.1 创建数据…

亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

自然语言处理期末试题汇总

建议自己做,写完再来对答案。答案可能存在极小部分错误,不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

深度学习——激活函数

一、人工神经元 1.1 构建人工神经元 人工神经元接受多个输入信息,对它们进行加权求和,再经过激活函数处理,最后将这个结果输出。 1.2 组成部分 输入(Inputs): 代表输入数据,通常用向量表示,每…

新型大语言模型的预训练与后训练范式,Meta的Llama 3.1语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

[js] 函数柯里化

面试题:实现一个add方法,使计算结果能够满足如下预期: add(1)(2)(3) 6; add(1, 2, 3)(4) 10; add(1)(2)(3)(4)(5) 15; // 保存不定长参数 let nums []; function add(...args) { // 往数组中插入不定长参数nums.push(...args)// 判断参数…

git rebase-优雅合并与修改提交

文章目录 简介rebase用于合并使用rebase修改提交cherry-pick 简介 在Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)中我们已经介绍了git的最常用实用的命令。 在上面说的那篇文章中,我们只是简单提了一下rebase。 是因为r…

音视频流媒体直播/点播系统EasyDSS互联网视频云平台介绍

随着互联网技术的飞速发展,音视频流媒体直播已成为现代社会信息传递与娱乐消费的重要组成部分。在这样的背景下,EasyDSS互联网视频云平台应运而生,它以高效、稳定、便捷的特性,为音视频流媒体直播领域带来了全新的解决方案。 1、产…

HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)

文章目录 1、属性动画图解2、案例实现-小鱼移动游戏1、代码实现2、代码解释3、资源图片4、实现效果3、显示动画4、案例修改-显示动画5、总结1、属性动画图解 这里我们用一张完整的图来汇整属性动画的用法格式和使用的主要属性范围,如下所示: 2、案例实现-小鱼移动游戏 1、代…

基于大数据python 豆果美食推荐数据可视化系统(源码+LW+部署讲解+数据库+ppt)

!!!!!!!!! 很对人不知道选题怎么选 不清楚自己适合做哪块内容 都可以免费来问我 避免后期給自己答辩找麻烦 增加难度(部分学校只有一次答辩机会 没弄好就延迟…

坐标系变换

1 Clark变换 三相对称电压表达式为: 将三相电压用相量的形式表达出来,并用欧拉公式(eix(cosxisinx))写成三角函数的形式: 同时,三相电压矢量空间合成向量可表示为: 三相电压合成矢量幅值为相电…

008静态路由-特定主机路由

按照如上配置,用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1,再经过R2 &#xf…