Skip to main content

No project description provided

Project description

RagSGE_chinese

Retrieval Augmented Generation for context Sortation, ground_truth Generation, and Evaluation (RagSGE)

本系统是一个检索增强评估期,有如下几个功能:

  1. 针对检索器从数据库中搜索出来的内容排序进行验证,并返回一个系统认为的最优排序,可用于修改检索器参数
  2. 针对问题和背景资料生成一个标准答案(GPT-4生成),该标准答案可用于后序评估
  3. 使用开源的RAGAs评价系统,生成四个分数,分别是Answer_relevancy, Faithfulness, Context_recall, Context_precision, 具体信息详见 RAGAs使用指南

评测系统使用说明,请详见 评测系统使用说明

评测系统介绍,请详见 评测系统介绍

评测系统使用说明

from RagSGE_chinese import sort, generate, evaluate
import os

os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

result = sort(question_list,contexts_list)                                          # step 1
ground_truth = generate(question_list,contexts_list)                                # step 2
scores = evaluate(question_list,contexts_list,answer_list,ground_truth_list)        # step 3

本系统共有三个方法可以调用,分别是

1. sort() 背景资料排序

使用大模型(GPT)给出背景内容(context)对于问题的相关性排序

使用示例:

from RagSGE_chinese import sort
import os

os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

result = sort(question_list,contexts_list)

输入:

字段 说明 类型 是否必选
question_list 问题列表 数组 list(str)
contexts_list 背景列表 二维数组 list(list(str))
k 相似性计算时选择前 k 个值 整数 int 否 (默认 10)
top 相似性计算时选择最相似的 top-k/最不相似的 bottom-k 布尔数 bool 否 (默认 True)
fast 是否需要先 0-1 筛选剔除掉无用信息 布尔数 bool 否 (默认 True)

输出:

result: 数组(list(int)), 返回二分筛选后系统精排数组后相关度排序(下标),如果使用fast快速排序,则返回数组排序中只包含系统认为的有用的内容

详细的结果会保存在 ./result/sorted_indices.json, 包含以下内容:

字段 说明 类型
spearman 量化对比评价系统排序和上传的排序(0-1) 浮点数
sim 量化分析评价系统排序和上传的排序中 Top-k 个重复率(0-1) 浮点数
overlap 输出评价系统排序和上传的排序中 Top-k 个重复项(下标) 数组

result/sort_indices样例:

[
    {
        "question": "东方航空公司主营业务",
        "contexts": [
            "该文件显示,东方航空盈利状况与旗下子公司密切相关,且本次发行超短期融资券的偿债资金来源主要为营业收入,存在主营业务收入依赖下属核心子公司的风险。\n据了解,东方航空下属子公司数量较多,且涉及业务与服务范围较广,营业收入、利润水平差异较大。集团公司本部主要行使管理职能,公司核心业务和服务均来自于下属子公司,故集团的主营业务收入及利润主要来自下属子公司。子公司的营业收入及利润波动会对公司的营业收入及利润产生较大影响。受业务开展情况及季节性等因素影响,公司部分子公司存在一定的亏损情况,若未来亏损持续,将可能对公司整体盈利及偿债能力产生影响。\n根据东方航空发布的2018年三季报显示,在2018年1~9月,公司实现营业收入878.78亿元,同比增长13.38%;归属于上市公司股东的净利润44.90亿元,同比下降43.27%;每股收益0.31元,同比下降43.64%。\n责任编辑:刘万里SF014\n热门推荐收起\n24小时滚动播报最新的财经资讯和视频,更多粉丝福利扫描二维码关注(sinafinance)",
            ...
        ],
        "good": [0, 1, 3, 5, 9, 11, 13, 14, 16, 19, 21, 22, 23, 25, 26],
        "bad": [2, 4, 6, 7, 8, 10, 12, 15, 17, 18, 20, 24, 27, 28, 29],
        "sorted": [0, 26, 14, 23, 13, 5, 9, 22, 11, 1, 3, 21, 25, 16, 19],
        "spearman": 0.121,
        "sim": 0.7,
        "overlap": [0, 14, 13, 5, 9, 11, 1]
    },
    ...
]

2. generate() 标准答案生成

使用大模型为问题生成标准答案

使用示例:

from RagSGE_chinese import generate
import os

os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

ground_truth = generate(question_list,contexts_list)

输入:

字段 说明 类型 是否必选
question_list 问题列表 数组 list(str)
contexts_list 背景列表 二维数组 list(list(str))
chat_model 生成标准答案使用的 GPT 模型 字符串 str 否 (默认 'gpt-4-turbo')

