之前几篇文章我们聊过大模型再RAG领域的落地情况,本篇文章就先以百度的平台为例,进行一次详细的测评,详细介绍大模型知识问答助手的应用创建情况。场景我们选择【智能财报分析助手】,目标是通过该助手获得特定财报信息中的相关信息,同时展示百度千帆平台构建知识库时工具链的完整性、易用性,以进行各环节的技术能力和效果评估。
1.登录https://cloud.baidu.com/
2.选择构建智能云千帆AppBuilder,进入创建应用主页面。
3.点击创建应用,选择知识问答应用(RAG)框架。
4.首先尝试零代码创建。
基于本次目标【智能财报分析助手】,首先需要给助手设定一个身份角色,最终会在上下文中传给大模型,以激发大模型特定领域的专业能力。
在【角色指令】框里填写详细的角色描述信息,这里可以理解为一个prompt模板。
在下面的个性化领域知识里面,千帆提供了两种方式,一种是通过百度搜索,即联网的方式查询相关支持,将其作为相关文档传给大模型;另一种是传统的通过用户自己上传的领域知识文档,切分并向量化后传给大模型。
这里我们选择使用自己上传文档的方式。这里我上传了一个3.5M大小的pdf文档《郑州银行2022年年度报告》,可以看到文档需要解析需要很长一段时间,这里可以选择用标点符号或者固定长度来切分文档,猜测可能用到了百度相关的切分文档的方法,最终呈现的文档效果片当很不错。分档切分的同时,还提取了每个片段的关键知识。
下一步就是选择基础大模型,并对大模型回答多样性的参数做一个调整,页面都配置了下拉选项,使用起来十分方便。下面还有一些对模型回答的格式要求和其他个性化配置。
配置完成后,点击生成应用。
5.发布应用后,可以在我的应用列表中查查看,点击立即试用,就能进入下一步的对话问答界面。
6.点击【发布详情】,可进入发布管理界面,不得不说百度千帆对应用发布有很好的支持,既支持直接发布成网页服务,提供一个访问链接,也支持发布到微信等第三方程序中作为辅助服务。
7.点击【立即使用】,进入助手的新页面,用户可以自主输入问题,使用该助手回答。
以上是全部使用流程。
下面分几个步骤评估一下百度千帆的AppBuilder产品:
1.从产品完整度
提供零代码创建应用方式及代码态开发应用方式,非常方便进入‘’RAG知识问答应用“开发状态。平台提供了完整的开发手册。
【我的知识】模块,上传文档、切分文档、知识点展示,页面功能齐全,操作逻辑衔接准确。
创建应用时,可使用上传的文档作为外挂知识库,也可以选择使用百度搜索作为外挂知识。可以自主选择合适的基础大模型,配置“多样性”参数。
应用创建完成后可以直接发布,平台提供了发布的应用界面和API等。从完整性角度上来看,整个应用从数据处理到应用构建到应用服务,一套流程比较完整。
2.从RAG效果角度(通过过程三元素的两两相关性来衡量)
如何评估该助手的效果呢?我们收集了开源向量数据库milvus团队Zilliz公开的一些资料,做了如下整理:
标准的 RAG 流程就是用户提出 Query 问题,RAG 应用去召回 Context,然后 LLM 将 Context 组装,生成满足 Query 的 Response 回答。那么在这里出现的三元组:—— Query、Context 和 Response 就是 RAG 整个过程中最重要的三元组,它们之间两两相互牵制。我们可以通过 检测三元组之间两两元素的相关度 ,来评估这个 RAG 应用的效果:
- Context Relevance:
衡量召回的 Context 能够支持 Query 的程度。如果该得分低,反应出了召回了太多与Query 问题无关的内容,这些错误的召回知识会对 LLM 的最终回答造成一定影响。 - Groundedness:
衡量 LLM 的 Response 遵从召回的 Context 的程度。如果该得分低,反应出了 LLM 的回答不遵从召回的知识,那么回答出现幻觉的可能就越大。 - Answer Relevance:
衡量最终的 Response 回答对 Query 提问的相关度。如果该得分低,反应出了可能答不对题。
因此,对于一个 RAG 系统来说,最基本的就是三元组指标得分,它反映了 RAG 效果的核心部分。
Ragas (http://docs.ragas.io/en/latest/concepts/metrics/context_recall.html)中就将 Context Relevance 这一步又分为Context Precision、Context Relevancy、Context Recall。Ragas提供了五种评估指标包括:
- 忠实度(faithfulness)
忠实度(faithfulness)衡量了生成的答案(answer)与给定上下文(context)的事实一致性。它是根据answer和检索到的context计算得出的。并将计算结果缩放到 (0,1) 范围且越高越好。 - 答案相关性(Answer relevancy)
评估指标“答案相关性”重点评估生成的答案(answer)与用户问题(question)之间相关程度。不完整或包含冗余信息的答案将获得较低分数。该指标是通过计算question和answer获得的,它的取值范围在 0 到 1 之间,其中分数越高表示相关性越好。 - 上下文精度(Context precision)
上下文精度是一种衡量标准,它评估所有在上下文(contexts)中呈现的与基本事实(ground-truth)相关的条目是否排名较高。理想情况下,所有相关文档块(chunks)必须出现在顶层。该指标使用question和计算contexts,值范围在 0 到 1 之间,其中分数越高表示精度越高。 - 上下文召回率(Context recall)
上下文召回率(Context recall)衡量检索到的上下文(Context)与人类提供的真实答案(ground truth)的一致程度。它是根据ground truth和检索到的Context计算出来的,取值范围在 0 到 1 之间,值越高表示性能越好。 - 上下文相关性(Context relevancy)
该指标衡量检索到的上下文(Context)的相关性,根据用户问题(question)和上下文(Context)计算得到,并且取值范围在 (0, 1)之间,值越高表示相关性越好。
我们判断下来这是一个相对容易上手且符合三元素评估标准的框架,通过简单的接口即可实现评估:
from datasets import Dataset
questions = ["流动性风险管理的目标是什么?",
"剩余到期还款金额合计是多少?",
"利率风险对本集团的影响包括哪些方面?",
"利率变动(收益率曲线平行移动100个基点)会对未来一年的净利润有什么影响??",
"报告期内,本行总生息资产的平均余额和平均收益率是多少?",
"报告期内,本行总付息负债的平均余额和平均收益率是多少?",
"报告期末,集团发放贷款和垫款的总金额是多少?",
"本行净利息收入多少?",
"报告期末,集团吸收存款总金额是多少?",
"报告期内,本集团的贷款质量如何?"
]
ground_truths = ["本行流动性风险管理的目标是确保拥有充足资金头寸, 以及时满足偿付义务及业务清算资金的需求。本行密切关注流动性变化,实时监控资金余缺,合理摆布资金 期限结构,并逐步优化资产负债配置,平衡资产负债结构,加强流动性风险监控,确保流动性安全可控。",
"2281562771",
"利率风险主要包括来自商业银行业务的重定价风险和资金交易头寸的风险。",
"收益率曲线平行上移100个基点减少 (1,060,789),收益率曲线平行下移100个基点 增加1,060,789",
"总生息资产平均余额是539,315,568 ,平均收益率是4.65%",
"总付息负债平均余额是517,441,178,平均付息率是2.47%",
"截至报告期末,本行发放贷款及垫款本金总额人民币3,309.21亿元",
"本行实现利息净收入人民币122.54亿元,较上年同比增加人民币3.05亿元,增幅2.55%;占营业收入81.14%。",
"截至报告期末,本行吸收存款本金总额人民币3,377.08亿元,较上年末增加人民币188.95亿元,增幅5.93%。",
"截至报告期末,不良贷款余额人民币62.21亿元,不良贷款率1.88%,较上年末上升0.03个百分点。"]
answers = ["流动性风险管理的目标是确保拥有充足资金头寸,以及时满足偿付义务及业务清算资金的需求。银行应密切关注流动性变化,实时监控资金余缺,合理摆布资金期限结构,优化资产负债配置,以平衡资产负债结构,从而加强流动性风险监控,确保流动性安全可控。同时,还需要建立健全操作风险管理框架,对操作风险进行有效管理,以实现操作风险损失的最小化。",
"很抱歉,我无法直接给出剩余到期还款金额合计的具体数值,因为这个数值会根据不同的贷款合同、还款计划、借款人的还款情况等多种因素而有所变化。通常,剩余到期还款金额合计是指借款人在未来某个时间点需要偿还的贷款本金和利息的总额。如果您需要查询某个具体的贷款合同的剩余到期还款金额合计,建议您直接联系贷款机构或银行进行查询。另外,如果您是在分析财务报表时遇到了这个问题,那么您可能需要查看该公司的贷款和还款情况的相关披露信息,以了解该公司的剩余到期还款金额合计。请注意,这些信息可能需要在该公司的财务报表附注或相关说明中查找。",
"利率风险对本集团的影响主要体现在以下几个方面:财务成本:利率的变动可能会导致本集团的借款成本上升或下降,从而影响本集团的利润水平。如果利率上升,本集团的借款成本将增加,可能导致财务成本上升;反之,如果利率下降,本集团的借款成本将减少,可能带来财务成本的降低。投资收益:本集团持有的投资产品可能受到利率变动的影响,导致投资收益的波动。例如,如果市场利率上升,固定收益类投资产品的价格可能会下降,从而影响本集团的投资收益。现金流:利率的变动可能会影响本集团的现金流状况。例如,利率上升可能导致本集团需要支付更高的利息费用,从而增加现金流出;反之,利率下降可能减少本集团的利息支出,降低现金流出。资产负债管理:利率风险还可能对本集团的资产负债管理产生影响。例如,利率变动可能导致资产和负债的价值发生变动,从而影响本集团的资产负债率和财务杠杆水平。为了降低利率风险的影响,本集团可以采取相应的风险管理措施,如制定合适的风险管理策略、优化资产负债结构、使用金融衍生工具进行对冲等。同时,本集团也需要密切关注市场利率的变动趋势,及时调整经营策略以适应市场环境的变化。",
"利率变动对未来一年的净利润的具体影响取决于多个因素,包括公司的资产负债结构、重定价缺口、敏感性分析等。一般来说,如果公司的资产和负债对利率的敏感度不同,那么利率变动就可能导致净利润的增加或减少。例如,如果公司的资产主要是浮动利率资产,而负债主要是固定利率负债,那么当市场利率上升时,公司的资产收益将增加,而负债成本保持不变,从而导致净利润增加。相反,如果公司的负债主要是浮动利率负债,而资产主要是固定利率资产,那么市场利率的上升将导致负债成本增加,而资产收益保持不变,从而导致净利润减少。此外,公司还需要考虑利率变动对其他业务的影响,如外汇风险敞口、流动性风险等。因此,要准确评估利率变动对未来一年的净利润的影响,需要进行全面的敏感性分析和风险评估。",
"很抱歉,由于您提供的搜索结果中并没有具体提及本行总生息资产的平均余额和平均收益率的数值,因此我无法直接给出答案。这些数值通常会在财务报告的详细数据表格中列出,建议您查阅相关的财务报告或联系本行进行咨询以获取准确的信息。一般来说,生息资产的平均余额和平均收益率是银行财务报告中比较重要的指标之一。平均余额反映了银行在一定时期内生息资产的总规模,而平均收益率则反映了这些生息资产的盈利水平。通过对这些指标的分析,可以了解银行的资产负债情况和盈利状况,为投资者和利益相关者提供有用的参考信息。",
"很抱歉,由于您提供的搜索结果中并未包含关于本行总付息负债的平均余额和平均收益率的具体数据,因此我无法为您提供准确的答案。通常,这些信息可以在银行的财务报告或相关公开信息中找到。建议您查阅本行的最新财务报告或联系本行进行咨询,以获取最准确的数据和信息。同时,您提供的搜索结果主要包含了利息净收入、不良贷款率、拨备覆盖率、贷款拨备率等指标的计算方法和说明,以及部分指标的口径和数据差异说明,但并未直接提供总付息负债的平均余额和平均收益率的具体数据。因此,需要您进一步查找相关信息。",
"报告期末,集团发放贷款和垫款的总金额为286,498,536元。请注意,这个数字可能会因为集团的具体财务报告期和其他因素而有所不同,建议查看相关财务报表的官方发布渠道,以获取最准确的信息。",
"根据搜索结果,本行的净利息收入为人民币122.54亿元。此外,报告还提到,本行净利差为2.18%,较上年同期下降0.06个百分点,净利息收益率为2.27%,较上年同期下降0.04个百分点。净利差及净利息收益率下降的主要原因是本行积极响应国家政策,多措并举让利实体经济,从而导致生息资产的平均收益率较上年同期下降。",
"报告期末,集团吸收存款的总金额为341,797,766元。这一数据是基于集团与关联方的交易均按照一般商业条款和正常业务程序进行,定价原则与独立第三方交易一致的情况下得出的。请注意,财报中的具体数字可能会因公司的实际情况和报告期而有所不同,因此在进行相关分析时,应结合公司的具体情况进行综合判断。",
"报告期内,本集团的贷款质量总体保持在可控水平。本行不断加强信用风险管理,加快不良资产处置力度,截至报告期末,不良贷款余额人民币62.21亿元,不良贷款率1.88%,较上年末上升0.03个百分点。同时,本行对任何单一借款人的贷款余额均未超过本行资本净额的10%,十大单一借款人(不包括集团借款人)的贷款余额概无不良贷款。因此,本集团的贷款质量在报告期内表现良好。此外,需要注意的是,贷款质量的评估还需要考虑其他因素,如贷款的行业分布、担保方式、借款人信用评级等。因此,在未来的经营中,本集团需要继续加强信用风险管理,优化贷款结构,提高贷款质量,以确保贷款业务的稳健发展。"
]
contexts = [["本行流动性风险管理的目标是确保拥有充足资金头寸,以及时满足偿付义务及业务清算资金的需求。本行密切关注流动性变化,实时监控资金余缺,合理摆布资金期限结构,并逐步优化资产负债配置,平衡资产负债结构,加强流动性风险监控,确保流动性安全可控。本行流动性风险管理的主要措施如下:一是加强日间流动性管理。密切关注宏观和货币政策变化,加强资金来源和运用监测,合理规划融资期限结构,确保日间支付结算的头寸需求。二是优化资产负债配置。加强资产负债计划和流动性风险的平衡管理,注重资产负债结构和久期管理,保持安全合理的期限错配水平。三是加强流动性风险限额管理。健全流动性限额管理体系,强化风险限额监测预警,及时结合资产负债计划调节风险指标,确保流动性限额指标在安全区间运行。四是开展压力测试和流动性应急演练。定期开展压力测试,评估流动性风险水平,并加强压力测试结果在资产负债计划中的应用,同时考虑压力测试结果开展流动性应急演练,评估应急响应、指挥协调和应急处置等流程,完善应急管理,提升应对风险能力。截至报告期末,本行流动性比例72.34%,符合中国银保监会规定的不低于25%的要求;流动性覆盖率300.13%,符合中国银保监会规定的不低于100%的要求;净稳定资金比例120.68%,符合中国银保监会规定的不低于100%的要求。从整体上看,本行主要流动性监管指标均能满足监管要求,整体流动性风险可控。7.5信息科技风险信息科技风险是指信息科技在运行过程中由于自然因素、人为因素、技术漏洞和管理缺陷产生的操作、法律和声誉风险。"],
[],
["八、风险管理于日常营业中,本集团金融工具使用方面所面临的主要风险包括:信用风险、利率风险、外汇风险及流动性风险。本集团在下文主要论述上述风险敞口及其形成原因,风险管理目标、计量及管理这些风险的政策及程序等。本集团谋求使用金融工具时取得风险与收益间的恰当平衡及将潜在不利影响减至最低。董事会为本集团风险管理政策的最高决策者及通过风险管理委员会监督本集团的风险管理职能。本集团制定风险管理政策的目的是识别和分析本集团所面对的风险,以设定适当的风险限额和控制,监控本集团的风险水平。本集团会定期重检这些风险管理政策及有关控制系统,以适应市场情况或经营活动的改变。高级管理层为本集团风险管理框架的最高实行者,并直接向董事会风险管理委员会报告。根据董事会定下的风险管理策略,高级管理层负责建立及实行风险管理政策及系统,并监管、识别和控制不同业务面对的风险。1. 信用风险信用风险是指债务人或交易对手没有履行合同约定的对本集团的义务或承诺而使本集团可能蒙受损失的风险。信用风险主要来自发放贷款及垫款组合、债券投资组合及各种形式的担保。信贷业务董事会负责制定本集团风险管理战略和可接受的总体风险水平,并对本集团的风险控制程序进行监察和对风险状况及风险管理策略进行定期评估,确保不同业务的各类信用风险均得到适当发现、评估、计算及监察。授信管理部负责信用风险管理。授信审批部、公司业务部、零售业务部、小企业金融事业部、投资银行部及金融市场部均根据本集团的风险管理政策及程序进行信贷业务。本集团采用贷款风险分类方法管理发放贷款及垫款的组合风险。"],
["风险管理部、金融市场部及资产负债管理部共同负责识别、计量、监测及报告市场风险。本集团使用敏感性分析、利率重定价敞口分析、外汇敞口分析、压力测试及有效久期分析来计量、监测市场风险。敏感性分析是以总体敏感度额度及每个档期敏感度额度控制,按照不同期限分档计算利率风险。利率重定价敞口分析是衡量利率变动对当期损益影响的一种方法。具体而言,就是将所有生息资产和付息负债按照利率重新定价的期限划分到不同的时间段以匡算未来资产和负债现金流的缺口。外汇敞口分析是衡量汇率变动对当期损益影响的一种方法。外汇敞口主要来源于本集团表内外业务中的货币错配。压力测试的结果是采用市场变量的压力变动,对一系列前瞻性的情景进行评估,利用得出结果测量对损益的影响。有效久期分析是对各时段的敞口赋予相应的敏感性权重,得到加权敞口,然后对所有时段的加权敞口进行汇总,以此估算利率变动可能会对本集团经济价值产生的非线性影响。八、风险管理(续)2. 市场风险(续)(a) 利率风险本集团的利率风险主要包括来自商业银行业务的重定价风险和资金交易头寸的风险。(i) 重定价风险重定价风险也称为期限错配风险,是最主要和最常见的利率风险形式,来源于银行资产、负债和表外业务到期期限(就固定利率而言)或重新定价期限(就浮动利率而言)存在的差异。这种重新定价的不对称使银行的收益或内在经济价值会随着利率的变动而变化。资产负债管理部负责利率风险的识别、计量、监测和管理。本集团定期评估对利率变动敏感的资产及负债重定价缺口以及利率变动对本集团利息净收入的敏感性分析。利率风险管理的主要目的是减少利率变动对利息净收入和经济价值的潜在负面影响。"],
[],
[],
["934 0.72% 328,303 采矿业2,008,593 0.70% 109,000 文化、体育和娱乐业1,573,440 0.55% 1,148,906 住宿和餐饮业1,372,705 0.48% 1,224,965 其他8,082,725 2.82% 1,889,210 公司贷款及垫款小计199,009,186 69.47% 51,717,108 个人贷款及垫款74,384,357 25.96% 67,210,177 票据贴现13,104,993 4.57% 13,104,993 发放贷款及垫款总额286,498,536 100.00% 132,032,278 五、财务报表主要项目注释(续)6. 发放贷款及垫款(续)(3) 按担保方式分布情况分析本集团本行2022年2021年2022年2021年12月31日12月31日12月31日12月31日信用贷款61,617,398 47,398,227 61,436,215 47,248,180 保证贷款133,810,471109,016,175130,221,583107,218,078 抵押贷款97,978,701101,095,217 97,165,209100,528,739 质押贷款37,514,527 31,518,049 36,512,147 31,503,539 发放贷款及垫款总额330,921,097289,027"],
["3.1.1利息净收入、净利差及净利息收益率报告期内,本行实现利息净收入人民币122.54亿元,较上年同比增加人民币3.05亿元,增幅2.55%;占营业收入81.14%。其中:业务规模调整导致利息净收入增加人民币9.23亿元,收益率或成本率变动导致利息净收入减少人民币6.18亿元。报告期内,本行生息资产和付息负债的平均余额、该类资产利息收入及支出、生息资产平均收益率及付息负债平均成本率如下表列示:单位:人民币千元"],
["八、风险管理(续)2. 市场风险(续)(b) 外汇风险本集团的外汇风险主要来自客户外币的投资及存款。本集团通过将以外币为单位的资产与相同币种的对应负债匹配来管理外汇风险。本集团于报告期末的外汇风险敞口如下:本集团2022年12月31日人民币美元其他合计(折合人民币) (折合人民币) (折合人民币) 资产现金及存放中央银行款项存放和拆放同业及其他金融机构款项26,481,997 1,792 3,661 26,487,450 4,151,727 133,120 47,871 4,332,718 买入返售金融资产12,386,501 --12,386,501 发放贷款及垫款322,164,335 42,699 -322,207,034 投资(注(1)) 180,653,149 2,891,678 -183,544,827 应收租赁款30,633,447 --30,633,447 其他1,520,110 707 -1,520,817 资产总额577,991,266 3,069,996 51,532 581,112,794 负债向中央银行借款20,105,825 --20,105,825 同业及其他金融机构存放款项和拆入资金58,486,514 603,321 -59,089,835 卖出回购金融资产款18,819,611 278,584 -19,098,195 吸收存款341,606,478 187,203 4,085 341,797,766 应付债券94,992,906 --94,992,906 其他993,523 84 -993,607 负债总额535"],
["截至报告期末,本行公司贷款的不良贷款主要集中在:房地产业、批发和零售业、制造业,不良率分别为4.06%、2.51%、4.22%。3.3.4按担保方式划分的贷款及不良贷款情况本行按担保方式划分的贷款及不良贷款情况明细如下:单位:人民币千元3.3.5借款人集中度截至报告期末,本行对任何单一借款人的贷款余额均未超过本行资本净额的10%。下表列示截至报告期末本行十大单一借款人(不包括集团借款人)的贷款余额,概无不良贷款。"]
]
# To dict
data = {
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truth": ground_truths
}
# Convert dict to dataset
dataset = Dataset.from_dict(data)
import os
os.environ['OPENAI_API_KEY'] = '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'
os.environ["http_proxy"] = "http://localhost:7890"
os.environ["https_proxy"] = "http://localhost:7890"
from ragas import evaluate
from ragas.metrics import (
answer_relevancy,
context_precision,
faithfulness,
answer_correctness,
answer_similarity,
)
from tenacity import (
retry,
stop_after_attempt,
wait_random_exponential,
)
@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def do_evalue(dataset,metrics):
return evaluate(
dataset = dataset,
metrics=[
answer_relevancy,
context_precision,
faithfulness,
answer_correctness,
answer_similarity,
],
)
result = do_evalue(
dataset = dataset,
metrics=[
answer_relevancy,
context_precision,
faithfulness,
answer_correctness,
answer_similarity,
],
)
df = result.to_pandas()
df
只要把 RAG 过程中的 question , contexts , answer , ground_truths ,构建成一个 Dataset 实例,即可使用上面的代码一键启动测评,非常方便。
由于小编的科学上网工具出了点问题,在此不能展示具体的df结果集。感兴趣的同学可以自行上手测试。
参考文章:
《如何评估 RAG 应用的质量?最典型的方法论和评估工具都在这里了》