zR commited on
Commit
b36cb68
1 Parent(s): dad3715

change Citations

Browse files
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ *venv
2
+ *.DS_Store
3
+ *.idea/
README.md CHANGED
@@ -4,26 +4,24 @@ license_name: glm-4
4
  license_link: https://huggingface.co/THUDM/glm-4-9b-chat-1m/blob/main/LICENSE
5
 
6
  language:
7
- - zh
8
- - en
9
  tags:
10
- - glm
11
- - chatglm
12
- - thudm
13
  inference: false
14
  ---
15
 
16
  # GLM-4-9B-Chat-1M
17
 
18
- Read this in [English](README_en.md)
19
 
20
- GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 在语义、数学、推理、代码和知识等多方面的数据集测评中,
21
- **GLM-4-9B** 及其人类偏好对齐的版本 **GLM-4-9B-Chat** 均表现出超越 Llama-3-8B 的卓越性能。除了能进行多轮对话,GLM-4-9B-Chat
22
- 还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大 128K 上下文)等高级功能。本代模型增加了多语言支持,支持包括日语,韩语,德语在内的
23
- 26 种语言。我们还推出了支持 1M 上下文长度(约 200 万中文字符)的 **GLM-4-9B-Chat-1M** 模型和基于 GLM-4-9B 的多模态模型
24
- GLM-4V-9B。**GLM-4V-9B** 具备 1120 * 1120 高分辨率下的中英双语多轮对话能力,在中英文综合能力、感知推理、文字识别、图表理解等多方面多模态评测中,GLM-4V-9B
25
- 表现出超越 GPT-4-turbo-2024-04-09、Gemini
26
- 1.0 Pro、Qwen-VL-Max 和 Claude 3 Opus 的卓越性能。
27
 
28
  ## 评测结果
29
 
@@ -41,11 +39,13 @@ GLM-4V-9B。**GLM-4V-9B** 具备 1120 * 1120 高分辨率下的中英双语多
41
 
42
  ## 运行模型
43
 
 
 
44
  使用 transformers 后端进行推理:
45
 
46
  ```python
47
  import torch
48
- from transformers import AutoModelForCausalLM, AutoTokenizer
49
 
50
  device = "cuda"
51
 
@@ -62,7 +62,7 @@ inputs = tokenizer.apply_chat_template([{"role": "user", "content": query}],
62
 
63
  inputs = inputs.to(device)
64
  model = AutoModelForCausalLM.from_pretrained(
65
- "THUDM/glm-4-9b-chat-1m",
66
  torch_dtype=torch.bfloat16,
67
  low_cpu_mem_usage=True,
68
  trust_remote_code=True
@@ -82,12 +82,13 @@ from transformers import AutoTokenizer
82
  from vllm import LLM, SamplingParams
83
 
84
  # GLM-4-9B-Chat-1M
 
85
 
86
- # 如果遇见 OOM 现象,建议减少max_model_len,或者增加tp_size
87
- max_model_len, tp_size = 1048576, 4
88
-
89
  model_name = "THUDM/glm-4-9b-chat-1m"
90
- prompt = [{"role": "user", "content": "你好"}]
91
 
92
  tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
93
  llm = LLM(
@@ -96,7 +97,7 @@ llm = LLM(
96
  max_model_len=max_model_len,
97
  trust_remote_code=True,
98
  enforce_eager=True,
99
- # GLM-4-9B-Chat-1M 如果遇见 OOM 现象,建议开启下述参数
100
  # enable_chunked_prefill=True,
101
  # max_num_batched_tokens=8192
102
  )
@@ -105,7 +106,6 @@ sampling_params = SamplingParams(temperature=0.95, max_tokens=1024, stop_token_i
105
 
106
  inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
107
  outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
108
-
109
  print(outputs[0].outputs[0].text)
110
  ```
111
 
@@ -113,27 +113,18 @@ print(outputs[0].outputs[0].text)
113
 
114
  GLM-4 模型的权重的使用则需要遵循 [LICENSE](LICENSE)。
115
 
116
- Rhe use of the GLM-4 model weights needs to comply with the [LICENSE](LICENSE).
117
 
118
  ## 引用
119
 
120
  如果你觉得我们的工作有帮助的话,请考虑引用下列论文。
121
 
122
  ```
123
- @article{zeng2022glm,
124
- title={Glm-130b: An open bilingual pre-trained model},
125
- author={Zeng, Aohan and Liu, Xiao and Du, Zhengxiao and Wang, Zihan and Lai, Hanyu and Ding, Ming and Yang, Zhuoyi and Xu, Yifan and Zheng, Wendi and Xia, Xiao and others},
126
- journal={arXiv preprint arXiv:2210.02414},
127
- year={2022}
128
- }
129
- ```
130
-
131
- ```
132
- @inproceedings{du2022glm,
133
- title={GLM: General Language Model Pretraining with Autoregressive Blank Infilling},
134
- author={Du, Zhengxiao and Qian, Yujie and Liu, Xiao and Ding, Ming and Qiu, Jiezhong and Yang, Zhilin and Tang, Jie},
135
- booktitle={Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
136
- pages={320--335},
137
- year={2022}
138
  }
139
  ```
 