输出:

ground_truth: 数组(list(str)), 返回每个问题的标准答案。所有的标准答案会自动保存在./gt文件夹中

./gt/GT_东方航空公司主营业务.json样例:

[    
    "question": "东方航空公司主营业务",
    "contexts": [
        "该文件显示,东方航空盈利状况与旗下子公司密切相关,且本次发行超短期融资券的偿债资金来源主要为营业收入,存在主营业务收入依赖下属核心子公司的风险。\n据了解,东方航空下属子公司数量较多,且涉及业务与服务范围较广,营业收入、利润水平差异较大。集团公司本部主要行使管理职能,公司核心业务和服务均来自于下属子公司,故集团的主营业务收入及利润主要来自下属子公司。子公司的营业收入及利润波动会对公司的营业收入及利润产生较大影响。受业务开展情况及季节性等因素影响,公司部分子公司存在一定的亏损情况,若未来亏损持续,将可能对公司整体盈利及偿债能力产生影响。\n根据东方航空发布的2018年三季报显示,在2018年1~9月,公司实现营业收入878.78亿元,同比增长13.38%;归属于上市公司股东的净利润44.90亿元,同比下降43.27%;每股收益0.31元,同比下降43.64%。\n责任编辑:刘万里SF014\n热门推荐收起\n24小时滚动播报最新的财经资讯和视频,更多粉丝福利扫描二维码关注(sinafinance)",
        ...
    ],
    "ground_truth": "答案: 东方航空公司的主营业务包括民用航空运输服务,主要包括乘客和货物的运输。公司运营的飞机包括支线喷气式飞机如ARJ21和大型客机如C919,服务内容涵盖国内外航线,如从上海至国际各大城市的航线。此外,东方航空还涉及通用航空业务及延伸服务,包括飞机维修和合资企业等。公司的航线网络覆盖全球,拥有多个型号的飞机,如空中客车A320、A330、A340、波音737等,总体来看,东方航空通过建立以上海为中心的航线网络,连接全球市场,实现乘客和货物的运输。"
]

3. evaluate() 开源模型RAGAs评分

使用开源模型RAGAs为模型评分,共有四个输出,分别为:

字段 说明 类型
Context precision 衡量检索出的上下文中有用信息与无用信息的比率。该指标通过分析
question 和 contexts 来计算。检索的背景是否与问题有关
浮点数
Context recall 用来评估是否检索到了解答问题所需的全部相关信息。这一指标依据
ground_truth 和 contexts 进行计算。检索的背景是否与标准答案
相关
浮点数
Faithfulness 用于衡量生成答案的事实准确度。它通过对比给定上下文中正确的陈述与
生成答案中总陈述的数量来计算。这一指标结合了 contexts 和
answer。生成的答案是否来源于背景
浮点数
Answer relevancy 评估生成答案与问题的关联程度。 浮点数

使用示例:

from RagSGE_chinese import evaluate
import os

os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

scores = evaluate(question_list,contexts_list,answer_list,ground_truth_list)

输入:

字段 说明 类型 是否必选
question_list 问题列表 数组 list(str)
contexts_list 背景列表 二维数组 list(list(str))
answer_list 答案列表 数组 list(str) 否 (默认 None)
ground_truth_list 标准答案列表 数组 list(str) 否 (默认 None)

输出:

scores: 输出RAGAs系统给出的四个评分,详细的分数结果会保存在./result/result.xlsx

score示例:

{
 'context_precision': 0.8000, 
 'context_recall': 0.7000, 
 'faithfulness': 0.9667, 
 'answer_relevancy': 0.9601
}

评测系统介绍

1. 背景资料排序 (contexts)

排序系统介绍

本排序系统能够完成如下:

  1. 用户输入全部的背景资料(contexts), 按照相关度从高到低排序(与问题最相关的文档排在首位)
  2. 先遍历全部的背景资料,让GPT进行0-1排序,查看文档是否包含问题的答案(可选)
  3. 然后让GPT对有用的文档两两对比排序,完成相关度排序
  4. 使用spearman_scoretop-k similarity量化对比排序质量

最终输出结果包含一个长度为n的数组 indicesn为总文件数量。 数组内包含0~n-1,每个元素对应原本输入数组context_list的下标。在输出数组indices中,越靠前的下标代表GPT认为在回答问题的时候更重要,越靠后的越不重要

输出样例:

