Process conversation datasets;

This commit is contained in:
extio-de
2025-01-11 21:58:29 +01:00
parent 63192f2bc0
commit 2799b9c555

View File

@@ -7,10 +7,14 @@ class Dataset:
def scan(self, location: str, tokenizer, context: Context): def scan(self, location: str, tokenizer, context: Context):
print(f"Scanning dataset directory {location}") print(f"Scanning dataset directory {location}")
directory = pathlib.Path(location) customChatTemplate = None
files = [f for f in directory.iterdir() if f.is_file()] if context.locCustomPromptTemplate != None:
with open(context.locCustomPromptTemplate, 'r') as file:
customChatTemplate = file.read()
datasets = [] datasets = []
directory = pathlib.Path(location)
files = [f for f in directory.iterdir() if f.is_file()]
for file in files: for file in files:
print(file.name) print(file.name)
@@ -23,9 +27,11 @@ class Dataset:
if "text" in qaDataset['train'].features: if "text" in qaDataset['train'].features:
self.__loadTextDataset(qaDataset, datasets, tokenizer) self.__loadTextDataset(qaDataset, datasets, tokenizer)
elif "history" in qaDataset['train'].features or "instruct" in qaDataset['train'].features or "completion" in qaDataset['train'].features or "question" in qaDataset['train'].features or "answer" in qaDataset['train'].features: elif "history" in qaDataset['train'].features or "instruct" in qaDataset['train'].features or "completion" in qaDataset['train'].features or "question" in qaDataset['train'].features or "answer" in qaDataset['train'].features:
self.__loadQaDataset(qaDataset, datasets, tokenizer, context) self.__loadQaDataset(qaDataset, datasets, tokenizer, customChatTemplate, context)
elif "conversation" in qaDataset['train'].features:
self.__loadConversationDataset(qaDataset, datasets, tokenizer, customChatTemplate, context)
else: else:
print("Cannot load dataset, json dataset neither contains 'text' nor 'question', 'answer'") print("Cannot load dataset, json dataset is malformed")
if len(datasets) == 0: if len(datasets) == 0:
raise Exception("No datasets have been found. Check configuration") raise Exception("No datasets have been found. Check configuration")
@@ -51,12 +57,7 @@ class Dataset:
return tokenizer(record["text"]) return tokenizer(record["text"])
datasets.append(textDataset.map(datasetTextEncoder)["train"]) datasets.append(textDataset.map(datasetTextEncoder)["train"])
def __loadQaDataset(self, qaDataset, datasets, tokenizer, context): def __loadQaDataset(self, qaDataset, datasets, tokenizer, customChatTemplate, context):
customChatTemplate = None
if context.locCustomPromptTemplate != None:
with open(context.locCustomPromptTemplate, 'r') as file:
customChatTemplate = file.read()
def datasetChatEncoder(record): def datasetChatEncoder(record):
chat = [] chat = []
try: try:
@@ -85,8 +86,37 @@ class Dataset:
except KeyError: except KeyError:
pass pass
return self.__format(chat, tokenizer, customChatTemplate, context)
datasets.append(qaDataset.map(datasetChatEncoder, remove_columns=qaDataset.column_names["train"])["train"])
def __loadConversationDataset(self, qaDataset, datasets, tokenizer, customChatTemplate, context):
def datasetConversationEncoder(batch):
inputIds = []
attentionMask = []
for records in batch['conversation']:
chat = []
cnt = 0
for record in records:
curCnt = len(tokenizer.tokenize(record['user'])) + len(tokenizer.tokenize(record['assistant'])) + 15
if cnt + curCnt >= context.trMaxSeqLength:
encoded = self.__format(chat, tokenizer, customChatTemplate, context)
inputIds.append(encoded['input_ids'])
attentionMask.append(encoded['attention_mask'])
chat = []
cnt = curCnt
else:
cnt += curCnt
chat.append({"role": "user", "content": f"{record['user']}"})
chat.append({"role": "assistant", "content": f"{record['assistant']}"})
encoded = self.__format(chat, tokenizer, customChatTemplate, context)
inputIds.append(encoded['input_ids'])
attentionMask.append(encoded['attention_mask'])
return {"input_ids": inputIds, "attention_mask": attentionMask}
datasets.append(qaDataset.map(datasetConversationEncoder, batched = True, remove_columns=qaDataset.column_names["train"])["train"])
def __format(self, chat, tokenizer, customChatTemplate, context):
if context.showChatTemplate: if context.showChatTemplate:
print(tokenizer.apply_chat_template(chat, chat_template = customChatTemplate, add_generation_prompt = False, tokenize = False, return_dict = False)) print(tokenizer.apply_chat_template(chat, chat_template = customChatTemplate, add_generation_prompt = False, tokenize = False, return_dict = False))
return tokenizer.apply_chat_template(chat, chat_template = customChatTemplate, add_generation_prompt = False, tokenize = True, return_dict = True) return tokenizer.apply_chat_template(chat, chat_template = customChatTemplate, add_generation_prompt = False, tokenize = True, return_dict = True)
datasets.append(qaDataset.map(datasetChatEncoder, remove_columns=qaDataset.column_names["train"])["train"])