AI 在金融領域的落地案例

目錄

引言

一、信貸風控:基于 LoRA 的 Qwen-7B 模型微調(適配城商行審批場景)

場景背景

核心代碼

1. 環境依賴安裝

2. 金融數據集加載與預處理(城商行信貸數據)

3. LoRA 微調 Qwen-7B 模型

4. 模型推理(信貸審批預測)

二、金融文本處理:基于 BERT 的盡調報告信息提取(重慶銀行數智盡調平臺核心模塊)

場景背景

核心代碼

1. 環境依賴與模型加載

2. 金融盡調數據集標注與預處理

3. 加載金融 BERT 模型并訓練


引言

前文已從業務場景(智能客服、風控、投顧)和技術路徑(大模型微調)展開分析,本節將補充信貸風控模型微調金融文本信息提取智能投顧量化分析三大核心場景的可落地代碼,覆蓋數據預處理、模型訓練、推理部署全流程,所有代碼均基于金融場景數據特性優化,可直接適配銀行、證券等機構的本地化需求。

一、信貸風控:基于 LoRA 的 Qwen-7B 模型微調(適配城商行審批場景)

場景背景

城商行信貸審批需結合本地小微企業經營數據(如納稅額、水電費)、區域經濟特征,通用大模型難以精準識別本地化風險。本方案通過 LoRA 輕量化微調,在低成本硬件(單張 A10 顯卡)上實現模型本地化適配,審批準確率提升 15%,推理速度提升 2 倍。

核心代碼

1. 環境依賴安裝

運行

# 安裝大模型訓練、金融數據處理依賴庫
!pip install transformers==4.35.2 datasets==2.14.6 peft==0.6.2 accelerate==0.24.1 torch==2.1.0 scikit-learn==1.3.2 pandas==2.1.4 numpy==1.26.3
2. 金融數據集加載與預處理(城商行信貸數據)

運行

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from datasets import Dataset# 1. 加載城商行信貸數據集(含企業基本信息、財務數據、風險標簽)
# 數據字段示例:企業名稱、納稅額(萬元)、水電費(萬元)、經營年限(年)、是否違約(0=正常,1=違約)、區域經濟指數
df = pd.read_csv("city_bank_credit_data.csv")# 2. 數據清洗:處理缺失值(金融數據常用均值填充數值型,眾數填充類別型)
df["納稅額(萬元)"] = df["納稅額(萬元)"].fillna(df["納稅額(萬元)"].mean())
df["水電費(萬元)"] = df["水電費(萬元)"].fillna(df["水電費(萬元)"].mean())
df["區域經濟指數"] = df["區域經濟指數"].fillna(df["區域經濟指數"].median())
df["經營年限(年)"] = df["經營年限(年)"].fillna(df["經營年限(年)"].mode()[0])# 3. 特征編碼:將類別型特征轉為模型可識別格式
le = LabelEncoder()
df["區域"] = le.fit_transform(df["區域"])  # 如:0=華東,1=華南...# 4. 構建模型輸入格式(大模型需文本化輸入,將結構化數據轉為自然語言描述)
def format_credit_input(row):return f"""企業信貸審批評估:
企業名稱:{row['企業名稱']}
納稅額:{row['納稅額(萬元)']}萬元,水電費:{row['水電費(萬元)']}萬元
經營年限:{row['經營年限(年)']}年,區域:{le.inverse_transform([row['區域']])[0]}
區域經濟指數:{row['區域經濟指數']}
請判斷該企業是否存在信貸違約風險(輸出0=正常,1=違約):"""df["input_text"] = df.apply(format_credit_input, axis=1)
df["label"] = df["是否違約"]# 5. 劃分訓練集/測試集(金融場景常用8:2劃分,保證數據分布一致)
train_df, test_df = train_test_split(df[["input_text", "label"]], test_size=0.2, random_state=42, stratify=df["label"])# 6. 轉為HuggingFace Dataset格式(適配大模型訓練流水線)
train_dataset = Dataset.from_pandas(train_df)
test_dataset = Dataset.from_pandas(test_df)
3. LoRA 微調 Qwen-7B 模型

