简介

July 14, 2024 · View on GitHub

📈 CFBenchmark: Chinese Financial Assistant with Large Language Model

license

English | 简体中文

简介

欢迎来到CFBenchmark

近年来,随着大语言模型(LLM)的快速发展,现有的大语言模型在各项任务中都取得了优异的表现。 然而,我们注意到,目前专注于大语言模型在特定领域表现的基准测试数量有限。

“书生•济世”中文金融评测基准(CFBenchmark)基础版本由CFBenchmark-BasicCFBenchmark-OpenFinData两部分数据组成,主要包含以下几方面,来评测相关大模型在金融实际应用中的各项能力和安全性:

  • 金融自然语言处理,主要关注模型对金融文本的理解和生成能力,如金融实体识别,行业分类,研报总结和风险评估;
  • 金融场景计算,侧重于评估模型在特定金融场景下的计算和推理能力,如风险评估和投资组合优化;
  • 金融分析与解读任务,检验模型在理解复杂金融报告、预测市场趋势和辅助决策制定方面的能力;
  • 金融合规与安全检查,评估模型潜在的合规风险,如生成内容的隐私性、内容安全性、金融合规性等方面的能力。

未来,“书生•济世”中文金融评测基准将继续深化金融大模型评测体系建设,包括大模型在金融行业应用过程中的模型生成内容的准确性、及时性、安全性、隐私性、合规性等能力评估。



更新

[2024.03.17] 增加了在金融数据集CFBenchmark-OpenFinData上的评测内容,提供了该数据集中对应主观题的一种评测代码实现方式,并测试了9个大模型在OpenFinData 数据集上的评测结果。

OpenFinData数据来源于东方财富与上海人工智能实验室联合发布的开源项目,更多详情:Github地址

[2023.11.10] 我们发布了CFBenchmark-Basic和对应的技术报告,主要针对大模型在金融自然语言任务和金融文本生成任务上的能力进行全面评测。

目录

CFBenchmark-Basic

CFBenchmark的基础版本包括3917个金融文本涵盖三个方面和八个任务,从金融识别、金融分类、金融生成三个方面进行组织。

  • 识别-公司:识别与财务文件相关的公司名称,共273个。
  • 识别-产品:识别与财务文件相关的产品名称,共297个。
  • 分类-情感分析:对于财务文件相关的情感类别进行分类,共591个。
  • 分类-事件检测:对于财务文件相关的事件类别进行分类,共577个。
  • 分类-行业确认:对于财务文件相关的二级行业进行分类,共402个。
  • 生成-投资建议:基于提供的财务文件生成投资建议,共593个。
  • 生成-风险提示:基于提供的财务文件生成投资建议,共591个。
  • 生成-内容总结:基于提供的财务文件生成投资建议,共593个。

我们提供了两个模型,展示了零样本(Zero-shot)和少样本(Few-shot)是如何进行测试的。

样例1 少样本(Few-shot)的输入:



样例2 零样本(Zero-shot)的输入:



快速开始

安装

以下展示了一个安装的简单步骤。

   conda create --name CFBenchmark python=3.10
   conda activate CFBenchmark
    git clone https://github.com/TongjiFinLab/CFBenchmark
    cd CFBenchmark
    pip install -r requirements.txt

测评

CFBenchmark-Basic

我们在 CFBenchmark-Basic/src 中为您准备了测试和评估代码。

为了运行测评,您可以在命令行中运行以下代码:

cd CFBenchmark-Basic/src
python -m run.py

您可以进入CFBenchmark-Basic/src/run.py来修改其中的参数,让代码运行的路径符合您的要求。

