前言

近期,各类维权新闻层出不穷,在这个法治社会,法律意识和素养对于每个人来说都至关重要。然而,面对庞杂的法律条文和纷繁复杂的案情,我们往不得不借助一些专业的律师团队,但是能否降低大部分劳动者的普法用法成本,是一个思考的问题。

恰逢 Intel 举办线上竞赛   “大语言模型(LLM)创新应用开发大赛”。我希望借助阿里云的英特尔至强可扩展处理器的G8i云环境开发一个贴心的法律虚拟助手。


设计思路

我计划基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现一个法律援助 Agent 应用。并后续通过阿里云的英特尔至强可扩展处理器的G8i云环境进行专项调优。后续计划使用多个LLM模型做对照组

主要应用的技术有:Langchain-ChatGLM或新版本的Langchain-chatchat、xFasterTransformer、LLM模型采用的是推荐使用的THUDM/ChatGLM3-6B,Embedding模型是 BAAI/bge-large-zh,对照组采用Qwen-72B-Chat

问题思考

现市场上开源的大模型基本上都是基于网络公开数据进行训练出来的通用模型,如果直接用于AIGC应用(如需要围绕具体的业务来进行问答)开发,通常存在一些较为明显的短板,如:缺少行业领域的私域数据,专有问题解答效果差;数据时效性很低,对实时要求高的问题效果差等。如何将具体业务知识融合到大语言模型里,是问答应用落地需要考虑的一个重要问题。

我们计划结合LLM的既有知识,以及概括、推理、扩展等能力,提升回答的准确性和质量,并且通过数据处理、prompt调优、更换Qwen-7B(14B)等LLM模型进行测试。

技术介绍


Langchain-ChatGLM

一种利用Langchain思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案

THUDM/ChatGLM3-6B

ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性:

更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在 10B 以下的预训练模型中最强的性能。

更完整的功能支持: ChatGLM3-6B 采用了全新设计的 Prompt 格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。

更全面的开源序列: 除了对话模型 ChatGLM3-6B 外,还开源了基础模型 ChatGLM-6B-Base、长文本对话模型 ChatGLM3-6B-32K。以上所有权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。


BAAI/bge-large-zh

BGE embedding系列模型是由智源研究院研发的文本表示模型。

可将任意文本映射为低维稠密向量,以用于检索、分类、聚类或语义匹配等任务,并可支持为大模型调用外部知识。


阿里云第八代Intel CPU实例

阿里云八代实例(g8i/c8i/r8i/hfc8i/hfg8i/hfr8i)采用Intel® Xeon® Emerald Rapids或者Intel® Xeon® Sapphire Rapids,该实例支持使用新的AMX(Advanced Matrix Extensions)指令来加速AI任务。相比于上一代实例,八代实例在Intel® AMX的加持下,推理和训练性能大幅提升。


xFasterTransformer

xFasterTransformer是由Intel官方开源的推理框架,为大语言模型(LLM)在CPU X86平台上的部署提供了一种深度优化的解决方案,支持多CPU节点之间的分布式部署方案,使得超大模型在CPU上的部署成为可能。此外,xFasterTransformer提供了C++和Python两种API接口,涵盖了从上层到底层的接口调用,易于用户使用并将xFasterTransformer集成到自有业务框架中。

Qwen-72B-Chat(后续对照组)

通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛,包括大量网络文本、专业书籍、代码等。而Qwen-72B-Chat是在Qwen-72B的基础上,使用对齐机制打造的基于大语言模型的AI助手,是通义千问对外开源的72B规模参数量的经过人类指令对齐的Chat模型

LangChain云上部署

本次的项目需要借助RAG技术对外部知识进行索引,并在阿里云服务器上对预训练的开源模型进行本地部署。由于于我们要部署大模型,所以资源配额选项需要选择GPU规格不要太低。

参考以下资料,我们先简单搭建环境


  • 中文开源大语言模型chatglm
  • bge将文本映射为嵌入向量,以用于检索、分类、聚类或语义匹配等任务

环境部署

检查python环境 Python3.8 - 3.11即可(项目文档中推荐使用 Python3.11)

python --version

创建虚拟环境 在阿里云中直接部署即可,如果是在自己的电脑上,创建一个虚拟环境防止冲突

conda create --name chatchat python=3.11

在环境内安装项目的依赖

拉取仓库

git clone https://github.com/chatchat-space/Langchain-Chatchat.git

进入目录

cd Langchain-Chatchat

安装全部依赖

基于LangChain+智谱ChatGLM 的法律援助小助手_数据

pip install -r requirements.txt

pip install -r requirements_api.txt

pip install -r requirements_webui.txt

