三种文本相似计算方法:规则、向量与大模型裁判

文本相似计算

项目背景

目前有众多工作需要评估字符串之间的相似(相关)程度:
 比如,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 norm

cos_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: """

参考资料

  1. 使用 LLM 作为评判者🧑‍⚖️进行自动化和多方面的评估
  2. https://github.com/huggingface/evaluate

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐,但如何将其转换为易于分享和打印的 PDF 格式,是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法,并探讨…

浅谈云计算21 | Docker容器技术

Docker容器技术 一、 容器技术特性1.1 轻量级特性1.2 隔离性特性 二、容器镜像2.1 容器镜像概述2.1.1 定义与构成2.1.2 分层结构 2.2 联合文件系统2.3 容器镜像的构建与管理2.3.1 容器镜像的构建2.3.2 **构建镜像流程**2.3.3 **应用场景**2.3.4 镜像仓库的应用 2.4 容器镜像的优…

LabVIEW实现油浸式变压器自主监测与实时报告

油浸式变压器广泛应用于电力系统中,尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行,及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查,但这不能及时发现潜在的故障隐患,且效率较低。随…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等,同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点,随时封禁不会封禁价格每月140元订阅费用每年70元…

SpringBoot:RestTemplate与IllegalArgumentException

问题描述 在SpringBoot应用中,有时会遇到使用RestTemplate调用第三方服务的场景。例如:在进行地名数据采集时,为了拿到地名对应的经纬度位置,通常会有地理编码的步骤,此时就可能涉及到调用第三方接口服务实现此需求。 …

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础,提供集中日志记录和分析,以及端到端可见性。因此,分析师可以更有效地管理安全状态,将安全流程自动化,并快速响应威胁。具有分析和自动化功能的集成…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} , HTML中想要保留 \n的换行效果的有下面3种方法: 1、style 中 设置 white-space: pre-lin…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…

基于预共享密钥的IPsec实验

一、实验目的 (1)了解IPsec的原理和协议运行机制; (2)掌握IPsec身份认证的预共享密钥的配置; (3)掌握用Wireshark工具抓包分析IPsec数据包格式和协议流程。 二、实验设备与环境 &…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成&#xff08;F1&#xff09; FLASH读写过程&#xff08;F1&#xff09; 闪存的读取 闪存的写入 内部FLASH构成&#xff08;F4 / F7 / H7&#xff09; FLASH读写过程&#xff08;F4 / F7 / H7&#xff09; 闪存的读取 闪存的写入 …

Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量

随着工业4.0时代的到来&#xff0c;自动化和智能化成为制造业的趋势。机器人作为实现这一趋势的重要工具&#xff0c;其性能和智能水平直接影响到生产效率和产品质量。然而&#xff0c;传统的机器人系统在应对复杂任务时往往缺乏足够的灵活性和适应性。为了解决这一问题&#x…

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…

电子画册制作平台哪个好?

​作为一个热爱分享的人&#xff0c;我试过了好几个平台&#xff0c;终于找到了几款比较好用得电子杂志制作平台&#xff0c;都是操作界面很简洁&#xff0c;上手非常快的工具。 FLBOOK:这是一款在线制作H5电子画册软件&#xff0c;提供了各种类型的模板&#xff0c;可支持添加…

如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?

Google Cloud Shell 是一个基于浏览器的命令行界面&#xff0c;它提供了一个临时的虚拟机环境&#xff0c;允许开发者在没有本地环境配置的情况下使用 Google Cloud 的各种服务。它还提供了一个免费的 5GB 存储空间以及可以在其中执行所有 Google Cloud 操作的命令行界面。 Vis…

anaconda安装和环境配置

文章目录 一、Anaconda下载1.从官网直接下载&#xff1a;2.从镜像站中下载&#xff1a; 二、Anaconda安装三、检测是否有Anaconda配置anaconda环境 四、 Anaconda创建多个python环境&#xff08;方便管理项目环境&#xff09;1.查看conda有哪些环境2.创建python3.6的环境3.激活…

CF 641A.Little Artem and Grasshopper(Java实现)

题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度&#xff0c;试问是否能够跳出这个长度&#xff08;即落点位置在0或n1&#xff09; 思路分析 输入n就有n个房间&#xff0c;n套规则&#xff08;固定方向和跳跃距离&#xff09;&#xff0c;蚂蚱到哪个房间就…

css 实现自定义虚线

需求&#xff1a; ui 画的图是虚线&#xff0c;但是虚线很宽正常的border 参数无法做到 进程&#xff1a; 尝试使用 border&#xff1a;1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单&#xff0c;让ui 画一个图然…

Bottleneck层模型介绍

瓶颈设计的思想是引入一个瓶颈层&#xff0c;它由一系列不同大小的滤波器组成&#xff0c;通常是1x1、3x3和1x1的卷积层序列&#xff1a;第一个1x1卷积层&#xff1a;用于减少通道数&#xff0c;即降维&#xff0c;从而降低计算复杂度。 3x3卷积层&#xff1a;用于提取空间特征…

软件测试—接口测试面试题及jmeter面试题

一&#xff0c;接口面试题 1.接口的作用 实现前后端的交互&#xff0c;实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑关系 3.接口测试必要性 1.可以发现很…