4
  license_link: https://huggingface.co/THUDM/glm-4-9b-chat-1m/blob/main/LICENSE
5
 
6
  language:
7
+ - zh
8
+ - en
9
  tags:
10
+ - glm
11
+ - chatglm
12
+ - thudm
13
  inference: false
14
  ---
15
 
16
  # GLM-4-9B-Chat-1M
17
 
18
+ Read this in [English](README_en.md).
19
 
20
+ GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。
21
+ 在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出较高的性能。
22
+ 除了能进行多轮对话,GLM-4-9B-Chat 还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大 128K
23
+ 上下文)等高级功能。
24
+ 本代模型增加了多语言支持,支持包括日语,韩语,德语在内的 26 种语言。我们还推出了支持 1M 上下文长度(约 200 万中文字符)的模型。
 
 
25
 
26
  ## 评测结果
27
 
 
39
 
40
  ## 运行模型
41
 
42
+ 更多推理代码和依赖信息,请访问我们的 [github](https://github.com/THUDM/GLM-4) 。
43
+
44
  使用 transformers 后端进行推理:
45
 
46
  ```python
47
  import torch
48
+ from Transformers
49
 
50
  device = "cuda"
51
 
 
62
 
63
  inputs = inputs.to(device)
64
  model = AutoModelForCausalLM.from_pretrained(
65
+ "ZhipuAI/glm-4-9b-chat-1m",
66
  torch_dtype=torch.bfloat16,
67
  low_cpu_mem_usage=True,
68
  trust_remote_code=True
 
82
  from vllm import LLM, SamplingParams
83
 
84
  # GLM-4-9B-Chat-1M
85
+ # max_model_len, tp_size = 1048576, 4
86
 
87
+ # GLM-4-9B-Chat
88
+ # If you encounter OOM, it is recommended to reduce max_model_len or increase tp_size
89
+ max_model_len, tp_size = 131072, 1
90
  model_name = "THUDM/glm-4-9b-chat-1m"
91
+ prompt = [{"role": "user", "content": "hello"}]
92
 
93
  tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
94
  llm = LLM(
 
97
  max_model_len=max_model_len,
98
  trust_remote_code=True,
99
  enforce_eager=True,
100
+ # GLM-4-9B-Chat-1M If you encounter OOM phenomenon, it is recommended to enable the following parameters
101
  # enable_chunked_prefill=True,
102
  # max_num_batched_tokens=8192
103
  )
 
106
 
107
  inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
108
  outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
 
109
  print(outputs[0].outputs[0].text)
110
  ```
111
 
 
113
 
114
  GLM-4 模型的权重的使用则需要遵循 [LICENSE](LICENSE)。
115
 
 
116
 
117
  ## 引用
118
 
119
  如果你觉得我们的工作有帮助的话,请考虑引用下列论文。
120
 
121
  ```
122
+ @misc{glm2024chatglm,
123
+ title={ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools},
124
+ author={Team GLM and Aohan Zeng and Bin Xu and Bowen Wang and Chenhui Zhang and Da Yin and Diego Rojas and Guanyu Feng and Hanlin Zhao and Hanyu Lai and Hao Yu and Hongning Wang and Jiadai Sun and Jiajie Zhang and Jiale Cheng and Jiayi Gui and Jie Tang and Jing Zhang and Juanzi Li and Lei Zhao and Lindong Wu and Lucen Zhong and Mingdao Liu and Minlie Huang and Peng Zhang and Qinkai Zheng and Rui Lu and Shuaiqi Duan and Shudan Zhang and Shulin Cao and Shuxun Yang and Weng Lam Tam and Wenyi Zhao and Xiao Liu and Xiao Xia and Xiaohan Zhang and Xiaotao Gu and Xin Lv and Xinghan Liu and Xinyi Liu and Xinyue Yang and Xixuan Song and Xunkai Zhang and Yifan An and Yifan Xu and Yilin Niu and Yuantao Yang and Yueyan Li and Yushi Bai and Yuxiao Dong and Zehan Qi and Zhaoyu Wang and Zhen Yang and Zhengxiao Du and Zhenyu Hou and Zihan Wang},
125
+ year={2024},
126
+ eprint={2406.12793},
127
+ archivePrefix={arXiv},
128
+ primaryClass={id='cs.CL' full_name='Computation and Language' is_active=True alt_name='cmp-lg' in_archive='cs' is_general=False description='Covers natural language processing. Roughly includes material in ACM Subject Class I.2.7. Note that work on artificial languages (programming languages, logics, formal systems) that does not explicitly address natural-language issues broadly construed (natural-language processing, computational linguistics, speech, text retrieval, etc.) is not appropriate for this area.'}
 
 
 
 
 
 
 
 
129
  }
130
  ```
README_en.md CHANGED
@@ -28,11 +28,11 @@ The long text capability was further evaluated on LongBench, and the results are
28
 
29
  **This repository is the model repository of GLM-4-9B-Chat-1M, supporting `1M` context length.**
30
 
31
- ## Quick call
32
 
33
- **For hardware configuration and system requirements, please check [here](basic_demo/README_en.md).**
34
 
35
- ### Use the following method to quickly call the GLM-4-9B-Chat language model
36
 
37
  Use the transformers backend for inference:
38
 
@@ -75,13 +75,13 @@ from transformers import AutoTokenizer
75
  from vllm import LLM, SamplingParams
76
 
77
  # GLM-4-9B-Chat-1M
 
78
 
 
79
  # If you encounter OOM, it is recommended to reduce max_model_len or increase tp_size
80
-
81
- max_model_len, tp_size = 1048576, 4
82
-
83
  model_name = "THUDM/glm-4-9b-chat-1m"
84
- prompt = [{"role": "user", "content": "你好"}]
85
 
86
  tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
87
  llm = LLM(
@@ -90,7 +90,7 @@ llm = LLM(
90
  max_model_len=max_model_len,
91
  trust_remote_code=True,
92
  enforce_eager=True,
93
- # GLM-4-9B-Chat-1M If you encounter OOM phenomenon, it is recommended to turn on the following parameters
94
  # enable_chunked_prefill=True,
95
  # max_num_batched_tokens=8192
96
  )
@@ -99,33 +99,24 @@ sampling_params = SamplingParams(temperature=0.95, max_tokens=1024, stop_token_i
99
 
100
  inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
101
  outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
102
-
103
  print(outputs[0].outputs[0].text)
104
  ```
105
 
106
  ## LICENSE
107
 
108
- The weights of the GLM-4 model are available under the terms of [LICENSE](LICENSE).
109
 
110
  ## Citations
111
 
112
  If you find our work useful, please consider citing the following paper.
113
 
114
  ```
115
- @article{zeng2022glm,
116
- title={Glm-130b: An open bilingual pre-trained model},
117
- author={Zeng, Aohan and Liu, Xiao and Du, Zhengxiao and Wang, Zihan and Lai, Hanyu and Ding, Ming and Yang, Zhuoyi and Xu, Yifan and Zheng, Wendi and Xia, Xiao and others},
118
- journal={arXiv preprint arXiv:2210.02414},
119
- year={2022}
120
- }
121
- ```
122
-
123
- ```
124
- @inproceedings{du2022glm,
125
- title={GLM: General Language Model Pretraining with Autoregressive Blank Infilling},
126
- author={Du, Zhengxiao and Qian, Yujie and Liu, Xiao and Ding, Ming and Qiu, Jiezhong and Yang, Zhilin and Tang, Jie},
127
- booktitle={Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
128
- pages={320--335},
129
- year={2022}
130
  }
131
- ```
 
28
 
29
  **This repository is the model repository of GLM-4-9B-Chat-1M, supporting `1M` context length.**
30
 
31
+ ## Quick Start
32
 
33
+ For more inference code and requirements, please visit our [github page](https://github.com/THUDM/GLM-4).
34
 
35
+ ### Use the following method to quickly call the GLM-4-9B-Chat-1M language model
36
 
37
  Use the transformers backend for inference:
38
 
 
75
  from vllm import LLM, SamplingParams
76
 
77
  # GLM-4-9B-Chat-1M
78
+ # max_model_len, tp_size = 1048576, 4
79
 
80
+ # GLM-4-9B-Chat
81
  # If you encounter OOM, it is recommended to reduce max_model_len or increase tp_size
82
+ max_model_len, tp_size = 131072, 1
 
 
83
  model_name = "THUDM/glm-4-9b-chat-1m"
84
+ prompt = [{"role": "user", "content": "hello"}]
85
 
86
  tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
87
  llm = LLM(
 
90
  max_model_len=max_model_len,
91
  trust_remote_code=True,
92
  enforce_eager=True,
93
+ # GLM-4-9B-Chat-1M If you encounter OOM phenomenon, it is recommended to enable the following parameters
94
  # enable_chunked_prefill=True,
95
  # max_num_batched_tokens=8192
96
  )
 
99
 
100
  inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
101
  outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
 
102
  print(outputs[0].outputs[0].text)
103
  ```
104
 
105
  ## LICENSE
106
 
107
+ The weights of the GLM-4 model are available under the terms of [LICENSE](LICENSE)
108
 
109
  ## Citations
110
 
111
  If you find our work useful, please consider citing the following paper.
112
 
113
  ```
114
+ @misc{glm2024chatglm,
115
+ title={ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools},
116
+ author={Team GLM and Aohan Zeng and Bin Xu and Bowen Wang and Chenhui Zhang and Da Yin and Diego Rojas and Guanyu Feng and Hanlin Zhao and Hanyu Lai and Hao Yu and Hongning Wang and Jiadai Sun and Jiajie Zhang and Jiale Cheng and Jiayi Gui and Jie Tang and Jing Zhang and Juanzi Li and Lei Zhao and Lindong Wu and Lucen Zhong and Mingdao Liu and Minlie Huang and Peng Zhang and Qinkai Zheng and Rui Lu and Shuaiqi Duan and Shudan Zhang and Shulin Cao and Shuxun Yang and Weng Lam Tam and Wenyi Zhao and Xiao Liu and Xiao Xia and Xiaohan Zhang and Xiaotao Gu and Xin Lv and Xinghan Liu and Xinyi Liu and Xinyue Yang and Xixuan Song and Xunkai Zhang and Yifan An and Yifan Xu and Yilin Niu and Yuantao Yang and Yueyan Li and Yushi Bai and Yuxiao Dong and Zehan Qi and Zhaoyu Wang and Zhen Yang and Zhengxiao Du and Zhenyu Hou and Zihan Wang},
117
+ year={2024},
118
+ eprint={2406.12793},
119
+ archivePrefix={arXiv},
120
+ primaryClass={id='cs.CL' full_name='Computation and Language' is_active=True alt_name='cmp-lg' in_archive='cs' is_general=False description='Covers natural language processing. Roughly includes material in ACM Subject Class I.2.7. Note that work on artificial languages (programming languages, logics, formal systems) that does not explicitly address natural-language issues broadly construed (natural-language processing, computational linguistics, speech, text retrieval, etc.) is not appropriate for this area.'}
 
 
 
 
 
 
 
 
121
  }
122
+ ```
config.json CHANGED
@@ -37,8 +37,8 @@
37
  "seq_length": 1048576,
38
  "use_cache": true,
39
  "torch_dtype": "bfloat16",
40
- "transformers_version": "4.30.2",
41
  "tie_word_embeddings": false,
42
  "eos_token_id": [151329, 151336, 151338],
43
  "pad_token_id": 151329
44
- }
 
37
  "seq_length": 1048576,
38
  "use_cache": true,
39
  "torch_dtype": "bfloat16",
40
+ "transformers_version": "4.40.2",
41
  "tie_word_embeddings": false,
42
  "eos_token_id": [151329, 151336, 151338],
43
  "pad_token_id": 151329
44
+ }
configuration.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"framework":"Pytorch","task":"nli"}
generation_config.json CHANGED
@@ -9,5 +9,5 @@
9
  "temperature": 0.8,
10
  "max_length": 1024000,
11
  "top_p": 0.8,
12
- "transformers_version": "4.38.2"
13
  }
 
