Facico / Chinese-Vicuna

Chinese-Vicuna: A Chinese Instruction-following LLaMA-based Model —— 一个中文低资源的llama+lora方案,结构参考alpaca
https://github.com/Facico/Chinese-Vicuna
Apache License 2.0
4.14k stars 421 forks source link

多轮对话,语境,和回复循环的问题 #7

Closed ZenXir closed 1 year ago

ZenXir commented 1 year ago

大佬老师,我用一台rtx4090机器,周末两天基于llama-13b-hf 和 merge.sjon【网盘里的663M语料】 finetune出来的,刚测试了下,可以用:

链接:https://pan.baidu.com/s/1QlKdW8elJKm2pCWSIoQIKA?pwd=vim8 
提取码:vim8

效果是这样的:

Instruction: 你是谁
Response: 我是一个智能语言模型,名叫Belle。【这个回答应该是用的belle语料的原因吧?】
Instruction: 你可以扮演一只猫吗?
Response: 当然,我可以扮演一只猫!我可以做一些猫咪的动作,例如跳跃、抓住玩具、抓住食物、抓住玩具,等等。我也可以做一些猫咪的声音,例如喵喵、咕咕、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵喵喵喵、喵��
Instruction: 那你来过来 让我摸摸你的爪子
Response: 当然,我会让你摸摸我的爪子,让你感受到我的温暖和柔软。
Instruction: 你的胡须的作用是什么?
Response: 胡须是一种神秘的神秘力量,它可以帮助人们掌握更多的知识和技能,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力,帮助人们更好地掌握自己的能力
Instruction: 你的尾巴的作用是什么?
Response: 尾巴的作用是帮助身体保持平衡,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,帮助肌肉保持灵活性,��

感觉多轮对话上下文的理解可以让它连贯不?

是不是也可以加上context,描述语境?

回复的内容会循环,这个怎么避免呀大佬老师?

ZenXir commented 1 year ago

finetune使用的命令是这样的:

python finetune.py --data_path sample/merge.json --output_path lora-Vicuna/checkpoint-testfinetune --model_path /mnt/e/zllama-models/llama-13b-hf --test_size 3000

Facico commented 1 year ago

