浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

713次阅读
没有评论

今天是2023年12月18日,星期一,北京,天气晴。

本文主要介绍两个事情,一个是时间线自动生成的一个工具mylens以及代码评测的一些数据集和评测指标,这些对于增强我们对评估的认知都很有帮助,毕竟评估是算法优化的灯塔。

其中涉及到的一些算法思路、数据构造以及评估指标的执行逻辑,都很有趣,对于增强我们对原理性的理解很有帮助,供大家一起思考,进一步完胜对评估的认知。

一、有趣的时间线自动生成项目

自动生成时间线的工具:https://mylens.ai/,其思想在于:输入一个检索的事件短语,系统自动根据该事件生成时间序列数据,然后用可视化组件。

例如,我们额以russia-ukrain war”为检索词进行输入。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

该项目自动生成一个以“Key Events in the Russia-Ukraine War”为标题的时间线。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

我们可以猜测其实现方式,我们可以构造prompt,让chatgpt生成对应的时间线。例如:

prompt如下:

please show me the timeline of russia-ukraine war, in the form of date:event name order by date

chatgpt回复如下:

Certainly! Here's a timeline of significant events in the Russia-Ukraine conflict:

1. **2014**
   – **February 20-22:** Protests escalate in Ukraine leading to the ousting of President Yanukovych.
   – **February 27:** Russian troops, without insignia, occupy Crimea.
   – **March 16:** Crimea holds a controversial referendum and votes to join Russia.

2. **2014-2015**
   – **April 6:** Pro-Russian separatists seize government buildings in Donetsk and Luhansk, declaring independence.
   – **July 17:** Malaysia Airlines Flight MH17 is shot down over eastern Ukraine, killing all 298 people on board.
   – **September 5:** Minsk Protocol signed, establishing a ceasefire and a roadmap for peace.

3. **2016-2017**
   – **February 12:** Minsk II agreement signed, aimed at implementing a ceasefire.
   – **2017:** Fighting continues in eastern Ukraine despite ceasefire agreements.

4. **2018**
   – **March 4:** Sergei Skripal, a former Russian spy, and his daughter are poisoned in the UK, leading to diplomatic tensions.
   – **November 25:** Russian forces seize three Ukrainian naval vessels near the Kerch Strait.

5. **2019**
   – **April 21:** Comedian Volodymyr Zelensky wins the Ukrainian presidential election.
   – **June:** Zelensky and Putin hold talks in Paris, aiming to restart peace efforts.

6. **2020**
   – **January:** Ukraine and separatists exchange prisoners, a step towards implementing the Minsk agreements.
   – **July 27:** Russia announces mass troop movements near Ukraine’s border, sparking concerns.

7. **2021**
   – **April:** Russia begins military buildup near Ukraine‘s border.
   – **July:** Belarusian authorities allegedly orchestrate a plane diversion to arrest an opposition journalist, causing international outrage.
   – **August-September:** Joint military exercises between NATO and Ukraine, raising tensions with Russia.

8. **2022**
   – **January:** Talks between Russia, Ukraine, France, and Germany (Normandy Format) aim to ease tensions but yield limited progress.
   – **February:** Russia recognizes Donetsk and Luhansk as independent regions, escalating tensions.
   – **April:** Renewed clashes occur in eastern Ukraine.
   – **October:** Russian forces launch a large-scale invasion of Ukraine.

9. **2023**
   – **Ongoing:** Intense fighting continues across Ukraine; international condemnation and sanctions increase against Russia.

This timeline outlines the key events in the ongoing conflict between Russia and Ukraine, which has seen periods of diplomatic efforts, ceasefires, and escalations in tensions and violence.

也就是说,我们可以直接让模型总结并生成时间线,然后进行解析即可,但这又会陷入到一个幻觉的问题,一个可尝试的方向,还会结合RAG,例如,百度搜索中有时间线的功能,这个在情报分析中也常用用到。

有一条可行的路线是,将待检索词,检索搜索引擎(只搜索资讯,固定前10页),并解析每个资讯的标题以及时间,按照时间:标题的格式对资讯进行排列,然后送入大模型进行总结,最终按照指定格式进行输出。浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

这些事件可以在https://events.baidu.com/search/vein?platform=pc&record_id=221001请求地址中找到对应的演化信息。

二、再看代码评估MBPP数据集

代码生成模型和自然语言模型一样,可以使用基于匹配的指标(如BLEU分数)进行评估。然而,这些指标无法捕捉代码的语法和语义特征。评估这些模型的更合适方法是功能正确性,即如果一个解决方案通过了某些单元测试,就可以认为它是正确的。