9
  "temperature": 0.8,
10
  "max_length": 1024000,
11
  "top_p": 0.8,
12
+ "transformers_version": "4.40.2"
13
  }
modeling_chatglm.py CHANGED
@@ -21,7 +21,7 @@ from transformers.modeling_outputs import (
21
  SequenceClassifierOutputWithPast,
22
  )
23
  from transformers.modeling_utils import PreTrainedModel
24
- from transformers.utils import logging
25
  from transformers.generation.logits_process import LogitsProcessor
26
  from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput
27
 
@@ -29,7 +29,7 @@ from .configuration_chatglm import ChatGLMConfig
29
 
30
  # flags required to enable jit fusion kernels
31
 
32
- if sys.platform != 'darwin':
33
  torch._C._jit_set_profiling_mode(False)
34
  torch._C._jit_set_profiling_executor(False)
35
  torch._C._jit_override_can_fuse_on_cpu(True)
@@ -1139,7 +1139,7 @@ class ChatGLMForSequenceClassification(ChatGLMPreTrainedModel):
1139
  self.num_labels = config.num_labels
1140
  self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device)
1141
 
1142
- self.classifier_head = nn.Linear(config.hidden_size, config.num_labels, bias=True, dtype=torch.half)
1143
  if config.classifier_dropout is not None:
