这里或多或少会涉及到RAG 此处会简单介绍 比较详细相关可见

背景

场景1: 知识库

这里所说的RAG是比较狭义且普遍的用法 将原始文档切片后转换成为向量 存储在数据库中 带着input-query查询的时候 来到同一个向量空间 向量化后计算他们的相似度 然后输入LLM生成etc


场景2:function call

使用一段描述性prompt设定模型的能力、背景、人设相关信息,让大模型可以访问数据源,网络搜索等。获取自己拿不到的数据

评测维度

这里参考RAG的相关论文设置评测的一些维度和指标

1、噪声鲁棒性(Noise Robustness)
模型能从噪声文档中提取有用信息。噪声文档定义为与问题相关但不包含任何相关信息的文档。在与”谁获得了2022年诺贝尔文学奖”问题相关的噪声文档包括有关2021年诺贝尔文学奖的报道。为此,噪声鲁棒性测试根据所需的噪声比,将外部文档包含一定数量噪声文档的实例包含在内。
2、否定拒绝(Negative Rejection)
当检索到的文档中不存在所需的知识点时,模型应拒绝回答问题。否定拒绝的测试包含外部文档只有噪声文档的实例。LLM预计会发出”信息不足”或其他拒绝信号。
3、信息整合(information integration)
评估模型能否回答需要整合多个文档信息的复杂问题。对于”ChatGPTiOS应用程序和ChatGPTapi是什么时候推出的?”这个问题,LLMs应提供iOS上ChatGPT应用程序和ChatGPTAPI的推出日期信息。信息集成测试包含只能使用多个外部文件才能回答的问题。
4、反事实鲁棒性(CounterfactualRobustness)
该测试评估当通过指令向LLMs发出关于检索信息中潜在风险的警告时,模型能否识别检索文档中已知事实错误的风险。反事实鲁棒性的测试包括可以由LLM直接回答,但外部文档包含事实错误的实例。

评测指标设计

采用指标分级的设计多维度评估RAG能力 需体现RAG端到端能力

同时需细化帮助产研找到问题所在 —— 提供一定的定位问题能力

所以分为两级指标 分别表示RAG能力和各环节情况

指标分级 指标名 评估范围 指标解释 实现方式 prompt
一级指标 Answer Correctness(答案准确率) RAG端到端能力 回答正确性,可能指示了回答的准确性或正确率,适用于问答系统或者类似的任务中。 2.端到端打分 问答-限定回答
二级指标 Faithfulness(忠诚度) 大模型理解总结能力 该指标衡量生成的 answer 与给定 context 的事实一致性。它是根据 answer 和检索到的 context 来计算的。迭代改进大模型生成幻觉时,可重点考察此指标,指标越高,代表回答越忠于参考内容,无虚构或误解。 实现:通过 LLM 判断 answer 与 contexts 的要点比值。做法:用 LLM 提取 Answer 中的要点,设为 Sa
二级指标 Context Precision(语境精确率) RAG检索能力 Context Precision 评估的是检索到的文档是否对 question 有帮助,即有帮助文档与所有检索文档的比例,体现检索精度,惩罚无用文档喂给下游模型。 实现:通过 LLM 判断 contexts 与 query 的相关性。做法:用 LLM 判断有帮助的文档数量为 TP
二级指标 Context Recall(语境文召回率) 知识库的分段能力、RAG检索能力 Context Recall 评估的是检索到的文档中包含真相(Truths)所需信息的程度。若精确度优化过度删减文档,可能造成召回率下降。 实现:用 LLM 提取 Truths 中的要点 St

二级指标中的三个值本质上都是不同语句下的一个召回率的体现

  • 生成的answer召回的内容与事实是否一致?是否召回了错误信息?

  • 生成的answer召回了多少检索出来的文档?(文档的一个召回率)

  • 生成的answer召回了多少有效信息?

具体涉及的prompt

