尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

[基于OpenEvals的自动化评估-03]两种针对语义相似度的评估方式

[基于OpenEvals的自动化评估-03]两种针对语义相似度的评估方式 本文介绍两种常用的文本相似度验证方式一种是基于Levenshtein距离的相似度评估它通过计算把一个字符串转成另一个字符串所需的最少编辑操作数拉来衡量两个字符串相似度完全不需要LLM的加持。另一个是我们常用了基于嵌入向量的相似度介绍通将文本转换成嵌入向量然后通过计算两个向量之间的夹角余弦值或者点积的方式衡量语义相似度。1. 基于Levenshtein距离的评估Levenshtein距离编辑距离是一种衡量两个字符串相似度的经典算法它计算把字符串A转成字符串B所需的最少编辑操作数。允许的编辑操作只有三种插入插入一个字符删除删除一个字符替换把一个字符改成另一个字符编辑次数越少两个字符串越相似编辑次数越多差异越大。例如“kitten” → sitting只需经过如下三次操作k→s替换e→i替换插入g所以它们之间的Levenshtein距离为3。Levenshtein距离广泛用于文本相似度比较、拼写纠错、OCR错误检测和评估模型输出与参考答案的接近程度。OpenEvals返回的是数值范围在[0-1]之间的归一化距离具体的评估计分算法实现在如下这个_scorer函数中。由于没有对作为待评估输出outputs参数和评估基准reference_outputs的数据类型作任何约束所以需要对它们进行基于JSON的序列化处理。def_scorer(outputs:Any,reference_outputs:Any)-float:ifoutputsisNoneorreference_outputsisNone:raiseValueError(Levenshtein distance requires both outputs and reference_outputs)ifnotisinstance(outputs,str):outputsjson.dumps(outputs)ifnotisinstance(reference_outputs,str):reference_outputsjson.dumps(reference_outputs)# Create a matrix of size (m1)x(n1) where m and n are the string lengthsm,nlen(outputs),len(reference_outputs)dp[[0]*(n1)for_inrange(m1)]# Initialize first row and columnforiinrange(m1):dp[i][0]iforjinrange(n1):dp[0][j]j# Fill the matrixforiinrange(1,m1):forjinrange(1,n1):ifoutputs[i-1]reference_outputs[j-1]:dp[i][j]dp[i-1][j-1]else:dp[i][j]min(dp[i-1][j]1,# deletiondp[i][j-1]1,# insertiondp[i-1][j-1]1,# substitution)# Calculate the distance and normalize it to a score between 0 and 1distancedp[m][n]max_lengthmax(m,n)score1.0-(distance/max_length)ifmax_length0else1.0returnscore基于Levenshtein距离的评估可以通过调用如下两个函数来完成levenshtein_distance用于同步调用levenshtein_distance_async用于异步调用。deflevenshtein_distance(*,outputs:Any,reference_outputs:Any,**kwargs:Any)-EvaluatorResult:asyncdeflevenshtein_distance_async(*,outputs:Any,reference_outputs:Any,**kwargs:Any)-EvaluatorResult:在如下的演示程序中我们调用levenshtein_distance_async函数评估指定的字符串tee和too与基准字符串tea之间相似度。很明显两个待评估的字符串与基准字符串之间的Levenshtein距离分别是1和2并且它们的长度相同所以针对前者的评估得分是后者的两倍。fromopenevals.stringimportlevenshtein_distance_asyncimportasyncio,jsonasyncdefeval():resultawaitlevenshtein_distance_async(outputstee,reference_outputstea)print(json.dumps(result,ensure_asciiFalse,indent2))resultawaitlevenshtein_distance_async(outputstoo,reference_outputstea)print(json.dumps(result,ensure_asciiFalse,indent2))asyncio.run(eval())输出{key:levenshtein_distance,score:0.6666666666666667,comment:null,metadata:null}{key:levenshtein_distance,score:0.33333333333333337,comment:null,metadata:null}2. 基于向量距离的利用模型将指定的文本转换成具有相同维度的嵌入向量后可以通过计算两个嵌入向量的相似度来确定语义的相似度对于的评估器SimpleAsyncEvaluator对象可以通过如下所示的create_embedding_similarity_evaluator和create_async_embedding_similarity_evaluator来创建。defcreate_embedding_similarity_evaluator(*,model:stropenai:text-embedding-3-small,algorithm:strcosine)-SimpleEvaluatordefcreate_async_embedding_similarity_evaluator(*,model:stropenai:text-embedding-3-small,algorithm:strcosine)-SimpleAsyncEvaluator两个函数具有相同的参数列表model参数表示采用的嵌入模型名称algorithm则相似度指标的算法。如果使用v1和v2代表输入的两个嵌入向量两种算法计算公式如下cosine余弦相似度计算v1和v2夹角的余弦cosine(v1,v2)v1⋅v2∥v1∥ ∥v2∥ \text{cosine}(v_1, v_2) \frac{v_1 \cdot v_2}{\|v_1\| \, \|v_2\|}cosine(v1​,v2​)∥v1​∥∥v2​∥v1​⋅v2​​dot-product(点积)v1⋅v2∑i1nv1iv2i v_1 \cdot v_2 \sum_{i1}^{n} v_{1i} v_{2i}v1​⋅v2​i1∑n​v1i​v2i​在如下的演示程序中我定义了eval函数针对指定的算法计算两句包含类似文字但是具有完全不同语义的句子与同一个作为基准的句子之间的相似度。importasyncio,jsonfromdotenvimportload_dotenvfromopenevals.stringimportcreate_async_embedding_similarity_evaluator load_dotenv()asyncdefeval(algorithm:str):outputs1三伏天布偶猫小A喜欢将肚子贴在地板砖上睡觉outputs2盛夏时节小A喜欢蹲在地板砖上玩弄她的布偶玩具reference炎炎夏日布偶猫小A喜欢整个肚子贴在地板砖上打盹evaluatorcreate_async_embedding_similarity_evaluator(modelazure_openai:text-embedding-3-small,algorithmalgorithm)resultawaitevaluator(outputsoutputs1,reference_outputsreference)print(json.dumps(result,ensure_asciiFalse,indent2))resultawaitevaluator(outputsoutputs2,reference_outputsreference)print(json.dumps(result,ensure_asciiFalse,indent2))asyncdefmain():awaiteval(cosine)awaiteval(dot_product)asyncio.run(main())我们分别指定两种不同的算法调用eval函数并得到如下的评估结果总体来说符合预期:outputs1比outputs2在语义上与基准文本更接近。cosine{key:embedding_similarity,score:0.81,comment:null,metadata:null}{key:embedding_similarity,score:0.70,comment:null,metadata:null}dot_product{key:embedding_similarity,score:0.81,comment:null,metadata:null}{key:embedding_similarity,score:0.70,comment:null,metadata:null}
返回列表