3.3 LLM实现金融文本分类
基于Zero-shot方式实现LLM文本分类¶
学习目标¶
- 掌握Zero-shot方式下prompt的设计方式
- 掌握利用LLM实现文本分类的代码
1 LLM文本分类任务介绍¶
- 下面几段文本来自某平台发布的金融领域文本:
1."今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",
2."ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉,此次收购将进一步巩固ABC公司在行业中的地位,并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏",
3."公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",
4."最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",
-
我们的目的是期望模型能够帮助我们识别出这4段话中,每一句话描述的是一个什么类型的报告。
-
因此,我们期望模型输出的结果为:
['新闻报道', '公司公告', '财务公告 '分析师报告']
2 Prompt设计¶
-
对于大模型来讲,prompt 的设计非常重要,一个
明确的 prompt 能够帮助我们更好从大模型中获得我们想要的结果。 -
在该任务的 prompt 设计中,我们主要考虑 2 点:
-
需要向模型解释什么叫作「文本分类任务」
-
需要让模型按照我们指定的格式输出
-
为了让模型知道什么叫做「文本分类」,我们借用 Incontext Learning 的方式,先给模型展示几个正确的例子:
-
```
User: "今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。" 是['新闻报道', '公司公告', '财务公告 '分析师报告']里的什么类别? Bot: 新闻报道 User: "本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。"是['新闻报道', '公司公告', '财务公告 '分析师报告']里的什么类别? Bot: 财务报告 ```
其中,
User代表我们输入给模型的句子,Bot代表模型的回复内容。注意:上述例子中
Bot的部分也是由人工输入的,其目的是希望看到在看到类似User中的句子时,模型应当做出类似Bot的回答。
3 分类任务代码实现¶
- 本章节使用的模型为ChatGLM-6B,参数参数较大(6B),下载到本地大概需要 12G+ 的磁盘空间,请确保磁盘有充足的空间。此外,加载模型大概需要 13G 左右的显存,如果您显存不够,可以进行模型量化加载以缩小模型成本。
- 本次分类任务实现的主要过程:
- 构造prompt
- 实现模型预测
-
代码存放位置:/Users/**/PycharmProjects/llm/zero-shot/finance_classify.py
-
llm_classification.py脚本中包含两个函数:init_prompts()和inference()
3.1 导入必备的工具包¶
# —*-coding:utf-8-*-
"""
利用 LLM 进行文本分类任务。
"""
from rich import print
from rich.console import Console
from transformers import AutoTokenizer, AutoModel
# 提供所有类别以及每个类别下的样例
class_examples = {
'新闻报道': '今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告': '本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。',
'公司公告': '本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告': '最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势'}
3.2 构建init_prompts()函数¶
- 目的:进行prompt设计
- 具体代码实现:
def init_prompts():
"""
初始化前置prompt,便于模型做 incontext learning。
"""
class_list = list(class_examples.keys())
pre_history = [
(
f'现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。',
f'好的。'
)
]
for _type, exmpale in class_examples.items():
pre_history.append((f'“{exmpale}”是 {class_list} 里的什么类别?', _type))
return {'class_list': class_list, 'pre_history': pre_history}
3.3 构建inference()函数
- 目的:实现文本分类
- 具体代码实现
def inference(
sentences: list,
custom_settings: dict
):
"""
推理函数。
Args:
sentences (List[str]): 待推理的句子。
custom_settings (dict): 初始设定,包含人为给定的 few-shot example。
"""
for sentence in sentences:
with console.status("[bold bright_green] Model Inference..."):
sentence_with_prompt = f"“{sentence}”是 {custom_settings['class_list']} 里的什么类别?"
response, history = model.chat(tokenizer, sentence_with_prompt, history=custom_settings['pre_history'])
print(f'>>> [bold bright_red]sentence: {sentence}')
print(f'>>> [bold bright_green]inference answer: {response}')
- 代码调用
if __name__ == '__main__':
console = Console()
#device = 'cuda:0'
device = 'cpu'
tokenizer = AutoTokenizer.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True)
# model = AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True).float()
model.to(device)
sentences = [
"今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",
"ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉,此次收购将进一步巩固ABC公司在行业中的地位,并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏",
"公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",
"最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",
]
custom_settings = init_prompts()
print(custom_settings)
inference(
sentences,
custom_settings
)
- 打印结果:

小结总结¶
本章节主要介绍了基于Few-shot方式实现ChatGLM模型来完成文本分类的过程。