GPT-3.5 n=30:
输入问题:question = "东方航空公司主营业务"; contexts = [0,1,...,200]共200个,其中下标为0的context为检索器认为的有最高的相关性资料

输出样例:
# Sorted Good indices: [55, 178, 0, 59, 169, 11, 9, 1, 5, 13, 56, 28, 53, 95, 3, 186, 21, 22, 20, 57, 25, 26, 38, 70, 98, 106, 165, 182, 54, 99, 111, 129, 140, 141, 144, 192, 87, 51, 168, 17, 19, 30, 33, 31, 32, 36, 34, 35, 39, 40, 67, 47, 41, 49, 78, 121, 122, 127, 132, 42, 45, 61, 62, 80, 69, 85, 153, 128, 135, 180, 137, 152, 154, 172, 187, 195, 198, 160]   GPT认为的相关性顺序
# Bad indices: [2, 4, 6, 7, 8, 10, 12, 14, 15, 16, 18, 23, 24, 27, 29, 37, 43, 44, 46, 48, 50, 52, 58, 60, 63, 64, 65, 66, 68, 71, 72, 73, 74, 75, 76, 77, 79, 81, 82, 83, 84, 86, 88, 89, 90, 91, 92, 93, 94, 96, 97, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 130, 131, 133, 134, 136, 138, 139, 142, 143, 145, 146, 147, 148, 149, 150, 151, 155, 156, 157, 158, 159, 161, 162, 163, 164, 166, 167, 170, 171, 173, 174, 175, 176, 177, 179, 181, 183, 184, 185, 188, 189, 190, 191, 193, 194, 196, 197, 199]   GPT认为的没有用的资料
# Spearmans correlation coefficient: 0.443
# Top-10 similarity score is: 0.6
# Overlap indices are: [0, 11, 9, 1, 5, 13]

0-1排序:

遍历全部的文章documents context_i = [d_1, d_2, ..., d_n], n<=200, 让GPT分析文章d_i中是否包含问题q的答案,如果有,则将该文档的下标保存在good列表中,否则保存在bad列表中。

二分排序:

随机选择一个文档作为中点,其他文章与该文章两两排序并打分,二分训练排序

a. 针对单一问题q_i, 我们需要对good列表中的每一项进行排序,排序方法如下:

b. 初始化sorted = []作为排序好的数列值,并遍历good_i:d_i

  1. d_i与已经排好的序列中点进行比较 d_i and sorted[mid]
  2. 使用GPT with prompt, 可行的prompt:
'''
There are two contexts given below, please choose one of the context to answer the question given.
If you choose context1, please output "1". If you choose context2, please output "2".
You must choose one of the context and output either "1" or "2". Please do not output anything else

Question: {question}

Context1: {context1}   # doc_i
Context2: {context2}   # sorted[mid]

# output 1: doc_i排在sorted[mid]前面
# output 2: doc_i排在sorted[mid]后面
'''
  1. 根据二分法条件循环查找,完成排序,复杂度:O(nlogn)

排序评价:

在此程序中,我们使用了两种方法量化评价GPT和ES的排序,分别是spearman_scoretop-k similarity目前方案不完善,可能会有更好的评价标准

spearman_score:

它是衡量两个变量的依赖性的非参数指标。它评估的是两个变量的等级之间的相关性,而不直接关注变量的具体值,适用于定序数据及非正态分布的数据分析。简单来说,该相关系数是用来判断两组数据是否具有一致的等级顺序(排序)。

计算方法:

  1. 排列等级:首先,对每一组数据进行排序,赋予等级。如果有相同的值,赋予它们的平均等级。
  2. 计算等级差:然后,计算每对数据点等级之间的差异(差的平方称为d_i^2)。
  3. 使用公式计算,详情请见 spearman 介绍

Spearman_score 值的区间为 -1~1. 1代表两个排列顺序正相关;-1代表负相关。

top-k similarity:

这个是一个自制方法,用于对比两个数组在前k个值中的重复比率,并返回重复的内容。该方法可以用于对比GPT和ES两者排序后的indices在最相关的top-k个元素中重复的比率,从而推断出检索器的好坏。

2. 标准答案生成 (ground_truth)

系统使用GPT生成标准答案,共有快速,慢速两个版本。

