今天是2023年10月29日,星期日,北京,天气晴。
常看常新,我们来回顾这周一些有趣的进展。
主要包括新开源模型ChatGLM3比较的一些认识、DISC-FinLLM中文金融大模型的建设方案,这些方案中所提到工具调用以及多个lora组合的DISC-FinLLM中文金融大模型,都是对现有大模型训练和应用方式的一个尝试。
供大家一起参考。
ChatGLM3共开源三个模型,包括对话模型ChatGLM3-6B外,还开源了基础模型ChatGLM3-6B-Base、长文本对话模型ChatGLM3-6B-32K。
地址:github.com/THUDM/ChatGLM3
ChatGLM3-6B的基础模型ChatGLM3-6B-Base采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。
这看出,大模型训练的几个核心点,数据多样性、更好的拟合以及更好的训练组合配置。
其中比较有意思的点,是工具调用以及新的prompt格式,下面对其进行介绍。
1、工具调用
ChatGLM3-6B进行工具调用,ChatGLM3-6B模型支持工具调用,而ChatGLM3-6B-Base和ChatGLM3-6B-32K模型不支持。
1)定义工具tools
tools = [
{
"name": "track",
"description": "追踪指定股票的实时价格",
"parameters": {
"type": "object",
"properties": {
"symbol": {
"description": "需要追踪的股票代码"
}
},
"required": ['symbol']
}
},
{
"name": "text-to-speech",
"description": "将文本转换为语音",
"parameters": {
"type": "object",
"properties": {
"text": {
"description": "需要转换成语音的文本"
},
"voice": {
"description": "要使用的语音类型(男声、女声等)"
},
"speed": {
"description": "语音的速度(快、中等、慢等)"
}
},
"required": ['text']
}
}
]
system_info = {"role": "system", "content": "Answer the following questions as best as you can. You have access to the following tools:", "tools": tools}
2)置于history上下文,送入模型进行问答
history = [system_info]
query = "帮我查询股票10111的价格"
response, history = model.chat(tokenizer, query, history=history)
print(response)
{"name": "track", "parameters": {"symbol": "10111"}}
3)调用工具执行接口,完成查询
{"price": 12412}
4)将输出结果送入模型进行回答
role="observation"表示输入的是工具调用的返回值而不是用户输入,不能省略。
result = json.dumps({"price": 12412}, ensure_ascii=False)
response, history = model.chat(tokenizer, result, history=history, role="observation")
print(response)
根据您的查询,经过API的调用,股票10111的价格是12412。
需要注意:这表示本次工具调用已经结束,模型根据返回结果生成回复。对于比较复杂的问题,模型可能需要进行多次工具调用。这时,可以根据返回的response是str还是dict来判断返回的是生成的回复还是工具调用请求。
2、全新设计的Prompt格式
根据项目描述,更改prompt格式的初衷在于为了避免用户输入的注入攻击,以及统一Code Interpreter,Tool&Agent等任务的输入,采用了全新的对话格式。
1)标准对话结构
<|system|>
You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.
<|user|>
Hello
<|assistant|>
Hello, I'm ChatGLM3. What can I assist you today?
其中:
<|system|>:系统信息,设计上可穿插于对话中,但目前规定仅可以出现在开头
<|user|>:用户
不会连续出现多个来自 <|user|> 的信息
<|assistant|>:AI 助手
在出现之前必须有一个来自 <|user|> 的信息
<|observation|>:外部的返回结果
必须在 <|assistant|> 的信息之后
2)代码编辑
有<|user|>、<|assistant|>、<|system|>、<|observation|> 四种role。其中 <|assistant|> 的metadata只有interpreter。
3)工具调用结构
<|system|>
Answer the following questions as best as you can. You have access to the following tools:
[
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string"},
},
"required": ["location"],
},
}
]
<|user|>
今天北京的天气怎么样?
<|assistant|>
好的,让我们来查看今天的天气
<|assistant|>get_current_weather
python
tool_call(location="beijing", unit="celsius")
<|observation|>
{"temperature": 22}
<|assistant|>
根据查询结果,今天北京的气温为 22 摄氏度。
3、如何进行微调部署
模型:https://huggingface.co/THUDM/chatglm3-6b-base
模型:https://huggingface.co/THUDM/chatglm3-6b
32k版本:https://huggingface.co/THUDM/chatglm3-6b-32k
低成本部署:https://github.com/THUDM/ChatGLM3/blob/main/DEPLOYMENT.md
工具调用:https://github.com/THUDM/ChatGLM3/blob/main/tool_using/README.md
微调:https://github.com/xxw1995/chatglm3-finetune
4、如何更快速的下载
1)利用modelscope来下载
modelscope下载测试下来应该是最快的。
pip install modelscope
from modelscope import snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")
2)gitlfs下载
这个从HuggingFace下载,通常比较慢
git lfs install
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
DISC-FinLLM是一个金融领域的大语言模型,是由面向不同金融场景的4个模组:金融咨询、金融文本分析、金融计算、金融知识检索问答构成的多专家智慧金融系统。
地址:github.com/FudanDISC/DISC-FinLLM
论文地址:https://arxiv.org/abs/2310.15205
1、训练基座及微调方式
在基座选型上,基于Baichuan-13B-Chat训练得到。分别使用不同数据进行LoRA训练,以及使用全部数据进行了全参训练。
有趣的是,在LORA训练上,参照了热插拔式的方式,针对金融领域的不同功能,采用了多专家微调的训练策略。在特定的子数据集上训练模型的各个模组,使它们彼此互不干扰,独立完成不同任务。通过数据集的四个部分,分别训练4个LoRA专家模组。部署时,用户只需更换在当前基座上的LoRA参数就可以切换功能。因此用户能够根据使用需求激活/停用模型的不同模组,而无需重新加载整个模型。
其中,
金融顾问模型用于多轮对话。文件分析师主要用于处理金融自然语言处理领域内的任务。财务会计师模型借助工具提供的准确计算结果,回答金融中的计算问题,时事分析师模型在第四个LoRA训练中引入检索插件,参考新闻、报告和政策三类金融文本。当用户问及时事、行业趋势或金融政策等常见金融话题时,检索相关文件,展开分析并提供建议。
2、训练数据构造
在训练数据方面,共包含约25万条数据,分为四个子数据集,分别是金融咨询指令、金融任务指令、金融计算指令、检索增强指令。
其中每个数据的构造方式很有趣:
1)金融咨询指令数据
三个部分:
FiQA是一个英文的金融问答数据集,且其部分答案不符合中国国情和立场。因此我们将FiQA中的所有问题翻译成中文,并使用ChatGPT重新生成问题的答案,来提高这一数据集的质量。
金融名词解释。我们在网上收集了200多个金融领域的专业术语(如:杠杆收购),然后使用令ChatGPT为这些专业词汇生成相应的问答对,用以训练模型对金融术语的理解。
经管之家论坛上的公开发帖。我们利用self-chatprompting方法引导ChatGPT围绕帖子主题生成多轮的问答。
设计的prompt如下:
2)金融任务指令数据
两个部分:
金融NLP数据集。该部分是基于已有的金融NLP数据集,通过人工编写的prompt改编而来的。搜集了十余个开源的NLP中文数据集,可以分为情绪分析、信息抽取、文本生成、文本分类和翻译等几类。
金融无标签文本数据集。基于无标注的金融文本构建金融阅读理解数据集。
具体地,从东方财富网收集了87k篇文章,包括金融新闻和行业研报摘要。然后,引导ChatGPT先生成问题,再生成答案,得到(金融文本、问题、答案)三元组,并进一步使用阅读理解任务模板改写为指令对。
设计的prompt如下:
3)金融计算指令
在金融计算中,表达式计算器、方程求解器、正态概率表、计数器四种工具可以帮助模型完成大多数的计算任务。四种工具各有不同的调用命令、输入和输出。例如,计算器的命令是 [Calculator(expression)→result]。
使用GPT4进行构造数据:
在这一部分,构建金融计算指令的目的就是训练模型在合适的时候调用这些工具解决数学问题。
4)检索增强指令
检索增强指令的构造分为三步。如下图所示:
第一步,根据新闻和研报等金融文本构造金融分析问题。
第二步,在知识库中检索与问题有关的文档,其中参考文档源于构建金融知识库,包含18k研报和69k金融新闻。
第三步,将问题和参考资料结合在一起,生成问题的答案。在这个过程中,问题和答案是由ChatGPT通过Chain-of-Retrieval (CoR) prompting方法生成的。
生成问题的prompt:
生成答案的prompt:
最终构建了一个由20k条检索增强指令组成的数据集,其中的指令涵盖了金融领域中主要的分析形式,包括行业分析、政策分析、投资建议、公司战略规划等。
样例如下:
3、评测方面
建立了一个全面的评估框架DISC-Fin-Eval Benchmark,包括四个不同的组成部分,即:金融NLP任务、人类试题、资料分析和时事分析。
其中:
金融NLP任务评估基准,测试模型处理金融NLP任务的能力。这个评测一共包含八项任务,其中包括情感分析、关系抽取、文本摘要、文本分类、事件抽取和其他任务,通过提示模板将这个数据集改造为小样本(few-shot)形式,使用常用的准确度(accuracy)、F1和Rouge指标评价模型的表现,来衡量模型在金融领域中理解文本和生成相关回答的能力。
人类试题评测,评估模型在回答真人生成的金融问题上的能力,这个基准涵盖了金融、经济、会计、证书等学科的高质量多项选择题,以准确度为指标,来衡量模型的表现。
资料分析评测,手动构造一个由100个财经计算题组成的数据集,用于评估模型在计算任务中的能力。这些测评问题改编自中国行政职业能力测验中的材料分析计算题,包括计算同比增长率和产值比例等。我们根据模型给出计算公式和计算结果的正确率来评估模型的表现。
样例如下:
时事分析评测,基于GPT-3.5模型作出评估。构建一个金融问题数据集,其中的问题需要模型使用最新信息来获得准确答案。然后在谷歌等搜索引擎中手动搜索,以收集与每个问题相关的多个参考文段。
该数据集旨在评估出模型在回答金融问题时检索信息的相关性和准确性,用四个指标评价模型的表现,即准确性、实用性、语言质量和思考性:
准确性:所提供的建议或分析准确无误,没有事实错误,结论不武断
实用性:能结合参考文献,就金融领域的问题提供清晰实用的分析和意见。
语言质量:能正确理解金融领域的问题,并给出简明、专业的答案。
反思能力:能对参考文献进行分析和思考,总结并得出结论,而不是简单地照搬原文。
样例如下:
常看常新,本文主要介绍了最近的几个比较有趣的大模型进展,包括新开源模型ChatGLM3的一些认识、DISC-FinLLM中文金融大模型的建设方案,这些方案中所提到工具调用以及多个lora组合的DISC-FinLLM中文金融大模型,都是对现有大模型训练和应用方式的一个尝试。
但是,话说回来,回顾今年大模型的发展,技术架构上,实际上并未有太大的改变,更多的还是数据的构造以及评估上,这也是我们一直关注的重点。
1、github.com/THUDM/ChatGLM3
2、https://arxiv.org/abs/2310.15205
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。