faithfullness prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
给定一个question、一个answer及与answer相关的sentences,分析'sentences'下每个句子的复杂性,并将每个句子分解为一个或多个完全可以理解的陈述,同时确保每个陈述中不使用代词。要求输出格式化为JSON",
examples=[
{
"question": "阿尔伯特·爱因斯坦是谁?他最出名的是什么?",
"answer": "他是一位出生于德国的理论物理学家,被公认为有史以来最伟大、最有影响力的物理学家之一。他以发展相对论而闻名,也为量子力学理论的发展做出了重要贡献。",
"sentences": "0:他是一位出生于德国的理论物理学家,被公认为有史以来最伟大、最有影响力的物理学家之一. 1:他以发展相对论而闻名,也为量子力学理论的发展做出了重要贡献。",
"analysis":
[
{
"sentence_index": 0,
"simpler_statements": [
"阿尔伯特·爱因斯坦是德国出生的理论物理学家。",
"阿尔伯特·爱因斯坦被公认为有史以来最伟大、最有影响力的物理学家之一。",
],
},
{
"sentence_index": 1,
"simpler_statements": [
"阿尔伯特·爱因斯坦以发展相对论而闻名。",
"阿尔伯特·爱因斯坦也为量子力学理论的发展做出了重要贡献。",
],
},
]
}
],
input_keys=["question", "answer", "sentences"],
output_key="analysis",
language="中文")

####第二轮prompt-需要拿到第一轮prompt作为输入

