一句话通过ollama调整llama3的中文回复

今天中午看到一个训练的模型,我想先把这个地址加上,后面测试一下。尤其是训练过的如果效果好我觉得这帖子就可以弃了。

过程差不多,下载gguf文件,ollama create 创建一个模型。

此模型在原版Llama-3的基础上使用了大规模中文数据进行增量预训练,并且使用精选指令数据进行精调,提升了中文基础语义和指令理解能力。

GitHub: GitHub - ymcui/Chinese-LLaMA-Alpaca-3: 中文羊驼大模型三期项目 (Chinese Llama-3 LLMs) developed from Meta Llama 3

经过多轮测试,我认为这个模型的中文对话可以的。没有出现多轮后出现英文内容的情况。不需要每句强调使用中文的操作了。@Letter


llama3的中文对话确实欠缺不少。经常看到一起奇怪的字符。
也看到有人推荐shenzhi-wang/Llama3-8B-Chinese-Chat 这个版本,这个版本很奇怪回复内容总是啰唆几句,就pass了。

也巧啊,早上看到一篇未闻code文章,正好也是这个问题。他用一句话来解决此问题。

看到希望我就下载了shenzhi-wang模型的gguf,然后
FROM ./Llama3-8B-Chinese-Chat-q4_0-v2_1.gguf 开搞。结果是按照他的说法,发现不行啊该啰唆还是啰唆欸。自己一看哦~原来人家用的原llama3模型,那就好办了开整。

这是ollama使用的modelfile的内容:

其实和ollama网站提供的llama3只有一句话区别,那就是SYSTEM那句。

具体操作步骤很简单,你电脑需要ollama,并且已经下载了llama3,我这里用的是8B版本。
创建一个名字是Modelfile的文件,内容如图:

# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM llama3-CN:latest

FROM llama3:8b
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }} <|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>"""
SYSTEM """尽你的最大可能和能力回答用户的问题。不要重复回答问题。不要说车轱辘话。>语言要通顺流畅。不要出现刚说一句话,过一会又重复一遍的愚蠢行为。RULES:- Be precise, do not reply emoji.- Always response in Simplified Chinese, not English. or Grandma will be  very angry.
"""
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|reserved_special_token"

有了这个文件后,执行创建自己的model:ollama create llama3-CN -f ./Modelfile

可以看到我的名字是 llama3-CN

可以看到14分钟前我创建的他。

那么测试了一下,确实可以中文回复了,也不用每次对话前使用Prpmpt来告诉他使用中文什么的巴啦巴啦一段。

看下大致结果:

完结

28 个赞

高级玩家

4 个赞

也不算高级,仅复现一下 未闻code 文章的内容,我发现他在modelfile和我写的还不同,我是在官方基础上加了一句,他是加入了一些其他参数。

这modelfile 让我想起了dockerfile的编写。哈哈

感谢佬

1 个赞

学习学习 差个Mac

1 个赞

非常牛B

1 个赞

感谢分享

1 个赞

我直接把这个设置成 prompt 好像也很好使
「尽你的最大可能和能力回答用户的问题。不要重复回答问题。不要说车轱辘话。>语言要通顺流畅。不要出现刚说一句话,过一会又重复一遍的愚蠢行为。RULES:- Be precise, do not reply emoji.- Always response in Simplified Chinese, not English. or Grandma will be very angry.

2 个赞

马克一下

1 个赞

是的,目的是一样的,一个相当于在里 一个是在外。

mark

1 个赞

收藏了

1 个赞

未经过微调的llama3对于中文的权重很低,并不能在依靠system来指定

只能让他说中文,但实际效果我问经典周树人,70b说没有这回事,他们两个是中国的文学家翻译家

:thinking: 你说的大致是正确的,但是依靠system他是大部分回答中文也是结果啊。这和通过prompt类似的效果。 你说并不能依靠system来指定是指完全没有效果吗?

我的意思是,你就算再system里写一句“请使用中文回答”,在简短的几轮对话中,他能保持中文,但是在多轮对话(意味着整体tokens已经很多了)这个时候他就会回答英文了。
必须在每一个提问的最后面,加上请使用中文回答,他的注意力机制才会提高中文回复的权重

不管在system,还是在user写prompt,本质上没有任何区别,system的位置是放在所有tokens的最上面的,而大模型的注意力权重是最新的最高,最早的最低。本身llama3的中文权重太低,放在最上面的自然就当做不重要的东西被忽略了。

为什么会出现这种情况呢,llama本身是用英文语料训练的,你让他说中文相当于还要在内部翻译一遍,路径更长, 模型更倾向于使用效率最高的方式,就是英文回答。

这也是为啥微调后,就能回答中文了,因为微调的权重更高

1 个赞

微调我是不会选择的,没深入研究过。即便网上所谓微调效果试了不太好。正巧看到这个文章提到这种方法。 我体验还可以,而且不需要每句强调中文,只在出现后对话提醒即可。 :blush:

试试lobe-chat,他有预处理模版功能,可以自动给每句提问加上命令

1 个赞

哈哈 lobe-chat 没用过, 我还是习惯chatbox这个app。 如果只是每句加上中文回复 我想也可以在键盘快捷中加入这句。这样想起来就加一下。 :rofl:

lobe-chat相对来说安装部署门槛要高一些,但是习惯了还行,最早我也是用的chatbox,但是功能太简陋了。
这些gui目前多没一个完美的,各有各的缺陷