慢速版具体实现方法如下:

  1. 用户给评测系统上传
    • 一个问题 q
    • 一个针对该问题的contexts的集合 C = {c_1, ..., c_n}, n=200
  2. GPT 遍历所有文档C, 并针对每一个c_i生成一个答案a_i
    • 如果GPT认为可以回答问题,则a_i为生成的答案
    • 如果不能回答问题,a_i = "不知道"
  3. GPT 将200个答案 {a_1, ..., a_200} 合并, 循环总结,得出最终标准答案
    • 如果合并后的答案超出GPT字符限制,则自动拆分成小片段输入,得出多个答案后再次合并,以此循坏

快速版具体实现方法如下:

  1. 用户给评测系统上传
    • 一个问题 q
    • 一个针对该问题的contexts的集合 C = {c_1, ..., c_n}, n=200
  2. shuffle contexts集合,随后将contexts分为20个一组 {C_1 = {c_1, ..., c_20}; C_2; ... ; C_10}, 每一组生成一个答案 [A_1; ...; A_10]
  3. GPT 将答案 [A_1; ...; A_10] 合并, 循环总结,得出最终标准答案

文档所使用的prompt:

# 慢速版
'''
请判断给定的文档中是否包含问题的答案,如果有请回答问题,如果没有请回答不知道
问题: {question}
请不要输出与回答问题无关的任何内容
'''
'''
请根据一下给定的背景知识,回答问题
问题: {question}
输出格式:“答案: xxx"
'''

# 快速版
'''
请根据给定的文档回答问题
如果文档中的内容可以回答问题,请全面详细地回答问题并在回答中使用资料中细节,包括例子,数据等;如果不可以回答问题,请回答不知道
问题: {question}     
文档: {context_list}           
请不要输出与回答问题无关的任何内容
输出格式:“答案: xxx"
'''

该程序共输出一个文件夹 ./gt 用于保存生成的标准答案

./gt/GT_{question}.json示例:

{
    "question": "优刻得科技股份有限公司主营业务",
    "contexts": [
        "前言\n优刻得科技股份有限公司主营业务是自主研发并提供以计算、存储、网络等企业必需的基础IT产品为主的云计算服务。公司主要产品或服务有公有云、私有云、混合云、数据可信流通平台安全屋...",
        "优刻得——2023企业能力分析研究报告...",
        ...200个...        
    ],
    "ground_truth": "答案: 优刻得科技股份有限公司主营业务是自主研发并提供以计算、存储、网络等企业必需的基础IT产品为主的云计算服务,包括公有云、私有云、混合云、数据可信流通平台安全屋等产品或服务。"
}

3. 开源模型RAGAs评分

系统采用开源的RAGAs评分系统,为检索器和生成器提供共4个分数。

  • 用户上传 question_list, contexts_list, answer_listground_truth_list Q = {q_1, ..., q_m}, m个问题
  • 随后调用RAGAs系统评分给出分数 S = {s_1, ..., s_m}, s_i = {四个分数}
  • 最后将S保存在./result/result.xlsx中可视化展示

由于RAGAs评分系统采用LLM大模型打分,模型输入时有最大tokens限制,因此无法输入全部200个contexts。本系统默认选择Top-10 contexts 用于评价,经测试不会超过限制。也可以手动修改Top-k值,系统将自动评判是否超过tokens限制,如果超过,则自动降低k值至符合条件。

score字段格式:

字段 说明 类型
Context precision 衡量检索出的上下文中有用信息与无用信息的比率。该指标通过分析
question 和 contexts 来计算。检索的背景是否与问题有关
浮点数
Context recall 用来评估是否检索到了解答问题所需的全部相关信息。这一指标依据
ground_truth 和 contexts 进行计算。检索的背景是否与标准答案
相关
浮点数
Faithfulness 用于衡量生成答案的事实准确度。它通过对比给定上下文中正确的陈述与
生成答案中总陈述的数量来计算。这一指标结合了 contexts 和
answer。生成的答案是否来源于背景
浮点数
Answer relevancy 评估生成答案与问题的关联程度。 浮点数

score示例:

{
 'context_precision': 0.8000, 
 'context_recall': 0.7000, 
 'faithfulness': 0.9667, 
 'answer_relevancy': 0.9601
}

result.xlsx示例:

question ground_truth answer_relevancy faithfulness context_recal1 context_precision
问题1 [背景资料1...] 0.949362107 1 1 0.821428571
问题2 [背景资料2...] 0.956288335 0.857142857 1 0.870833333
问题3 [背景资料3...] 0.968210221 1 1 0.946781305

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

RagSGE_chinese-0.14.tar.gz (25.4 kB view hashes)

Uploaded Source

Built Distribution

RagSGE_chinese-0.14-py3-none-any.whl (21.6 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page