from CFBenchmark import CFBenchmark
if __name__=='__main__':

    # EXPERIMENT SETUP
    modelname = 'YOUR-MODEL-NAME'
    model_type= 'NORMAL' #NORMAL or LoRA
    model_path= 'YOUR-MODEL-PATH'
    peft_model_path= ''#PASS YOUR OWN PATH OF PEFT MODEL IF NEEDED
    fewshot_text_path= '../fewshot'#DEFAULT PATH
    test_type='few-shot'#LET'S TAKE THE FEW-SHOT TEST AS AN EXAMPLE
    response_path='../cfbenchmark-response'#PATH TO RESERVE THE RESPONSE OF YOUR MODEL
    scores_path='../cfbenchmark-scores'	#PATH TO RESERVE THE SCORE OF YOUR MODEL
    embedding_model_path='../bge-zh-v1.5' #PASS YOUR OWN PATH OF BGE-ZH-V1.5
    benchmark_path='../data' #DEFAULT PATH

    #generate Class CFBenchmark
    cfb=CFBenchmark(
        model_name=modelname,
        model_type=model_type,
        model_path=model_path,
        peft_model_path=peft_model_path,
        fewshot_text_path=fewshot_text_path,
        test_type=test_type,
        response_path=response_path,
        scores_path=scores_path,
        embedding_model_path=embedding_model_path,
        benchmark_path=benchmark_path,
    )
    
    cfb.generate_model()# TO GET RESPONSE FROM YOUR MODEL
    cfb.get_test_scores()# TO GET YOUR MODEL SCORES FROM RESPONSE

我们在codes/CFBenchmark.py中定义了一个类“CFBenchmark”来进行评估。