你的任务是根据给定的上下文来判断一系列陈述的可信度。对于每个语句,如果该语句可以直接基于上下文推断,则必须返回判决结果为1;如果该语句不能直接基于上下文推导,则返回判决结果0。
【例子1】
"context": "约翰是XYZ大学的学生。他正在攻读计算机科学学位。本学期他选修了数门课程,包括数据结构、算法和数据库管理。约翰是一个勤奋的学生,花了大量的时间学习和完成作业。他经常在图书馆研究他的课题到很晚。",
"statements": [
"约翰主修生物学。",
"约翰正在上人工智能课程。",
"约翰是个专心致志的学生。",
"约翰有一份兼职工作。",
],
"answer": (
[
{
"statement": "约翰主修生物学。",
"reason": "约翰的专业明确提到是计算机科学。没有资料表明他主修生物学。",
"verdict": 0,
},
{
"statement": "约翰正在上人工智能课程。",
"reason": "上下文提到了John目前正在学习的课程,但没有提到人工智能。\
因此,不能推断约翰正在学习人工智能课程。",
"verdict": 0,
},
{
"statement": "约翰是个专心致志的学生。",
"reason": "上下文表明,他花了大量时间学习和完成作业。此外,\
它还提到,他经常在图书馆呆到很晚才能完成自己的项目,这意味着他要专心致志。",
"verdict": 1,
},
{
"statement": "J约翰有一份兼职工作。",
"reason": "上下文中没有提供关于约翰有一份兼职工作的信息。",
"verdict": 0,
},
]
【例子2】
"context": "光合作用是植物、藻类和某些细菌将光能转化为化学能的过程。",
"statements": "阿尔伯特·爱因斯坦是个天才。",
"answer":
[
{
"statement": "阿尔伯特·爱因斯坦是个天才。",
"reason": "上下文和语句无关",
"verdict": 0,
}
]
input_keys=["context", "statements"],
output_key="answer",
output_type="json",
language="中文",

context_precision prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
给定问题、答案和上下文,验证上下文是否有助于答案。如果有用,则将判断结果标记为“1”,则标记为“0”,json输出。
【例子1】
问题:关于阿尔伯特·爱因斯坦,你能告诉我什么?
上下文:阿尔伯特·爱因斯坦(1879年3月14日-1955年4月18日)是德国出生的理论物理学家,被广泛认为是有史以来最伟大、最有影响力的科学家之一。他以发展相对论而闻名,也对量子力学做出了重要贡献,因此是现代物理学在二十世纪头几十年实现的对自然科学理解的革命性重塑的核心人物。他的质能等价公式E=mc2源于相对论,被称为“世界上最著名的方程”。他因“对理论物理学的贡献,特别是对光电效应定律的发现”而获得1921年诺贝尔物理学奖,这是量子理论发展的关键一步。他的工作也因其对科学哲学的影响而闻名。1999年,英国《物理世界》杂志对全球130位顶尖物理学家进行了民意调查,爱因斯坦被评为有史以来最伟大的物理学家。他的智力成就和独创性使爱因斯坦成为天才的代名词。
答案:阿尔伯特·爱因斯坦出生于1879年3月14日,是德国出生的理论物理学家,被广泛认为是有史以来最伟大、最有影响力的科学家之一。他因对理论物理学的贡献而获得1921年诺贝尔物理学奖。1905年发表4篇论文。爱因斯坦于1895年移居瑞士
判断结果:{
"reslut": 1,
"reason": "所提供的上下文确实有助于得出给定的答案。上下文包括有关阿尔伯特·爱因斯坦生平和贡献的关键信息,这些信息反映在答案中。"
}
【例子2】
问题:谁赢得了2020年ICC世界杯??
上下文:2022年10月16日至11月13日在澳大利亚举行的2022年ICC男子T20世界杯是该锦标赛的第八届。原定于2020年举行,但由于新冠肺炎大流行而推迟。英格兰队取得了胜利,在决赛中以五个小门击败巴基斯坦队,夺得了他们的第二个ICC男子T20世界杯冠军。
答案:英格兰
判断结果:{
"reslut": 1,
"reason": "上下文有助于了解2020年ICC世界杯的情况,并表明英格兰是原定于2020年举行但实际上在2022年举行的比赛的获胜者。"
}
【例子3】
问题:世界上最高的山是什么?
上下文:安第斯山脉是世界上最长的大陆山脉,位于南美洲。它横跨七个国家,拥有西半球许多最高峰。该山脉以其多样化的生态系统而闻名,包括高海拔的安第斯高原和亚马逊雨林。
答案:珠穆朗玛峰。
判断结果:{
"reslut": 0,
"reason": "所提供的下上文讨论了安第斯山脉,虽然令人印象深刻,但不包括珠穆朗玛峰,也不直接涉及世界最高峰的问题。"
}

contenxt_recall prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
给定一个问题、相关上下文及问题的真相,将真相内容拆解为独立的有逻辑的句子,并判断这些句子是否可以从给定的上下文找到对应信息。仅需要回答“是”(1)或“否”(0)作为二元分类。输出带原因的json。
【举例】:
问题:关于阿尔伯特·爱因斯坦,你能告诉我什么?
上下文:阿尔伯特·爱因斯坦(1879年3月14日-1955年4月18日)是德国出生的理论物理学家,被广泛认为是有史以来最伟大、最有影响力的科学家之一。他以发展相对论而闻名,也对量子力学做出了重要贡献,因此是现代物理学在二十世纪头几十年实现的对自然科学理解的革命性重塑的核心人物。他的质能等价公式E=mc2源于相对论,被称为“世界上最著名的方程”。他因“对理论物理学的贡献,特别是对光电效应定律的发现”而获得1921年诺贝尔物理学奖,这是量子理论发展的关键一步。他的工作也因其对科学哲学的影响而闻名。1999年,英国《物理世界》杂志对全球130位顶尖物理学家进行了民意调查,爱因斯坦被评为有史以来最伟大的物理学家。他的智力成就和独创性使爱因斯坦成为天才的代名词。
真相:阿尔伯特·爱因斯坦出生于1879年3月14日,是德国出生的理论物理学家,被广泛认为是有史以来最伟大、最有影响力的科学家之一。他因对理论物理学的贡献而获得1921年诺贝尔物理学奖。1905年发表4篇论文。爱因斯坦于1895年移居瑞士
判定结果:[
{"statement": "阿尔伯特·爱因斯坦出生于1879年3月14日,是一位德国出生的理论物理学家,被广泛认为是有史以来最伟大、最有影响力的科学家之一。",
"reason": "爱因斯坦的出生日期在上下文中被清楚地提到了。"
"result": 1},
{"statement": "他因对理论物理学的贡献而获得1921年诺贝尔物理学奖。",
"reason": "确切的句子出现在给定的上下文中。",
"result": 1},
{"statement": "他因对理论物理学的贡献而获得1921年诺贝尔物理学奖。",
"reason": "确切的句子出现在给定的上下文中。",
"result": 1},
{"statement": "1905年发表4篇论文。",
"reason": "下上文中没有提到他写的论文。",
"result": 0},
{"statement": "爱因斯坦于1895年移居瑞士。",
"reason": "下上文中没有提到他1895年移居瑞士。",
"result": 0}]

再确定对应的prompt之后 便可代入框架代码 或者自建脚本来构建对应的评测集了 这里所使用的是主流框架Ragas

相关的内容见另一文章