1144
  self.dropout = nn.Dropout(config.classifier_dropout)
1145
  else:
@@ -1174,7 +1174,7 @@ class ChatGLMForSequenceClassification(ChatGLMPreTrainedModel):
1174
  )
1175
 
1176
  hidden_states = transformer_outputs[0]
1177
- pooled_hidden_states = hidden_states[-1]
1178
  if self.dropout is not None:
1179
  pooled_hidden_states = self.dropout(pooled_hidden_states)
1180
  logits = self.classifier_head(pooled_hidden_states)
 
21
  SequenceClassifierOutputWithPast,
22
  )
23
  from transformers.modeling_utils import PreTrainedModel
24
+ from transformers.utils import logging, is_torch_npu_available
25
  from transformers.generation.logits_process import LogitsProcessor
26
  from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput
27
 
 
29
 
30
  # flags required to enable jit fusion kernels
31
 
32
+ if sys.platform != 'darwin' and not is_torch_npu_available():
33
  torch._C._jit_set_profiling_mode(False)
34
  torch._C._jit_set_profiling_executor(False)
35
  torch._C._jit_override_can_fuse_on_cpu(True)
 
1139
  self.num_labels = config.num_labels
1140
  self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device)
1141
 
1142
+ self.classifier_head = nn.Linear(config.hidden_size, config.num_labels, bias=True, dtype=config.torch_dtype)
1143
  if config.classifier_dropout is not None:
1144
  self.dropout = nn.Dropout(config.classifier_dropout)
1145
  else:
 
1174
  )
1175
 
1176
  hidden_states = transformer_outputs[0]
1177
+ pooled_hidden_states = hidden_states[:, -1]
1178
  if self.dropout is not None:
1179
  pooled_hidden_states = self.dropout(pooled_hidden_states)
1180
  logits = self.classifier_head(pooled_hidden_states)
tokenization_chatglm.py CHANGED
@@ -62,16 +62,14 @@ class ChatGLM4Tokenizer(PreTrainedTokenizer):
62
  vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
63
  vocab.update(self.added_tokens_encoder)
64
  return vocab
65
-
66
- def convert_tokens_to_string(self, tokens: List[Union[bytes, str, int]]) -> str:
67
  """
68
  Converts a sequence of tokens in a single string.
69
  """
70
  text = ""
71
  temp = b""
72
  for t in tokens:
73
- if isinstance(t, int):
74
- t = chr(t)
75
  if isinstance(t, str):
76
  if temp:
77
  text += temp.decode("utf-8", errors="replace")
@@ -80,7 +78,7 @@ class ChatGLM4Tokenizer(PreTrainedTokenizer):
80
  elif isinstance(t, bytes):
81
  temp += t
82
  else:
83
- raise TypeError("token should only be of type int, bytes or str")
84
  if temp:
85
  text += temp.decode("utf-8", errors="replace")
86
  return text
@@ -143,98 +141,98 @@ class ChatGLM4Tokenizer(PreTrainedTokenizer):
143
  else:
144
  return str(f"<|{role}|>{metadata}\n{message}")
145
 