例如,已有的数据集如下:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

我们在周日的文章中讲了humaneval是如何评估的,接下来,我们再来看看另一个常用数据集MBPP,两者都是用单元测试。

MBPP(Mostly Basic Python Problems Dataset)旨在衡量LLM根据自然语言描述合成Python短程序的能力。最基本编程问题(MBPP)数据集包含974个编程任务,每个问题都包括任务描述、代码解决方案和3个用于检查功能正确性的自动测试用例。

该数据集在文章《Program Synthesis with Large Language Models》地址https://arxiv.org/pdf/2108.07732.pdf所提出,该工作提到引入了两个数据集来测试Python代码合成能力。第一个是名为”最基本编程问题”(MBPP)的新数据集,它包含974个简短的Python函数、程序的文本描述以及用于检查功能正确性的测试用例。

第二个数据集是一个Python合成数据集,包含23914个问题,是将MathQA数据集的一个子集的解改写成Python后产生的,称这个数据集为MathQA-Python。

这两个数据集涉及合成任务空间中的不同点:MBPP包含更多命令式控制流的用法,如循环和条件,而MathQA-Python包含更复杂的自然语言描述。

1、数据集

数据集样例如下所示:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

其中: text为编程题目、code为解题答案、test_list为自动测试用例。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

从每个自动测试用例来看,有写到关于输入以及期望输出的断言。

2、评估逻辑

在评估时候,通常采用fewshot的逻辑进行评测,fewshot如下:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

一般,从索引11到511的样本测试集进行评估,对每个问题使用pass@1,即每个问题只给模型一次求解机会,也可沿用类似于HumanEval的pass@k估算方法,为每个问题生成解决方案,以估算成功率(n_samples=15)。

三、再看代码评测数据集DS1000