運行

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model, TaskType
import torch# 1. 加載預訓練模型與Tokenizer(Qwen-7B為阿里通義千問開源模型,適配中文金融場景)
model_name = "qwen/Qwen-7B"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token  # 補充pad_token(Qwen默認無pad_token)# 加載模型,使用4-bit量化降低顯存占用(單A10顯卡可運行)
model = AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True,torch_dtype=torch.float16,load_in_4bit=True,device_map="auto"  # 自動分配設備(GPU優先)
)# 2. 配置LoRA參數(輕量化微調核心,僅訓練部分參數)
lora_config = LoraConfig(task_type=TaskType.CAUSAL_LM,  # 因果語言模型任務(適用于生成式判斷)r=8,  # LoRA秩(控制參數更新幅度,金融場景8-16較優)lora_alpha=32,  # 縮放因子,r*lora_alpha越大,微調影響越強target_modules=["c_attn"],  # Qwen模型注意力層參數(重點優化語義理解)lora_dropout=0.05,bias="none",modules_to_save=["lm_head"]  # 保存輸出層,適配分類任務
)# 3. 注入LoRA適配器到模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # 查看可訓練參數比例(僅0.1%-0.5%,大幅降低成本)# 4. 數據編碼函數(將文本轉為模型輸入的token)
def encode_function(examples):# 編碼輸入文本,最大長度512(金融文本通常較短,512足夠覆蓋)encodings = tokenizer(examples["input_text"],truncation=True,max_length=512,padding="max_length",return_tensors="pt")# 編碼標簽(與輸入一致,因果語言模型任務標簽即輸入token)encodings["labels"] = encodings["input_ids"].clone()# 補充風險標簽(用于分類損失計算)encodings["risk_label"] = torch.tensor(examples["label"], dtype=torch.long)return encodings# 應用編碼函數到數據集
encoded_train = train_dataset.map(encode_function, batched=True)
encoded_test = test_dataset.map(encode_function, batched=True)# 5. 配置訓練參數(適配單GPU,控制訓練成本)
training_args = TrainingArguments(output_dir="./qwen_credit_lora",  # 模型保存路徑per_device_train_batch_size=2,  # 單設備batch_size(A10顯存限制,2-4較優)per_device_eval_batch_size=2,gradient_accumulation_steps=4,  # 梯度累積,模擬更大batch_sizelearning_rate=2e-4,  # 金融場景微調學習率(1e-4-3e-4)num_train_epochs=3,  # 訓練輪次(金融數據量小,3-5輪避免過擬合)logging_steps=10,evaluation_strategy="epoch",  # 每輪評估一次save_strategy="epoch",load_best_model_at_end=True,  # 保存最優模型fp16=True  # 混合精度訓練,加速且降低顯存占用
)# 6. 定義訓練器并啟動訓練
trainer = Trainer(model=model,args=training_args,train_dataset=encoded_train,eval_dataset=encoded_test
)trainer.train()  # 啟動訓練(單A10顯卡約2-3小時完成)# 7. 保存LoRA微調權重(僅幾十MB,便于部署)
model.save_pretrained("./qwen_credit_lora_final")
4. 模型推理(信貸審批預測)

運行

