DISC-FinLLM:金融领域大语言模型及多专家系统解析
DISC-FinLLM 是一个专门针对金融场景下为用户提供专业、智能、全面的金融咨询服务的金融领域大模型。它由面向不同金融场景的四个模组构成:金融咨询、金融文本分析、金融计算、金融知识检索问答,形成了一个多专家智慧金融系统。

1. 概述
DISC-FinLLM 在金融 NLP 任务、人类试题、资料分析和时事分析等四个评测中展现出明显优势,证明了其能为广泛的金融领域提供强有力的支持。该系统能在不同应用场景下提供帮助,具体功能如下:
- 金融咨询:该模组可以在中国金融语境下,与用户展开关于金融话题的多轮对话,或是为用户解释金融专业的相关知识。这是由数据集中的金融咨询指令部分训练而来,能够适应中文金融环境的表达习惯和合规要求。
- 金融文本分析:该模组可以帮助用户在金融文本上完成信息抽取、情感分析、文本分类、文本生成等 NLP 任务。这部分能力源自数据集中的金融任务指令,适用于处理研报、新闻等非结构化数据。
- 金融计算:该模组可以帮助用户完成与数学计算相关的任务。除了利率、增长率等基本计算外,它还支持统计分析和包括 Black-Scholes 期权定价模型、EDF 预期违约概率模型在内的复杂金融模型计算。这一模组是由数据集中的金融计算指令部分训练而来,并集成了工具调用能力。
- 金融知识检索问答:该模组可以基于金融新闻、研报和相关政策文件为用户提供投资建议、时事分析、政策解读。它是由数据集中的检索增强指令部分训练而来,结合了 RAG(检索增强生成)技术以确保信息的时效性和准确性。
1.1 模型效果演示
金融咨询

金融文本分析

金融计算

金融知识检索问答

2. DISC-Fin-SFT 数据集
DISC-FinLLM 是基于构建的高质量金融数据集 DISC-Fin-SFT 在通用领域中文大模型 Baichuan-13B-Chat 上进行 LoRA 指令微调得到的金融大模型。DISC-Fin-SFT 总共包含约 25 万条数据,分为四个子数据集,它们分别是金融咨询指令、金融任务指令、金融计算指令、检索增强指令。

