大语言模型实战

检索增强的大型语言模型通过给大型语言模型挂载一个外部知识库,在大型语言模型进行生成的同时在知识库中检索相关文档,以此来辅助大型语言模型的生成。其实就是通过检索的模式为大型语言模型的生成提供帮助,使其生成更符合要求的结果。在本节的问答实战中,首先使用BGE作为文本表征基础,并使用公开数据对BGE进行微调;其次采用ChatGLM-3为大型语言模型基座,并针对知识库问答任务进行答案生成任务微调;最后基于web-ui搭建问答知识库。

 

1. BGE微调


BGE微调过程主要采用对比学习和指令微调的方法,以提高模型在检索任务中的性能。对比学习是一种训练模型的有效方法,它通过对比正例和反例的方式学习数据的表示。在BGE的微调中,输入数据以三元组的形式提供,包括一个查询(query)、一个正例(positive)和一个反例(negative)。为了增加反例的数量,采用了批次内负例策略,即在同一个批次的数据中使用其他数据作为额外的反例。此外,还采用了跨设备负例共享方法,通过在不同GPU之间共享反例,进一步提高了训练效果。在微调的同时,针对检索任务的查询添加了指令。对于英语,指令是“Represent this sentence for searching relevant passages:”;对于中文,指令是“这个句子生成表示以用于检索相关文章:”。在评测中,对于段落检索任务,需要在查询中添加指令,但不需要为段落文档添加指令。这一微调过程旨

在提高模型在检索任务中的效果。


1. 项目介绍

本项目是基于BGE模型的文本表征模型。利用bge-base-zh模型在开源数据中进行长文本表征任务微调,并利用对比学习方法进行数据构造。代码见GitHub的RagProj项目中的bge-finetune部分,项目主要结构如下。

·data:存放数据及数据处理的文件夹。

■dev.jsonl:验证集数据。

■train.jsonl:训练数据。

■load_data.py:用于针对开源数据进行数据处理,生成训练集及验证集数据。

·finetune:模型训练的文件夹。

■arguments.py:BGE训练中相关的配置信息。

■data.py:BGE训练时所需要构建的数据格式。

■modeling.py:BGE模型文件。

■run.py:BGE训练主函数。

■trainer.py:BGE训练的trainer方法。

·predict:推理所需的代码文件夹。

■get_embedding.py:利用已训练的模型进行文本表征并计算相似度。

本项目从数据预处理、模型微调和模型预测几个部分入手,带领大家一起完成一个BGE微调任务。

 

 

2. 数据预处理

本项目中的数据来源于开源社区huggingface.co中的Multi-Doc-QA-Chinese,参考文档源数据来自悟道开源的200GB数据,其中问题和回答是通过GPT-3.5自动生成的,并且具有高质量。在原始数据集中,每个样本包含一个参考文档、99个无关文档、一个问题和一个基于参考文档的回答。这使得模型在大量文档中提取关键信息的能力得到训练。不同领域的文档保存在不同的JSON文件中。

原始数据格式如下:

 

数据处理代码见load_data.py文件,具体流程如下。

步骤1:获取开源Multi-Doc-QA-Chinese数据。

步骤2:遍历数据,获取QA中的question字段作为问题,positive_doc为正向样例,negative_doc为负向样例。

步骤3:保存数据集。

相关样例代码如下:

 

 

生成后的数据样例如下:

 

3. 模型微调

针对BGE的模型微调,采用finetune文件夹中的run.py进行模型训练,主要包含模型训练参数设置函数和模型训练函数,涉及以下步骤。

步骤1:设置模型训练参数。

步骤2:实例化分词器和BGE模型。

步骤3:加载模型训练所需要的训练数据和测试数据。

步骤4:加载模型训练所需的trainer。

步骤5:进行训练,并按需保存模型和分词器。

相关代码如下:

 

 

 

 

运行上述代码,结果如图9-5所示。

 

 

4. 模型预测

对于微调后的BGE模型,使用FlagEmbedding中提供的模型加载方法,对问题、段落进行向量表征,并计算相似度。

步骤1:加载模型。

步骤2:对问句进行向量表征。

步骤3:对段落进行向量表征。

步骤4:计算问句与段落之间的相似得分。

相关代码如下:

 


2. 基于ChatGLM3知识库答案生成任务的微调


ChatGLM3是由智谱AI和清华大学KEG实验室联合发布的对话预训练模型系列,其中ChatGLM3-6B是该系列中的一个开源模型。在保留了前两代模型的对话流畅性和部署门槛低等优势的基础上,ChatGLM3-6B引入了更强大的基础模型(ChatGLM3-6B-Base),在10B以下基础模型中具有较强大的性能。此外,模型支持全新设计的Prompt格式,原生支持工具调用、代码执行和Agent任务等复杂场景。ChatGLM3-6B系列不仅包括对话模型,还开源了基础模型和长文本对话模型,所有权重均对学术

