RAG之微调垂域BGE的经验之谈
1、数据集格式
{"query": str, "pos": List[str], "neg":List1[str], List2[str], List3[str], List4[str]}
{"query": "小孩做胃镜有哪几种方法",
"pos": ["儿童做胃镜常用的方法有如下两种:1、有痛胃镜,不在麻醉状态下做胃镜;2、无痛胃镜,在麻醉状态下做胃镜。国内通用的方法,不建议麻醉。因为小孩子麻醉,有很多副反应,包括麻醉药本身的副作用和麻醉后的复苏,都有副反应。不麻醉,即不使用麻醉药,目前通用的方法是抓麻,即把小孩抓住,做胃镜。这种情况虽然恢复快,但也有不好的地方。因为小孩害怕做该检查。在不麻醉非常清楚的情况下,做检查时比较痛苦,虽然过程比较短暂,但是对以后的心理上会造成一定阴影和压力。综合利弊就是这两种各有各的好处和不好的地方。对于患儿配合度较好的,建议不使用麻醉。对于不配合甚至极不配合的患儿,建议麻醉做胃镜做相关检查。"],
"neg": ["胃镜检查在临床上是非常常用的,而且是非常有效的一个检查方式。其实在国外,尤其是在日本、欧美一些国家,它是被列为体检检查的,不是有症状了才来查,而是到了一定年龄就应该做这项检查。有些胃的早期病变,比如胃早癌、萎缩性胃炎,它临床上是没有症状的或者症状很轻微,很难被早期发现,所以胃镜检查非常重要。做胃镜检查一般分成两种方式:一、普通的胃镜。给病人口服一支利多卡因胶浆,它主要是起到麻醉咽部的作用,减少胃镜的痛苦,在常规的清醒状态下就可以做胃镜。二、无痛胃镜。无痛胃镜其实就是一种麻醉胃镜,就是用一种静脉麻醉的方式让他睡着,就没有痛苦的这种反应了,再做胃镜检查。这两种检查的效果相同,但是如果病人比较敏感,咽部的反射比较强烈,建议还是做无痛胃镜,这样检查的效果更好。关于费用,一个普通的胃镜加上胃镜之前要做一些抽血的检查,主要是筛查传染病,费用大概在500-800块钱左右。如果是麻醉胃镜或者无痛胃镜,费用相对来说,因为它有麻醉的费用,包括一次性耗材的使用,可能费用在2000块钱左右。",
"做胃镜并非就诊当天就能做胃镜,也不是任意时间均可做胃镜。胃镜检查之前要先预约,中国人看病,很多情况下来了就要看病,或进医院就要检查,这种习惯逐渐在改变,必须提前预约。因为做胃镜需要达到一定要求:第一,身体要达到一定要求。不能有严重心肺疾病,不能有严重的精神疾病,口腔、咽部及存在一些其他的症状,这些情况不能做胃镜。如颈椎有严重脱位也不能做胃镜,做胃镜是有禁忌症的。做胃镜前医生需要给患者讲解清楚,同时让患者签一张知情同意书。如选择做无痛胃镜更需要提前预约,医生需讲清楚某些状况下不能做无痛胃镜,因为使用无痛药物后会诱发某些疾病发作。做胃镜前一定要先预约,医生会告之其注意事项。基本注意事项是,如第二天上午做胃镜,需要禁食,前一日晚上晚饭后应禁食,第二日早晨也不需禁食,最好达到8小时。即使在这种情况下,部分人胃动力不好,置入胃镜后会出现胃潴留,发生胃潴留做胃镜是没有效果的。首先胃潴留后因为胃内有很多食物导致看不到病变部位,其次胃阻流时做无痛胃镜,会发生反流,造成窒息,这是很危险的情况。因此做胃镜前需要禁食、禁水一定的时间。某些特殊疾病做胃镜时,医生会告知注意事项。如为糖尿病及高血压患者需做胃镜,糖尿病患者早上需注射胰岛素或口服降糖药,做胃镜要求术晨禁食,所以对于糖尿病及高血压病人医生会进行术晨用药指导,告之何时服药。总之,做胃镜前有很多要求,一定要在做胃镜前,去内镜室与医生联系,确定注意事项。",
"胃镜是检查胃癌的金标准,分为普通胃镜、镇静胃镜、胶囊胃镜和全麻胃镜,通过检查可发现胃黏膜病变情况,亦可由病理活检确诊胃癌。除此之外,CT检查可发现胃肿瘤的局部侵犯情况,包括肝、肺或其它脏器是否发生转移,以确定肿瘤分期及淋巴结分期,进而确定患者是否适合进行手术治疗,若不适于手术则建议采取化疗或放疗手段,以为患者选择最佳的治疗方案。其中,患者进行胃镜检查当天清晨需禁食,并口服局麻药物,以减轻检查过程中的咽喉部反应;或给予镇静药物或剂量稍重的麻醉药物,以行镇静胃镜或全麻胃镜检查,减轻患者不适感。",
"这个问题可能做过的患者就很清楚,没做过的患者都会有疑虑,特别是很多患者会害怕胃镜检查。经常碰到患者跟我说,犹豫了几个月都没敢来做,最后下定决心终于来做了,结果发现原来胃镜也不是那么难受,当然他是做的无痛的胃镜检查。其实胃镜检查从外行来看是个很简单的过程,患者躺在病床上左侧卧位,然后医生通过一条软管从口腔咽喉进入食道,然后再进入胃进入十二指肠。在进和退的过程中进行各个部位的仔细观察,医生会在这个过程中得出结论、诊断,所以还是比较简单快捷的检查。有经验的医生一般在5min之内,当然如果有特殊情况,比如胃里面有一些病变需要活检或者治疗,可能会需要的时间更长一点。",
"胃镜检查前需空腹6-8小时,前1天晚餐进食少渣、易消化食物,检查当天避免进食辛辣热烫食物,检查前取出活动性假牙。高血压、糖尿病患者需根据实际情况,在医生指导下选择性服药。胃镜检查过程中可出现恶心、呕吐、腹胀、腹痛等情况,积极配合工作人员指导,多数患者均能够顺利完成检查。检查前使用局部麻药者,术后2小时再饮水进食,以免引起呛咳。根据个体情况术后暂停1-2天阿司匹林、华法林、波立维、泰嘉等药物;若患者检查后出现剧烈腹痛、呕吐、出血等情况,需及时就医诊治。",
"做胃镜前的注意事项如下:1、根据医生判断,患者病情应符合检查指征;2、检查当天早晨保持空腹,检查前进行血象化验;3、检查前需停服部分药物,如服用阿司匹林、三七等活血化瘀、抗凝药物者,检查前应在医生指导下尽量停药一周,以保证检查的安全性;由于检查过程中,可能发现可疑病变,需取活检,若服用抗凝药,可能出现出血量较多的情况。",
"做无痛胃镜时,患者要保证胃内的食物已经彻底排空,有些患者有胃潴留或胃蠕动的障碍,不建议做胃镜。医生会给患者注射些短效的麻醉药物,使患者处于睡眠状况,医护人员会使用特殊的监测设备监测患者的生命体征,如心率、呼吸、血氧等,最后医生会将胃镜管缓慢插入胃内进行观察。过程中患者的感觉较轻,多数情况下不会出现特殊的不适。检查以后医生会叫醒患者,患者早期会有些头晕不适症状,一般会缓慢自行消失。医生在做完胃镜以后,要嘱咐患者在3天之内尽量不要吃不易消化的食物以及刺激性的辛辣食物。",
"无痛胃镜是借助麻醉医生给患者从静脉输入一种短效的麻醉药物,输完麻醉药物以后病人很快进入睡眠状态,然后在病人睡眠状态下,内镜医生进行常规的内镜操作,操作完以后病人就会立刻清醒。所以在这个过程中做无痛胃镜是有一定危害的。具体危害有以下几点:1、有些患者会对麻醉药品出现过敏反应,或者中毒反应,出现呼吸或心跳加快,会出现麻醉意外,甚至病人会昏迷;2、麻醉药品都有一定的呼吸抑制,当出现有呼吸道梗阻或者呼吸抑制时,病人会出现呼吸困难,这时也是比较危险的;3、有些病人会出现胃内容物反流入气管而出现麻醉意外。有些患者有呼吸道情况,比如咳嗽、哮喘、心功能不全,这些患者的无痛胃镜属于禁忌症,其完全不能做无痛胃镜。", "胃镜检查是一种有创检查,可对患者造成一定的生理痛苦。年龄较大或既往有心脏病史的患者,应先通过心电图排查,患明确胃部疼痛等症状是否因心脏病引起,因心梗病人做胃镜后可直接损害心脏,应尽量避免。另外肝炎、HIV等传染病患者也不适宜进行胃镜检查,因胃镜反复利用,有造成医源性交叉污染的可能。",
"无痛胃镜需要进行全身麻醉,其危害如下:1、静脉麻药可引起呼吸抑制、呛咳、恶心、呕吐,尤其在饱胃状态下,患者出现恶心、呕吐的可能性会大大提高,所以全身麻醉前需禁食6-8小时;2、患者被麻醉后,意识会丧失,咽喉反射也会消失,可能出现误吸,严重者可导致当场窒息死亡。所以全麻手术若非急诊,一定要保证足够的禁食时间。"]}
2、对于微调数据的构造
Method 1
bge基础模型向量化数据
对每个query召回top10
计算top10的重排得分 #重排得分的计算方法是?Bge-reranker-large
#关于重排参考文章:RAG 实战 | (三)使用 BAAI/bge-reranker 增强 RAG_bge-reranker-large-CSDN博客
两两计算query、answer、target_query、target_answer的bge_cos-sim、jacard 相似性系数、lcs、编辑距离
使用重排得分、bge相似度、jacard相似度系数等数值组合,筛选出训练的数据
Query targetquery Answer targetanswer
writer.writerow(["query", "answer", "target_query", "target_answer", "rerank_score",
"query_tgt_query_bge_cos", "query_tgt_query_lcs_score", "query_tgt_query_edit_dist", "query_tgt_query_jaccard",
"answer_tgt_query_bge_cos", "answer_tgt_query_lcs_score", "answer_tgt_query_edit_dist", "answer_tgt_query_jaccard",
"query_tgt_answer_bge_cos", "query_tgt_answer_lcs_score", "query_tgt_answer_edit_dist", "query_tgt_answer_jaccard",
"answer_tgt_answer_bge_cos", "answer_tgt_answer_lcs_score", "answer_tgt_answer_edit_dist", "answer_tgt_answer_jaccard"
])
Method 2
使用bge基础模型向量化数据
对每个query召回top100
过滤出0.4到0.7的数据作为负样本/或者从range_for_sampling范围内随机抽样
注:负样本的构造是用以上两种方法生成。
正样本的构造
LLM根据段落生成问答对,query是生成的问题,passage是给定的段落,如此构成一个正例对。LLM生成的数据过滤下来后,不到1w条
Prompt:
prompt = f"""
'''
{paragraph}
'''
请你从以上文献段落中抽取问答对, 务必严格遵守以下要求:抽取出来的问题和答案必须包含主语谓语宾语, 不得出现 本研究、本实验 等指代不明的词语, 请确保抽取出的问题必须能在原文中找到答案, 返回结果的格式请严格按照'''中的格式
'''
[
{{
"问题": "问题1内容",
"回答": "问题1的答案"
}},
{{
"问题": "问题2内容",
"回答": "问题2的答案"
}},
{{
"问题": "问题3内容",
"回答": "问题3的答案"
}}
]
'''
"""
3、训练参数
Batch_size要大(结合gradient_accumulation_steps使用),否则小的batch_size训练过程中loss非常陡,效果很差
4、可改进的地方
用训练好的向量模型去构造困难样例,再去训练基座模型,是否效果会更好
将负样本从阈值区间采样,改为取相对来说更相近的前TopK个