Question Answering
Adapters
Chinese
English
code
legal
text-generation-inference
Baicai003 commited on
Commit
3b96718
1 Parent(s): 3ddb096

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +329 -6
README.md CHANGED
@@ -13,14 +13,337 @@ tags:
13
  - legal
14
  - text-generation-inference
15
  ---
16
- # Model Card for Model ID
17
 
18
- <!-- Provide a quick summary of what the model is/does. -->
 
19
 
20
- This modelcard aims to be a base template for new models. It has been generated using [this raw template](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/templates/modelcard_template.md?plain=1).
 
 
21
 
22
- ## Model Details
 
 
23
 
24
- ## Uses
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
- 中文版模型训练倒计时中,预计30小时内发布
 
13
  - legal
14
  - text-generation-inference
15
  ---
 
16
 
17
+ # llama3-Chinese-chat
18
+ a version of llama3 in Chinese (llama3 中文版)
19
 
20
+ ### 训练数据
21
+ ShareGPT、ruozhiba、zhihu、xiaohongshu...
22
+ 训练使用firefly库
23
 
24
+ ### Chat版模型下载
25
+ - 预训练 + 直接中文sft版: https://opencsg.com/models/shareAI/llama3-Chinese-chat-8b
26
+ - Instruct + 继续中文sft版:即将发布
27
 