而除此之外,还有其他评测数据集,例如DS-1000(DS-1000: A Natural and Reliable Benchmark for Data Science Code Generation,地址https://arxiv.org/pdf/2211.11501.pdf)。

DS-1000包含源自451个独特Stack-Overflow问题的1000个问题,为了防止可能出现的记忆问题,DS-1000有一半以上的问题是在原始StackOverflow问题的基础上修改而来的。其中包括152个表面扰动问题、235个语义扰动问题和162个高难度改写问题。

有趣的是,DS-1000横跨7个Python库(numpy, scipy, pandas, tensorflow, pytorch, sklearn, matplotlib).

1、数据集

地址https://github.com/xlang-ai/DS-1000/tree/main/ds1000_example中可以看到DS1000的数据,按照7个领域进行划分。

其数据集的构建策略很有趣,其先手动选择和修改StackOverflow问题->添加代码上下文->实施自动测试->扰乱原始问题(Codex可以通过记忆预训练语料库来回答问题,为了防作弊),最终进行测试。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

样例prompt如下:

Problem:
How do I get the dimensions of an array? For instance, this is (2, 2):
a = np.array([[1,2],[3,4]])

A:
<code>
import numpy as np
a = np.array([[1,2],[3,4]])
</code>
BEGIN SOLUTION
<code>
[insert]
</code>
END SOLUTION
<code>
print(result)
</code>

2、评估逻辑

整个的评估逻辑也很简单,线将问题描述promblem、代码上下文code Context作为prompt送入模型,模型进行预测,如下图所示:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

模型预测结果为:

Replace [insert] in the code context with following predicted code snippets
result = df.div(1).add_prefix("inv_")

将该代码进行替换,生成测试代码,然后使用多个测试用例进行单元测试。

当然,除了上述几个数据集,还有APPS(Automated Programming Progress Standard)是Dan Hendrycks等人在2021年提出的从Codeforces、Kattis等开放的编程网站收集的问题组成的数据集。问题难度从入门级到竞赛级不等,总共包含10000个编程问题,131777个测试用例,232421个人工处理的参考答案。

四、最后再看代码模型的几个指标

下面代码评测的几个指标进行总结,很形象,里面有对应的参考文献,引用到这里,供大家参考。

1、bleu(词相似)

bleu是一个衡量机器翻译的指标,基于生成的语句和目标语句在n-gram相似度来度量两者间的匹配程度,在代码生成领域用其衡量生成的代码与真实代码之间的token级的相似性。

其总体思想就是准确率,假如给定标准译文reference,神经网络生成的句子是candidate,句子长度为n,candidate中有m个单词出现在reference,m/n就是bleu的1-gram的计算公式。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

BLEU还有许多变种。根据n-gram可以划分成多种评价指标,常见的指标有BLEU-1、BLEU-2、BLEU-3、BLEU-4四种,其中n-gram指的是连续的单词个数为n。

BLEU-1衡量的是单词级别的准确性,更高阶的bleu可以衡量句子的流畅性。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

2、pass@k(功能正确性)

BLEU在捕捉代码特有的语义特征方面存在问题。

因此,Kulal等人(2019年)使用pass@k指标评估功能正确性,每个问题生成k个代码样本,如果任何样本通过单元测试,则认为问题已解决,并报告总分数。

是一次实验随机性太大,需要多次实验求平均值。pass@k需要对每一个测试问题重复实验t次,并且每次都生成k个代码,最后计算平均通过率。假如重复实验100次来估计pass@100,就需要生成 100*100=10000个代码,这样的计算量是难以接受的。而t越小,估计的pass@k就越不准(方差越大)。

因此,为了评估pass@k,该工作会为每个任务生成n≥k个样本(本文中使用n=200,k≤100),计算通过单元测试的正确样本c≤n的数量,并计算无偏估计值。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

其中,c是生成的n个代码中通过测试的数量。n越大估计越准确,但计算代价肯定远远小于t*k。

假设模型只能生成这n个代码,而且他们每一种被生成出来的概率是相等的,其中有c个可以通过测试。那么模型任意生成k个代码,全都不能通过测试的概率是:生成k个不能通过测试的代码的情况总和与生成k个代码的全部情况总和之比,即:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

根据大数定理,当样本总量趋近无穷大的时候,样本的平均值无限接近数学期望。因此只要求出其的均值,即得到了对pass@k的无偏估计。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

3、bluert(语义相似度)

bleurt来自于《BLEURT: a Transfer Learning-Based Metric for Natural Language Generation》(https://github.com/google-research/bleurt),其是一个有监督的生成式评估指标。

BLEURT 进行了两次预训练,首先是语言建模目标,然后是一组NLG评估目标,然后在WMT Metrics 数据集、用户提供的一组评分或两者的组合上微调模型。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标from bleurt import score

checkpoint = “bleurt/test_checkpoint”
references = [“This is a test.”]
candidates = [“This is the test.”]

scorer = score.BleurtScorer(checkpoint)
scores = scorer.score(references=references, candidates=candidates)
assert isinstance(scores, list) and len(scores) == 1
print(scores)

如效果如下:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

4、codebleu(语法相似)

CodeBLEU在2020年提出的BLEU变体。在BLEU在n-gram匹配上的优势之上,进一步通过抽象语法树(AST)融入代码语法,通过数据流融入代码语义。

其根本逻辑在于:代码与自然语言有很大不同,BLEU只考虑标记匹配而忽略了关键字、语法准确性和语义正确性的重要性,不适合用于代码综合评价。因此,为了关注关键词、利用树形结构并考虑语义逻辑信息,提出了一种新的评价指标CodeBLEU:

可以参照CodeBLEU: a Method for Automatic Evaluation of Code Synthesis(地址:https://arxiv.org/abs/2009.10297。

其计算方式为多个指标的加权,如BLEU、BLEU_weight、Match_ast、Match_df。

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

其中:BLEU由标准BLEU计算得出,BLEU weight是加权n-gram匹配度,通过比较不同权重的假设代码和参考代码得出:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

Matchast是语法AST匹配度,探索代码的语法信息:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标Matchdf是语义数据流匹配度,考虑假设和参考之间的语义相似性:

加权n-gram匹配和语法AST匹配用于确保语法正确性,语义数据流匹配用于计算逻辑正确性。

更形象的如下:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

指标计算效果如下:

浅看大模型用于事件Timeline自动生成:兼看MBPP、DS1000代码评估数据集及主流评测指标

总结

本文主要介绍了时间线自动生成的一个工具mylens以及代码评测的一些数据集和评测指标,这些对于增强我们对评估的认知都很有帮助,毕竟评估是算法优化的灯塔。

感兴趣的可以进一步查看文中提到的一些论文工作,对指标、数据的构成和设计来源进行跟踪,会有更多的收获。

参考文献

1、https://mylens.ai/

2、https://arxiv.org/abs/2009.10297

3、https://developer.aliyun.com/article/1383621

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

老刘说NLPhttps://zhuanlan.2,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。

 

Read More 

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 
评论(没有评论)
Generated by Feedzy