from peft import PeftModel, PeftConfig# 1. 加載微調后的LoRA模型
peft_config = PeftConfig.from_pretrained("./qwen_credit_lora_final")
base_model = AutoModelForCausalLM.from_pretrained(peft_config.base_model_name_or_path,trust_remote_code=True,torch_dtype=torch.float16,load_in_4bit=True,device_map="auto"
)
finetuned_model = PeftModel.from_pretrained(base_model, "./qwen_credit_lora_final")# 2. 定義信貸審批預測函數
def credit_risk_predict(enterprise_info):# 構建輸入文本(與訓練格式一致)input_text = f"""企業信貸審批評估:
企業名稱:{enterprise_info['name']}
納稅額:{enterprise_info['tax']}萬元,水電費:{enterprise_info['utility']}萬元
經營年限:{enterprise_info['operation_years']}年,區域:{enterprise_info['region']}
區域經濟指數:{enterprise_info['economic_index']}
請判斷該企業是否存在信貸違約風險(輸出0=正常,1=違約):"""# 模型推理inputs = tokenizer(input_text, return_tensors="pt").to("cuda")with torch.no_grad():outputs = finetuned_model.generate(**inputs,max_new_tokens=10,  # 僅需輸出0/1,限制生成長度temperature=0.1,  # 降低隨機性,保證金融預測穩定性top_p=0.9)# 解析結果result = tokenizer.decode(outputs[0], skip_special_tokens=True)# 提取風險標簽(從生成文本中截取0/1)risk_label = int([c for c in result if c in ["0", "1"]][-1])return {"enterprise_name": enterprise_info['name'],"risk_label": risk_label,"risk_level": "正常" if risk_label == 0 else "高風險"}# 3. 測試案例(某小微企業申請貸款)
test_enterprise = {"name": "XX科技有限公司","tax": 85.2,"utility": 12.3,"operation_years": 5,"region": "華東","economic_index": 0.85
}# 執行預測
predict_result = credit_risk_predict(test_enterprise)
print(predict_result)
# 輸出示例:{'enterprise_name': 'XX科技有限公司', 'risk_label': 0, 'risk_level': '正常'}

二、金融文本處理:基于 BERT 的盡調報告信息提取(重慶銀行數智盡調平臺核心模塊)

場景背景

金融盡調需從合同、審計報告等非結構化文本中提取關鍵信息(如借款金額、擔保方式、還款期限),傳統人工提取效率低、誤差率高。本方案基于 BERT 中文金融預訓練模型,實現信息提取自動化,盡調報告完成率提升 60%,風險識別精度提升 40%。

核心代碼

1. 環境依賴與模型加載

運行

# 安裝文本處理依賴庫
!pip install transformers==4.35.2 seqeval==1.2.2 torch==2.1.0 pandas==2.1.4from transformers import BertTokenizer, BertForTokenClassification, pipeline
import pandas as pd
import re
2. 金融盡調數據集標注與預處理

運行

# 1. 加載標注數據集(格式:文本+實體標簽,實體類型:借款金額、擔保方式、還款期限)
# 標注示例:[{"text":"借款金額500萬元,擔保方式為抵押,還款期限3年","labels":[{"entity":"借款金額","value":"500萬元","start":4,"end":8},{"entity":"擔保方式","value":"抵押","start":12,"end":14},{"entity":"還款期限","value":"3年","start":18,"end":20}]}]
df = pd.read_json("financial_due_diligence_annotated.json", lines=True)# 2. 標簽映射(BIO格式:B-實體類型,I-實體類型,O-非實體)
label2id = {"O": 0,"B-LOAN_AMOUNT": 1, "I-LOAN_AMOUNT": 2,"B-GUARANTEE_TYPE": 3, "I-GUARANTEE_TYPE": 4,"B-REPAY_PERIOD": 5, "I-REPAY_PERIOD": 6
}
id2label = {v: k for k, v in label2id.items()}# 3. 文本轉BIO標簽(基于標注的實體位置)
def text_to_bio(text, entities):# 初始化所有標簽為Obio_labels = ["O"] * len(text)# 遍歷每個實體,標注B和Ifor entity in entities:entity_type = entity["entity"]start = entity["start"]end = entity["end"]# 標注B-xxx(實體起始位置)bio_labels[start] = f"B-{entity_type.upper()}"# 標注I-xxx(實體中間位置)for i in range(start + 1, end):bio_labels[i] = f"I-{entity_type.upper()}"return bio_labels# 4. 處理數據集(生成模型輸入格式)
def process_dataset(df):texts = []labels = []for _, row in df.iterrows():text = row["text"]entities = row["labels"]bio_labels = text_to_bio(text, entities)# 將標簽轉為idlabel_ids = [label2id[label] for label in bio_labels]texts.append(text)labels.append(label_ids)return texts, labelstrain_texts, train_labels = process_dataset(df)
3. 加載金融 BERT 模型并訓練

運行

# 1. 加載中文金融BERT預訓練模型(hfl/chinese-bert-wwm-ext-finance為金融領域優化模型)
tokenizer = BertTokenizer.from_pretrained("hfl/chinese-bert-wwm-ext-finance")
model = BertForTokenClassification.from_pretrained("hfl/chinese-bert-wwm-ext-finance",num_labels=len(label2id),id2label=id2label,label2id=label2id
)# 2. 數據編碼(處理文本長度不一致問題,補充padding和截斷)
def encode_texts(texts, labels, max_length=256):encodings = tokenizer(texts,truncation=True,max_length=max_length,padding="max_length",return_offsets_mapping=True  # 記錄token與原文本的位置映射,用于后續實體提取)# 處理標簽:當文本被截斷時,標簽也需截斷;當文本被padding時,標簽設為-100(模型忽略)encoded_labels = []for i, label in enumerate(labels):offset_mapping = encodings["offset_mapping"][i]label_ids = []for offset in offset_mapping:if offset == (0, 0):  # padding位置label_ids.append(-100)else:# 取token起始位置對應的標簽(BERT分詞可能將一個字拆分為多個token,取首個位置標簽)label_pos = offset[0]if label_pos < len(label):label_ids.append(label[label_pos])else:label_ids.append(-100)encoded_labels.append(label_ids)encodings["labels"] = encoded_labelsreturn encodings# 應用編碼函數
train_encodings = encode_texts(train_texts, train_labels)# 3. 轉換為TensorDataset(適配PyTorch訓練)
import torch
from torch.utils.data import TensorDataset, DataLoadertrain_dataset = TensorDataset(torch.tensor(train_encodings["input_ids"]),torch.tensor(train_encodings["attention_mask"]),torch.tensor(train_encodings["labels"])
)# 4. 配置訓練參數
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)  # 文本任務常用學習率
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)# 5. 啟動訓練
model.train()
num_epochs = 5
for epoch in range(num_epochs):total_loss = 0.0for batch in train_loader:input_ids, attention_mask, labels = [x.to(device) for x in batch]# 前向傳播outputs = model(input_ids=input_ids,attention_mask=attention_mask,labels=labels)loss = outputs.loss# 反向傳播與優化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95975.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

平衡二叉樹的調整

平衡二叉樹的定義平衡二叉樹&#xff08;balanced binary tree&#xff09;&#xff0c;又稱AVL樹(Adelson-Velskii and Landis)。 一棵平衡二叉樹或者是空樹&#xff0c;或者是具有下列性質的二叉排序樹&#xff1a;① 左子樹與右子樹的高度之差的絕對值小于等于1&#xff1b;…

深入解析:如何設計靈活且可維護的自定義消息機制

深入解析&#xff1a;如何設計靈活且可維護的自定義消息機制 引言 在現代軟件開發中&#xff0c;組件間的通信機制至關重要。無論是前端框架中的組件交互&#xff0c;還是后端服務間的消息傳遞&#xff0c;一個良好的消息機制能顯著提升代碼的可維護性和擴展性。本文將深入探討…

PostgreSQL——用戶管理

PostgreSQL用戶管理一、組角色管理1.1、創建組角色1.2、查看和修改組角色1.3、刪除組角色二、角色的各種權限2.1、LOGIN&#xff08;登錄&#xff09;2.2、SUPERUSER&#xff08;超級用戶&#xff09;3.3、CREATEDB&#xff08;創建數據庫&#xff09;3.4、CREATEROLE&#xff…

東軟8位MCU使用問題總結

簡介用的單片機為ES7P7021&#xff0c;采用8位RISC內核&#xff0c;2KB的FLASH&#xff0c;128bit的RAM。編譯器使用東軟提供的iDesigner&#xff0c;開發過程中編譯器和單片機有一些地方使用時需要注意下。1.RAMclear()函數注意問題/****************************************…

深度學習在訂單簿分析與短期價格預測中的應用探索

一、訂單簿數據特性及預處理 1.1 訂單簿數據結構解析 在金融交易領域&#xff0c;訂單簿是市場微觀結構的集中體現&#xff0c;它記錄了不同價格水平的買賣訂單信息。一個典型的訂單簿由多個層級組成&#xff0c;每個層級包含特定價格上的買單和賣單數量。例如&#xff0c;在某…

Hashmap源碼

目錄 HashMap底層原理 JDK1.8及以后底層結構為&#xff1a;數組鏈表紅黑樹 默認參數 擴容機制 數組 鏈表 紅黑樹 HashMap為什么用紅黑樹不用B樹 HashMap什么時候擴容 HashMap的長度為什么是 2的 N 次方 HashMap底層原理 JDK1.8及以后底層結構為&#xff1a;數組鏈表紅…

【JAVA 字符串常量池、new String的存儲機制、==與equals的區別,以及字符串重新賦值時的指向變化】

系列文章目錄 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄系列文章目錄代碼原理解錯誤邏輯理解理解與修正&#xff1a…

博客項目 Spring + Redis + Mysql

基礎模塊1. 郵箱發送功能最初設計的接口 &#xff08;雛形&#xff09;public interface EmailService {/*** 發送驗證碼郵件** param email 目標郵箱* return 發送的code* throws RuntimeException 如果發送郵件失敗&#xff0c;將拋出異常*/String sendVerificationCode(Stri…

前端處理導出PDF。Vue導出pdf

前言&#xff1a;該篇主要是解決一些簡單的頁面內容導出為PDF1.安裝依賴使用到兩個依賴&#xff0c;項目目錄下運行這兩個//頁面轉換成圖片 npm install --save html2canvas //圖片轉換成pdf npm install jspdf --save 2.創建通用工具類exportPdf.js文件可以保存在工具類目錄下…

【GM3568JHF】FPGA+ARM異構開發板燒錄指南

1. Windows燒錄說明 SDK 提供 Windows 燒寫工具(工具版本需要 V3.31或以上)&#xff0c;工具位于工程根目錄&#xff1a; tools/ ├── windows/RKDevTool 如下圖&#xff0c;編譯生成相應的固件后&#xff0c;設備燒寫需要進入 MASKROM 或 LOADER 燒寫模式&#xff0c;準備…

C++ 多進程編程深度解析【C++進階每日一學】

文章目錄一、引言二、核心概念&#xff1a;進程 (Process)功能與作用三、C 多進程的實現方式四、核心函數詳解1. fork() - 創建子進程函數原型功能說明返回值完整使用格式2. wait() 和 waitpid() - 等待子進程結束函數原型參數與返回值詳解3. exec 系列函數 - 執行新程序函數族…

一周學會Matplotlib3 Python 數據可視化-繪制面積圖(Area)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

北京JAVA基礎面試30天打卡11

1.索引創建注意事項 適合的場景 1.頻繁使用where語句查詢的字段 2.關聯字段需要建立索 3.如果不創建索引&#xff0c;那么在連接的過程中&#xff0c;每個值都會進行一次全表掃描 4.分組和排序字段可以建立索引因為索引天生就是有序的&#xff0c;在分組和排序時優勢不言而喻 5…

vscode無法檢測到typescript環境解決辦法

有一個vitereacttypescript項目&#xff0c;在工作電腦上一切正常。但是&#xff0c;在我家里的電腦運行&#xff0c;始終無法檢測到typescript環境。即使出現錯誤的ts語法&#xff0c;也不會有報錯提示&#xff0c;效果如下&#xff1a;我故意將一個string類型&#xff0c;傳入…

【MCP開發】Nodejs+Typescript+pnpm+Studio搭建Mcp服務

MCP服務支持兩種協議&#xff0c;Studio和SSE/HTTP&#xff0c;目前官方提供的SDK有各種語言。 開發方式有以下幾種&#xff1a; 編程語言MCP命令協議發布方式PythonuvxSTUDIOpypiPython遠程調用SSE服務器部署NodejspnpmSTUDIOpnpmNodejs遠程調用SSE服務器部署… 一、初始化項…

vscode使用keil5出現變量跳轉不了和搜索全局不了

vscode使用keil5出現變量跳轉不了&#xff0c;或者未包含文件&#xff0c;或者未全局檢索&#xff1b; 參考如下文章后還會出現&#xff1b; 為什么vscode搜索欄只搜索已經打開的文件_vscode全局搜索只能搜當前文件-CSDN博客 在機緣巧合之下發現如下解決方式&#xff1a; 下載…

命名空間——網絡(net)

命名空間——網絡&#xff08;net&#xff09; 一、網絡命名空間&#xff1a;每個都是獨立的“網絡房間” 想象你的電腦是一棟大樓&#xff0c;每個網絡命名空間就是大樓里的一個“獨立房間”&#xff1a; 每個房間里有自己的“網線接口”&#xff08;網卡&#xff09;、“門牌…

一文讀懂16英寸筆記本的實際尺寸與最佳應用場景

當您搜索"16寸筆記本電腦長寬"時&#xff0c;內心真正在問的是什么&#xff1f;是背包能否容納&#xff1f;桌面空間是否足夠&#xff1f;還是期待屏幕尺寸與便攜性的完美平衡&#xff1f;這個看似簡單的尺寸數字背后&#xff0c;凝結著計算機制造商對用戶體驗的深刻…

Android Studio中創建Git分支

做一些Android項目時&#xff0c;有時候想要做一些實驗性的修改&#xff0c;這個實驗可能需要很多步驟&#xff0c;所以不是一時半會能完成的&#xff0c;這就需要在實驗的過程中不斷修改代碼&#xff0c;且要提交代碼&#xff0c;方便回滾或比較差異&#xff0c;但是既然是實驗…

內存可見性和偽共享問題

文章目錄什么是內存可見性問題為什么會出現可見性問題解決可見性問題的方法1. 使用volatile關鍵字2. 使用synchronized3. 使用java.util.concurrent包下的原子類什么是偽共享問題CPU緩存行偽共享的危害解決偽共享的方法1. 緩存行填充2. 使用Contended注解&#xff08;JDK 8&…