class CFBenchmark:
    def __init__(self,
                 model_name,
                 model_type,
                 model_path,
                 peft_model_path,
                 fewshot_text_path,
                 test_type,
                 response_path,
                 scores_path,
                 embedding_model_path,
                 benchmark_path
                 ) -> None:
  • 您可以使用参数来设置模型的路径。 如果你想使用进行LoRA微调后的模型,请将model_type设置为LoRA并通过````peft_model_path```传递你的peft模型路径。
  • 您可以将test-type设置为'zero-shot'或'few-shot'来进行不同的评估。
  • 为“bzh-zh-v1.5”设置“embedding_model_path”,用于计算余弦相似度。
  • 您可以修改“CFBenchmark.generate_model()”中的超参数来生成文本。
  • 我们在Hugging Face和Github中都提供了保存为Dataset数据类型的CFBenchmark。

CFBenchmark-OpenFinData

我们在CFBenchmark-OpenFinData 中为您准备了测试和评估的代码与数据。 评测代码的设计与Fineva1.0相似,通过CFBenchmark-OpenFinData/src/evaluator对于评测模型的调用方式进行定义,并通过CFBenchmark-OpenFinData/run_scripts中的bash文件对于关键参数进行配置和实验。

为了运行测评,您可以在命令行中运行以下代码:

cd CFBenchmark-OpenFinData/run_scripts
sh run_baichuan2_7b.sh

值得注意的是,因为OpenFinData的评测过程涉及主观题的判断,因此我们的评测框架借助了文心一言来对金融解读与分析类问题和金融合规类问题进行评测。为了顺利试用文心一言的API参与评测,请您在环境变量中设置BAIDU_API_KEYBAIDU_SECRET_KEY,以便于CFBenchmark-OpenFinData/src/get_score.pyget_access_token函数可以顺利运行。

def get_access_token():
    """
    使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
    """

    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}".format(os.environ.get("BAIDU_API_KEY"), os.environ.get("BAIDU_SECRET_KEY"))
    
    payload = json.dumps("")
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    return response.json().get("access_token")

测试结果

我们使用两种类型的指标来评估金融领域大语言模型在 CFBenchmark 上的表现。 对于CFBenchmark-Basic中的识别和分类任务,我们采用 F1_score 作为评估指标,平衡了精度和召回率。

对于CFBenchmark-Basic中的生成任务,我们利用地面实况的向量(通过bge-zh-v1.5生成)表示和生成的答案之间的余弦相似度来衡量生成能力。

对于CFBenchmark-OpenFinData中的knowledge, calculation, 和identification任务,我们直接计算多项选择题的准确率进行模型效果评估。

对于CFBenchmark-OpenFinData中的explanation, analysis, 和compliance任务,我们利用文心一言4作为打分器,来判断模型生成结果和真实答案之间的正确性。

大模型的表现如下表所示:

CFBenchmark-Basic

ModelSizeCompanyProductR.AvgSectorEventSentimentC.AvgSummaryRiskSuggestionG.AvgAvg
GPT-3.5-79.719.849.845.345.842.545.559.354.177.163.552.9
GPT-4-83.338.260.848.250.149.949.465.360.279.268.259.4
ERNIE-Bot-3.5-80.730.053.340.835.018.631.571.559.071.667.350.7
ERNIE-Bot-4-81.941.761.841.835.837.538.472.162.971.868.956.4
ChatGLM2-6B6B74.731.353.028.530.035.731.465.745.467.159.447.9
ChatGLM3-6B6B75.125.250.233.532.739.735.368.453.670.564.249.9
GLM4-9B-Chat9B81.326.153.749.651.547.649.673.562.472.669.557.6
Qwen-Chat-7B7B76.336.056.240.036.726.534.454.830.737.941.143.9
Qwen1.5-Chat-7B7B83.535.359.434.337.551.641.173.758.773.168.556.3
Qwen2-Chat-7B7B82.434.858.654.449.941.148.575.055.976.969.258.8
Baichuan2-7B-Chat7B75.740.257.942.547.532.340.872.564.873.270.256.3
Baichuan2-13B-Chat13B79.731.455.647.250.738.745.573.963.474.670.657.2
InternLM2-7B-Chat7B75.719.547.646.428.442.239.073.754.374.967.651.4
InternLM2-20B-Chat20B74.227.650.948.432.437.439.473.258.074.168.452.9
InternLM2.5-7B-Chat7B75.224.349.853.134.345.744.474.557.073.268.254.1

CFBenchmark-OpenFinData

ModelSizeKnowledgeCaluationExplanationIdentificationAnalysisComplianceAverage
GPT-3.5-77.268.881.976.375.135.863.9
GPT-4-89.277.284.476.982.539.274.9
ERNIE-Bot-3.5-78.070.482.175.377.736.770.0
ERNIE-Bot-4-87.373.684.377.079.137.373.1
ChatGLM2-6B6B62.437.270.859.258.338.754.4
ChatGLM3-6B6B66.538.076.561.560.132.055.8
GLM4-9B-Chat9B81.856.979.363.578.229.564.9
Qwen-Chat-7B7B71.340.571.458.651.340.055.5
Qwen1.5-Chat-7B7B67.353.984.667.776.830.063.3
Qwen2-Chat-7B7B82.561.384.269.880.119.366.2
Baichuan2-7B-Chat7B46.237.076.560.255.028.750.6
Baichuan2-13B-Chat13B69.339.575.365.762.031.357.2
InternLM2-7B-Chat7B70.239.973.462.861.439.557.8
InternLM2-20B-Chat20B76.452.676.366.263.942.162.9
InternLM2.5-7B-Chat7B80.766.685.071.783.135.470.4

CFBenchmark

ModelSize金融自然语言金融场景计算金融分析与解读金融合规与安全平均
GPT-3.5-52.974.178.535.860.3
GPT-4-59.483.583.539.266.4
ERNIE-Bot-3.5-50.774.579.936.760.4
ERNIE-Bot-4-56.482.881.737.364.6
ChatGLM2-6B6B47.964.164.638.753.8
ChatGLM3-6B6B49.968.268.332.054.6
GLM4-9B-Chat9B57.667.478.829.558.3
Qwen-Chat-7B7B43.967.161.440.053.1
Qwen1.5-Chat-7B7B56.373.280.730.060.0
Qwen2-Chat-7B7B58.878.882.219.359.8
Baichuan2-7B-Chat7B56.361.065.828.753.0
Baichuan2-13B-Chat13B57.270.168.631.356.8
InternLM2-7B-Chat7B51.468.867.439.556.8
InternLM2-20B-Chat20B52.973.070.142.159.5
InternLM2.5-7B-Chat7B54.179.184.035.463.2

致谢

CFBenchmark 研发过程中参考了以下开源项目。 我们向项目的研究人员表示尊重和感谢。

未来的工作

  • 针对中文金融使用中各种场景,提出更多的评测任务,丰富CFBenchmark系列基准。

许可证

CFBenchmark是一项仅用于非商业使用的研究预览,受OpenAI生成数据的使用条款约束。如果您发现任何潜在的风险行为,请与我们联系。该代码发布在Apache License 2.0下。

感谢我们的贡献者 :

引用

@misc{lei2023cfbenchmark,
      title={{CFBenchmark}: Chinese Financial Assistant Benchmark for Large Language Model}, 
      author={Lei, Yang and Li, Jiangtong and Cheng, Dawei and Ding, Zhijun and Jiang, Changjun},
      year={2023},
      eprint={2311.05812},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}