惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
美团技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
雷峰网
雷峰网
P
Proofpoint News Feed
IT之家
IT之家
人人都是产品经理
人人都是产品经理
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
T
The Blog of Author Tim Ferriss
月光博客
月光博客
V
Visual Studio Blog
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Project Zero
Project Zero
U
Unit 42
T
Tor Project blog
Scott Helme
Scott Helme
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
I
InfoQ
Cloudbric
Cloudbric
P
Proofpoint News Feed
The Cloudflare Blog
H
Heimdal Security Blog
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
Attack and Defense Labs
Attack and Defense Labs
有赞技术团队
有赞技术团队
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
博客园 - 【当耐特】
Security Latest
Security Latest
The Register - Security
The Register - Security
F
Fortinet All Blogs
I
Intezer
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
NISL@THU
NISL@THU
T
Tenable Blog

博客园 - 若-飞

企业AI Agent落地的核心逻辑与路径 基于langchain,Function Call的成功率怎么解决? LangChain Checkpoint(检查点)是什么?—— Agent 的"存档机制" RAG 设计:Embedding 如何切分 AI 客服系统设计:RAG 知识库设计 Go 百万连接服务器设计:从网卡到业务的全链路解析 深度解析 sync.Pool:从设计哲学到生产实践 Goroutine 泄漏:原因、检测与防范 Go Channel 关闭与超时机制完全指南 Go Map 无限增长问题解决方案 LangChain 聊天记录压缩:原理、机制与实战 揭开 sklearn 文本分类的核心原理:从词袋到逻辑回归 大模型“胡说八道”怎么办?一张图读懂检测、评估与修复全方案 企业级AI知识库权限隔离设计:让AI“懂规矩”比“懂知识”更重要 RAG系统设计全解析:从架构到多模态的核心知识图谱 RAG召回率提升全攻略:7大核心方法让检索更精准 RAG召回率提升秘籍:Metadata过滤的底层原理与实践 构建更好的RAG系统:深入理解混合搜索 一文搞懂 RAG 中 Retriever 和 Reranker 的区别 一文搞懂 RAG 的召回率(Recall)是什么? LangChain / LangGraph、MCP、Harness Engineer 与 Claude Code 的对应关系 Agent Harness 技术笔记:从 Trajectory 到 Function Calling Loop 一文讲清:Approve / Permit / Permit2 的本质区别 分库分表后跨分页查询的完整方案 ai如何处理私有数据 ai幻觉是啥,以及如何解决 别再让大模型“凭空瞎猜”了!带你认识AI最强外挂:ChromaDB 用 useQuery 管请求:TanStack React Query 入门小结 HD钱包--BIP44 TRON 四种 API 面怎么选:从节点协议到 JSON-RPC 再到 TronGrid 以太坊节点存储与共识机制全解析 BSC节点发现协议全解析:UDP发现、Bootnode引导与Gossip交易广播 以太坊节点发现背后的分布式哈希表(DHT)与 Kademlia 原理解析 Solidity中的bytes与string:深入理解这两种特殊的动态数组 智能合约自毁:当资产还在,合约死了 —— 深度解析 selfdestruct 导致的资产锁定风险 TDengine CLI (taos) 使用指南 —— Docker 本地开发实战 在 macOS 上用 DBeaver 连接 TDengine:踩坑总结与最终配置指南 Solidity Storage Slot 深度解析 Geth Snapshot Export/Import 深度解析: 不是备份工具,而是数据分析利器 基于BSC 公链的数据备份与 Snapshot 机制深度解析 Docker 共享内存完全指南:从原理到实践,避免常见的理解误区 Docker容器"僵尸状态"问题排查与自动重启方案 SSE协议深度解析:被低估的HTTP服务器推送标准 TDengine vs MySQL:时序数据处理的时代之选 Proxmox 启用 QEMU Guest Agent 实战指南 解决 Blockscout "batch too large" 错误的完整指南 一文讲清楚什么是基准测试(Benchmark) Rust中的宏(Macro):编译时的代码生成魔法 Docker优雅关闭的艺术:为什么stop_grace_period能防止数据丢失 为什么 Go 没有依赖注入和 Bean 机制?语言设计哲学对比
BLEU 是什么?——从原理到工程实践
若-飞 · 2026-06-15 · via 博客园 - 若-飞