模型下载

  • 创建一个目录来统一存放所有模型
    Langchain-Chatchat/model
  • 魔搭社区:魔搭是国内的AI平台,提供开源的模型和算力。搜索到模型后,点击模型文件,点击下载模型,复制命令用git clone下载即可。需要注意,同一个模型可能不止有官方上传,下载前注意一下是否是自己需要的。

基于LangChain+智谱ChatGLM 的法律援助小助手_数据_02

在本次项目中,我使用的是ChatGLM3-6和bge-large-zh-v1.5。

将 configs/model_config.py.example 文件中

MODEL_PATH 下,embed_model下bge-large-zh-v1.5 的value修改为模型所在的绝对路径 /mnt/workspace/Langchain-Chatchat/model/bge-large-zh-v1.5

llm_model 下, chatglm3-6b 的value修改为模型所在的绝对路径 /mnt/workspace/Langchain-Chatchat/model/chatglm3-6b

初始化知识库和配置文件

回到项目根目录

python copy_config_example.py2

python init_database.py --recreate-vs

基于LangChain+智谱ChatGLM 的法律援助小助手_数据_03

 启动

python startup.py -a

基于LangChain+智谱ChatGLM 的法律援助小助手_数据_04

创建向量数据库,助手优化

这里我主要贴出来思路,主要是围绕数据清洗、查询优化、管理更新和维护

基于LangChain+智谱ChatGLM 的法律援助小助手_数据_05

加载文件-读取文本-文本分割(Text Splitter)

加载文件:这是读取存储在本地的知识库文件的步骤。

读取文本:读取加载的文件内容,通常是将其转化为文本格式。

文本分割(Text Splitter):按照一定的规则(例如段落、句子、词语、符号等)将文本分割。

基于LangChain+智谱ChatGLM 的法律援助小助手_python_06

在获得query相关的context后,如何让LLM生成高质量的response,也是一个至关重要的问题。


基于LangChain+智谱ChatGLM 的法律援助小助手_数据_07


边界优化

在某些情况下,我们需要拒绝回答用户提出的问题,这可能包括以下情况:当用户的问题不属于我们目前支持的领域,在这些情况下,我们会向用户发送一些回复,

基于LangChain+智谱ChatGLM 的法律援助小助手_数据_08

xFasterTransformer优化

使用 xFasterTransformer 转换工具转换模型

// 注意 OPT 模型采用 OPTConvert(), LLaMA 模型采用 LlamaConvert(), 以此类推
$ python -c 'import xfastertransformer as xft; xft.OPTConvert().convert("/models/opt-1.3b-hf","/models/opt-1.3b-xft")'
// python -c 'import xfastertransformer as xft; xft.LlamaConvert().convert("/models/llama-2-7b-hf","/models/llama-2-7b-xft")'

直接运行转换后的模型,进行推理

$ apt update && apt install wget -y
$ wget https://raw.githubusercontent.com/intel/xFasterTransformer/main/examples/pytorch/demo.py
$ OMP_NUM_THREADS=48 numactl -N 0 -m 0 python demo.py --dtype=bf16 --token_path /models/opt-1.3b-hf --model_path /models/opt-1.3b-xft
Please enter the prompt: Once upon a time, there existed a little girl who liked to have adventures.
==================================================
Once upon a time, there existed a little girl who liked to have adventures.
She was a little girl who liked to have adventures.
# 不同的model输出可能不同,model size越大,输出越准确

基于LangChain+智谱ChatGLM 的法律援助小助手_语言模型_09

Benchmark模型性能(可选)

运行benchmark脚本时默认使用的是假模型数据,因此不需要准备模型数据。您执行以下指令来测试模型性能。

 

cd /root/xFasterTransformer/benchmark
XFT_CLOUD_ENV=1 bash run_benchmark.sh -m chatglm2-6b -d bf16 -bs 1 -in 32 -out 32 -i 10

通过调整运行参数,来测试指定场景下的性能数据:

  • -d 或 --dtype选择模型量化类型:
  • bf16 (default)
  • bf16_fp16
  • int8
  • bf16_int8
  • fp16
  • bf16_int4
  • int4
  • bf16_nf4
  • nf4
  • bf16_w8a8
  • w8a8
  • w8a8_int8
  • w8a8_int4
  • w8a8_nf4
  • -bs或--batch_size选择batch size大小,默认为1。
  • -in或--input_tokens选择输入长度,自定义长度请在prompt.json中配置对应的prompt,默认为32。
  • -out或--output_tokens选择生成长度,默认为32。
  • -i或--iter选择迭代次数,迭代次数越大,等待测试结果的时间越长,默认为10次。



最终效果

调整一下UI这里我们是用的老版本的

基于LangChain+智谱ChatGLM 的法律援助小助手_语言模型_10