ChatGLM3-6B — новейшая крупномасштабная языковая модель искусственного интеллекта, выпущенная в конце октября. Эффект действительно значительно улучшился. Но судя по документации, на официальном сайте Bilibili есть лишь несколько демоверсий и видеороликов. https://www.bilibili.com/video/BV1uC4y1J7yA Доступно для справки. Но если вы хотите углубиться, ключевые вызовы таковы:
model.stream_chat(tokenizer, input, history, past_key_values=past_key_values,
return_past_key_values=True,
max_length=max_length,
top_p=top_p,
temperature=temperature)
Что именно означает каждый параметр?
Потому что на Huggingface, modelscope.cn и github чатглма,Подробного описания основного интерфейса нет. Поиск по всей сети занял много времени.,Ответа тоже не нашел. Наконец после исследования,Вы можете узнать об этом из файлов исходного кода.:https://huggingface.co/THUDM/chatglm3-6b/blob/main/modeling_chatglm.py
Эта статья помогает каждому понять использование связанных интерфейсов, предоставляя соответствующий Аннотация интерфейса.
существоватьhuggingfaceизChatGLM3-6BизДомашняя страницасередина,Нажмите на вкладку «Файлы».
Файл modeling_chatglm.py можно найти, в нем находится код интерфейса.
@torch.inference_mode()
def chat(self, tokenizer, query: str, history: List[Dict] = None, role: str = "user",
max_length: int = 8192, num_beams=1, do_sample=True, top_p=0.8, temperature=0.8, logits_processor=None,
**kwargs):
"""
Функция чата, принимает текстовый запрос и возвращает ответ модели.
параметр:
tokenizer: Объект токенизатора, используемый для обработки входного и выходного текста.
query (str): Ввод текста пользователем.
history (List[Dict], необязательный): История разговоров, каждый элемент представляет собой словарь, содержащий роль («role») и контент («content»). По умолчанию — Нет.
role (str, необязательный): Роль входного текста: «пользователь» или «помощник». По умолчанию «пользователь».
max_length (int, необязательный): Максимальная длина создаваемого текста. По умолчанию — 8192.
num_beams (int, необязательный): Ширина поиска луча. Если значение больше 1, используется поиск луча. По умолчанию — 1.
do_sample (bool, необязательный): Следует ли выполнять выборку из распределения прогнозов. По умолчанию — Истина.
top_p (float, необязательный): Порог кумулятивной вероятности при использовании выборки ядер. По умолчанию — 0,8.
temperature (float, необязательный): Параметры, управляющие случайностью генерируемого текста. По умолчанию — 0,8.
logits_processor (LogitsProcessorList, необязательный): Объект, используемый для обработки и изменения логитов на этапе сборки. По умолчанию — Нет.
**kwargs: Остальные параметры передаются в функцию генерации модели.
возвращаться:
response (str): Текст ответа модели.
history (List[Dict]): Обновлена история разговоров.
"""
if history is None:
history = []
if logits_processor is None:
logits_processor = LogitsProcessorList()
logits_processor.append(InvalidScoreLogitsProcessor())
gen_kwargs = {"max_length": max_length, "num_beams": num_beams, "do_sample": do_sample, "top_p": top_p,
"temperature": temperature, "logits_processor": logits_processor, **kwargs}
inputs = tokenizer.build_chat_input(query, history=history, role=role)
inputs = inputs.to(self.device)
eos_token_id = [tokenizer.eos_token_id, tokenizer.get_command("<|user|>"),
tokenizer.get_command("<|observation|>")]
outputs = self.generate(**inputs, **gen_kwargs, eos_token_id=eos_token_id)
outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):-1]
response = tokenizer.decode(outputs)
history.append({"role": role, "content": query})
response, history = self.process_response(response, history)
return response, history
@torch.inference_mode()
def stream_chat(self, tokenizer, query: str, history: List[Dict] = None, role: str = "user",
past_key_values=None,max_length: int = 8192, do_sample=True, top_p=0.8, temperature=0.8,
logits_processor=None, return_past_key_values=False, **kwargs):
"""
Функция потоковой передачи чата, принимает текстовый запрос и возвращает ответ модели.Эта функция является генератором,可以существовать流式处理середина使用。
параметр:
tokenizer: Объект токенизатора, используемый для обработки входного и выходного текста.
query (str): Ввод текста пользователем.
history (List[Dict], необязательный): История разговоров, каждый элемент представляет собой словарь, содержащий роль («role») и контент («content»). По умолчанию — Нет.
role (str, необязательный): Роль входного текста: «пользователь» или «помощник». По умолчанию «пользователь».
past_key_values (List[Tensor], необязательный): Прошлые пары ключ-значение для модели преобразователя. По умолчанию — Нет.
max_length (int, необязательный): Максимальная длина создаваемого текста. По умолчанию — 8192.
do_sample (bool, необязательный): Следует ли выполнять выборку из распределения прогнозов. По умолчанию — Истина.
top_p (float, необязательный): Порог кумулятивной вероятности при использовании выборки ядер. По умолчанию — 0,8.
temperature (float, необязательный): Параметры, управляющие случайностью генерируемого текста. По умолчанию — 0,8.
logits_processor (LogitsProcessorList, необязательный): Объект, используемый для обработки и изменения логитов на этапе сборки. По умолчанию — Нет.
return_past_key_values (bool, необязательный): Возвращать ли прошлые пары ключ-значение для следующего поколения. По умолчанию — ложь.
**kwargs: Остальные параметры передаются в функцию генерации модели.
возвращаться:
response (str): Текст ответа модели.
history (List[Dict]): Обновлена история разговоров.
past_key_values (List[Tensor], необязательный): Если return_past_key_values имеет значение True, возвращает прошлые пары ключ-значение, используемые для следующего поколения.
"""
if history is None:
history = []
if logits_processor is None:
logits_processor = LogitsProcessorList()
logits_processor.append(InvalidScoreLogitsProcessor())
eos_token_id = [tokenizer.eos_token_id, tokenizer.get_command("<|user|>"),
tokenizer.get_command("<|observation|>")]
gen_kwargs = {"max_length": max_length, "do_sample": do_sample, "top_p": top_p,
"temperature": temperature, "logits_processor": logits_processor, **kwargs}
if past_key_values is None:
inputs = tokenizer.build_chat_input(query, history=history, role=role)
else:
inputs = tokenizer.build_chat_input(query, role=role)
inputs = inputs.to(self.device)
if past_key_values is not None:
past_length = past_key_values[0][0].shape[0]
if self.transformer.pre_seq_len is not None:
past_length -= self.transformer.pre_seq_len
inputs.position_ids += past_length
attention_mask = inputs.attention_mask
attention_mask = torch.cat((attention_mask.new_ones(1, past_length), attention_mask), dim=1)
inputs['attention_mask'] = attention_mask
history.append({"role": role, "content": query})
for outputs in self.stream_generate(**inputs, past_key_values=past_key_values,
eos_token_id=eos_token_id, return_past_key_values=return_past_key_values,
**gen_kwargs):
if return_past_key_values:
outputs, past_key_values = outputs
outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):-1]
response = tokenizer.decode(outputs)
if response and response[-1] != "�":
response, new_history = self.process_response(response, history)
if return_past_key_values:
yield response, new_history, past_key_values
else:
yield response, new_history