金融AI:零样本到少样本的智能进化

发布时间:2026/7/2 17:01:12

金融AI:零样本到少样本的智能进化 一.项目背景在当今金融数据爆发式增长的当下如何从海量信息中挖掘价值以辅助决策、规避风险已成为行业痛点。随着人工智能技术的成熟将其应用于金融数据分析已成为热门趋势。这不仅能提升金融服务的精准度与效率更能有效辅助投资者优化决策因此该领域的研究兼具理论价值与现实意义。二.项目任务和方法介绍项目任务主要分为三个业务场景分别为文本分类文本信息抽取文本匹配。而对应选择的大模型为deepseek采用思想是基于Few-ShotZero-Shot以及Instrunction的思想来设计对应prompt从而完成对应项目的三个业务。2.1 什么是ShotShot在机器学习中指的是样本数量即模型在完成任务前能看到多少个示例。比如下面3个shot的对应含义及例子数量对比类型含义示例数量Zero-Shot零样本学习0个示例One-Shot单样本学习1个示例Few-Shot少样本学习少量示例(通常1-5个)2.2 Zero-Shot零样本Zero-Shot是指模型在没有任何示例的情况下仅通过任务描述直接完成任务。优点简单快捷、节省token、适合常见任务缺点复杂任务可能效果不佳2.3 Few-Shot少样本Few-Shot少样本是指在提示中提供少量输入-输出示例让模型通过上下文学习理解任务模式。优点能处理复杂任务、输出格式更可控、准确率更高缺点占用更多token、需要精心设计示例2.4 Instruction指令微调是指通过大量指令-期望输出配对数据对模型进行训练让模型更好地理解和遵循人类指令。也就是要使用预训练模型在指令微调的条件下使模型更能理解人类意图通过这个过程得到的模型对于Zero-Shot能力有着很大的提升。三种关系图如下所示2.5 总结建议场景推荐方法原因简单常见任务Zero-Shot快速高效复杂/特殊格式任务Few-Shot示例能明确期望需要稳定专业输出InstructionFew-Shot双重保障推理类问题Zero-ShotCoT让模型逐步思考总之Zero-Shot是直接下命令Few-Shot是先看例子再干活Instruction是提前培训让员工更懂你。三者结合使用能让大语言模型发挥最大价值三.环境准备此项目运行所需要安装的相关依赖包如下所示四.实现金融文本分类任务4.1 介绍列举一个例子下面几段文本来自某平台发布的金融领域文本1.今日央行发布公告宣布降低利率以刺激经济增长。这一降息举措将影响贷款利率并在未来几个季度内对金融市场产生影响。, 2.ABC公司今日发布公告称已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉此次收购将进一步巩固ABC公司在行业中的地位并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏, 3.公司资产负债表显示公司偿债能力强劲现金流充足为未来投资和扩张提供了坚实的财务基础。, 4.最新的分析报告指出可再生能源行业预计将在未来几年经历持续增长投资者应该关注这一领域的投资机会,该任务目的是期望模型能够帮助我们识别出这4段话中每一句话描述的是一个什么类型的报告。因此我们期望模型输出的结果为[新闻报道, 公司公告, 财务公告 分析师报告]4.2 对应代码实现导入必要的包以及样例# 利用LLM进行文本分类任务 from rich import print from rich.console import Console import requests import json DEEPSEEK_API_KEY your_deepseek_api_key # 替换成你的DeepSeek API Key DEEPSEEK_BASE_URL https://api.deepseek.com/v1/chat/completions # 基础地址 MODEL_NAME deepseek-chat # 可根据需求调整 # 提供所有类别以及每个类别下的样例 class_examples { 新闻报道: 今日股市经历了一轮震荡受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整以适应市场的不确定性。, 财务报告: 本公司年度财务报告显示去年公司实现了稳步增长的盈利同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。, 公司公告: 本公司高兴地宣布成功完成最新一轮并购交易收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域提高市场竞争力, 分析师报告: 最新的行业分析报告指出科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素投资者应关注这些趋势 }构建init_prompt()函数# 构建init_prompt()函数 prompt设计 def init_prompt(): # 初始化前置prompt便于模型做 incontext Learning class_list list(class_examples.keys()) pre_history [ { role: user, content: f现在你是一个文本分类器需要按照要求将我给你的句子进行分类{class_list}类别中。 }, { role: assistant, content: 好的。 } ] # 补充少样本示例到对话历史 for _type, example in class_examples.items(): pre_history.append({ role: user, content: f{example}是{class_list}里的什么类别 }) pre_history.append({ role: assistant, content: _type }) return {class_list: class_list, pre_history: pre_history}实现文本分类# 实现文本分类 def inference( sentences: list, # 待推理的句子。 custom_settings: dict # 初始设定包含人为给定的 few-shot example。 ): console Console() # 初始化console用于状态提示 headers { Content-Type: application/json, Authorization: fBearer {DEEPSEEK_API_KEY} } for sentence in sentences: with console.status([bold bright_green] Model Inference...): # 构建当前待分类的请求 current_prompt f“{sentence}”是 {custom_settings[class_list]} 里的什么类别 # 拼接完整的对话历史少样本示例 当前请求 messages custom_settings[pre_history] [ {role: user, content: current_prompt} ] # 构造API请求体 payload { model: MODEL_NAME, messages: messages, temperature: 0.1, # 分类任务建议低温度保证结果稳定 max_tokens: 50, # 分类结果仅需类别名称限制token数 stream: False # 非流式响应 } # 调用DeepSeek API response requests.post( urlDEEPSEEK_BASE_URL, headersheaders, datajson.dumps(payload), timeout30 ) response.raise_for_status() # 抛出HTTP请求异常 result response.json() # 提取模型回复 inference_answer result[choices][0][message][content].strip() # 打印结果 print(f [bold bright_red]sentence: {sentence}) print(f [bold bright_green]inference answer: {inference_answer})最后调用模型运行即可得到结果if __name__ __main__: # 初始化分类配置 custom_settings init_prompt() print(初始化prompt配置, custom_settings) # 待分类的句子列表 sentences [ 今日央行发布公告宣布降低利率以刺激经济增长。这一降息举措将影响贷款利率并在未来几个季度内对金融市场产生影响。, ABC公司今日发布公告称已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉此次收购将进一步巩固ABC公司在行业中的地位并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏, 公司资产负债表显示公司偿债能力强劲现金流充足为未来投资和扩张提供了坚实的财务基础。, 最新的分析报告指出可再生能源行业预计将在未来几年经历持续增长投资者应该关注这一领域的投资机会, ] # 执行分类推理 inference(sentences, custom_settings)五.实现金融文本信息抽取5.1 介绍首先定义其中信息抽取的Schema# 定义不同实体下的具备属性 schema { 金融: [日期, 股票名称, 开盘价, 收盘价, 成交量], }比如下面几段文本的股票信息来源于网络1.2023-02-15寓意吉祥的节日股票佰笃[BD]美股开盘价10美元虽然经历了波动但最终以13美元收盘成交量微幅增加至460,000投资者情绪较为平稳。, 2.2023-04-05市场迎来轻松氛围股票盘古(0021)开盘价23元尽管经历了波动但最终以26美元收盘成交量缩小至310,000投资者保持观望态度。,主要目标就是将这几段股票信息提取其中上述所描述的Schema的相关信息。5.2 对应代码实现导入必备的工具包import re import json from rich import print from transformers import AutoTokenizer, AutoModel # 定义不同实体下的具备属性 schema { 金融: [日期, 股票名称, 开盘价, 收盘价, 成交量], } IE_PATTERN {}\n\n提取上述句子中{}的实体并按照JSON格式输出上述句子中不存在的信息用[原文中未提及]来表示多个值之间用,分隔。 # 提供一些例子供模型参考 ie_examples { 金融: [ { content: 2023-01-10股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元一度飙升至105美元随后回落至98美元最终以102美元收盘成交量达到520000。, answers: { 日期: [2023-01-10], 股票名称: [古哥-D[EOOE]美股], 开盘价: [100美元], 收盘价: [102美元], 成交量: [520000], } } ] }构建init_prompts()函数def init_prompts(): 初始化前置prompt便于模型做 incontext learning。 ie_pre_history [ ( 现在你需要帮助我完成信息抽取任务当我给你一个句子时你需要帮我抽取出句子中实体信息并按照JSON的格式输出上述句子中没有的信息用[原文中未提及]来表示多个值之间用,分隔。, 好的请输入您的句子。 ) ] for _type, example_list in ie_examples.items(): print(f信息抽取样本的原始句子是--》{example_list}) for example in example_list: sentence example[content] properties_str , .join(schema[_type]) schema_str_list f“{_type}”({properties_str}) sentence_with_prompt IE_PATTERN.format(sentence, schema_str_list) ie_pre_history.append(( f{sentence_with_prompt}, f{json.dumps(example[answers], ensure_asciiFalse)} )) print(fie_pre_history--{ie_pre_history}) return {ie_pre_history: ie_pre_history}构建clean_response()函数def clean_response(response: str): 后处理模型输出。 Args: response (str): _description_ if json in response: res re.findall(rjson(.*?), response) if len(res) and res[0]: response res[0] response.replace(、, ,) try: return json.loads(response) except: return response构建inference()函数def inference( sentences: list, custom_settings: dict ): 推理函数。 Args: sentences (List[str]): 待抽取的句子。 custom_settings (dict): 初始设定包含人为给定的 few-shot example。 for sentence in sentences: cls_res 金融 if cls_res not in schema: print(fThe type model inferenced {cls_res} which is not in schema dict, exited.) exit() properties_str , .join(schema[cls_res]) schema_str_list f“{cls_res}”({properties_str}) sentence_with_ie_prompt IE_PATTERN.format(sentence, schema_str_list) ie_res, _ model.chat(tokenizer, sentence_with_ie_prompt, historycustom_settings[ie_pre_history]) ie_res clean_response(ie_res) print(f [bold bright_red]sentence: {sentence}) print(f [bold bright_green]inference answer: ) print(ie_res)代码调用if __name__ __main__: #device cuda:0 device cpu tokenizer AutoTokenizer.from_pretrained(./ChatGLM-6B/THUDM/chatglm-6b, trust_remote_codeTrue) #model AutoModel.from_pretrained(./ChatGLM-6B/THUDM/chatglm-6b, # trust_remote_codeTrue).half().cuda() model AutoModel.from_pretrained(./ChatGLM-6B/THUDM/chatglm-6b, trust_remote_codeTrue).float() model.to(device) sentences [ 2023-02-15寓意吉祥的节日股票佰笃[BD]美股开盘价10美元虽然经历了波动但最终以13美元收盘成交量微幅增加至460,000投资者情绪较为平稳。, 2023-04-05市场迎来轻松氛围股票盘古(0021)开盘价23元尽管经历了波动但最终以26美元收盘成交量缩小至310,000投资者保持观望态度。, ] custom_settings init_prompts() inference( sentences, custom_settings )六. 实现金融文本匹配6.1 介绍例如下面几段中每一对句字相比较看是否相似由大模型输出即相似与不相似。1.(股票市场今日大涨投资者乐观。, 持续上涨的市场让投资者感到满意。), 2.(油价大幅下跌能源公司面临挑战。, 未来智能城市的建设趋势愈发明显。), 3.(利率上升影响房地产市场。, 高利率对房地产有一定冲击。),6.2 对应代码实现# 导入必备的工具包 from rich import print from transformers import AutoTokenizer, AutoModel import os # 提供相似、不相似的语义匹配例子 examples { 是: [ (公司ABC发布了季度财报显示盈利增长。, 财报披露公司ABC利润上升。), ], 不是: [ (黄金价格下跌投资者抛售。, 外汇市场交易额创下新高。), (央行降息刺激经济增长。, 新能源技术的创新。) ] } # 3.2 构建 init_prompts() 函数 def init_prompts(): 初始化前置 prompt便于模型做 in-context learning。 Returns: dict: 包含 pre_history 的字典用于后续推理 pre_history [ ( 现在你需要帮助我完成文本匹配任务当我给你两个句子时你需要回答我这两句话语义是否相似。只需要回答是否相似不要做多余的回答。, 好的我将只回答是或不是。 ) ] for key, sentence_pairs in examples.items(): for sentence_pair in sentence_pairs: sentence1, sentence2 sentence_pair pre_history.append(( f句子一{sentence1}\n句子二{sentence2}\n上面两句话是相似的语义吗, key )) return {pre_history: pre_history} # 3.3 构建 inference() 函数 def inference(sentence_pairs: list, custom_settings: dict, model, tokenizer): 推理函数。 Args: sentence_pairs (List[tuple]): 待推理的句子对列表 custom_settings (dict): 初始设定包含人为给定的 few-shot example model: 加载的语言模型 tokenizer: 加载的分词器 print(\n *60) print([bold cyan]开始语义匹配推理[/bold cyan]) print(*60 \n) results [] for idx, sentence_pair in enumerate(sentence_pairs, 1): sentence1, sentence2 sentence_pair sentence_with_prompt ( f句子一{sentence1}\n f句子二{sentence2}\n f上面两句话是相似的语义吗 ) response, history model.chat( tokenizer, sentence_with_prompt, historycustom_settings[pre_history] ) results.append({ id: idx, sentence1: sentence1, sentence2: sentence2, answer: response }) print(f[bold yellow]【样本 {idx}】[/bold yellow]) print(f 句子一[white]{sentence1}[/white]) print(f 句子二[white]{sentence2}[/white]) print(f 匹配结果[bold green]{response}[/bold green]\n) print(*60) print(f[bold cyan]推理完成共处理 {len(results)} 个样本[/bold cyan]) print(*60) return results # 主程序入口 if __name__ __main__: # 设备配置 device cpu # 可根据需要改为 cuda:0 # 加载模型和分词器 print([bold blue]正在加载 ChatGLM-6B 模型...[/bold blue]) tokenizer AutoTokenizer.from_pretrained( ./ChatGLM-6B/THUDM/chatglm-6b, trust_remote_codeTrue ) model AutoModel.from_pretrained( ./ChatGLM-6B/THUDM/chatglm-6b, trust_remote_codeTrue ).float().to(device) print([bold green]模型加载完成[/bold green]\n) # 待测试的句子对 sentence_pairs [ (股票市场今日大涨投资者乐观。, 持续上涨的市场让投资者感到满意。), (油价大幅下跌能源公司面临挑战。, 未来智能城市的建设趋势愈发明显。), (利率上升影响房地产市场。, 高利率对房地产有一定冲击。), ] # 初始化 prompt custom_settings init_prompts() # 执行推理 results inference(sentence_pairs, custom_settings, model, tokenizer)七. 总结这是一个利用大语言模型处理金融文本的项目核心是用提示工程让AI干三件事给金融文本分类、从文本里抽取关键信息、判断两句话意思是否相似。项目的关键在于教会AI怎么干活——简单任务直接下命令Zero-Shot复杂任务先给几个例子让它照猫画虎Few-Shot专业任务则提前训练让它更懂行Instruction。具体实现上文本分类用DeepSeek API调用信息抽取和文本匹配用本地ChatGLM-6B模型对应api接口暂时没钱了都是通过构建示例指令的提示模板让模型在对话历史中学习任务模式最后输出结构化结果。整体思路就是给例子、下指令、调参数用最小成本让大模型在金融场景下发挥最大价值。

相关新闻