| 数据集 | 数据量 | 输入长度 | 输出长度 |
|---|
| 金融咨询指令 | 63k | 26 | 369 |
| 金融任务指令 | 110k | 676 | 35 |
| 金融计算指令 | 57k | 73 | 190 |
| 检索增强指令 | 20k | 1031 | 521 |
| DISC-Fin-SFT | 246k | 351 | 198 |
2.1 金融咨询指令
金融咨询指令数据来源于三部分:
- Wealth-alpaca-lora:这是一个英文的金融问答数据集,且其部分答案不符合中国国情和立场。因此我们将 FiQA 中的所有问题翻译成中文,并使用 ChatGPT 重新生成问题的答案,来提高这一数据集的质量,确保符合本地化语境。
- 金融名词解释:我们在网上收集了 200 多个金融领域的专业术语(如:杠杆收购),然后使用 ChatGPT 为这些专业词汇生成相应的问答对,用以训练模型对金融术语的理解,提升专业度。
- 经管之家论坛上的公开发帖:我们利用 self-chat prompting 方法引导 ChatGPT 围绕帖子主题生成多轮的问答,模拟真实用户的交互场景。
在引导 ChatGPT 生成数据的过程中,我们通过精心设计的 prompt 确保生成的问答符合中国的国情、立场、态度和语言风格,避免产生合规风险。
2.2 金融任务指令
金融任务指令数据来源于两个部分:
- 金融 NLP 数据集:该部分是基于已有的金融 NLP 数据集,通过人工编写的 prompt 改编而来的。我们搜集了十余个开源的 NLP 中文数据集,可以分为情绪分析、信息抽取、文本生成、文本分类和翻译等几类。此数据集的分布如下所示:
| 数据集 | 主要任务类型 | 次要任务类型 | 数据量 |
|---|
| FPB | 情感分析 | 情感分析 | 18690 |
| FIQA-SA | 情感分析 | 情感分析 | - |
| FNSC | 情感分析 | 情感分析 | - |
| CCKS-NEC-2022 | 信息抽取 | 因果抽取 | 7499 |
| SmoothNLP IEE | 信息抽取 | 事件抽取 | 3256 |
| SmoothNLP NHG | 文本生成 | 文本生成 | 4642 |
| CCKS2022-event | 文本分类 | 事件类型分类 | 3578 |
| Minds14 | 文本分类 | 意图识别 | 59143 |
| Financial Report | 信息抽取 | 实体抽取 | 61705 |
| OpenKG | 信息抽取 | 实体抽取 | 7672 |
| OpenKG | 信息抽取 | 实体抽取 | 67921 |
| FDDC2018 | 翻译 | 术语翻译 | 333 |
| Wealth-alpaca-lora | 文本生成 | 关键词生成 | 41825 |
- 金融无标签文本数据集:我们基于无标注的金融文本构建金融阅读理解数据集。我们从东方财富网收集了 87k 篇文章,包括金融新闻和行业研报摘要。然后,引导 ChatGPT 先生成问题,再生成答案,得到(金融文本、问题、答案)这样的三元组,并进一步使用阅读理解任务模板改写为指令对,增强模型的上下文理解能力。
金融计算指令
在金融计算中,表达式计算器、方程求解器、正态概率表、计数器四种工具可以帮助模型完成大多数的计算任务。四种工具各有不同的调用命令、输入和输出。例如,计算器的命令是 [Calculator(expression)→result]。在这一部分,构建金融计算指令的目的就是训练模型在合适的时候调用这些工具解决数学问题,而不是仅靠参数记忆。
四个工具的定义如下表所示:
| 工具名称 | 工具描述 |
|---|
| 表达式计算器 | 输入:初等函数的数学表达式;输出:表达式的计算结果(小数表示) |
| 方程求解器 | 输入:方程组;输出:方程组的解 |
| 计数器 | 输入:包含数据样本的数组;输出:样本数量 |
| 概率表 | 输入:数字;输出:正态分布累积分布函数在这个数字处的值 |
首先构建了一个种子任务库,其中的种子任务由三部分组成:根据金融考试人工改写的计算题、带有研报上下文的数据计算题、BELLE 数据集中校园数学部分的通用数学题。特别地,根据 Toolformer 的方法,这些问题的答案中插入着上述四个工具的调用命令,它们代表着调用工具的方法和时机。随后,为了增加数据的数量和多样性,我们通过小样本思维链提示(Few-shot Chain-of-Thought Prompting)方法,让 ChatGPT 在提示词的引导下,根据种子任务生成超过 5 万个新问答对,其中的答案也带有插件命令,从而强化模型的工具使用逻辑。
2.3 检索增强指令
检索增强指令的构造分为三步。第一步,我们根据新闻和研报等金融文本构造金融分析问题。第二步,我们在知识库中检索与问题有关的文档,其中参考文档源于我们构建金融知识库,包含 18k 研报和 69k 金融新闻。第三步,我们将问题和参考资料结合在一起,生成问题的答案。在这个过程中,问题和答案是由 ChatGPT 通过 Chain-of-Retrieval (CoR) prompting 方法生成的。最终我们构建了一个由 20k 条检索增强指令组成的数据集,其中的指令涵盖了金融领域中主要的分析形式,包括行业分析、政策分析、投资建议、公司战略规划等。
我们展示了 DISC-FinLLM-SFT 训练数据样例,您可以访问相关资源下载数据集。
3. 模型微调
3.1 LoRA 微调
针对金融领域的不同功能,我们首先采用了多专家微调的训练策略。我们在特定的子数据集上训练模型的各个模组,使它们彼此互不干扰,独立完成不同任务。为此,我们以 Baichuan-13B-Chat 为基座模型,使用 LoRA 方法高效地进行参数微调。

