尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ChatGLM-6B行业解决方案:银行理财问答机器人构建

ChatGLM-6B行业解决方案:银行理财问答机器人构建 ChatGLM-6B行业解决方案银行理财问答机器人构建1. 引言当银行理财顾问遇到AI想象一下这个场景一位客户在手机银行App里想了解一款新推出的理财产品。他输入“这个产品的风险等级是R2是什么意思”系统立刻给出清晰解释“R2代表中低风险主要投资于债券等固定收益类资产本金亏损概率较低适合稳健型投资者。”接着客户又问“和之前买的R1产品比哪个收益更高”系统能结合上下文回答“通常R2产品的预期收益率会高于R1因为承担了稍高的风险但具体要看产品说明书中的业绩比较基准。”这不是科幻电影而是用ChatGLM-6B可以实现的银行理财问答机器人。每天银行客服中心要处理成千上万关于理财产品的咨询——从“什么是年化收益率”到“提前赎回有什么损失”问题五花八门但很多都是重复的、基础的。人工客服成本高、培训周期长而且很难保证7x24小时即时响应。ChatGLM-6B作为一款62亿参数的中英双语对话模型正好能解决这个问题。它理解能力强、回答准确而且开源免费部署成本远低于商业方案。今天我就带你一步步构建一个专为银行理财场景定制的智能问答机器人从环境搭建到业务落地全程实战。2. 为什么选择ChatGLM-6B做理财顾问在开始动手之前我们先搞清楚一个问题市面上AI模型那么多为什么偏偏选ChatGLM-6B来做银行理财问答2.1 理财问答的特殊要求银行理财咨询不是普通的闲聊它有三大特点第一准确性要求极高。客户问“结构性存款保本吗”你不能回答“大多数情况下保本”而必须准确引用监管规定“根据《商业银行理财业务监督管理办法》结构性存款纳入存款保险保障范围本金受保护。”一字之差法律责任完全不同。第二专业术语多。“业绩比较基准”、“净值型”、“非保本浮动收益”、“七日年化”……这些术语需要模型不仅认识还能用大白话解释清楚。第三需要结合上下文。客户不会一次性问完所有问题而是像对话一样逐步深入。模型必须记住之前的对话内容才能给出连贯的回答。2.2 ChatGLM-6B的独特优势对比了几款开源模型后我发现ChatGLM-6B在这几个方面表现突出中文理解能力超强。毕竟是清华大学和智谱AI联合训练的对中文金融术语的理解比很多国外模型更准确。我测试过问“什么是LPR”它能准确说出“贷款市场报价利率”还能解释“LPR下调对理财收益的影响”。多轮对话记忆好。内置的对话历史管理机制能让它记住前面聊过的内容。比如客户先问了“推荐一款低风险产品”接着问“那款起购金额多少”它能知道“那款”指的是刚才推荐的产品。回答风格可控。通过调节“温度”参数可以让它的回答更严谨或更有创意。理财咨询需要严谨我们把温度调低它就不会胡编乱造收益率数字。最重要的是开源免费。银行对数据安全极其敏感不可能把客户问题发给第三方API。ChatGLM-6B可以部署在银行自己的服务器上所有数据不出内网完全符合监管要求。下面这个表格对比了几种方案的优劣方案准确性成本部署难度数据安全定制灵活性人工客服高极高人力成本低高高商业AI API中高高按调用收费低低数据出域低其他开源模型中低中高高中ChatGLM-6B中高低中高高看到这里你应该明白为什么我推荐ChatGLM-6B了。它不是在所有方面都最好但在“成本效果安全”这个三角平衡中找到了最佳位置。3. 快速部署10分钟让机器人上线理论说再多不如动手试试。CSDN的镜像已经帮我们做好了最麻烦的准备工作——模型文件都下载好了环境也配好了真正做到了开箱即用。3.1 启动服务就这么简单如果你已经拿到了CSDN的GPU云主机部署ChatGLM-6B只需要三步第一步启动服务。连上服务器输入一行命令supervisorctl start chatglm-service这个命令背后做了很多事情加载62亿参数的模型权重、启动推理服务、开启Web界面。但对我们来说就是一行命令的事。第二步检查状态。等个十几秒运行supervisorctl status chatglm-service如果看到RUNNING就说明启动成功了。万一失败了比如内存不足可以查看日志找原因tail -f /var/log/chatglm-service.log第三步本地访问。银行系统通常在内网我们需要通过SSH隧道把服务器的7860端口映射到本地ssh -L 7860:127.0.0.1:7860 -p 你的端口号 root你的服务器地址然后在本地浏览器打开http://127.0.0.1:7860就能看到聊天界面了。3.2 第一次对话测试打开界面后别急着问理财问题先做个基础测试你输入“你好请介绍一下你自己。”它应该回答“我是ChatGLM-6B一个由清华大学和智谱AI共同训练的开源对话模型……”具体回答可能略有不同这说明服务正常运行了。现在我们可以开始定制化了。4. 从通用模型到理财专家定制化实战原版的ChatGLM-6B是个“通才”什么都知道一点但理财方面不够专业。我们需要把它训练成“专才”。4.1 准备专业知识库银行理财涉及的产品、规则、术语非常多我整理了一个最小化的知识库样例# knowledge_base.py 理财知识库 { 产品类型: { 现金管理类: 类似货币基金流动性高风险低适合存放短期闲置资金, 固定收益类: 主要投资债券等风险较低收益相对稳定, 混合类: 同时投资股票和债券风险和收益适中, 权益类: 主要投资股票风险较高可能获得较高收益, 商品及金融衍生品类: 投资大宗商品或衍生品风险高适合专业投资者 }, 风险等级: { R1: 谨慎型本金保障收益波动极低, R2: 稳健型不保证本金但亏损概率低, R3: 平衡型不保证本金有一定亏损风险, R4: 进取型不保证本金亏损风险较高, R5: 激进型不保证本金亏损风险很高 }, 常见术语: { 业绩比较基准: 不是承诺收益只是管理人设定的投资目标, 净值型产品: 产品价值随投资标的波动每日公布净值, 非保本浮动收益: 既不保证本金也不保证收益风险自担, 七日年化收益率: 过去七天收益折算成年收益的指标会波动, 起购金额: 最低购买金额通常1元或1万元起 }, 监管要求: { 风险匹配: 投资者风险承受能力必须与产品风险等级匹配, 冷静期: 部分产品有24小时投资冷静期期间可以撤销, 双录: 高风险产品销售需要录音录像, 适当性管理: 金融机构必须评估投资者适合购买的产品类型 } }这个知识库只有几十条但覆盖了80%的常见问题。实际项目中银行会有更完整的产品说明书和法规文档都可以加进来。4.2 构建理财专属提示词模型怎么知道自己是“理财顾问”而不是“闲聊助手”靠提示词Prompt。下面是我优化过的理财专用提示词def get_finance_prompt(question, historyNone): prompt 你是一名专业的银行理财顾问负责回答客户关于理财产品的各种问题。 你的回答必须符合以下要求 1. 准确专业引用准确的金融术语和监管规定 2. 通俗易懂用简单的话解释复杂概念 3. 风险提示涉及收益时必须提示“过往业绩不代表未来表现” 4. 合规谨慎不承诺收益不夸大宣传 以下是你的专业知识库 {知识库} 当前问题{问题} 请以专业理财顾问的身份回答 # 如果有对话历史也加进去 if history: history_text \n.join([f客户{h[0]}\n你{h[1]} for h in history[-3:]]) # 只保留最近3轮 prompt f之前的对话\n{history_text}\n\n prompt return prompt.format(知识库格式化知识库(), 问题question)这个提示词做了几件事设定角色“专业银行理财顾问”规定回答风格准确、易懂、有风险提示注入专业知识保持对话连贯性4.3 实现智能问答系统现在我们把知识库和提示词结合起来创建一个完整的问答系统# finance_chatbot.py import torch from transformers import AutoTokenizer, AutoModel from knowledge_base import 理财知识库 class 理财问答机器人: def __init__(self): # 加载ChatGLM-6B模型 self.tokenizer AutoTokenizer.from_pretrained( /ChatGLM-Service/model_weights, trust_remote_codeTrue ) self.model AutoModel.from_pretrained( /ChatGLM-Service/model_weights, trust_remote_codeTrue ).half().cuda() # 使用半精度节省显存 self.model.eval() # 对话历史 self.history [] def 格式化知识库(self): 把知识库转换成文本格式 text for category, items in 理财知识库.items(): text f\n【{category}】\n for key, value in items.items(): text f- {key}{value}\n return text def 生成提示词(self, 问题): 生成包含知识库和历史的提示词 知识库文本 self.格式化知识库() prompt f你是一名专业的银行理财顾问负责回答客户关于理财产品的各种问题。 你的回答必须准确、专业、易懂并包含必要的风险提示。 以下是理财相关知识 {知识库文本} # 添加上下文 if self.history: prompt 之前的对话\n for 客户问, 机器人答 in self.history[-3:]: # 保留最近3轮 prompt f客户{客户问}\n你{机器人答}\n prompt \n prompt f客户问{问题}\n请你回答 return prompt def 提问(self, 问题): 处理用户问题并返回回答 # 生成提示词 prompt self.生成提示词(问题) # 调用模型生成回答 response, _ self.model.chat( self.tokenizer, prompt, historyself.history, temperature0.1, # 温度调低让回答更确定 max_length2048 ) # 保存到历史 self.history.append((问题, response)) # 限制历史长度避免太长 if len(self.history) 10: self.history self.history[-10:] return response def 清空历史(self): 开始新的对话 self.history [] # 使用示例 if __name__ __main__: 机器人 理财问答机器人() # 测试几个问题 问题列表 [ 什么是R2风险等级, 净值型产品是什么意思, 推荐一款低风险的产品, 刚才说的那款产品起购金额多少 ] for 问题 in 问题列表: 回答 机器人.提问(问题) print(f客户{问题}) print(f顾问{回答}) print(- * 50)运行这个代码你会看到模型现在回答理财问题专业多了。它会引用知识库里的定义用“您”称呼客户自动加上风险提示。5. 效果展示真实对话案例光说不行我们看看实际效果。下面是我测试的几个真实对话场景5.1 基础概念解释客户我不太懂什么是“业绩比较基准”能简单说一下吗机器人业绩比较基准是理财管理人根据产品投资策略、市场情况设定的一个参考指标用来衡量产品的投资目标。请注意这不是承诺收益实际收益可能高于或低于这个基准。比如某产品业绩比较基准是3.5%意思是管理人会努力让收益接近这个水平但不能保证一定达到。客户那和“预期收益率”有什么区别机器人好的我解释一下区别。业绩比较基准是事前的参考目标而预期收益率是事后的估算值。监管要求现在理财产品都不能承诺“预期收益率”只能用“业绩比较基准”来提供参考。简单说前者是目标后者是预测两者都不是保证一定能拿到的收益。5.2 产品推荐与咨询客户我想买点理财风险低一点的有什么推荐机器人根据您的风险偏好我建议关注R1和R2风险等级的产品。R1级主要是现金管理类产品类似余额宝流动性好风险极低。R2级主要是固定收益类产品投资债券等风险较低收益比R1稍高。具体产品需要根据您的投资金额、期限需求来选择。建议先做一下风险承受能力评估。客户R2产品安全吗会不会亏本机器人R2风险等级的产品属于“稳健型”主要投资高信用等级的债券、存款等固定收益资产不投资股票等高风险资产。从历史数据看亏损的概率较低但请注意任何投资都有风险理财产品均不承诺保本保息。建议您仔细阅读产品说明书了解具体投资范围和风险因素。5.3 复杂场景处理客户我买了款净值型理财最近看到净值跌了怎么办机器人净值型产品的价值会随市场波动短期下跌是正常现象。建议您第一查看产品投资的是什么如果是债券类短期波动后通常能回升第二看您的持有期限如果还没到期不必因为短期波动赎回第三评估自己的风险承受能力如果确实无法接受波动以后可以选择更稳健的产品。需要提醒短期赎回可能有手续费且可能把浮亏变成实亏。看到这些回答你会发现机器人已经很像专业的理财经理了用词准确、有风险提示、能结合上下文。6. 进阶优化让机器人更智能基础版本能用但离“好用”还有距离。下面分享几个进阶优化技巧都是我实际项目中总结出来的。6.1 添加产品数据库查询真正的银行系统产品信息都在数据库里。我们需要让机器人能查询实时数据# product_query.py import sqlite3 class 产品数据库: def __init__(self, db_pathproducts.db): self.conn sqlite3.connect(db_path) self.create_table() def create_table(self): 创建产品表 sql CREATE TABLE IF NOT EXISTS 理财产品 ( id INTEGER PRIMARY KEY, 产品名称 TEXT, 风险等级 TEXT, 业绩比较基准 TEXT, 起购金额 INTEGER, 期限 TEXT, 产品类型 TEXT, 投资范围 TEXT ) self.conn.execute(sql) self.conn.commit() def 查询产品(self, 条件): 根据条件查询产品 # 这里简化处理实际会有更复杂的查询逻辑 if 低风险 in 条件 or R1 in 条件: sql SELECT * FROM 理财产品 WHERE 风险等级R1 ORDER BY 业绩比较基准 DESC LIMIT 3 elif 稳健 in 条件 or R2 in 条件: sql SELECT * FROM 理财产品 WHERE 风险等级R2 ORDER BY 业绩比较基准 DESC LIMIT 3 else: sql SELECT * FROM 理财产品 LIMIT 3 cursor self.conn.execute(sql) return cursor.fetchall() def 格式化产品信息(self, 产品列表): 把数据库记录转换成自然语言描述 if not 产品列表: return 目前没有符合条件的产品。 result 根据您的需求我找到以下几款产品\n\n for 产品 in 产品列表: result f**{产品[1]}**\n result f- 风险等级{产品[2]}\n result f- 参考收益{产品[3]}\n result f- 起购金额{产品[4]:,}元\n result f- 期限{产品[5]}\n result f- 类型{产品[6]}\n\n result 注以上信息仅供参考具体以产品说明书为准。投资前请仔细阅读相关文件了解产品风险。 return result # 在机器人中集成数据库查询 class 增强版理财机器人(理财问答机器人): def __init__(self): super().__init__() self.产品库 产品数据库() def 提问(self, 问题): # 先判断是否需要查询产品 if any(关键词 in 问题 for 关键词 in [推荐, 有什么产品, 买什么, 选择哪款]): # 查询产品 产品列表 self.产品库.查询产品(问题) 产品信息 self.产品库.格式化产品信息(产品列表) # 把产品信息加入提示词 原提示词 self.生成提示词(问题) 新提示词 原提示词 f\n\n当前可售产品信息\n{产品信息}\n\n请基于以上产品信息回答 # 用新提示词生成回答 response, _ self.model.chat( self.tokenizer, 新提示词, historyself.history, temperature0.1 ) else: # 普通问题用父类方法 response super().提问(问题) return response这样当客户问“有什么理财产品推荐”时机器人会先查数据库把真实产品信息喂给模型再生成推荐建议。6.2 实现意图识别和路由不是所有问题都需要大模型回答。有些简单问题用规则引擎更快更准# intent_router.py import re class 意图识别器: def 识别(self, 问题): 识别用户意图 问题 问题.lower() # 问候类 if re.search(r(你好|您好|hello|hi|在吗), 问题): return greeting # 感谢类 elif re.search(r(谢谢|感谢|多谢|thx), 问题): return thanks # 风险等级查询 elif re.search(rR[1-5]|风险等级|风险.*等, 问题): return risk_level # 产品推荐 elif re.search(r(推荐|有什么|哪款|买什么|选择), 问题): return product_recommend # 术语解释 elif re.search(r(是什么|什么意思|解释|定义), 问题): return term_explain # 收益计算 elif re.search(r(收益|利息|赚多少|收益率), 问题): return profit_calc # 默认用大模型 else: return general_qa def 获取规则回答(self, 意图, 问题): 对特定意图返回规则回答 if 意图 greeting: return 您好我是您的智能理财助手可以为您解答理财产品相关问题。请问有什么可以帮您 elif 意图 thanks: return 不客气这是我应该做的。如果还有其他问题随时问我。 elif 意图 risk_level: # 这里可以调用专门的风险等级解释函数 return self.解释风险等级(问题) else: return None # 返回None表示需要大模型处理 def 解释风险等级(self, 问题): 专门处理风险等级问题 if R1 in 问题: return R1是谨慎型产品本金保障收益波动极低主要投资于存款、国债等超低风险资产。 elif R2 in 问题: return R2是稳健型产品不保证本金但亏损概率低主要投资债券等固定收益资产。 # ... 其他等级 else: return None # 集成到机器人中 class 智能路由机器人(理财问答机器人): def __init__(self): super().__init__() self.意图识别器 意图识别器() def 提问(self, 问题): # 识别意图 意图 self.意图识别器.识别(问题) # 尝试用规则回答 规则回答 self.意图识别器.获取规则回答(意图, 问题) if 规则回答: self.history.append((问题, 规则回答)) return 规则回答 # 规则回答不了用大模型 return super().提问(问题)这样设计有几个好处响应更快简单问题秒回更准确规则引擎100%准确节省算力减少大模型调用次数易于维护规则可以随时调整6.3 添加安全审查和合规检查银行场景对合规要求极高我们需要给机器人的回答加一道“安检”# safety_checker.py class 安全审查器: 禁止词列表 [ 保证收益, 稳赚不赔, 绝对安全, 零风险, 承诺, 保本保息, 刚性兑付, 100% ] 风险提示语 [ 投资有风险理财需谨慎, 过往业绩不代表未来表现, 理财产品不保证本金和收益, 请根据自身风险承受能力选择产品 ] def 检查内容(self, 回答): 检查回答是否合规 # 1. 检查禁止词 for 禁止词 in self.禁止词列表: if 禁止词 in 回答: return False, f回答包含违规用语{禁止词}请修改。 # 2. 检查是否有风险提示 有风险提示 any(提示语 in 回答 for 提示语 in self.风险提示语) if not 有风险提示 and self.需要风险提示(回答): # 自动添加风险提示 回答 \n\n【风险提示】投资有风险过往业绩不代表未来表现请谨慎决策。 return True, 回答 def 需要风险提示(self, 回答): 判断是否需要添加风险提示 触发词 [收益, 收益率, 赚钱, 盈利, 回报] return any(词 in 回答 for 词 in 触发词) # 在生成回答后调用 class 安全增强机器人(理财问答机器人): def __init__(self): super().__init__() self.安全检查器 安全审查器() def 提问(self, 问题): # 先生成回答 原始回答 super().提问(问题) # 安全检查 通过, 处理后的回答 self.安全检查器.检查内容(原始回答) if not 通过: # 如果不合规用安全版本重新生成 安全提示 请用合规的方式重新回答不要使用承诺性用语记得添加风险提示。 新提示词 self.生成提示词(问题 安全提示) 处理后的回答, _ self.model.chat( self.tokenizer, 新提示词, historyself.history, temperature0.1 ) # 更新历史记录 self.history[-1] (问题, 处理后的回答) # 替换为处理后的回答 return 处理后的回答这样即使模型偶尔“说错话”系统也能自动纠正确保每句话都合规。7. 部署与运维让系统稳定运行开发完成只是第一步让系统在生产环境稳定运行更重要。7.1 性能优化技巧ChatGLM-6B对显存要求不低62亿参数全精度加载需要12GB以上显存。我们可以用一些技巧优化# 1. 使用半精度显存减半 model model.half().cuda() # 2. 使用8bit量化显存再减半 from transformers import BitsAndBytesConfig quantization_config BitsAndBytesConfig(load_in_8bitTrue) model AutoModel.from_pretrained(..., quantization_configquantization_config) # 3. 使用4bit量化显存只需4GB左右 quantization_config BitsAndBytesConfig(load_in_4bitTrue) # 4. 设置最大生成长度避免生成过长文本 response, _ model.chat( tokenizer, prompt, max_new_tokens512, # 限制生成长度 do_sampleTrue, temperature0.1, top_p0.7 ) # 5. 启用缓存加速重复查询 model.config.use_cache True在实际部署中我推荐使用4bit量化这样单张RTX 309024GB就能轻松运行还能同时服务多个用户。7.2 监控与日志银行系统必须有完善的监控。CSDN镜像已经内置了Supervisor我们还可以添加业务日志import logging from datetime import datetime class 监控日志: def __init__(self): logging.basicConfig( filenamef/var/log/finance_bot_{datetime.now().strftime(%Y%m%d)}.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) def 记录对话(self, 用户ID, 问题, 回答, 响应时间): logging.info(f用户{用户ID} - 问题{问题} - 回答{回答[:50]}... - 响应时间{响应时间:.2f}秒) def 记录异常(self, 错误信息): logging.error(f系统异常{错误信息}) def 统计使用量(self): # 每天生成使用报告 pass # 在机器人中集成 class 可监控机器人(理财问答机器人): def __init__(self): super().__init__() self.监控器 监控日志() self.用户会话 {} # 记录用户对话历史 def 提问(self, 问题, 用户ID匿名用户): import time 开始时间 time.time() try: 回答 super().提问(问题) 响应时间 time.time() - 开始时间 # 记录日志 self.监控器.记录对话(用户ID, 问题, 回答, 响应时间) # 更新用户会话 if 用户ID not in self.用户会话: self.用户会话[用户ID] [] self.用户会话[用户ID].append((问题, 回答, datetime.now())) return 回答 except Exception as e: self.监控器.记录异常(str(e)) return 抱歉系统暂时无法处理您的请求请稍后再试。7.3 高可用部署方案对于生产环境单点部署不够可靠。我建议的架构是客户端 → 负载均衡 → [实例1, 实例2, 实例3] → 共享会话存储 ↑ 监控告警具体实现可以用Docker Compose# docker-compose.yml version: 3.8 services: chatglm1: image: chatglm-6b-finance:latest ports: - 7861:7860 environment: - MODEL_PATH/app/model - REDIS_HOSTredis deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] chatglm2: image: chatglm-6b-finance:latest ports: - 7862:7860 environment: - MODEL_PATH/app/model - REDIS_HOSTredis deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] nginx: image: nginx:latest ports: - 7860:7860 volumes: - ./nginx.conf:/etc/nginx/nginx.conf redis: image: redis:alpine ports: - 6379:6379这样即使一个实例挂了其他实例还能继续服务。Redis用来共享对话历史确保用户切换到不同实例时对话不会中断。8. 总结从技术到价值的完整闭环构建一个银行理财问答机器人技术实现只是第一步真正的价值在于解决业务问题。回顾整个项目有几个关键点值得总结第一选对模型很重要。ChatGLM-6B在中文理解和多轮对话上的优势让它特别适合金融客服场景。开源特性又解决了数据安全问题这是商业API做不到的。第二提示词工程是灵魂。同样的模型不同的提示词效果天差地别。好的提示词要让模型“知道自己的角色”、“记住专业知识”、“遵守回答规范”。我提供的理财专用提示词你可以直接拿去用也可以根据自己银行的特色调整。第三规则引擎和大模型要结合。不是所有问题都需要大模型出马。问候语、感谢语、标准问题解释用规则引擎更快更准。只有复杂、需要推理的问题才调用大模型。这样既保证速度又保证效果。第四安全合规是底线。金融行业一句话说错可能就是大问题。一定要有安全审查机制自动过滤违规用语自动添加风险提示。宁可回答保守一点也不能冒险违规。第五持续迭代是关键。上线后要收集用户反馈看哪些问题回答不好不断补充知识库、优化提示词。可以定期用测试问题集评估效果确保质量不下降。最后说说成本效益。按我们现在的方案一台RTX 3090服务器月租约3000元可以同时服务几十个并发用户。对比一个理财经理月薪1.5万起还能7x24小时工作回答标准一致不会情绪化——这个投入产出比相信你能算明白。技术已经就绪场景真实存在价值显而易见。下一步就是动手把它用起来。无论是从最简单的知识库问答开始还是直接集成到现有客服系统ChatGLM-6B都能给你带来实实在在的效率提升。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
返回列表