146
- def apply_chat_template(
147
- self,
148
- conversation: Union[List[Dict[str, str]], List[List[Dict[str, str]]], "Conversation"],
149
- add_generation_prompt: bool = False,
150
- tokenize: bool = True,
151
- padding: bool = False,
152
- truncation: bool = False,
153
- max_length: Optional[int] = None,
154
- return_tensors: Optional[Union[str, TensorType]] = None,
155
- return_dict: bool = False,
156
- tokenizer_kwargs: Optional[Dict[str, Any]] = None,
157
- add_special_tokens: bool = True,
158
- **kwargs,
159
- ) -> Union[str, List[int], List[str], List[List[int]], BatchEncoding]:
160
-
161
- if return_dict and not tokenize:
162
- raise ValueError(
163
- "`return_dict=True` is incompatible with `tokenize=False`, because there is no dict "
164
- "of tokenizer outputs to return."
165
- )
166
-
167
- def handle_single_conversation(conversation):
168
- input_ids = self.get_prefix_tokens() if add_special_tokens else []
169
- input_message = "[gMASK]<sop>" if add_special_tokens else ""
170
- for item in conversation:
171
- if item.get("tools"):
172
- tools = item["tools"]
173
- content = "你是一个名为 GLM-4 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的,你的任务是针对用户的问题和要求提供适当的答复和支持。"
174
- for tool in tools:
175
- if tool["type"] == "function":
176
- function = tool["function"]
177
- content += f"\n\n## {function['name']}\n\n{json.dumps(function, ensure_ascii=False, indent=4)}"
178
- content += "\n在调用上述函数时,请使用 Json 格式表示调用的参数。"
179
- elif tool["type"] == "python":
180
- content += "\n\n## python\n\n当你向 `python` 发送包含 Python 代码的消息时,该代码将会在一个有状态的 Jupyter notebook 环境中执行。\n`python` 返回代码执行的输出,或在执行 60 秒后返回超时。\n`/mnt/data` 将会持久化存储你的文件。在此会话中,`python` 无法访问互联网。不要使用 `python` 进行任何网络请求或者在线 API 调用,这些在线内容的访问将不会成功。"
181
- elif tool["type"] == "simple_browser":
182
- content += "\n\n## simple_browser\n\n你可以使用 `simple_browser` 工具。该工具支持以下函数:\n`search(query: str, recency_days: int)`:使用搜索引擎进行查询并显示结果,可以使用 `recency_days` 参数控制搜索内容的时效性。\n`mclick(ids: list[int])`:获取一系列指定 id 的页面内容。每次调用时,须选择3-10个页面。选择多个角度的页面,同时尽可能选择可信任的信息来源。考虑到部分页面是无法加载的,你也可以多打开一些可能有用的页面而不用担心内容过多。\n`open_url(url: str)`:打开指定的 URL。\n\n使用 `【{引用 id}†{引用文本}】` 来引用内容。\n\n操作步骤:1. 使用 `search` 来获得信息列表; 2. 使用 `mclick` 来获取指定 ID 页面的内容; 3. 根据获得的内容进行回复。在回复中应当引用信息来源。\n 如果用户提供了 URL,也可以用 `open_url` 直接打开页面。\n如果初次搜索结果没有找到合适的信息,也可以再次使用 `search` 进行搜索。"
183
- elif tool["type"] == "cogview":
184
- content += "\n\n## cogview\n\n如果用户的请求中包含了对图像的描述,你可以使用 `cogview` 来生成图像并展示给用户。你需要�� `cogview` 发送图像描述,规则:\n- 发送给 `cogview` 的消息必须使用英语。用户的中文描述必须完全翻译为英语。\n- 应当尽可能详细地描述图像生成的需求,需求描述约 100 英文单词。\n- 保持用户原始描述的意图。不要虚构内容或者没见过的人物。\n- 如无特殊说明,所在地为中国,持有中国立场并遵循中国社会主义价值观。"
185
- else:
186
- raise NotImplementedError(f"Unknown tool type {tool['type']}")
187
- input = self.build_single_message("system", "", content, tokenize=tokenize)
188
- if tokenize:
189
- input_ids.extend(input)
190
- else:
191
- input_message += input
192
- if item["content"]:
193
- input = self.build_single_message(
194
- item["role"],
195
- item.get("metadata", ""),
196
- item["content"],
197
- tokenize=tokenize
198
- )
199
- if tokenize:
200
- input_ids.extend(input)
201
- else:
202
- input_message += input
203
- if add_generation_prompt:
204
- if tokenize:
205
- input_ids.extend([self.convert_tokens_to_ids("<|assistant|>")])
206
- else:
207
- input_message += "<|assistant|>"
208
-
209
- return input_ids if tokenize else input_message
210
-
211
- # Main logic to handle different conversation formats
212
- if isinstance(conversation, list) and all(isinstance(i, dict) for i in conversation):
213
- result = handle_single_conversation(conversation)
214
- elif isinstance(conversation, list) and all(isinstance(i, list) for i in conversation):
215
- result = [handle_single_conversation(c) for c in conversation]
216
- elif hasattr(conversation, "messages"):
217
- result = handle_single_conversation(conversation.messages)
218
- else:
219
- raise ValueError("Invalid conversation format")
220
-
221
- if tokenize:
222
- output = self.batch_encode_plus(
223
- [result] if isinstance(result[0], int) else result,
224
- padding=padding,
225
- truncation=truncation,
226
- max_length=max_length,
227
- return_tensors=return_tensors,
228
- is_split_into_words=True,
229
- add_special_tokens=False
230
- )
231
- if return_dict:
232
- return output
233
- else:
234
- return output["input_ids"]
235
- else:
236
- return result
237
-
238
 