研究完全开放,并在填写问卷进行登记后允许免费商业使用,为研究人员和开发者提供了更多的灵活性和可定制性。


1. 项目介绍

本项目是基于ChatGLM3知识库答案生成任务的微调方法介绍。利用ChatGLM3-6B模型从开源数据中进行长文本表征任务微调,并利用对比学习方法进行数据构造。代码见GitHub的RagProj项目中的chatglm3-finetune部分,项目主要结构如下。

·data:存放数据及数据处理的文件夹。

■dev.jsonl:验证集数据。

■train.jsonl:训练数据。

■load_data.py:用于针对开源数据进行数据处理,生成训练集及验证集数据。

·finetune:模型训练的文件夹。

■train_qlora.py:使用QLoRA进行ChatGLM3训练的函数。

·predict:推理所需的代码文件夹。

■predict.py:利用已训练的模型进行答案生成的方法。

本项目从数据预处理、模型微调和模型预测几个部分入手,手把手地带领大家一起完成ChatGLM3知识库答案生成微调任务。


2. 数据预处理

本项目中的数据与9.3.1节中使用相同的来源于开源社区Hugging Face中的Multi-Doc-QA-Chinese数据。数据处理代码见load_data.py文件,具体流程如下。

步骤1:获取开源Multi-Doc-QA-Chinese数据。

步骤2:遍历数据,获取QA中的question字段作为问题,positive_doc为参考知识库文档信息,answer为模型需要生成的答案。

步骤3:保存数据集。

相关样例代码如下:

 


3. 模型微调

针对ChatGLM3-6B模型微调,采用finetune文件夹中的train_qlora.py进行模型训练,主要包含模型训练参数设置函数和模型训练函数,主要涉及以下步骤。

步骤1:设置模型训练参数。

步骤2:实例化分词器和ChatGLM3-6B模型。

步骤3:加载模型训练所需要的训练数据和测试数据。

步骤4:加载模型训练所需的trainer。

步骤5:进行训练,并按需保存模型和分词器。

相关代码如下:

 


4. 模型预测

对于微调后的ChatGLM3-6B模型,使用相应的模型加载方法,可以针对问题和参考段落进行答案生成。

步骤1:加载模型与分词器。

步骤2:获取用户问题。

步骤3:生成相应结果并返回。

相关代码如下:

 


3. 基于Streamlit的知识库答案应用搭建


Streamlit是一个简单、易用的开源Python库,旨在帮助数据科学和机器学习领域的开发者轻松构建交互式应用程序。它提供了直观的API,让开发者能够快速创建功能强大的应用,无须处理复杂的网络开发问题。Streamlit支持快速迭代,自动重新运行功能可以即时反映代码变化,提供流畅的开发体验。此外,Streamlit提供了广泛的可视化选项,包括图表、地图、表格等,支持与他人共享和部署应用程序到不同的平台中。本次将借助Streamlit,利用微调后的BGE作为向量表征,并结合Faiss将相关文档进行向量存储,最后,根据用户输入的问题搜索后的结果使用微调的ChatGLM3模型生成答案,并进行展示。


1. 项目介绍

本项目是基于Streamlit搭建的知识库答案生成应用。代码见GitHub的RagProj项目中的service部分,项目主要结构如下。

·web_service:Streamlit综合服务。

■web.py:Streamlit问答主函数。

■split.py:用于针对输入文档进行拆分的方法。

本项目以Streamlit为基础进行知识库答案应用搭建。


2. 项目搭建

项目主函数采用Streamlit,使用web.py进行模型服务加载,主要包含向量表征模型初始化、ChatGLM3模型初始化、文档获取等逻辑,主要涉及以下步骤。

步骤1:获取服务必要参数。

步骤2:加载BGE向量模型。

步骤3:加载ChatGLM3模型。

步骤4:获取知识库文件,解析文档内容,并使用已加载的BGE向量模型对文档进行表征,进而将表征结果存储到Faiss中。

步骤5:获取用户问题,使用BGE向量模型对问题进行表征,结合Faiss召回相关文本内容。

步骤6:结合用户问题集召回的文档内容,使用初始化后的ChatGLM3模型,生成答 案。并在前端进行展示。

Streamlit的核心代码如下:

 

向量表征模块的核心代码如下:

 

大模型答案生成模块的核心代码如下:

 

问答样例如图9-6所示。