通过数据集的四个部分,分别训练 4 个 LoRA 专家模组。部署时,用户只需更换在当前基座上的 LoRA 参数就可以切换功能。因此用户能够根据使用需求激活/停用模型的不同模组,而无需重新加载整个模型,极大地降低了推理成本和延迟。4 个 LoRA 专家模组分别如下:
- 金融顾问:该模型用于多轮对话。由于我们的金融咨询指令数据十分丰富,该模型可以在中国的金融语境下做出高质量的回答,为用户解答金融领域的专业问题,提供优质的咨询服务。
- 文件分析师:该模型主要用于处理金融自然语言处理领域内的各种任务,包括但不限于金融文本中的信息抽取、情绪分析等。
- 财务会计师:DISC-FinLLM 支持四种工具,即表达式计算器、方程求解器、计数器和概率表。这些工具支持我们的模型完成金融领域的大多数的计算任务,如金融数学建模、统计分析等。当模型需要使用工具时,它可以生成工具调用命令,然后中断解码,并将工具调用结果添加到生成的文本中。这样,DISC-FinLLM 就可以借助工具提供的准确计算结果,回答金融中的计算问题。
- 时事分析师:我们在第四个 LoRA 训练中引入检索插件。DISC-FinLLM 主要参考了三类金融文本:新闻、报告和政策。当用户问及时事、行业趋势或金融政策等常见金融话题时,我们的模型可以检索相关文件,并像金融专家一样展开分析并提供建议。
3.2 全量微调
我们以 Baichuan-13B-Chat 为基座模型,混合了所有数据,在 8 * Nvidia A800 80 GB + deepspeed 的环境下进行了全量微调测试。全量微调旨在融合各模组的知识,提升模型在综合金融任务上的表现,但需要更高的显存成本。
4. 推理和部署
当前版本的 DISC-FinLLM 是基于 Baichuan-13B-Chat 训练得到的。我们分别使用不同数据进行了 LoRA 训练,以及使用全部数据进行了全参训练。您可以直接从 Hugging Face 上下载我们的模型权重。
首先,您需要安装项目的依赖环境。
pip install -r requirements.txt
5. 快速开始
5.1 全参模型
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation.utils import GenerationConfig
from peft import PeftModel, PeftConfig
model_path = "Go4miii/DISC-FinLLM"
model = AutoModelForCausalLM.from_pretrained(
model_path, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True
)
model.generation_config = GenerationConfig.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(
model_path, use_fast=False, trust_remote_code=True,
)
messages = [
{"role": "user", "content": "请解释一下什么是银行不良资产?"},
]
response = model.chat(tokenizer, messages)
print(response)
5.2 LoRA 模型
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation.utils import GenerationConfig
from peft import PeftModel, PeftConfig
model_path = "Go4miii/DISC-FinLLM"
model = AutoModelForCausalLM.from_pretrained(
model_path, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True
)
model.generation_config = GenerationConfig.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(
model_path, use_fast=False, trust_remote_code=True,
)
lora_path = "Go4miii/DISC-FinLLM/Baichuan-13B-Chat-lora-Task"
model = PeftModel.from_pretrained(model, lora_path)
messages = [
{"role": "user", "content": "请解释一下什么是银行不良资产?"},
]
response = model.chat(tokenizer, messages)
print(response)
我们的四个 LoRA 路径,使用时将上述 lora_path 替换为下面路径就可以:
lora_path='Go4miii/DISC-FinLLM/Baichuan-13B-Chat-lora-Task'
lora_path='Go4miii/DISC-FinLLM/Baichuan-13B-Chat-lora-Consulting'
lora_path='Go4miii/DISC-FinLLM/Baichuan-13B-Chat-lora-Computing'
lora_path='Go4miii/DISC-FinLLM/Baichuan-13B-Chat-lora-Retrival'
5.3 命令行工具
python cli_demo.py
5.4 网页 Demo
依靠 streamlit 工具运行以下命令,会在本地启动一个 web 服务,把控制台给出的地址输入浏览器即可访问:
streamlit run web_demo.py --server.port 8888
此外,目前版本的 DISC-FinLLM 是以 Baichuan-13B 作为基座的,您可以参照 Baichuan-13B 的介绍来进行 int8 或 int4 量化推理部署以及 CPU 部署,以适应不同的硬件环境。
6. DISC-Fin-Eval-Benchmark
我们建立了一个全面的评估框架 —— DISC-Fin-Eval Benchmark,从各个角度严格评估我们的模型。该评估框架包括四个不同的组成部分,即:金融 NLP 任务、人类试题、资料分析和时事分析。这一评估框架全面地证明了我们模型能力和训练数据的有效性。
6.1 测评方法
首先,我们所用的评测数据集是超对称团队针对金融行业的预训练模型发布的一套目前中文领域金融大模型最专业的评测数据集 BBT CFLEB,包含八个标准语言任务,包括摘要生成、文本分类、关系抽取、事件抽取和其他任务,用以衡量不同的模型的多维能力,并促进金融大模型研发。
我们目前提供了 baichuan-7b、baichuan-13b-base、baichuan-13b-chat、bloomz-7b、chatglm、chatglm2、fingpt-v3 的评测代码,同时也可以加入针对自己数据训练出来的 lora 权重进行评测。下面介绍评测的几个步骤:
第一步:运行脚本 preprocess.py,会在本地创建一个 data 的文件夹,把八个任务的数据集下载到本地,并且会针对每个数据集进行相应的处理,方便后续进行评测。同时还会生成一个 instruct_samples.json 文件,这里保存着每个数据集的 few-shot。这里需要说明的一点是:我们将第七个数据集拆分成两个数据集,对应着两个不同的任务。
第二步:使用如下命令运行脚本 autoeval.py:
python autoeval.py --model xxxx --lora_path xxxx --eval_data all --device cuda:0
目前 model 可以分别设置为:chatglm-6b、chatglm2-6b、baichuan-7b、baichuan-13b-base、baichuan-13b-chat、bloomz-7b、fingpt-v3。
第三步:最终的评测结果会自动保存成 json 文件。
如果需要在其他模型上进行评测,需要修改源代码。主要分为以下两步:
- 第一步:在
finllm.py 代码中自定义一个模型类,该类需要继承 DISCFINLLMBase 类,并实现 generate 函数,其中 generate 函数的输入为任意提示文本,输出为模型的回复。
import os
from evaluator.finllm import DISCFINLLMBase
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
os.environ["OPENAI_API_KEY"] = ""
os.environ["OPENAI_API_BASE"] = ""
class OpenAILLM(DISCFINLLMBase):
def __init__(self):
self.model = ChatOpenAI()
def generate(self, prompt: str) -> str:
messages = [HumanMessage(content=prompt)]
response = self.model(messages).content
return response
python evaluate.py
6.2 评测系统
金融 NLP 任务评测
我们使用 FinCUGE 评估基准测试模型处理金融 NLP 任务的能力。这个评测一共包含八项任务,其中包括情感分析、关系抽取、文本摘要、文本分类、事件抽取和其他任务。我们通过提示模板将这个数据集改造为小样本(few-shot)形式,使用常用的准确度(accuracy)、F1 和 Rouge 指标评价模型的表现,来衡量模型在金融领域中理解文本和生成相关回答的能力。评测结果(%)如下:
| 模型 ↓ 评测集 → | FinFE (Accuracy) | FinQA (F1) | FinCQA (F1) | FinNA (ROUGE) | FinRE (F1) | FinESE (F1) | 平均值 |
|---|
| Baichuan-13B-Chat | 64.8 | 38.1 | 33.6 | 31.0 | 9.1 | 18.6 | 31.0 |
| (LoRA) | 69.3 | 42.4 | 42.0 | 30.9 | 10.1 | 45.3 | 40.0 |
| ChatGLM | 56.7 | 31.8 | 35.1 | 32.5 | 13.0 | 48.7 | 36.3 |
| (LoRA) | 60.7 | 41.4 | 36.4 | 34.7 | 10.7 | 46.2 | 38.4 |
| ChatGLM2 | 61.3 | 28.8 | 35.9 | 28.9 | 11.7 | 42.1 | 34.8 |
| (LoRA) | 65.3 | 37.6 | 36.4 | 33.4 | 11.8 | 39.5 | 37.3 |
人类试题评测