239
  def build_inputs_with_special_tokens(
240
  self, token_ids_0: List[int], token_ids_1: Optional[List[int]] = None
 
62
  vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
63
  vocab.update(self.added_tokens_encoder)
64
  return vocab
65
+
66
+ def convert_tokens_to_string(self, tokens: List[Union[bytes, str]]) -> str:
67
  """
68
  Converts a sequence of tokens in a single string.
69
  """
70
  text = ""
71
  temp = b""
72
  for t in tokens:
 
 
73
  if isinstance(t, str):
74
  if temp:
75
  text += temp.decode("utf-8", errors="replace")
 
78
  elif isinstance(t, bytes):
79
  temp += t
80
  else:
81
+ raise TypeError("token should only be of type types or str")
82
  if temp:
83
  text += temp.decode("utf-8", errors="replace")
84
  return text
 
141
  else:
142
  return str(f"<|{role}|>{metadata}\n{message}")
143
 
144
+ # Use Jinja Template in tokenizer_config.json
145
+ # def apply_chat_template(
146
+ # self,
147
+ # conversation: Union[List[Dict[str, str]], List[List[Dict[str, str]]], "Conversation"],
148
+ # add_generation_prompt: bool = False,
149
+ # tokenize: bool = True,
150
+ # padding: bool = False,
151
+ # truncation: bool = False,
152
+ # max_length: Optional[int] = None,
153
+ # return_tensors: Optional[Union[str, TensorType]] = None,
154
+ # return_dict: bool = False,
155
+ # tokenizer_kwargs: Optional[Dict[str, Any]] = None,
156
+ # add_special_tokens: bool = True,
157
+ # **kwargs,
158
+ # ) -> Union[str, List[int], List[str], List[List[int]], BatchEncoding]:
159
+ #
160
+ # if return_dict and not tokenize:
161
+ # raise ValueError(
162
+ # "`return_dict=True` is incompatible with `tokenize=False`, because there is no dict "
163
+ # "of tokenizer outputs to return."
164
+ # )
165
+ #
166
+ # def handle_single_conversation(conversation):
167
+ # input_ids = self.get_prefix_tokens() if add_special_tokens else []
168
+ # input_message = "[gMASK]<sop>" if add_special_tokens else ""
169
+ # for item in conversation:
170
+ # if item.get("tools"):
171
+ # tools = item["tools"]
172
+ # content = "你是一个名为 GhatGLM 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的,你的任务是针对用户的问题和要求提供适当的答复和支持。"
173
+ # content += "\n\n# 可用工具"
174
+ # for tool in tools:
175
+ # if tool["type"] == "function":
176
+ # function = tool["function"]
177
+ # content += f"\n\n## {function['name']}\n\n{json.dumps(function, ensure_ascii=False, indent=4)}"
178
+ # content += "\n在调用上述函数时,请使用 Json 格式表示调用的参数。"
179
+ # elif tool["type"] == "python":
180
+ # content += "\n\n## python\n\n当你向 `python` 发送包含 Python 代码的消息时,该代码将会在一个有状态的 Jupyter notebook 环境中执行。\n`python` 返回代码执行的输出,或在执行 60 秒后返回超时。\n`/mnt/data` 将会持久化存储你的文件。在此会话中,`python` 无法访问互联网。不要使用 `python` 进行任何网络请求或者在线 API 调用,这些在线内容的访问将不会成功。"
181
+ # elif tool["type"] == "simple_browser":
182
+ # content += "\n\n## simple_browser\n\n你可以使用 `simple_browser` 工具。该工具支持以下函数:\n`search(query: str, recency_days: int)`:使用搜索引擎进行查询并显示结果,可以使用 `recency_days` 参数控制搜索内容的时效性。\n`mclick(ids: list[int])`:获取一系列指定 id 的页面内容。每次调用时,须选择3-10个页面。选择多个角度的页面,同时尽可能选择可信任的信息来源。考虑到部分页面是无法加载的,你也可以多打开一些可能有用的页面而不用担心内容过多。\n`open_url(url: str)`:打开指定的 URL。\n\n使用 `【{引用 id}†{引用文本}】` 来引用内容。\n\n操作步骤:1. 使用 `search` 来获得信息列表; 2. 使用 `mclick` 来获取指定 ID 页面的内容; 3. 根据获得的内容进行回复。在回复中应当引用信息来源。\n 如果用户提供了 URL,也可以用 `open_url` 直接打开页面。\n如果初次搜索结果没有找到合适的信息,也可以再次使用 `search` 进行搜索。"
183
+ # elif tool["type"] == "cogview":
184
+ # content += "\n\n## cogview\n\n如果用户的请求中包含了对图像的描述,你可以使用 `cogview` 来生成图像并展示给用户。你需要向 `cogview` 发送图像描述,规则:\n- 发送给 `cogview` 的消息必须使用英语。用户的中文描述必须完全翻译为英语。\n- 应当尽可能详细地描述图像生成的需求,需求描述约 100 英文单词。\n- 保持用户原始描述的意图。不要虚构内容或者没见过的人物。\n- 如无特殊说明,所在地为中国,持有中国立场并遵循中国社会主义价值观。"
185
+ # else:
186
+ # raise NotImplementedError(f"Unknown tool type {tool['type']}")
187
+ # input = self.build_single_message("system", "", content, tokenize=tokenize)
188
+ # if tokenize:
189
+ # input_ids.extend(input)
190
+ # else:
191
+ # input_message += input
192
+ # if item["content"]:
193
+ # input = self.build_single_message(
194
+ # item["role"],
195
+ # item.get("metadata", ""),
196
+ # item["content"],
197
+ # tokenize=tokenize
198
+ # )
199
+ # if tokenize:
200
+ # input_ids.extend(input)
201
+ # else:
202
+ # input_message += input
203
+ # if add_generation_prompt:
204
+ # if tokenize:
205
+ # input_ids.extend([self.convert_tokens_to_ids("<|assistant|>")])
206
+ # else:
207
+ # input_message += "<|assistant|>"
208
+ # return input_ids if tokenize else input_message
209
+ #
210
+ # # Main logic to handle different conversation formats
211
+ # if isinstance(conversation, list) and all(isinstance(i, dict) for i in conversation):
212
+ # result = handle_single_conversation(conversation)
213
+ # elif isinstance(conversation, list) and all(isinstance(i, list) for i in conversation):
214
+ # result = [handle_single_conversation(c) for c in conversation]
215
+ # elif hasattr(conversation, "messages"):
216
+ # result = handle_single_conversation(conversation.messages)
217
+ # else:
218
+ # raise ValueError("Invalid conversation format")
219
+ #
220
+ # if tokenize:
221
+ # output = self.batch_encode_plus(
222
+ # [result] if isinstance(result[0], int) else result,
223
+ # padding=padding,
224
+ # truncation=truncation,
225
+ # max_length=max_length,
226
+ # return_tensors=return_tensors,
227
+ # is_split_into_words=True,
228
+ # add_special_tokens=False
229
+ # )
230
+ # if return_dict:
231
+ # return output
232
+ # else:
233
+ # return output["input_ids"]
234
+ # else:
235
+ # return result
236
 
237
  def build_inputs_with_special_tokens(
238
  self, token_ids_0: List[int], token_ids_1: Optional[List[int]] = None
tokenizer_config.json CHANGED
@@ -123,6 +123,7 @@
123
  "<|user|>", "<|assistant|>", "<|observation|>", "<|begin_of_image|>", "<|end_of_image|>",
124
  "<|begin_of_video|>", "<|end_of_video|>"],
125
  "clean_up_tokenization_spaces": false,
 
126
  "do_lower_case": false,
127
  "eos_token": "<|endoftext|>",
128
  "pad_token": "<|endoftext|>",
 
123
  "<|user|>", "<|assistant|>", "<|observation|>", "<|begin_of_image|>", "<|end_of_image|>",
124
  "<|begin_of_video|>", "<|end_of_video|>"],