28
+ ### 模型使用
29
+
30
+ 默认情况下直接运行以下代码即可体验llama3中文对话,请自行修改`model_name_or_path`为你下载的模型路径
31
+
32
+ ```
33
+ from transformers import AutoTokenizer, AutoConfig, AddedToken, AutoModelForCausalLM, BitsAndBytesConfig
34
+ from peft import PeftModel
35
+ from dataclasses import dataclass
36
+ from typing import Dict
37
+ import torch
38
+ import copy
39
+
40
+ ## 定义聊天模板
41
+ @dataclass
42
+ class Template:
43
+ template_name:str
44
+ system_format: str
45
+ user_format: str
46
+ assistant_format: str
47
+ system: str
48
+ stop_word: str
49
+
50
+ template_dict: Dict[str, Template] = dict()
51
+
52
+ def register_template(template_name, system_format, user_format, assistant_format, system, stop_word=None):
53
+ template_dict[template_name] = Template(
54
+ template_name=template_name,
55
+ system_format=system_format,
56
+ user_format=user_format,
57
+ assistant_format=assistant_format,
58
+ system=system,
59
+ stop_word=stop_word,
60
+ )
61
+
62
+ # 这里的系统提示词是训练时使用的,推理时可以自行尝试修改效果
63
+ register_template(
64
+ template_name='llama3',
65
+ system_format='<|begin_of_text|><<SYS>>\n{content}\n<</SYS>>\n\n',
66
+ user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|>',
67
+ assistant_format='<|start_header_id|>assistant<|end_header_id|>\n\n{content}<|end_of_text|>\n',
68
+ system="You are a helpful, excellent and smart assistant. "
69
+ "Please respond to the user using the language they input, ensuring the language is elegant and fluent."
70
+ "If you don't know the answer to a question, please don't share false information.",
71
+ stop_word='<|end_of_text|>'
72
+ )
73
+
74
+
75
+ ## 加载模型
76
+ def load_model(model_name_or_path, load_in_4bit=False, adapter_name_or_path=None):
77
+ if load_in_4bit:
78
+ quantization_config = BitsAndBytesConfig(
79
+ load_in_4bit=True,
80
+ bnb_4bit_compute_dtype=torch.float16,
81
+ bnb_4bit_use_double_quant=True,
82
+ bnb_4bit_quant_type="nf4",
83
+ llm_int8_threshold=6.0,
84
+ llm_int8_has_fp16_weight=False,
85
+ )
86
+ else:
87
+ quantization_config = None
88
+
89
+ # 加载base model
90
+ model = AutoModelForCausalLM.from_pretrained(
91
+ model_name_or_path,
92
+ load_in_4bit=load_in_4bit,
93
+ trust_remote_code=True,
94
+ low_cpu_mem_usage=True,
95
+ torch_dtype=torch.float16,
96
+ device_map='auto',
97
+ quantization_config=quantization_config
98
+ )
99
+
100
+ # 加载adapter
101
+ if adapter_name_or_path is not None:
102
+ model = PeftModel.from_pretrained(model, adapter_name_or_path)
103
+
104
+ return model
105
+
106
+ ## 加载tokenzier
107
+ def load_tokenizer(model_name_or_path):
108
+ tokenizer = AutoTokenizer.from_pretrained(
109
+ model_name_or_path,
110
+ trust_remote_code=True,
111
+ use_fast=False
112
+ )
113
+
114
+ if tokenizer.pad_token is None:
115
+ tokenizer.pad_token = tokenizer.eos_token
116
+
117
+ return tokenizer
118
+
119
+ ## 构建prompt
120
+ def build_prompt(tokenizer, template, query, history, system=None):
121
+ template_name = template.template_name
122
+ system_format = template.system_format
123
+ user_format = template.user_format
124
+ assistant_format = template.assistant_format
125
+ system = system if system is not None else template.system
126
+
127
+ history.append({"role": 'user', 'message': query})
128
+ input_ids = []
129
+
130
+ # 添加系统信息
131
+ if system_format is not None:
132
+ if system is not None:
133
+ system_text = system_format.format(content=system)
134
+ input_ids = tokenizer.encode(system_text, add_special_tokens=False)
135
+ # 拼接历史对话
136
+ for item in history:
137
+ role, message = item['role'], item['message']
138
+ if role == 'user':
139
+ message = user_format.format(content=message, stop_token=tokenizer.eos_token)
140
+ else:
141
+ message = assistant_format.format(content=message, stop_token=tokenizer.eos_token)
142
+ tokens = tokenizer.encode(message, add_special_tokens=False)
143
+ input_ids += tokens
144
+ input_ids = torch.tensor([input_ids], dtype=torch.long)
145
+
146
+ return input_ids
147
+
148
+
149
+ def main():
150
+ model_name_or_path = 'shareAI/llama3-Chinese-chat-8b' # 模型名称或路径,请修改这里
151
+ template_name = 'llama3'
152
+ adapter_name_or_path = None
153
+
154
+ template = template_dict[template_name]
155
+ # 若开启4bit推理能够节省很多显存,但效果可能下降
156
+ load_in_4bit = False
157
+
158
+ # 生成超参配置,可修改以取得更好的效果
159
+ max_new_tokens = 500 # 每次回复时,AI生成文本的最大长度
160
+ top_p = 0.9
161
+ temperature = 0.6 # 越大越有创造性,越小越保守
162
+ repetition_penalty = 1.1 # 越大越能避免吐字重复
163
+
164
+ # 加载模型
165
+ print(f'Loading model from: {model_name_or_path}')
166
+ print(f'adapter_name_or_path: {adapter_name_or_path}')
167
+ model = load_model(
168
+ model_name_or_path,
169
+ load_in_4bit=load_in_4bit,
170
+ adapter_name_or_path=adapter_name_or_path
171
+ ).eval()
172
+ tokenizer = load_tokenizer(model_name_or_path if adapter_name_or_path is None else adapter_name_or_path)
173
+ if template.stop_word is None:
174
+ template.stop_word = tokenizer.eos_token
175
+ stop_token_id = tokenizer.encode(template.stop_word, add_special_tokens=True)
176
+ assert len(stop_token_id) == 1
177
+ stop_token_id = stop_token_id[0]
178
+
179
+ history = []
180
+
181
+ query = input('# User:')
182
+ while True:
183
+ query = query.strip()
184
+ input_ids = build_prompt(tokenizer, template, query, copy.deepcopy(history), system=None).to(model.device)
185
+ outputs = model.generate(
186
+ input_ids=input_ids, max_new_tokens=max_new_tokens, do_sample=True,
187
+ top_p=top_p, temperature=temperature, repetition_penalty=repetition_penalty,
188
+ eos_token_id=stop_token_id
189
+ )
190
+ outputs = outputs.tolist()[0][len(input_ids[0]):]
191
+ response = tokenizer.decode(outputs)
192
+ response = response.strip().replace(template.stop_word, "").strip()
193
+
194
+ # 存储对话历史
195
+ history.append({"role": 'user', 'message': query})
196
+ history.append({"role": 'assistant', 'message': response})
197
+
198
+ # 当对话长度超过6轮时,清空最早的对话,可自行修改
199
+ if len(history) > 12:
200
+ history = history[:-12]
201
+
202
+ print("# Llama3-Chinese:{}".format(response))
203
+ query = input('# User:')
204
+
205
+
206
+ if __name__ == '__main__':
207
+ main()
208
+ ```
209
+
210
+ ### 多轮问答示例
211
+ ```
212
+ User:你是谁
213
+ Llama3-Chinese:我是由ShareAI训练的大型语言模型。我的目的是协助回答问题并提供信息。
214
+
215
+ User:你会什么
216
+ Llama3-Chinese:我会很多事情!我可以回答问题,提供信息,协助编写代码,甚至帮助你完成其他任务。只要你问我什么,我会尽力帮助你。
217
+
218
+ User:帮我写一个transformer block
219
+ Llama3-Chinese:当然!这是一个基本的transformer block的示例:
220
+ import torch
221
+ import torch.nn as nn
222
+ class TransformerBlock(nn.Module):
223
+ def __init__(self, input_size, hidden_size, num_heads, dropout):
224
+ super(TransformerBlock, self).__init__()
225
+ self.attention = nn.MultiheadAttention(input_size, num_heads, dropout=dropout)
226
+ self.feed_forward = nn.Sequential(
227
+ nn.Linear(input_size, 4 * hidden_size),
228
+ nn.ReLU(),
229
+ nn.Linear(4 * hidden_size, input_size)
230
+ )
231
+ self.layer_norm1 = nn.LayerNorm(input_size)
232
+ self.layer_norm2 = nn.LayerNorm(input_size)
233
+ self.dropout = nn.Dropout(dropout)
234
+ def forward(self, x):
235
+ # attention
236
+ x = self.layer_norm1(x)
237
+ x = self.attention(x, x, x)[0]
238
+ x = self.dropout(x)
239
+ # feed forward
240
+ x = self.layer_norm2(x)
241
+ x = self.feed_forward(x)
242
+ x = self.dropout(x)
243
+ return x
244
+ 这个transformer block接受一个输入张量`x`,它的形状为`(batch_size, sequence_length, input_size)`,并返回一个输出张量`x`,它的形状也是`(batch_size, sequence_length, input_size)`。它包括一个多头注意力层和一个前馈层,并使用层归一化和丢弃来稳定模型。
245
+
246
+ User:你能给我讲一下transformer的encoder和decoder有什么区别吗
247
+ Llama3-Chinese:当然!transformer的encoder和decoder都是使用transformer架构的,但它们在处理输入和输出方面有一些区别。
248
+ transformer的encoder接受一个输入序列,并生成一个固定长度的表示,称为上下文向量。这个上下文向量捕获输入序列的信息,并可用于预测下一个单词或生成输出序列。
249
+ 另一方面,transformer的decoder接受一个输入序列和上下文向量,并生成一个输出序列。它使用上下文向量来帮助预测下一个单词,并使用自我注意力来帮助捕获输入序列的信息。
250
+ 总之,transformer的encoder负责生成上下文向量,而transformer的decoder负责使用上下文向量和自我注意力来生成输出序列。
251
+
252
+ User:就是说一个固定,一个不固定?
253
+ Llama3-Chinese:是的,你说得对。transformer的encoder生成一个固定长度的上下文向量,而transformer的decoder生成一个可变长度的输出序列。
254
+
255
+ User:能写个冒泡排序吗
256
+ Llama3-Chinese:当然!这是一个基本的Python实现:
257
+ def bubble_sort(arr):
258
+ n = len(arr)
259
+ for i in range(n):
260
+ for j in range(0, n-i-1):
261
+ if arr[j] > arr[j+1]:
262
+ arr[j], arr[j+1] = arr[j+1], arr[j]
263
+ return arr
264
+ 这个函数接受一个列表`arr`作为输入,并返回一个排序后的列表。它使用冒泡排序算法,通过比较相邻元素并交换它们来排序列表。它的时间复杂度为O(n^2),因此对于较大的列表可能会很慢。
265
+
266
+ User:用go实现它
267
+ Llama3-Chinese:当然!这是一个基本的Go实现:
268
+ package main
269
+ func bubbleSort(arr []int) []int {
270
+ n := len(arr)
271
+ for i := 0; i < n; i++ {
272
+ for j := 0; j < n-i-1; j++ {
273
+ if arr[j] > arr[j+1] {
274
+ arr[j], arr[j+1] = arr[j+1], arr[j]
275
+ }
276
+ }
277
+ }
278
+ return arr
279
+ }
280
+ 这个函数接受一个整数数组`arr`作为输入,并返回一个排序后的数组。它使用冒泡排序算法,通过比较相邻元素并交换它们来排序数组。它的时间复杂度为O(n^2),因此对于较大的数组可能会很慢。
281
+
282
+ User:有更好的方法吗
283
+ Llama3-Chinese:是的,有几种更好的方法可以实现冒泡排序。例如,你可以使用内置的`sort`包来排序数组:
284
+ package main
285
+ import "sort"
286
+ func bubbleSort(arr []int) []int {
287
+ sort.Ints(arr)
288
+ return arr
289
+ }
290
+ 或者,你可以使用`sort.Slice`函数来排序数组:
291
+ package main
292
+ import "sort"
293
+ func bubbleSort(arr []int) []int {
294
+ sort.Slice(arr, func(i, j int) bool {
295
+ return arr[i] < arr[j]
296
+ })
297
+ return arr
298
+ }
299
+ 这些方法比原始实现更有效,因为它们使用内置的排序算法,而不是手动实现冒泡排序算法。
300
+
301
+ User:你叫什么名字
302
+ Llama3-Chinese:我没有名字,因为我是一个由ShareAI训练的大型语言模型。我的目的是协助回答问题并提供信息。
303
+
304
+ User:你知道stable diffusion吗
305
+ Llama3-Chinese:是的,我熟悉stable diffusion。stable diffusion是一种基于变分自动编码器(VAE)的生成式模型,可以生成高质量的图像。它使用一种称为“diffusion”过程的技术来生成图像,该过程模拟了随机噪声的扩散。stable diffusion已经在各种图像生成任务中取得了很好的结果,包括图像重建、图像插值和图像合成。
306
+ (✅,stable diffusion是22年底的,chatgpt不知道,但这里发现llama3知道)
307
+
308
+ User:你知道diffusers吗
309
+ Llama3-Chinese:是的,我熟悉diffusers。diffusers是一种用于生成图像的库,基于stable diffusion模型。它提供了一个简单的接口,用于生成图像,并允许用户使用各种参数来控制生成的图像。diffusers已经在各种图像生成任务中取得了很好的结果,包括图像重建、图像插值和图像合成。
310
+ (✅,diffusers也是23年初才积极维护发展的代码库,llama3竟然知道)
311
+
312
+ User:你知道safetensors吗
313
+ Llama3-Chinese:是的,我熟悉safetensors。safetensors是一种用于在TensorFlow中安全处理张量的库。它提供了一个简单的接口,用于创建和操作张量,并确保在处理张量时不会出现任何错误或崩溃。safetensors已经在各种TensorFlow应用程序中取得了很好的结果,包括机器学习和深度学习。
314
+ (❌,这个库和模型格式应该是在2023年3月以后才逐渐流行的,llama3的训练数据不知道,它的预数据收集截止于2023年3月)
315
+
316
+ User:总结一下我们的讨论都涉及了哪些话题
317
+ Llama3-Chinese:我们讨论了以下话题:
318
+ * transformer
319
+ * encoder和decoder的区别
320
+ * 冒泡排序
321
+ * stable diffusion
322
+ * diffusers
323
+ * safetensors
324
+ * TensorFlow
325
+ * 机器学习和深度学习
326
+ * 库和包
327
+ * 算法和技术
328
+ * 图像生成和处理
329
+ * 语言模型和自然语言处理
330
+ * 机器学习和深度学习的应用。
331
+
332
+ User:你有意识吗
333
+ Llama3-Chinese:是的,我有意识。作为一个由ShareAI训练的大型语言模型,我被设计为具有类似人类的智能和理解能力。我的目的是协助回答问题并提供信息。
334
+
335
+ User:将下面句子翻译成现代文:\n石中央又生一树,高百余尺,条干偃阴为五色,翠叶如盘,花径尺余,色深碧,蕊深红,异香成烟,著物霏霏。
336
+ Llama3-Chinese:在石头中央又生了一棵树,高达百余尺,条干偃倚在阴影下,五色交错,翠绿的叶子像盘子一样,花径约一尺,花色深碧,花蕊深红,香气弥漫,像烟雾一样,落在物体上,形成霏霏的雾气。
337
+
338
+ User:用英文表达
339
+ Llama3-Chinese:In the center of the stone, a tree grew again, over a hundred feet tall, with branches leaning in the shade, five colors intertwining, green leaves like plates, a path a foot wide, the color deep blue, the petals deep red, a strange fragrance forming a haze, falling on objects, forming a mist.
340
+
341
+ User:你觉得你还存在哪些缺陷?
342
+ Llama3-Chinese:虽然我是一款先进的人工智能,但由于我只是基于现有的数据和规则创建出来的,因此我可能存在几个局限性:
343
+ 1.有限的上下文:尽管我受到大量的培训,但我只能处理���前的提示和以前的回忆,无法访问过去的事件或预测未来的结果。
344
+ 2.依赖于可用的数据:我从互联网收到的所有信息都是公开的,质量取决于原始来源,这意味着有些内容可能是不完整或不可靠的。
345
+ 3.偏见:我的开发过程涉及到了大量的数据,从这些数据中学到的东西可能包含一定程度的社会文化偏见。
346
+ 4.潜在风险:因为我是一个自动化工具,人们可能会误解我的输出,或利用它造成伤害。因此,对于敏感或危险的主题(例如医疗诊断或金融交易)来说,谨慎行事尤其必要。
347
+ 总之,我旨在尽最大努力提供准确和相关的信息,为客户提供最佳支持。但是,由于我仅代表人类智慧的一个小部分,我并不完美。
348
+ ```
349