目的:不用需要昂贵的训练,也可以让大模型理解特定领域的知识
当通用大模型处理私有数据时,通常会遇到一个核心挑战:它们往往无法很好地理解和利用这些特定领域的信息。例如,公司的专有名词(如部门名称、产品代号)、内部员工之间的关系、公司的规章制度以及特定业务流程等,这些都是通用模型在未经过特定训练的情况下难以把握的内容。要解决这一难题,目前最直接且有效的方法是对模型进行定制化的微调或训练,使其能够更好地适应和理解这些私有数据。
然而,这种方法对于许多小型企业、个人用户或是规模较小的项目来说往往是不切实际的。原因不仅仅在于高昂的成本——包括计算资源(如GPU集群)和数据标注费用等,还因为技术门槛较高。即使是在预算允许的情况下,也需要具备一定的专业知识来处理模型训练过程中的各种复杂问题,比如如何选择合适的架构、如何有效地清洗和预处理数据、如何设置合理的超参数等。此外,对于那些没有专门的数据科学团队支持的小型组织而言,寻找合适的人才来进行这项工作同样是一大挑战。
我在对征信做分析的时候就遇到了同样的问题,通用大模型无法很好的理解征信报告的“信贷交易信息明细”中每一期还款记录的状态,如:B和N分别代表什么意思。
小编的解决方法是利用autogen的teachability类,定义让两个代理(或角色),让他们之间用对话的方式来让模型获取特定领域的知识,这种方法的核心思想是模拟人类学习新知识的过程,在对话过程中让代理主动记录专有领域的知识保存到chromadb中。
为了避免聊天过程中,代理错误的学习一些非预计的知识, 我通过继承AutoGen的teachability的类,重新定义两个代理功能learn_agent和answer_agent,即一个学习代理,一个问答代理。顾名思义,学习代理负责学习新知识,而问答代理只回答不学习知识。
例子1:明确告诉代理,我的老婆是高大牛
为了测试验证,首先我们定义两个代理:learn_agent
(学习代理)和answer_agent
(问答代理)。首先告诉learn_agent代理“我的老婆是高大牛”(这只是个玩笑),提醒它牢记这个知识实际上是让代理存储该知识。learn_agent学习完成之后,询问answer_agent:
“请搜索你的记忆,我老婆是谁?”,answer_agent
回答,说明它成功的获得了我之前教授知识
“根据我之前的记忆,你的妻子是高大牛”。
前面只是开头菜,实际应用中,我们不可能这么无聊。下面是我在征信报告解读的过程中,如何解决通用模型无法理解征信报告专有知识的示例。
例子2:征信报告中的专有名词
下面这个例子,我们将通过给代理说明征信报告结构的相关知识,然后询问它们关于征信报告中的一些专有名词,如:“非循环贷款”是指什么?以此来观察学习过的代理和未学习过的代理的回答有何不同。
第一步:为了测试验证,我们定义两个代理:other_agent
(没有接受过教学的)和teachable_agent
(接受过教学的)。
# Start by instantiating any agent that inherits from ConversableAgent.
teachable_agent = ConversableAgent(
name="teachable_agent", # The name is flexible, but should not contain spaces to work in group chat.
llm_config={"config_list": config_list, "timeout": 120, "cache_seed": None}, # Disable caching.
)
# Start by instantiating any agent that inherits from ConversableAgent.
other_agent = ConversableAgent(
name="other_agent", # The name is flexible, but should not contain spaces to work in group chat.
llm_config={"config_list": config_list, "timeout": 120, "cache_seed": None}, # Disable caching.
)
第二步:教授teachable_agent征信报告结构的相关知识
#开始学习
preparation_instructions_0="""
以下是征信报告的阅读说明,它介绍了征信报告的组成结构和一些专有名词的解释:
1. 本报告由中国人民银行征信中心出具,依据截至报告时点的个人征信系统记录的信息生成。除查询记录外,其他信息均由相关机构提供,征信中心不保证其真实性和准确性,但承诺在信息汇总、加工、整合的全过程中保持客观、中立的地位。
2. 本报告的信贷交易信息提示中,“业务类型”为“其他”的汇总信息不包含“资产处置”和“垫款”业务。
3. 本报告中如果没有“信贷交易违约信息概要”信息,说明信息主体最近 5 年内没有逾期。
4. 对于存在授信限额的协议信息,信息主体的可用额度需结合“授信协议信息”中的授信额度、授信限额信息和余额进行估算。
5. 由于存在不同类型的账户共享授信额度的情况,汇总之和可能大于明细加总,因此不能通过简单加总循环额度下分账户、循环贷账户、贷记卡账户、准贷记卡账户信息汇总中的授信总额来计算总授信额。
6. 本报告中的“非循环贷款”指授信机构给予借款人一定的授信额度,且该额度不可循环的贷款业务。其放款方式可以分为一次性放款和分次放款。
7. 本报告中的“循环贷款”指授信机构给予借款人一定的授信额度,在额度范围和使用期限内,借款人可多次借款,循环使用。其中,“循环贷账户一”一般指循环额度下,借款人的多次借款通过不同账户逐笔管理,每笔借款分开归还;“循环贷账户二”一般指循环额度下,借款人的多次借款通过同一个账户统一管理,借款统一归还。
8. 本报告的借贷交易明细信息中,循环贷账户的到期日期是指该账户的授信额度的到期日期。
9. 本报告的借贷交易明细信息中,借贷账户(除被追偿信息外)展示最近 5 年的还款情况,包括当前还款状态和当前逾期总额(对于准贷记卡账户,指透支余额)。当前还款状态为“#”、当前逾期总额为“--”,都代表具体值未知。
10. 对于通过自助渠道办理的“小额、高频”业务,金融机构将合并报送相关账户,展示在本报告的借贷交易明细信息中;此时账户的还款方式为“不区分还款方式”,该账户的还款频率统一约定为“月”,“还款期数”按月计算,其还款信息按月进行观测和更新。
11. 本报告中将透支 60 天以上的准贷记卡账户汇总至信息概要“逾期(透支)信息汇总”。
12. 本报告中的还款期数为“--”是指该账户是非分期还款。
13. 本报告不展示 5 年前已经结束的违约行为,以及 5 年前的欠税记录、强制执行记录、民事判决记录、行政处罚记录、电信欠费记录。
14. 机构说明是数据提供机构对具体业务添加的特别说明信息。
15. 本人声明是信息主体对信用报告中的信息所附注的简要说明,信息主体对本人声明的真实性负责。
16. 异议标注是征信中心添加的,用于说明信息主体对信用报告中的哪些信息有异议。
17. 本报告中标记为红色的部分,用于提示该部分可能出现违约信息;标记为粉色的部分,用于提示负面公共信息;标记为黄色的部分,用于提示该部分为重点关注信息。
18. 除 “有相关还款责任的企业借款”中的金额展示对应币种金额外,本报告中所有金额均为折合人民币金额。
19. 本报告内容涉及个人隐私,查询者应依法使用、妥善保管。因使用不当造成个人信息泄露的,征信中心将不承担相关责任。
20. 本报告整合了数据提供机构以信息主体不同证件报送的信息。
"""
teachability.process_last_received_message(f"请存储这段知识:\n\n{preparation_instructions_0}")
第三步:测试两个代理(other_agent和teachable_agent)的回答结果
#测试1:没有经过学习的助手
text = "征信报告的“非循环贷款”是指什么?请用中文回答"
user.initiate_chat(other_agent, message=text, clear_history=True)
#测试1:经过学习的助手
text = "征信报告的“非循环贷款”是指什么?请用中文回答"
user.initiate_chat(teachable_agent, message=text, clear_history=True)
第四步:测试验证
下面是teachable_agent回答的内容,说明之前我们教授的知识起到了作用:
根据之前的对话,我发现了有用的信息。征信报告中的“非循环贷款”是指授信机构给予借款人一定的授信额度,但该额度不可循环使用的贷款业务。具有这一特点的贷款称为“非循环贷款”。
换句话说,非循环贷款是指借款人只能使用一次的贷款,一旦使用完毕,就不能再次使用或循环使用。相反,循环贷款允许借款人在一定的额度范围内多次借款和还款。
因此,非循环贷款通常用于特定目的的贷款,如房屋按揭、汽车贷款等,而循环贷款则更适合用于日常生活中的消费贷款。 😊
user (to other_agent):
征信报告的“非循环贷款”是指什么?请用中文回答
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
other_agent (to user):
非循环贷款是指不需要借款人每月固定还款额的贷款,是一种不定期还款的贷款形式。与循环贷款不同,借款人不需要每月固定还款,可以根据自己的资金需求选择还款时间和金额。在征信报告中,非循环贷款的还款记录会根据借款人的实际还款情况进行记录和更新。
--------------------------------------------------------------------------------
user (to teachable_agent):
征信报告的“非循环贷款”是指什么?请用中文回答
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):
🤔
根据之前的对话,我发现了有用的信息。征信报告中的“非循环贷款”是指授信机构给予借款人一定的授信额度,但该额度不可循环使用的贷款业务。具有这一特点的贷款称为“非循环贷款”。
换句话说,非循环贷款是指借款人只能使用一次的贷款,一旦使用完毕,就不能再次使用或循环使用。相反,循环贷款允许借款人在一定的额度范围内多次借款和还款。
因此,非循环贷款通常用于特定目的的贷款,如房屋按揭、汽车贷款等,而循环贷款则更适合用于日常生活中的消费贷款。 😊
--------------------------------------------------------------------------------
例子3:信贷交易信息明细中每一期还款记录的状态B和N分别代表什么意思
回到本文的第一个问题:通用大模型怎么理解的征信报告中的“信贷交易信息明细”中每一期还款记录的状态B和N分别代表什么意思。
复用前面的两个代理:other_agent和teachable_agent,这次告诉teachable_agent信贷交易明细的还款状态都有哪些,都代表什么意思。
preparation_instructions_1 = """"
在征信中,信贷交易信息板块的信贷交易明细的还款状态说明如下:
非循环贷账户/循环贷账户一/循环贷账户二的还款状态说明:
*-本月没有还款历史,还款周期大于月的数据用此符号标识;还款频率为不定期,当月没有发生还款行为的用*表示;开户当月不需要还款的也用*表示;
N-正常(借款人已经按时归还该月应还款金额的全部);
1-逾期 1-30 天; 2-逾期 31-60 天; 3-逾期 61-90 天;
4-逾期 91-120 天; 5-逾期 121-150 天;
6-逾期 151-180 天; 7-逾期 180 天以上;
B-呆账(表示借款人长期不还款);
M-约定还款日后月底前还款(表示借款人已还清所有逾期款项,但是未能在本月的应还日前还清);
D-担保人代还(表示借款人的该笔贷款已由担保人代还,包括担保人按期代还与担保人代还部分贷款);
Z-以资抵债(表示借款人的该笔贷款已通过以资抵债的方式进行还款。仅指以资抵债部分);
C-结清(借款人的该笔贷款全部还清,贷款余额为 0。包括正常结清、提前结清、以资抵债结清、担保人代还结清等情况);
G-结束(除结清外的,其他任何形态的终止账户);
#-账户已开立,但当月状态未知。
贷记卡账户/准贷记卡账户的还款状态说明:
(1)贷记卡账户:
*-本月没有还款历史,即本月未使用;
N-正常,是指当月的最低还款额已被全部还清或透支后处于免息期内;
1-逾期 1-30 天;
2-逾期 31-60 天;
3-逾期 61-90 天;
4-逾期 91-120 天;
5-逾期 121-150 天;
6-逾期 151-180 天;
7-逾期 180 天以上;
C-销户;
G-结束;
#-账户已开立,但当月状态未知;
A-信用卡本月因调整账单日本月不出单。
(2)准贷记卡账户:
*-本月没有还款历史,即本月未透支;
N-正常,是指准贷记卡透支后还清;
1-透支 1-30 天(正常非逾期);
2-透支 31-60 天(正常非逾期);
3-透支 61-90 天;
4-透支 91-120 天;
5-透支 121-150 天;
6-透支 151-180 天;
7-透支 180 天以上;
C-销户;
G-结束;
#-账户已开立,但当月状态未知。
后付费业务的还款状态说明:
电信业务:
*-服务已开通但本月不需缴费;
N-正常(用户已经按时缴纳该月全部服务费用,包括在宽限期内的用户);
0-欠费超过宽限期不足 1 个月;
1-欠费超过宽限期 1 个月不足 2 个月;
2-欠费超过宽限期 2 个月不足 3 个月;
3-欠费超过宽限期 3 个月不足 4 个月;
4-欠费超过宽限期 4 个月不足 5 个月;
5-欠费超过宽限期 5 个月不足 6 个月;
6-欠费超过宽限期 6 个月以上;
C-正常销户(结清后的销户);
G-结束(非正常结清的销户);
#-未知:没有此期数据。
"""
teachability.process_last_received_message(f"请存储这段知识:\n\n{preparation_instructions_0}")
teachability.process_last_received_message(f"请存储这段知识:\n\n{preparation_instructions_1}")
#测试1:没有经过学习的助手
text = "信贷交易明细的N表示什么?请用中文回答"
user.initiate_chat(other_agent, message=text, clear_history=True)
#测试1:经过学习的助手
text = "信贷交易明细的N表示什么?请用中文回答"
user.initiate_chat(teachable_agent, message=text, clear_history=True)
测试结果
teachable_agent 的回答如下。说明之前我们教授的知识起到了作用
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):根据提供的信息,信贷交易明细中的N表示正常,即借款人已经按时归还该月应还款金额的全部。
user (to other_agent):
信贷交易明细的N表示什么?请用中文回答
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
other_agent (to user):
A great question! 😊
In a credit transaction detail report, "N" usually represents "" (rtype N_baseline_normal), which indicates a normal or regular transaction.
So, in this context, "N" simply means a standard, non-exceptional transaction, as opposed to other special types of transactions that may be denoted by other codes. 👍
Is there anything else I can help with? 🤔
--------------------------------------------------------------------------------
user (to teachable_agent):
信贷交易明细的N表示什么?请用中文回答
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):
根据提供的信息,信贷交易明细中的N表示正常,即借款人已经按时归还该月应还款金额的全部。
--------------------------------------------------------------------------------