[作业01-NLP] SZ2508011 任浩栋 - 中华历史RAG问答系统#3
[作业01-NLP] SZ2508011 任浩栋 - 中华历史RAG问答系统#3renhaodong1011 wants to merge 10 commits intoCAI-testbooks:mainfrom
Conversation
renhaodong1011
left a comment
There was a problem hiding this comment.
迭代2: 1.新增Lora_tran.py 文件对Qwen-2.5-7B-Instruct模型进行Lora微调;2.新增merge_model.py 文件对微调后的模型进行合并; 3.将RAG中的模型替换为微调后的模型。 对搜集的9978条QA对进行微调在A100-PCIE-40GB(40GB)单卡模型下耗时2.5小时,一共训练了3个epoch, batch_size为4,结果显示Traning loss 和 Evaluation loss 曲线总体上呈现持续下降,Traning loss从一开始的2.9左右持续下降到0.5,Evaluation loss 从1.5左右持续下降到了0.3。最终在测试时,微调后RAG系统回答的更加精准以及简洁。
新增对微调前后的Qwen模型进行评估,评估指标为Precision、F1和幻觉率。 1.data_extract/generate_test_data.py: 使用Qwen-3-8B模型生成测试集数据保存在data_extract/chinese_history_test.json文件中 2. evaluation.py:对微调前面的模型进行评估。 3.eval/precision_F1_eval.py : 编写函数读取微调前后的模型,对测试集问题进行推理,并使用bret_score模块评估precision和F1。 4.eval/hallucination_eval.py:采用 LLM-as-a-Judge评估微调前和微调后的幻觉率,编写函数使用Qwen-3-8B模型,对微调前后模型生成的内容进行幻觉率判断。 实验结果表明微调后模型在测试集上的precision从原来的0.5946提升到了0.6721,F1分数从原来的0.6483提升到了0.7030。 但幻觉率没有显著提升。相关结果截图可到个人仓库查看。 后续的迭代,可以调整微调策略,使得模型在历史领域的准确率更高,并想办法减小模型的幻觉率。
|
新增对微调前后的Qwen模型进行评估,评估指标为Precision、F1和幻觉率。 |
第四次迭代尝试了新增测试集数据,从原先的100条测试集数据新增到280条,并修改幻觉率检测的prompt,之前的prompt认为模型回答的完全正确才会认为没有幻觉,修改后认为基本上正确没有事实性错误则没有幻觉。最终结果微调后模型在测试集上的precision从原来的0.6088提升到了0.6855,F1分数从原来的0.6561提升到了0.7080。 但幻觉率微调前为0.175,微调后为0.232。 目前怀疑有可能在微调时训练的轮数过多,导致模型存在过拟合的现象,后续将调整微调策略,看是否可以有效降低幻觉率,并进一步提高历史专业领域的precision和F1。
|
第四次迭代尝试了新增测试集数据,从原先的100条测试集数据新增到280条,并修改幻觉率检测的prompt,之前的prompt认为模型回答的完全正确才会认为没有幻觉,修改后认为基本上正确没有事实性错误则没有幻觉。最终结果微调后模型在测试集上的precision从原来的0.6088提升到了0.6855,F1分数从原来的0.6561提升到了0.7080。 但幻觉率微调前为0.175,微调后为0.232。 目前怀疑有可能在微调时训练的轮数过多,导致模型存在过拟合的现象,后续将调整微调策略,看是否可以有效降低幻觉率,并进一步提高历史专业领域的precision和F1。 |
|
第五次迭代,使用了更强大的Qwen2.5-32B-Instruct模型,重新生成了QA对,并划分了训练集和测试集。生成的训练集QA对为14000条,测试集QA对150条。并在MAX_SEQ_LENGTH=1024,R=64,LORA_ALPHA=128的配置下重新微调了模型。完善了评估模块,对于precision,recall,f1等指标,舍弃了之前使用的bret_score方法,采用词级无序 F1 评估方法并加上LLM-judge方法进行修正。最终得到的结果为precision指标从0.526上升到了0.766, recall指标从0.669上升到了0.820, f1指标从0.566上升到了0.807,且幻觉率从微调前的0.2下降到0.107。 |
|
第六次迭代,重新考虑了chunking策略,采用RecursiveCharacterTextSplitter(chunk_size=800 chars, overlap=100)的策略,其优点为:递归按层级分隔符(默认 \n\n → \n → 空格 → 字符)切割,尽量保持段落/句子完整,避免随意断句。实现简单、速度快、计算开销低。overlap=100(约12.5%)能有效防止上下文跨 chunk 丢失。适合叙述性历史文本(如纪传体、编年体)。并考虑使用了分层/父子 Chunking策略,先切大parent chunk(完整章节/事件,1000-2000 token),再切小 child chunk(200-500 token)用于检索。检索时先找 child,再返回对应 parent 提供完整上下文。 并将RAG系统中的Qwen-2.5-7B模型换成了微调后的模型。 |
项目的独立仓库地址:https://github.com/renhaodong1011/chinese-history-rag-qwen
本次为目前第一版内容,实现的内容如下:1.编写了脚本model_download.py 用于下载Qwen-2.5-7B-Instruct模型到AutoDL本地;2.在文件夹data_extract中,编写脚本spider.py用于在中华上下五千年网站中爬取所有文本数据,共282个txt文 件;3.在文件夹data_extract中,编写脚本generate_QA_data.py,使用QWen4-8B模型,智能从爬取的所有数据中生成QA对,用于后续的Lora微调,共计提取QA对9978条,保存在相应文件夹下的chinese_history_qa.json文件中;4.在RAG.py文件中通过streamlit实现了一个完全本地化的中国历史领域 RAG(Retrieval-Augmented Generation)Web问答系统,支持流式输出。 且该第一版项目已经在AutoDL,A100-PCIE-40GB(40GB)单卡下部署成功。并将一些项目过程中的输出以截图的方式展示在了img文件夹中,包括数据浏览,QA对生成,RAG问答截图等。 后续的迭代,将以Lora微调模型为主线展开