125
  "clean_up_tokenization_spaces": false,
126
+ "chat_template": "[gMASK]<sop>{% for item in messages %}{% if item['tools'] is defined %}<|system|>\n你是一个名为 GLM-4 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的,你的任务是针对用户的问题和要求提供适当的答复和支持。\n\n# 可用工具{% set tools = item['tools'] %}{% for tool in tools %}{% if tool['type'] == 'function' %}\n\n## {{ tool['function']['name'] }}\n\n{{ tool['function'] | tojson(indent=4) }}\n在调用上述函数时,请使用 Json 格式表示调用的参数。{% elif tool['type'] == 'python' %}\n\n## python\n\n当你向 `python` 发送包含 Python 代码的消息时,该代码将会在一个有状态的 Jupyter notebook 环境中执行。\n`python` 返回代码执行的输出,或在执行 60 秒后返回超时。\n`/mnt/data` 将会持久化存储你的文件。在此会话中,`python` 无法访问互联网。不要使用 `python` 进行任何网络请求或者在线 API 调用,这些在线内容的访问将不会成功。{% elif tool['type'] == 'simple_browser' %}\n\n## simple_browser\n\n你可以使用 `simple_browser` 工具。该工具支持以下函数:\n`search(query: str, recency_days: int)`:使用搜索引擎进行查询并显示结果,可以使用 `recency_days` 参数控制搜索内容的时效性。\n`mclick(ids: list[int])`:获取一系列指定 id 的页面内容。每次调用时,须选择3-10个页面。选择多个角度的页面,同时尽可能选择可信任的信息来源。考虑到部分页面是无法加载的,你也可以多打开一些可能有用的页面而不用担心内容过多。\n`open_url(url: str)`:打开指定的 URL。\n\n使用 `【{引用 id}†{引用文本}】` 来引用内容。\n\n操作步骤:1. 使用 `search` 来获得信息列表; 2. 使用 `mclick` 来获取指定 ID 页面的内容; 3. 根据获得的内容进行回复。在回复中应当引用信息来源。\n 如果用户提供了 URL,也可以用 `open_url` 直接打开页面。\n如果初次搜索结果没有找到合适的信息,也可以再次使用 `search` 进行搜索。{% elif tool['type'] == 'cogview' %}\n\n## cogview\n\n如果用户的请求中包含了对图像的描述,你可以使用 `cogview` 来生成图像并展示给用户。你需要向 `cogview` 发送图像描述,规则:\n- 发送给 `cogview` 的消息必须使用英语。用户的中文描述必须完全翻译为英语。\n- 应当尽可能详细地描述图像生成的需求,需求描述约 100 英文单词。\n- 保持用户原始描述的意图。不要虚构内容或者没见过的人物。\n- 如无特殊说明,所在地为中国,持有中国立场并遵循中国社会主义价值观。{% endif %}{% endfor %}{% endif %}{% if item['content'] %}<|{{ item['role'] }}|>{{ item['metadata'] }}\n{{ item['content'] }}{% endif %}{% endfor %}{% if add_generation_prompt %}<|assistant|>{% endif %}",
127
  "do_lower_case": false,
128
  "eos_token": "<|endoftext|>",
129
  "pad_token": "<|endoftext|>",