FinEval 是一个包含高质量多项选择题的集合,涵盖金融、经济、会计和证书等领域。它包括 4,661 个问题,涵盖了 34 个不同的学术科目。为了确保对模型性能进行全面的评估,FinEval 采用了多种方法,包括 zero-shot,few-shot,仅预测答案(answer-only)和思维链(chain-of-thought)提示词。通过在 FinEval 上评估最先进的中英文大语言模型,结果显示只有 GPT-4 在不同提示设置下达到了接近 70% 的平均准确率,表明大语言模型在金融领域知识方面具有显著的增长潜力。我们的工作提供了一个更全面的金融知识评估基准,利用了模拟考试数据,涵盖了广泛的大语言模型评估范围。
我们使用了 FIN-Eval 基准评估模型在回答真人生成的金融问题上的能力,这个基准涵盖了金融、经济、会计、证书等学科的高质量多项选择题。我们以准确度为指标,来衡量模型的表现。评测结果(%)如下:
| 模型 | 金融 | 经济 | 会计 | 证书 | 平均值 |
|---|
| GPT-4 | 71.0 | 74.5 | 59.3 | 70.4 | 68.6 |
| ChatGPT | 59.3 | 61.6 | 45.2 | 55.1 | 55.0 |
| Baichuan-13B-Base | 52.6 | 50.2 | 43.4 | 53.5 | 50.1 |
| Baichuan-13B-Chat | 51.6 | 51.1 | 41.7 | 52.8 | 49.4 |
| ChatGLM2-6B | 46.5 | 46.4 | 44.5 | 51.5 | 47.4 |
| InternLM-7B | 49.0 | 49.2 | 40.5 | 49.4 | 47.1 |
| InternLM-Chat-7B | 48.4 | 49.1 | 40.8 | 49.5 | 47.0 |
| LLaMA-2-Chat-70B | 47.1 | 46.7 | 41.5 | 45.7 | 45.2 |
| FinGPT-v3-6B | 50.5 | 42.5 | 50.8 | 52.1 | 49.6 |
| DISC-FinLLM(金融咨询) | 54.4 | 45.4 | 52.8 | 51.8 | 51.6 |
| DISC-FinLLM(金融任务) | 57.4 | 48.8 | 49.5 | 49.7 | 51.5 |
|
资料分析评测
我们手动构造了一个由 100 个财经计算题组成的数据集,用于评估模型在计算任务中的能力。这些测评问题改编自中国行政职业能力测验中的材料分析计算题,包括计算同比增长率和产值比例等。我们根据模型给出计算公式和计算结果的正确率来评估模型的表现。评测结果如下:
| 计算公式 | 计算公式与结果 |
|---|
| GPT-3.5-turbo | 0.28 | 0.26 |
| Baichuan-13B-Chat | 0.20 | 0.12 |
| DISC-FinLLM(金融计算) | 0.35 | 0.35 |

7. 总结与展望
DISC-FinLLM 通过多专家架构有效解决了单一模型难以兼顾金融领域多样化任务的问题。LoRA 微调方案使得模型在保持基座能力的同时,能够灵活切换特定功能,降低了部署门槛。在评估体系中,模型在金融计算和人类试题方面表现突出,特别是在结合工具调用后,计算准确率显著提升。未来工作可进一步优化检索增强机制,减少幻觉,并探索更多垂直金融场景的深度适配。