BLEU 是什么?——从原理到工程实践

本文讲解 BLEU 的算法思想、计算公式、常见误区,以及为什么「翻译对了,分数却不高」。


1. 为什么需要 BLEU?

在 QA 任务里,标准答案往往唯一且很短,用 Exact Match(EM) 就够了:归一化后完全一致即判对。

翻译任务不同。同一句英文可以有多条合法中文译文:

参考译文 模型译文 语义
早上好 早上好呀 ✅ 正确
谢谢 多谢 ✅ 正确
回头见 再见 ✅ 基本正确

EM 会把后两种情况全部判错。我们需要一种指标:不要求逐字相同,但越接近参考译文,分数越高

BLEU(Bilingual Evaluation Understudy,2002 年 Papineni 等人提出)就是机器翻译领域最经典的自动评测指标之一。核心思路很简单:

看模型译文里,有多少 n-gram(连续的 n 个词/字)也出现在参考译文里。


2. BLEU 在算什么?

BLEU 由三部分组成:

BLEU = BP × exp( Σ wₙ × log(pₙ) )

其中:

符号 含义
pₙ n-gram 修正精确率(modified precision)
wₙ 各阶 n-gram 的权重,默认 1~4 gram 各 0.25
BP 简短惩罚(Brevity Penalty),防止模型「说太短」刷分

下面分开讲。


3. Modified n-gram Precision(修正 n-gram 精确率)

3.1 什么是 n-gram?

把句子切成连续片段:

句子: "I love you"
1-gram: I | love | you
2-gram: I love | love you
3-gram: I love you

中文没有空格时,可以按切(本仓库 metrics_lib.py 就是这样做的):

句子: "我爱你"
1-gram: 我 | 爱 | 你
2-gram: 我爱 | 爱你
3-gram: 我爱你

3.2 「修正」在哪里?

普通精确率:候选译文里某个 n-gram 出现几次,就算几次命中。

修正版:每个 n-gram 的命中次数 不能超过 它在参考译文里出现的次数。

例子

  • 参考:the the the the the
  • 候选:the the the the

普通算法:候选里 4 个 the 都算命中 → 精确率 100%(不合理)

修正算法:参考里 the 最多计 5 次,候选 4 个 the 全部有效 → 4/4

若候选是 the the the the the the(6 个 the),只有 5 个能计分 → 5/6

这样可以防止模型通过重复高频词「刷分」。

3.3 多阶 n-gram 的几何平均

BLEU 默认同时看 1-gram、2-gram、3-gram、4-gram,各权重 0.25,再取几何平均:

BLEU_core = (p₁ × p₂ × p₃ × p₄) ^ 0.25

直觉:

  • 1-gram 高 → 用词和参考像
  • 4-gram 高 → 短语、语序也和参考像
  • 任一阶为 0 → 几何平均整体被拉很低(短句上这是 BLEU infamous 的痛点)

4. Brevity Penalty(简短惩罚)

若候选译文 比参考译文短很多,即使每个词都「命中」,也可能是漏译。BLEU 用 BP 惩罚过短输出:

若 len(候选) >= len(参考):
    BP = 1
否则:
    BP = exp(1 - len(参考) / len(候选))

候选越短,BP 越接近 0,总分被压低。


5. 手算一个迷你例子

参考译文cat sat on mat(4 词)

候选译文cat cat on mat(4 词)

候选 n-gram 总数 命中数(修正后) pₙ
1 4 4(cat 计 1 次) 4/4 = 1.0
2 3 2(on mat 命中,cat cat 无效重复) 2/3 ≈ 0.67
3 2 1(cat on mat 不连续匹配) 1/2 = 0.5
4 1 0 0/1 = 0

4-gram 为 0 时,若无平滑,几何平均直接为 0。NLTK 默认加 平滑(smoothing),避免短句一律得 0 分——但短句分数仍往往偏低。


6. 本仓库里的实现

# src/L3_EvalHarness/common/metrics_lib.py
def compute_bleu(candidate: str, reference: str) -> float:
    from nltk.translate.bleu_score import SmoothingFunction, sentence_bleu

    ref = [list(reference)]   # 参考:按字符列表
    hyp = list(candidate)     # 候选:按字符列表
    return float(
        sentence_bleu(ref, hyp, smoothing_function=SmoothingFunction().method1)
    )

