三种文本相似计算方法:规则、向量与大模型裁判
文本相似计算
项目背景
目前有众多工作需要评估字符串之间的相似(相关)程度:
比如,RAG 智能问答系统文本召回阶段需要计算用户文本与文本库内文本的相似分数,返回前TopK个候选文本。
在评估大模型生成的文本阶段,也需要评估大模型生成的文本与最终结果的相似或者相关程度。
做信息检索与评估生成式LLM效果的时候,都需要使用到文本相似度算法。掌握文本的相似度算法,有众多应用场景与实用性。
介绍
比如,要评估大模型生成的结果,与预设定的答案之间的相似程度。
本文介绍三类方法用于评估两个字符串的相似程度:规则、向量、大模型裁判。
- 规则:基于字符 n-gram 的相似计算,常用算法,ROUGE、BLEU;
- 向量:使用热门的嵌入模型(Jina),把字符串编码为向量,计算两个向量之间的相似度;
- 大模型裁判:使用大模型评估两个字符串之间的相关性;
介绍了三种方法,评估两个字符串之间的相似度:基于字符 n-gram 的规则算法(如 ROUGE、BLEU),通过嵌入模型将文本编码为向量并计算余弦相似度,以及使用大模型直接评判文本相关性。文章详细探讨了这些方法的实现细节及适用场景,并提供了 Python 示例代码,帮助读者理解和应用不同的方法来满足具体需求。
规则
Find a metric on the Hub
本篇文章主要关注 Metric 方面的评估
Metric: measures the performance of a model on a given dataset, usually by comparing the model’s predictions to some ground truth labels – these are covered in this space.
装包,主要依赖 nltk 这个包:
pip install transformers evaluate
众多的自然语言处理评估方法会发布在 evaluate 这个包上。
google_bleu 网页,若想浏览更多的例子请点击查看,https://huggingface.co/spaces/evaluate-metric/google_bleu

