学习目标
● 掌握Zero-shot方式下prompt的设计方式
● 掌握基于提示词利用LLM实现文本分类的方法
1.LLM文本分类任务介绍
下面几段文本来自某平台发布的金融领域文本:
金融文本 → 分类标签
1."今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。"==>新闻报道
2."ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉,此次收购将进一步巩固ABC公司在行业中的地位,并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏",==>公司公告
3."公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",==>财务公告
4."最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会"==>分析师报告
我们的目的是期望模型能够帮助我们识别出这4段话中,每一句话描述的是一个什么类型的报告。
因此,我们期望模型输出的结果为:
文本分类 → 实体抽取 → 关系分类 → 金融领域知识图谱
prompt
任务描述:现在干什么事情
输入数据:带分类的文本
输出要求:输出预定的类别标签
你是一个金融领域的专家,需要完成下面的金融文本分类任务。输入如下:
输入文本
输出的标签必须是下面的其中一个,不能是多个标签。
'新闻报警','公司公告','财务公告','分析师报告'
请完成文本分类。
['新闻报道','公司公告','财务公告','分析师报告']
2.Prompt设计
● 对于大模型来讲,prompt的设计非常重要,一个明确 的prompt能够帮助我们更好从大模型中获得我们想要的结果。
● 在该任务的prompt设计中,我们主要考虑2点:
○ 需要向模型解释什么叫作「文本分类任务」
**○**需要让模型按照我们指定的格式输出
● 为了让模型知道什么叫做「文本分类」,我们借用Incontext Learning的方式,先给模型展示几个正确的例子:
>>> User:"今日,故事经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的"
>>> Bot:新闻报道
>>> User:"本公司年底财务报告显示,去年公司实现了稳步增长的盈利,同时资产"
>>> Bot:财务报告
其中,User代表我们输入给模型的句子,Bot 代表模型的回复内容。
注意:上述例子中Bot 的部分也是由人工输入的,其目的是希望看到在看到类似User 中的句子时,模型类似Bot的回答
3.分类任务代码实现
● 本章节使用的模型是阿里云的通义千问大模型
**○**接入大模型的API
○ 构造prompt
○ 实现模型预测主函数
3.1接入通义千问大模型
● 进入阿里云的百炼大模型平台,完成注册,登录,实名(使用支付宝扫一下)。参考2.2接入商用大模型API
● 安装sdk测试代码
# 如果运行失败,您可以将pip替代成pip3再运行
pip install openai
复制上面的调试代码:
python
from openai import OpenAI
client = OpenAI(
api_key="your api key",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
# 模型列表: https://help.aliyun.com/zh/model-studio/getting-started/models
model="qwen-plus", # qwen-plus 属于 qwen3 模型,如需开启思考模式,请参见:https://help.aliyun.com/zh/model-studio/getting-started/models
messages=[
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': '你是谁?'}
]
)
print(completion.choices[0].message.content)
正常输出结果说明已经接入通义大模型 API成功
3.2对大模型接口进行封装
● 目的:封装成函数调用,为了屏蔽内部细节,方便调用
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author : wwc
@Time : 2026/7/16 13:10
@File : _model.py
@Function :
代码的封装
通常把代码写成函数调用或者类。屏蔽调用细节
好处:方便在其他代码模块复用
"""
import os
from openai import OpenAI
client = OpenAI(api_key=os.getenv("API_KEY"),
base_url=os.getenv("BASE_URL"))
# 封装成函数调用
def model_chat(content: str, model: str = "qwen-flash") -> str:
"""
大模型调用接口
1、确定入参和出参
2、写逻辑
返回模型回答的字符串结果
"""
# 参数校验
support_models = ["qwen-flash", "qwen-max", "qwen3-max"]
if not model in support_models:
raise ValueError(f"模型不在支持的列表中, {support_models}")
try:
completion = client.chat.completions.create(
model=model, # 模型
messages=[
{"role": "system", "content": "你是个人助手"},
{"role": "user", "content": content}
],
)
return completion.choices[0].message.content
except Exception as e:
print(e)
return ""
if __name__ == '__main__':
print(model_chat(content="你是什么模型,你能做什么", model="qwen-flash"))
封装以后的函数,可以直接输入文本指令,获取大模型的回答。
3.3编写金融文本分类的指令
首先来分析这个指令包含哪些内容
1.清晰的指令:告诉大模型完成金融行业的文本分类任务
2.输入数据分隔:根据输入数据和指定分类,需要明确输入数据的分隔符,通常用"###"分隔
3.明确的输出数据格式:输出结果必须是给定的分类标签,字符类型
python
你是一个金融行业的专家,现在需要根据输入的文本内容,确定是金融行业的具体类别,你只能从我给的类别中选择一个,类别以","分隔。
输入文本以###分隔,输入的内容如下:
###
{content}
###
分类的类别为
{label}
上述的内容所属的类别是什么?只能输出其中一个类别,不能输出其他标签
"""
3.4开发分类主函数
上面已经完成了大模型调用AP和输入指令了,接下来只需要把输入文本和标签拼接到指令中,再调大模型的AP接口,就可以得到最终的分类结果。
python
"""
@Author : wwc
@Time : 2026/7/16 13:10
@File : _01_finance_cls.py
@Function :
1. 写提示词
2. 写预测函数,输入是填充以后的提示词,输出是分类标签
3. 预测数据
"""
from _model import model_chat
# 提供所有类别以及每个类别下的样例
class_examples = {
'新闻报道': '今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告': '本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。',
'公司公告': '本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告': '最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势',
}
def classify_news(content):
"""
新闻分类函数
:param content: 新闻内容
:return: 类别
"""
label = ['新闻报道', '财务报告', '公司公告', '分析师报告']
prompt = """
你是一个金融行业的专家,现在需要根据输入的文本内容,确定是金融行业的具体类别,你只能从我 给的类别中选择一个,类别以","分隔。
输入文本以###分隔,输入的内容如下:
###
{content}
###
分类的类别为
{label}
上述的内容所属的类别是什么?只能输出其中一个类别,不能输出其他标签
""".format(content=content, label=label)
text = model_chat(content=prompt)
return text
if __name__ == '__main__':
for k,v in class_examples.items():
print(f"输入内容标签为\n[{k}]==>{v}")
text = classify_news(v)
print(f"模型预测结果为>>> {text}")
sentences = ["为保持银行体系流动性充裕,2024年12月26日人民银行以固定利率、数量招标方式开展了1063亿元逆回购操作"]
print("---" * 10)
print(f"预测样本 ==> {sentences[0]}")
输出结果:
python
D:\app\python\python.exe C:\Users\wwc\Desktop\Python练习\08阶段:大模型RAG开发\chapter02\demo\_01_finance_cls.py
输入内容标签为
[新闻报道]==>今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。
模型预测结果为>>> 新闻报道
输入内容标签为
[财务报告]==>本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。
模型预测结果为>>> 财务报告
输入内容标签为
[公司公告]==>本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力
模型预测结果为>>> 公司公告
输入内容标签为
[分析师报告]==>最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势
模型预测结果为>>> 分析师报告
------------------------------
预测样本 ==> 为保持银行体系流动性充裕,2024年12月26日人民银行以固定利率、数量招标方式开展了1063亿元逆回购操作
进程已结束,退出代码为 0
4.作业
请根据给出的新闻文本分类数据,获取dev.json数据前500条,使用提示词加大模型的方式,完成至少2种模型的效果评估。
python
# 数据集
{
"label": "102",
"label_desc": "news_entertainment",
"sentence": "江疏影甜甜圈自拍,迷之角度贾..."
},
{
"label": "110",
"label_desc": "news_military",
"sentence": "以色列大规模空袭开始!伊朗多个军事..."
},
{
"label": "104",
"label_desc": "news_finance",
"sentence": "出栏一头猪亏损300元。究竟谁能笑到..."
},
{
"label": "109",
"label_desc": "news_tech",
"sentence": "以前很火的巴铁为何现在只字不提?, k..."
},
{
"label": "112",
"label_desc": "news_travel",
"sentence": "作为一名酒店从业人员,你经历过房客哪..."
}
要求输出结果如下,课堂上要求输出至少两个大模型的评估指标,课后需要补充bert模型的评估指标。
| 模型名称 | 准确率 | 精确率 | 召回率 | F1值 |
|---|---|---|---|---|
| qwen-plus | 0.63 | 0.6 | 0.62 | 0.58 |
| qwen-flash | 0.58 | 0.596 | 0.641 | 0.575 |
| qwen-max | 0.568 | 0.58 | 0.558 | 0.543 |
| deepseek-V3.2 | 0.556 | 0.5506 | 0.5367 | 0.5259 |
5.总结
本节内容完成了基于通义大模型API实现金融文本分类的任务,重点内容包括:
1.学会接入商用平台API,这个工作中会用到
2.学会使用提示词完成分类任务,并且能够扩展到其他行业的分类任务
问题汇总:
● 调用大模型的时候,有些调用失败
● 生成新的分类了,大模型幻觉或者指令不遵从。(不到1%)
● 生成分类标签包含引号等其他符号,指令不遵从。(不到1%)
优化点
● 提示词中增加了few-shot