要点:

  1. 中文按字切分,不是按词(没有分词器时的常见做法)
  2. 使用 NLTK sentence_bleu,默认 1~4 gram、等权重
  3. SmoothingFunction().method1 缓解短句 4-gram 为 0 的问题
  4. 失败时回退为 EM 的 0/1

相关 demo:

  • demo24:离线对比 EM / BLEU / ROUGE-L
  • demo42:调 API 跑翻译 A/B prompt,汇总 EM + BLEU 均值

7. 为什么 demo42 里 BLEU 只有 0.38,EM 却有 0.8?

这是初学者最容易困惑的地方,并不代表「翻译只有 38 分质量」。

7.1 短句 + 4-gram 的天花板

mini_translate.jsonl 里大多是 2~3 个汉字:

参考 模型(完全正确) EM BLEU(实测)
我爱你 我爱你 1 ~0.56
谢谢 谢谢 1 ~0.32

即使 一字不差,3 字句也凑不满 4-gram,几何平均后分数很难接近 1.0。这是算法特性,不是模型差。

7.2 EM 归一化,BLEU 不归一化

def exact_match(pred, expected):
    return normalize(pred) == normalize(expected)  # 去标点、统一大小写等
参考 模型 EM BLEU
你好吗 你好吗? ✅ 对 ~0.40(多了一个字)

EM 去掉标点后算对;BLEU 逐字比较,标点也算差异。

7.3 错题与啰嗦输出

demo42 某次运行:

expected Prompt A EM BLEU
t5 回头见 再见 ~0.09
t5 回头见 (一大段 Markdown 解释) ~0.007

语义接近的「再见」EM 错、BLEU 低;冗长解释几乎不得分。

结论:在本 demo 的设定下,EM 更适合当硬指标选 winner;BLEU 适合看「和参考的重叠程度」,但 短中文句上的绝对值不能和论文里英译法的长句 BLEU 直接比


8. BLEU 与 EM、ROUGE-L 怎么选?

flowchart LR subgraph 任务 QA[短答案 QA] TR[翻译 / 摘要] end subgraph 指标 EM[Exact Match] BLEU[BLEU] ROUGE[ROUGE-L] end QA --> EM TR --> BLEU TR --> ROUGE

指标 比较方式 优点 缺点
EM 归一化后完全一致 简单、可解释 翻译同义改写全错
BLEU n-gram 重叠 + 短句惩罚 业界标准、可部分给分 短句偏低、单参考、不看语义
ROUGE-L 最长公共子序列 F1 对语序/片段匹配更稳 仍不理解语义

本仓库 compute_rouge_l 对中文按算 LCS,避免英文分词工具把整句当一个词导致 ROUGE=0。

更进一步的方案:多参考译文 BLEUCOMET/BERTScore 等语义指标LLM-as-Judge——适合产品级评测,超出 mini harness 范围。


9. BLEU 的已知局限(读论文和踩坑都要知道)

  1. 单参考偏见:只和一条标准答案比,同义表达吃亏(「多谢」vs「谢谢」)
  2. 长度敏感:短句 4-gram 天然吃亏;长句又可能被「流畅但胡编」骗过
  3. 不看语义:「我爱你」vs「你爱我」字重叠高但意思不同
  4. 与人工评测相关但非线性:BLEU 涨 5 点不一定等于人觉得好 5 分
  5. 语言与分词:中文按字、英文按词,跨语言 BLEU 不可直接比

10. 一句话总结

BLEU = 你的译文和参考译文在 1~4 gram 上重叠多少,再惩罚说得太短;分数越高越像参考,但不等于语义一定对。

在 L3 Harness 里:

  • 学原理 → 跑 demo24
  • 看真实 API + Prompt A/B → 跑 demo42
  • 看到 EM 0.8、BLEU 0.38 → 先想短句效应和标点,别急着怀疑模型

参考资料

  • Papineni, K., et al. (2002). BLEU: a Method for Automatic Evaluation of Machine Translation. ACL.
  • NLTK sentence_bleu 文档