从 evaluate 加载工具的时候,需要科 学 上 网,解决方案如下:
-
梯 子 开启全局代理;
-
import os os.environ['HTTP_PROXY'] = 'http://127.0.0.1:7890' os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'
import evaluate
google_bleu = evaluate.load("google_bleu")sentence1 = "the cat sat on the mat"
sentence2 = "the cat ate the mat"
result1 = google_bleu.compute(predictions=[sentence1], references=[[sentence2]])
print(result1)
# result1 {'google_bleu': 0.3333333333333333}result2 = google_bleu.compute(predictions=[sentence1], references=[[sentence1]])
print(result2)
# result2 {'google_bleu': 1.0}
【注意】:references 是一个嵌套的二维列表。
references 设计为二维列表的原因是,针对同一个问题,可能有多个回答,最终的结果是返回与多个结果计算google_bleu的最大值。
predictions = ["The cat is on the mat."]
references = [["The cat is on the mat.", "There is a cat on the mat."]]
print(google_bleu.compute(predictions=predictions, references=references))
>>> {'google_bleu': 1.0}
下述是中文的例子:
google_bleu.compute(predictions=["我爱你"], references=[["我爱我的祖国"]]
)
# >>> {'google_bleu': 0.0}
上述 我爱你 和 我爱我的祖国
如上述所示,google_bleu 不会原生支持汉字,原因在于英文可直接按照空格拆分开,但是汉语之间没有空格。
比如, [“我爱我的祖国”] 可拆分为:
- [“我 爱 我 的 祖 国”] ,
- [“我 爱 我 的 祖国”] , 祖国中间没有空格分开
显然 祖国 作为一个词更好,若拆分为 祖和国 两个字则会丢失原来的语义信息。
google_bleu.compute(predictions=["我 爱 你"], references=[["我 爱 我 的 祖 国"]]
)
# >>> {'google_bleu': 0.16666666666666666}
google_bleu.compute(predictions=["我 爱 你"], references=[["我 爱 我 的 祖国"]]
)
# >>> {'google_bleu': 0.21428571428571427}
使用合适的中文分词技术,可提高 google_bleu 分数。如上所示,祖国 变成一个词后,google_bleu 从0.16 提高到 0.21。
如果想尝试中文分词技术,可尝试使用pip install jieba,支持添加新词到字典中。
向量
使用经过训练的嵌入模型,把文本编码为向量,再计算两个向量的余弦相似度。
浏览 jina-embeddings-v2-base-zh 的介绍, https://modelscope.cn/models/jinaai/jina-embeddings-v2-base-zh
下述是一个简单的例子:
!pip install modelscope
from modelscope import AutoModel
from numpy.linalg import normcos_sim = lambda a,b: (a @ b.T) / (norm(a)*norm(b))
# trust_remote_code is needed to use the encode method
model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)
embeddings = model.encode(['How is the weather today?', '今天天气怎么样?'])
print(cos_sim(embeddings[0], embeddings[1]))
import numpy as np
from numpy.linalg import norm
from modelscope import AutoModel# 定义余弦相似度计算函数
cos_sim = lambda a, b: (a @ b.T) / (norm(a) * norm(b))# 加载模型
model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)# 输入字符串和候选字符串
input_string = 'How is the weather today?'
candidates = ['今天天气怎么样?', '我今天很高兴', '天气预报说今天会下雨', '你最喜欢的颜色是什么?']# 计算输入字符串的嵌入向量
input_embedding = model.encode([input_string])[0]# 计算候选字符串的嵌入向量
candidate_embeddings = model.encode(candidates)# 计算相似度并排序
similarities = [cos_sim(input_embedding, candidate_embedding) for candidate_embedding in candidate_embeddings]
sorted_candidates = sorted(zip(candidates, similarities), key=lambda x: x[1], reverse=True)# 输出排序结果
for candidate, similarity in sorted_candidates:print(f"({input_string} - {candidate}), Similarity: {similarity:.4f}")
上面代码展示了,计算 input_string 与 candidates 候选字符串之间的向量余弦相似度分数,按照从高到低排序:
Downloading Model to directory: C:\Users\user_name\.cache\modelscope\hub\jinaai/jina-embeddings-v2-base-zh
(How is the weather today? - 今天天气怎么样?), Similarity: 0.7861
(How is the weather today? - 天气预报说今天会下雨), Similarity: 0.5470
(How is the weather today? - 我今天很高兴), Similarity: 0.4202
(How is the weather today? - 你最喜欢的颜色是什么?), Similarity: 0.1032
大模型裁判
制定一个基于规则的程序来评估输出是非常具有挑战性的。传统的评估指标,基于输出和参考答案之间的相似性(例如,ROUGE、BLEU;),对于这些问题也无效。[1] 在复杂场景下,可尝试使用大模型进行判决。
主要针对复杂的场景,在基于规则与向量相似度均效果不显著的情况下,可尝试使用LLM进行判决。
提示词参考:
JUDGE_PROMPT = """
You will be given a user_question and system_answer couple.
Your task is to provide a 'total rating' scoring how well the system_answer answers the user concerns expressed in the user_question.
Give your answer as a float on a scale of 0 to 10, where 0 means that the system_answer is not helpful at all, and 10 means that the answer completely and helpfully addresses the question.Provide your feedback as follows:Feedback:::
Total rating: (your rating, as a float between 0 and 10)Now here are the question and answer.Question: {question}
Answer: {answer}Feedback:::
Total rating: """
参考资料
- 使用 LLM 作为评判者🧑⚖️进行自动化和多方面的评估
- https://github.com/huggingface/evaluate
相关文章:
三种文本相似计算方法:规则、向量与大模型裁判
文本相似计算 项目背景 目前有众多工作需要评估字符串之间的相似(相关)程度: 比如,RAG 智能问答系统文本召回阶段需要计算用户文本与文本库内文本的相似分数,返回前TopK个候选文本。 在评估大模型生成的文本阶段,也需要评估…...
Python语言的计算机基础
Python语言的计算机基础 绪论 在当今信息技术飞速发展的时代,编程已经成为了一种必备技能。Python凭借其简洁、易读和强大的功能,逐渐成为初学者学习编程的首选语言。本文将以Python语言为基础,探讨计算机科学的基本概念,并帮助…...
Dify应用-工作流
目录 DIFY 工作流参考 DIFY 工作流 2025-1-15 老规矩感谢参考文章的作者,避免走弯路。 2025-1-15 方便容易上手 在dify的一个桌面上,添加多个节点来完成一个任务。 每个工作流必须有一个开始和结束节点。 节点之间用线连接即可。 每个节点可以有输入和输出 输出类型有,字符串,…...
02.02、返回倒数第 k 个节点
02.02、[简单] 返回倒数第 k 个节点 1、题目描述 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 2、题解思路 本题的关键在于使用双指针法,通过两个指针(fast 和 slow),让 fast 指针比 slow 指针…...
Linux手写FrameBuffer任意引脚驱动spi屏幕
一、硬件设备 开发板:香橙派 5Plus,cpu:RK3588,带有 40pin 外接引脚。 屏幕:SPI 协议 0.96 寸 OLED。 二、需求 主要是想给板子增加一个可视化的监视器,并且主页面可调。 平时跑个模型或者服务,…...
怎么修复损坏的U盘?而且不用格式化的方式!
当你插入U盘时,若电脑弹出“需要格式化才能使用”提示,且无法打开或读取其中的数据,说明U盘极有可能已经损坏。除此之外,若电脑在连接U盘后显示以下信息,也可能意味着U盘出现问题,需要修复损坏的U盘&#x…...
语音技术在播客领域的应用(2)
播客是以语音为主,各种基于AI 的语音技术在播客领域十分重要。 语音转文本 Whisper Whisper 是OpenAI 推出的开源语音辨识工具,可以把音档转成文字,支援超过50 种语言。这款工具是基于68 万小时的训练资料,其中包含11.7 万小时的…...
【Linux】应用层自定义协议与序列化
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 应用层 🦋 再谈 "协议"🦋 网络版计算器🦋 序列化 和 反序列化 二:🔥 重新理解 read、…...
深度学习中的张量 - 使用PyTorch进行广播和元素级操作
深度学习中的张量 - 使用PyTorch进行广播和元素级操作 元素级是什么意思? 元素级操作在神经网络编程中与张量的使用非常常见。让我们从一个元素级操作的定义开始这次讨论。 一个_元素级_操作是在两个张量之间进行的操作,它作用于各自张量中的相应元素…...
gitignore忽略已经提交过的
已经在.gitignore文件中添加了过滤规则来忽略bin和obj等文件夹,但这些文件夹仍然出现在提交中,可能是因为这些文件夹在添加.gitignore规则之前已经被提交到Git仓库中了。要解决这个问题,您需要从Git的索引中移除这些文件夹,并确保…...
h5使用video播放时关掉vant弹窗视频声音还在后台播放
现象: 1、点击遮罩弹窗关闭,弹窗的视频已经用v-if销毁,但是后台会自己从头开始播放视频声音。但是此时已经没有视频dom 2、定时器在打开弹窗后3秒自动关闭弹窗,则正常没有问题。 原来的代码: //页面 <a click&quo…...
Widows搭建sqli-labs
使用ms17_010渗透win7 ms17_010针对windows445端口(共享文件), 现有一台win7虚拟机IP 192.168.80.129, 开放445端口, 使用msf渗透该虚拟机 auxiliary 使用auxiliary判断目标主机是否适用smb17_010漏洞 这里发现80网段, 有一台主机适用 exploit 使用search ms17_010 type:expl…...
为AI聊天工具添加一个知识系统 之46 蒙板程序设计(第一版):Facet六边形【意识形态:操纵】
本文要点 要点 (原先标题冒号后只有 “Facet”后改为“Face六边形【意识形态】” ,是 事后想到的,本文并未明确提出。备忘在这里作为后续的“后期制作”的备忘) 前面讨论的(“之41 纯粹的思维”)中 说到,“意识”三…...
ASP.NET Core WebApi接口IP限流实践技术指南
在当今的Web开发中,接口的安全性和稳定性至关重要。面对恶意请求或频繁访问,我们需要采取有效的措施来保护我们的WebApi接口。IP限流是一种常见的技术手段,通过对来自同一IP地址的请求进行频率控制,可以有效地防止恶意攻击和过度消…...
文件移动工具 (File Mover)
这是一个简单但功能强大的Python脚本,用于递归遍历目录并将指定格式的文件移动到目标目录。默认支持移动PDF文件,但也可以通过参数指定其他文件格式。 功能特点 递归遍历源目录及其所有子目录支持移动任意指定格式的文件自动处理目标目录中的文件重名情…...
PTA L1-039 古风排版
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串&a…...
Docker 镜像加速的配置
解决拉取镜像报错:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while 在使用 Docker 过程中,拉取镜像的速度常常会受到网络状况的影响,尤其是在国内网络环境下,…...
简历_使用优化的Redis自增ID策略生成分布式环境下全局唯一ID,用于用户上传数据的命名以及多种ID的生成
系列博客目录 文章目录 系列博客目录WhyRedis自增ID策略 Why 我们需要设置全局唯一ID。原因:当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题。 问题:id的规律性太明显、…...
PHP的HMAC_SHA1和HMAC_MD5算法方法
很多做对接的小伙伴们都会遇到签名加密的问题,常用的就是hmac_sha1加密和hmac_md5加密,最开始用的是sha1加密,后来用到了md5加密,我以为直接把sha1改为md5就好了,结果试来试去跟文档提示的示例结果都对不上,…...
二进制/源码编译安装mysql 8.0
二进制方式: 1.下载或上传安装包至设备: 2.创建组与用户: [rootopenEuler-1 ~]# groupadd mysql [rootopenEuler-1 ~]# useradd -r -g mysql -s /bin/false mysql 3.解压安装包: tar xf mysql-8.0.36-linux-glibc2.12-x86_64.ta…...
告别沉浸式白屏!UniApp中iOS/Android底部安全区与顶部状态栏颜色自定义全攻略
告别沉浸式白屏!UniApp中iOS/Android底部安全区与顶部状态栏颜色自定义全攻略当开发者尝试在UniApp中实现沉浸式设计时,往往会遇到一个令人头疼的问题——默认的白色安全区和状态栏导致界面元素(如电池图标、信号强度)几乎不可见。…...
别再乱算相似度了!用Python实战二元变量聚类:从Jaccard系数到病人分组
医疗数据分析实战:用Python实现基于Jaccard系数的病人症状聚类在医疗数据分析领域,如何从海量病人症状数据中发现潜在规律一直是临床研究的难点。传统方法往往依赖医生经验或简单统计,而现代数据挖掘技术为我们提供了更科学的解决方案。本文将…...
论文创新点像挤牙膏?导师强推这几个AI论文平台
想写论文又快又好,关键是用对 AI 工具、走对流程——资深教授普遍推荐:千笔AI(中文全流程首选) 豆包学术版(轻量高效) DeepSeek 学术版(理工 / 长文本) Grammarly Academicÿ…...
GitLab External Wiki代理权限绕过漏洞深度解析
1. 这个漏洞不是“修个补丁”就能完事的——它暴露的是 GitLab 权限模型里一个被长期忽视的逻辑断层GitLab 安全漏洞 CVE-2025-2614,光看编号容易误以为是又一个常规的越权或 XSS 类型漏洞。但我在实际复现和审计过程中发现,它根本不是配置疏漏或代码拼写…...
钱钟书《围城》第1-5章阅读笔记:一场关于人生困境的提前预演
前言 钱钟书先生的《围城》被誉为"新儒林外史",是中国现代文学史上风格独特的讽刺经典。这部创作于20世纪40年代的长篇小说,以抗战初期为背景,通过主人公方鸿渐的人生轨迹,深刻揭示了知识分子群体的精神困境与人性弱点。…...
Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)
Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)在游戏开发中,我们经常会遇到这样的场景:玩家拾取金币后,需要更新UI、播放音效、解锁成就、保存数据……如果把这些逻辑全部写在金币拾取的代…...
武汉国电华美16875kVA串联谐振试验装置,这手活儿细
在超高压变电站和长距离电缆的现场,交流耐压试验是检验设备绝缘的“最后一关”。这位老师傅经手过不少大工程,他说,面对GIS、大型变压器这些“大块头”电容性试品,能不能顺利“过关”,往往就看串联谐振装置顶不顶得住。…...
如何快速掌握Avidemux:新手完整入门指南与5个核心技巧
如何快速掌握Avidemux:新手完整入门指南与5个核心技巧 【免费下载链接】avidemux2 Avidemux2, simple video editor 项目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 Avidemux是一款功能强大且完全开源的专业视频编辑工具,专为快速剪辑、…...
艾尔登法环存档迁移终极指南:3分钟解决角色转移难题
艾尔登法环存档迁移终极指南:3分钟解决角色转移难题 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档版本不兼容而烦恼吗?EldenRingSaveCopier 是你的终极解决…...
OpenIPC开源固件:5分钟解锁网络摄像头的终极控制权
OpenIPC开源固件:5分钟解锁网络摄像头的终极控制权 【免费下载链接】firmware Alternative IP Camera firmware from an open community 项目地址: https://gitcode.com/gh_mirrors/fir/firmware 还在为网络摄像头的封闭系统而烦恼吗?想要完全掌控…...