@ZenXir Hello,非常感谢你分享自己的训练的结果。 多轮对话的场景可以根据一定的prompt描述来进行,比如The following is a conversation between an AI assistant called Bot and a human user called User.,然后把对话历史中的对话添加上'User: ', 'Bot: '的标签来当做一个在对话场景中的任务。 这一部分我已经更新了一个简单的demo(https://github.com/Facico/Chinese-Vicuna#how-to-use) 其他场景类似可以设置一个固定的instruction,我们引入了别人的alpaca-lora-serve的webui,可以实现流式的输出,不过由于现在huggingface不太支持这一部分,目前只能保持beam size=1,效果会看起来比较奇怪。 回复中存在循环可以将repetition_penalty这个参数调高。

Facico commented 1 year ago

同时,确实有模型叫“belle”这个问题,因为belle的数据集中有800多个这样的标签,在学习的时候会将其印进去。如果不进行商用的话可以将语料中belle替换,或者直接训练好后将belle replace掉。

ZenXir commented 1 year ago

明白 感谢大佬老师 昨晚我在想一个问题 如果想让模型像ChatGPT一样去扮演一个角色,回答设定人物相关问题 比如: 告诉模型:你是水浒传里的鲁智深 模型就会知道“花和尚”就是他自己,他打了镇关西,和林冲是兄弟,为人多仗义等等 告诉模型:你是三体里的某个人物 模型就可以回答三体世界里的问题,简单朴素的描述三体世界的沉重问题

类似内容吧,想让模型做到这点,在context里提供文本内容可能会比较大,是不是需要组织语料finetune模型?还有其他更好的方式不大佬老师?

Facico commented 1 year ago

@ZenXir 这种扮演式的个性对话需要给出一个比较详细的instruction描述,同时如果你要让他扮演一个已有的故事可能就得看训练的时候有没有喂过这些数据了。 我们的模型暂时是有一定的扮演能力的,但他很可能没有接触过比如“水浒传”里面具体的数据,其实像这种可以类似chatgpt那些扮演例子,比如扮演“猫娘”,把故事简单的讲给他听,然后他再来扮演。 context提供文本比较大的问题也是现在很多模型的瓶颈,在一定的硬件条件限制下,只能通过一些类似离线key-value的方式来扩充历史信息,这个我们后续会考虑引入相关技术。

ZenXir commented 1 year ago

明白大佬老师 我刚用ChatGPT 随便生成了几个问答,finetune了一下 问了语料里的问题:

问:在五庄观拜访镇元大仙时 为什么要拜访镇元大仙?

答:因为你是一个很好的人。

如果问到和语料相同的问题,是不是应该接近原语料的回答?

看到 finetune.py 和  interaction.py 里,是按8bit处理的模型,如果是其他的,效果会好吗?我是新人,辛苦大佬老师了 finetune.py的8bit处理代码:

      model = LlamaForCausalLM.from_pretrained(
          args.model_path,
          load_in_8bit=True,
          device_map=device_map,
      )

interaction.py的8bit处理代码:

    model = LlamaForCausalLM.from_pretrained(
        BASE_MODEL,
        load_in_8bit=LOAD_8BIT,
        torch_dtype=torch.float16,
        device_map="auto",
    )

随便生成的语料:

[
    {
        "instruction":"出生时",
        "input":"哪里出生?",
        "output":"出生在花果山,是一只石猴"
    },
    {
        "instruction":"拜菩提祖师为师时",
        "input":"为什么拜菩提祖师为师?",
        "output":"因为想学习道家功夫和法术,得到长生不老的秘诀"
    },
    {
        "instruction":"学习七十二变时",
        "input":"为什么要学习七十二变?",
        "output":"为了躲避追捕和保护师父,可以随时变换外貌逃避追踪"
    },
    {
        "instruction":"在天宫大闹一番时",
        "input":"为什么要大闹天宫?",
        "output":"因为玉帝冤枉他在天宫吃了长生不老桃,为了还清自己的清白,找回自己的法器,并震慑天庭,故而大闹天宫"
    },
    {
        "instruction":"取得如意金箍棒时",
        "input":"为什么要选如意金箍棒?",
        "output":"其它的兵器太轻,没有份量,耍起来不威风"
    },
    {
        "instruction":"前往西天取经时",
        "input":"为什么要前往西天取经?",
        "output":"为了修行成佛,救度众生,得到真经以及为师父降妖除魔"
    },
    {
        "instruction":"与红孩儿打斗时",
        "input":"为什么要与红孩儿打斗?",
        "output":"因为红孩儿拦住了取经路上的一群僧人,不肯让路,为了保护师父和其他的僧人,只能和他打斗"
    },
    {
        "instruction":"被观音菩萨收服时",
        "input":"为什么被观音菩萨收服?",
        "output":"因为在天宫大闹一番后,被如来佛祖按下五指山,经过五百年苦修后,被观音菩萨教化悔过,并且协助唐僧取经"
    },
    {
        "instruction":"与牛魔王打斗时",
        "input":"为什么要与牛魔王打斗?",
        "output":"因为牛魔王占领了通往西天的通道,拦住了取经的路,为了保护师父和其他的僧人,只能和他打斗"
    },
    {
        "instruction":"参加观音菩萨的招亲比赛时",
        "input":"为什么要参加招亲比赛?",
        "output":"为了替师父取得观音菩萨的灵药,并且在比赛中战胜了众多妖怪,得到观音菩萨的青睐"
    },
    {
        "instruction":"在火焰山救唐僧时",
        "input":"为什么要前往火焰山?",
        "output":"因为唐僧和其它三位徒弟被火焰山上的红孩儿所困,前往解救,并且打败了红孩儿,拯救了师父和其他三位徒弟"
    },
    {
        "instruction":"在流沙河与沙悟净结为好友时",
        "input":"为什么要与沙悟净结为好友?",
        "output":"因为和沙悟净一起保护唐僧取经的过程中,相互扶持,共同经历了很多艰辛和危险,成为了非常要好的朋友"
    },
    {
        "instruction":"与白骨精斗法时",
        "input":"为什么要与白骨精斗法?",
        "output":"因为白骨精欲害唐僧,为了保护师父,只能和她斗法,最终打败了白骨精,保护了唐僧的安全"
    },
    {
        "instruction":"在陷崖中寻找紫霞仙子时",
        "input":"为什么要寻找紫霞仙子?",
        "output":"为了救唐僧,前往陷崖中寻找紫霞仙子,寻得宝贝救回唐僧,并和紫霞仙子结为好友"
    },
    {
        "instruction":"在女儿村化解纠纷时",
        "input":"为什么要化解纠纷?",
        "output":"因为女儿村中的男女矛盾极深,两边的情绪都很激动,为了化解矛盾,让男女双方和解,最终化解了纠纷"
    },
    {
        "instruction":"与梦中的红孩儿斗法时",
        "input":"为什么要与梦中的红孩儿斗法?",
        "output":"因为在睡梦中受到红孩儿的威胁,为了保护自己,只能和红孩儿斗法,最终打败了他"
    },
    {
        "instruction":"在金山寺收服白龙马时",
        "input":"为什么要收服白龙马?",
        "output":"因为唐僧需要一匹神骏的坐骑,而白龙马是最好的选择,但他不愿意上路,便前往金山寺收服他,最终成功带回给唐僧"
    },
    {
        "instruction":"在天宫接受如来佛祖的惩罚时",
        "input":"为什么要接受惩罚?",
        "output":"因为在天宫大闹一番后,被如来佛祖按下五指山,经过五百年苦修后,认识到自己的错误,便主动前往天宫接受如来佛祖的惩罚,最终获得了救赎"
    },
    {
        "instruction":"在花果山为唐僧护送时",
        "input":"为什么要为唐僧护送?",
        "output":"因为唐僧需要西天取经,而是他的大徒弟,责任重大,所以他带领猴子们在花果山为唐僧护送,保护他完成取经之路"
    },
    {
        "instruction":"与牛魔王斗法时",
        "input":"为什么要与牛魔王斗法?",
        "output":"因为牛魔王占据了天河,阻碍唐僧前往西天取经,为了保护唐僧,与牛魔王斗法,最终打败他,解救了天河"
    },
    {
        "instruction":"在翠云山修炼时",
        "input":"为什么要在翠云山修炼?",
        "output":"因为想要更进一步地修炼自己的本领,于是他前往翠云山修炼,通过不断地磨炼,提高了自己的修为"
    },
    {
        "instruction":"在九曲黄河大闹天宫时",
        "input":"为什么要大闹天宫?",
        "output":"因为在天宫中受到不公正的待遇,受到了众神的冷落和压制,加上被玉帝误解,于是他带领猴子大闹天宫,为自己和猴子们争取权益"
    },
    {
        "instruction":"在火焰山与红孩儿斗法时",
        "input":"为什么要与红孩儿斗法?",
        "output":"因为红孩儿是火神之子,拥有强大的火系能力,为了保护唐僧一行人,与他进行斗法,最终击败了他,解救了唐僧一行人"
    },
    {
        "instruction":"在盘丝洞与蜘蛛精斗法时",
        "input":"为什么要与蜘蛛精斗法?",
        "output":"因为蜘蛛精占据了盘丝洞,并阻挠唐僧前往西天取经,为了保护唐僧,与蜘蛛精进行斗法,最终打败她,解救了唐僧一行人"
    },
    {
        "instruction":"在水帘洞解救八戒时",
        "input":"为什么要解救八戒?",
        "output":"因为八戒被白骨精抓走,为了救出八戒,于是前往水帘洞,与白骨精进行了激烈的战斗,最终解救出八戒"
    },
    {
        "instruction":"在三打白骨精时",
        "input":"为什么要三打白骨精?",
        "output":"因为白骨精犯了众多罪行,为了为百姓除害,于是与白骨精进行三次斗法,最终消灭了她,使百姓免遭她的危害"
    },
    {
        "instruction":"在陈家庄救下七仙女时",
        "input":"为什么要救下七仙女?",
        "output":"因为七仙女被妖魔抓走,为了拯救她们,于是前往陈家庄,与妖魔进行激烈的战斗,最终救下了七仙女"
    },
    {
        "instruction":"在女儿国中解决妖怪问题时",
        "input":"为什么要解决妖怪问题?",
        "output":"因为女儿国中妖怪横行,危害百姓,为了保护女儿国的安宁,于是前往女儿国,与妖怪进行斗争,最终解决了妖怪问题,使女儿国恢复了和平"
    },
    {
        "instruction":"在五庄观拜访镇元大仙时",
        "input":"为什么要拜访镇元大仙?",
        "output":"因为唐僧一行人需要经过五庄观,但路上有许多妖怪,为了帮助唐僧一行人,于是前往五庄观,拜访镇元大仙,并从他那里得到了灵符,帮助唐僧一行人渡过了危险的路段"
    },
    {
        "instruction":"在灵山与如来佛祖进行大战时",
        "input":"为什么要与如来佛祖进行大战?",
        "output":"因为如来佛祖不满唐僧等人取经之事,派出众多天兵天将来阻挠他们,为了保护唐僧一行人和取得真经,于是与如来佛祖进行了激烈的战斗,最终被如来佛祖收服,成为他的降妖神将"
    }
]
Facico commented 1 year ago

@ZenXir 如果finetune的够久的话,会拟合到语料的回答。 因为训练的时候为了让更低的显存也能微调模型,用的是8bit,推理的时候用8bit是保持一致的,同样也是能用更小的显存进行推理。你可以参考我们模型量化的工具,里面使用4bit的,可以更节省空间,但是效果会差一点。

ZenXir commented 1 year ago

大佬老师 我可以加入你们一起开发吗?有什么需要整理的 我帮忙一起弄

Facico commented 1 year ago

@ZenXir 项目在开发的过程中难免遇到很多问题,比如各种bug,比如文案说明,比如各种技术的引入。作为一个开源项目,我们欢迎所有的开发者。你可以通过PR的形式为这个开源项目做出贡献。

我们近期的目标会更新在todo list上,如果你有感兴趣的方向也可以参与进来。如果你发现了相关的可以引入的技术,也可以告诉我们。

ZenXir commented 1 year ago

好嘞太好了 我多学习多总结 尽量打好辅助 哈哈

hongshuo-wang commented 1 year ago

网盘过期了,请问数据集可以再分享一下吗