Anteriormente, o SiliconCloud ficou on-line com o modelo de linguagem doFunção de ajuste fino do LoRA on-line. Basta fazer o upload dos dados do corpus e criar uma tarefa de ajuste fino para obter um modelo de linguagem proprietário com ajuste fino.
Recentemente, o ajuste fino do LoRA on-line LLM do SiliconCloud foi ampliado com os modelos Qwen2.5-32B, Qwen2.5-14B e Llama-3.1-8B como modelos básicos de ajuste fino, o que enriquece ainda mais a jogabilidade do ajuste fino e reduz ainda mais o custo de treinamento e uso dos modelos de ajuste fino.
De fato, o ajuste fino de um modelo proprietário de linguagem grande é bastante simples. Usando o recurso de ajuste fino do SiliconCloud, você pode preparar apenas algumas dezenas de corpora de treinamento para fazer alterações "significativas" em seu modelo a partir do modelo básico.
preparação preliminar
Em primeiro lugar, precisamos ter clareza sobre o que o ajuste fino está tentando alcançar. Muitas vezes, o ajuste fino pode ajudar um modelo a aprender algo que não foi incluído no treinamento ou a desenvolver um determinado estilo linguístico distinto.
Para diferentes propósitos, nossa abordagem será diferente. Por exemplo, se você quiser que o modelo aprenda determinado conhecimento de domínio, precisará de dados de treinamento que contenham perguntas e respostas com base nesses dados, enquanto se quiser que o modelo aprenda um determinado estilo de linguagem típico, precisará de dados de diálogo com esse estilo.
Preparação de dados
O ajuste fino do modelo LLM exige que os dados sejam fornecidos na forma de um diálogo, com uma estrutura de dados que é essencialmente a mesma da mensagem de invocação do LLM. Pode-se dizer que, se alguém chamasse a interface de geração de texto, construiria os dados ajustados.
Abaixo está um exemplo de uma parte típica de dados ajustados:
{"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "How do I install a fire alarm in my home?"} , {"role": "assistant", "content": "According to the Home Fire Safety System (GB22370-2008), home fire alarms should be installed in accordance with the manufacturer's requirements. Especificamente, a instalação deve garantir que o dispositivo esteja em um estado de monitoramento normal e conectado aos detectores de incêndio apropriados e a outros componentes. O local de instalação deve evitar locais com alta temperatura, umidade e poeira para garantir a operação normal do dispositivo."}]}
Para realizar um ajuste fino, geralmente é necessário preparar dezenas desses dados e salvá-los como um arquivo "jsonl" na forma de uma linha por linha:
{"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "How do I install a fire alarm in my home?"} , {"role": "assistant", "content": "According to the Home Fire Safety System (GB22370-2008), home fire alarms should be installed in accordance with the manufacturer's requirements. Especificamente, a instalação deve garantir que o dispositivo esteja em condições normais de monitoramento e conectado aos detectores de incêndio apropriados e a outros componentes. O local de instalação deve evitar áreas quentes, úmidas e empoeiradas para garantir a operação adequada do dispositivo."}]} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "What are the power supply requirements for fire alarms?"} , {"role": "assistant", "content": "De acordo com as disposições do Sistema de Segurança contra Incêndio Doméstico (GB22370-2008), a fonte de alimentação principal do controlador de alarme de incêndio doméstico deve ser 220V, 50Hz AC e a extremidade de entrada do cabo de alimentação deve ser fornecida com um terminal. A fonte de alimentação de reserva deve ser uma bateria que possa ser carregada e descarregada várias vezes e, caso não exceda o limite de descarga especificado pelo fabricante, a bateria deve poder ser carregada até a capacidade nominal de mais de 80% dentro de 24 horas e, em seguida, deve poder ser recarregada após 48 horas."}]} {"messages": [{"role": "system", "content": "You are an expert in fire protection systems"}, {"role": "user", "content": "What are the requirements for the acoustic and visual signals of a fire alarm?"} , {"role": "assistant", "content": "De acordo com o Sistema de Segurança contra Incêndio Doméstico (GB22370-2008), o nível de pressão sonora do sinal acústico do alarme de incêndio não deve ser inferior a 75 dB (ponderação A) a 3 metros em pelo menos uma direção e a 3 metros em qualquer direção não deve ser superior a 120 dB (ponderação A) a 3 metros em qualquer direção. O sinal óptico do alarme luminoso de incêndio deve ser claramente visível a uma distância de 25 metros em uma luz ambiente de 100lx a 500lx."}]} {"messages": [{"role": "system", "content": "You are an expert in fire protection systems"}, {"role": "user", "content": "What to do with the fault signal of a fire alarm?"} , {"role": "assistant", "content": "De acordo com o Sistema de Segurança contra Incêndio Doméstico (GB22370-2008), quando há uma falha de comunicação com os componentes conectados, desconexão ou curto-circuito do fio de conexão entre o carregador de energia em espera e a fonte de alimentação em espera, desconexão ou curto-circuito do fio de conexão entre a fonte de alimentação em espera e suas cargas Quando houver uma falha de comunicação entre os componentes conectados, uma linha quebrada ou em curto-circuito entre o carregador de energia de reserva e a fonte de alimentação de reserva, uma linha quebrada ou em curto-circuito entre a fonte de alimentação de reserva e sua carga, ou uma subtensão da fonte de alimentação principal, o controlador de alarme de incêndio residencial deve enviar um sinal acústico e óptico da falha e indicar o tipo de falha dentro de 100 segundos. O sinal de falha audível deve poder ser cancelado manualmente e deve poder ser ativado novamente quando houver outra entrada de sinal de falha."}]} {"messages": [{"role": "system", "content": "You are an expert in fire protection systems"}, {"role": "user", "content": "How does the self-test function of a fire alarm work?"} , {"role": "assistant", "content": "According to the Home Fire Safety System (GB22370-2008), the home fire alarm controller should be able to perform a function check (self-test) on the unit. Durante a execução da função de autoteste, nem os dispositivos externos controlados por ele nem os contatos de saída devem atuar. Se o tempo de autoteste exceder 1 minuto ou se a função de autoteste não puder ser interrompida automaticamente, as funções de alarme de incêndio das partes não autotestadas e do próprio controlador não deverão ser afetadas."}]} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "What are the requirements for displaying messages on a fire alarm?"} , {"role": "assistant", "content": "De acordo com as disposições do Sistema de Segurança contra Incêndio Doméstico (GB22370-2008), os controladores de alarme de incêndio doméstico que usam números e letras para exibir o status de funcionamento devem ser organizados em ordem de exibição de alarmes de incêndio, alarmes de supervisão e outros status na ordem de exibição do nível de exibição de informações de alto a baixo. As informações de status de alto nível devem ser exibidas com prioridade, e a exibição de informações de status de baixo nível não deve afetar a exibição de informações de status de alto nível. As mensagens exibidas devem ser consistentes com o status correspondente e facilmente reconhecíveis."}]} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "What is the sound pressure level of a fire alarm?"} , {"role": "assistant", "content": "According to the Home Fire Safety System (GB22370-2008), the sound pressure level of the home fire alarm controller in various alarm states (1 metre directly in front) should be not less than 75dB (A weighting)."}]} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "How to install a combustible gas detector?"} , {"role": "assistant", "content": "According to "Combustible Gas Alarm Controller" (GB16808-2008), combustible gas detectors should be installed according to the manufacturer's requirements and connected to the combustible gas alarm controller. O local de instalação deve evitar locais com alta temperatura, umidade e poeira para garantir a operação normal do equipamento."}]} {"messages": [{"role": "system", "content": "You are a fire protection system expert"}, {"role": "user", "content": "What are the requirements for the alarm function of the combustible gas detector?"} , {"role": "assistant", "content": "According to Combustible Gas Alarm Controller (GB16808-2008), combustible gas detector should have the function of low-limit alarm or low-limit and high-limit two-segment alarm. Quando houver uma entrada de sinal de alarme de gás combustível, o controlador deverá emitir um sinal sonoro e luminoso de alarme dentro de 10 segundos e mantê-lo até a reinicialização manual."}]} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "How to check the isolation of a fire alarm?"} , {"role": "assistant", "content": "De acordo com o "Sistema de segurança contra incêndio doméstico" (GB22370-2008), meça o valor da resistência de isolamento após aplicar uma tensão de 500 V ± 50 V CC aos terminais ativos externos da amostra e ao chassi, respectivamente, por meio do dispositivo de teste de resistência de isolamento por 60 segundos ± 5 segundos. Meça o valor da resistência de isolamento. O valor da resistência de isolamento entre os terminais ativos externos do corpo de prova com requisitos de isolamento e o chassi não deve ser inferior a 20MΩ; o valor da resistência de isolamento entre o terminal de entrada de energia do corpo de prova e o chassi não deve ser inferior a 50MΩ."}]}
Se tivermos acumulado uma quantidade relativamente grande de dados de alta qualidade em nossos negócios diários, podemos começar a fazer o ajuste fino criando arquivos de dados que atendam aos requisitos de formato por meio de uma simples limpeza de dados. Se não tivermos acúmulo de dados ou se o processo de limpeza for mais complicado, podemos tentar fazer o ajuste fino com a ajuda de grandes modelos e construir dados com modelos.
Em seguida, usamos um exemplo para praticar o processo de construção de dados. Vamos tentar treinar um modelo grande de um "especialista em combate a incêndios", criando perguntas e respostas usando padrões de combate a incêndios.
Dados de ajuste fino tectônico
O SiliconCloud fornece um modelo Qwen2.5 com 128 mil contextos, o que é mais do que suficiente para cobrir um conteúdo bastante rico.
Em primeiro lugar, precisamos preparar localmente o arquivo que será usado para construir os dados, por exemplo, "GB22370-2008 Domestic Fire Safety Systems.pdf".
Em seguida, precisamos extrair o conteúdo do arquivo, escrever o prompt e fazer com que o Qwen Big Model gere dados que atendam aos requisitos acima. Isso pode ser feito no código ou usando a função Dify e outras ferramentas de interface para concluir.
Veja o exemplo da configuração de um fluxo de trabalho na Dify:
1. o arquivo de configuração do nó inicial é carregado e os campos do prompt do sistema no corpus de treinamento são preenchidos;
2) Use o nó de extração de documentos e o nó de código que acompanha o Dify para mesclar o conteúdo do arquivo em texto;
3) Usando o nó LLM, chame o modelo Qwen/Qwen2.5-72B-Instruct-128K do SiliconCloud (se o tamanho do arquivo estiver dentro de 32K, você poderá escolher outro modelo fornecido pela plataforma):
-
-
- Settings - Model Vendor (Configurações - Fornecedor do modelo), selecione SiliconFlow;
- Clique em Add Model (Adicionar modelo), consulte a imagem para preencher os parâmetros necessários e salvar.
-
- Um lote de dados de corpus pode ser obtido após a execução, usando a saída do macromodelo como saída do fluxo de trabalho;
- Em seguida, basta copiar, salvar o conteúdo como um arquivo .jsonl e carregá-lo no SiliconCloud para criar a tarefa de ajuste fino.
Se os dados gerados de uma só vez não forem suficientes, várias execuções podem ser feitas para construir mais dados.
É importante observar que dados mais refinados não são necessariamente melhoresMesmo que tenhamos apenas um dado, podemos começar o ajuste fino. Mesmo que haja apenas um dado, podemos começar o ajuste fino; ao contrário, se tivermos muitos dados que não sejam de qualidade suficientemente boa, o efeito do ajuste fino pode não ser o esperado.
aplicativo. Descrição: "Carregue um arquivo, gere conteúdo diário de Q&A com base no conteúdo do arquivo, usando o modelo Qwen2.5 em contextos SiliconCloud 128K, dados de corpus no formato JSONL". ⚠️ Notas: - Devido às limitações do Dify, o conteúdo do arquivo com mais de 80.000 caracteres será truncado. - O conteúdo gerado é apenas para referência, pode haver ilusões ou erros de conteúdo, erros de formatação, preste atenção à triagem ' ícone: 🤖 icon_background: '#FFEAD5' mode. fluxo de trabalho nome: Fine-tune corpus builder use_icon_as_answer_icon: false tipo: aplicativo versão: 0.1.5 fluxo de trabalho. variáveis_de_conversação: [] variáveis_de_ambiente: [] recursos. file_upload: [] environment_variables: [] features. Extensões de arquivo permitidas. - .JPG - .JPG - .JPG - .GIF - .WEBP - .SVG tipos_de_arquivos_permitidos. - .GIF .WEBP .SVG métodos_de_upload_de_arquivos_permitidos. - local_file - remote_url enabled: false fileUploadConfig: audio_file_size_limit: 50 audio_file_size_limit: 50 batch_count_limit: 5 limite_de_tamanho_do_arquivo: 15 image_file_size_limit: 10 limite de tamanho do arquivo de vídeo: 100 limite de upload de arquivo de fluxo de trabalho: 10 image. enabled: false número_limites: 3 workflow_file_upload_limit: 10 image: enabled: false number_limits: 3 transfer_methods. - local_file - remote_url number_limits: 3 opening_statement: '' retriever_resource. enabled: true sensitive_word_avoidance: ativado: false ativado: falso speech_to_text. enabled: false suggested_questions: [] suggested_questions_after_answer: [enabler: false speech_to_text: false habilitado: false speech_to_text: enabled: false suggested_questions: [] suggested_questions_after_answer: enabled: false ativado: false idioma: '' voz: '' graph: false edges. - dados: isInIteration: false isInIteration: false sourceType: start targetType: document-extractor id: 1735807686274-source-1735807758092-target source: '1735807686274' sourceHandle: fonte target: '1735807758092' targetHandle: alvo type: custom zIndex: 0 - targetHandle: target type: custom zIndex: 0 data. isInIteration: false sourceType: document-extractor targetType: código id: 1735807758092-source-1735807761855-target source: '1735807758092' sourceHandle: fonte target: '1735807761855' targetHandle: target type: custom zIndex: 0 - targetHandle: target type: custom zIndex: 0 data. isInIteration: false sourceType: código targetType: llm id: 1735807761855-source-1735807764975-target source: '1735807761855' sourceHandle: fonte target: '1735807764975' targetHandle: target type: custom zIndex: 0 - targetHandle: target type: custom zIndex: 0 data. isInIteration: false sourceType: llm targetType: end id: 1735807764975-source-1735807769820-target source: '1735807764975' sourceHandle: source target: '1735807769820' targetHandle: target type: custom zIndex: 0 targetHandle: tipo de destino: personalizado zIndex: 0 - target type: custom zIndex: 0 nodes: 0 data. desc: '' selected: false título: Start type: start variáveis: allowed_file_extensions: [] - extensões_de_arquivo permitidas: [] tipos_de_arquivos_permitidos: [] - [] tipos_de_arquivos_permitidos: document allowed_file_upload_methods: [] allowed_file_types: document - local_file - remote_url rótulo: documento do corpus max_length: 10 opções: [] obrigatório: true tipo: file-list variável: attachments - Extensões de arquivo permitidas: [] allowed_file_types. - image allowed_file_upload_methods: [] allowed_file_types: image - local_file - remote_url label: palavra acionadora (prompt do sistema no treinamento) max_length: 48 opções: [] obrigatório: true tipo: text-input variável: trigger altura: 116 id: '1735807686274' position. x: 30 y: 258 positionAbsolute. x: 30 y: 258 selected: false sourcePosition: direita targetPosition: esquerda type: custom data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data. is_array_file: true is_array_file: true selected: false título: Document Extractor tipo: document-extractor variable_selector. - '1735807686274' - anexos altura: 92 id: '1735807758092' posição. x: 334 y: 258 positionAbsolute. x: 334 y: 258 selected: false sourcePosition: direita targetPosition: esquerda type: custom data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data. código: "def main(articleSections: list) -> dict:\n try:\n # Combine os itens da lista em uma string \n\ \ texto_combinado = \"\\n\".join(articleSections)\n \n \n \n \\ # Interceptar os primeiros 80.000 caracteres \n truncated_text = combined_text[:80.000]\n \n \n \n \n return {\n \"resultado\": truncated_text\n \n \n }\n except Exception as e:\n # Error handling \n return {\n \n \n \ \ \ \ "result\": \ "\"\ \ \n }" linguagem_do_código: python3 desc: '' outputs. filhos: nulo filhos: nulo tipo: string selected: false título: Execução de código tipo: code variáveis: value_selector: value_selector - value_selector. - '1735807758092' - texto variável: articleSections altura: 54 id: '1735807761855' position. x: 638 y: 258 positionAbsolute. x: 638 y: 258 selected: false sourcePosition: direita targetPosition: esquerda type: custom data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data. context. enabled: false variable_selector: [] desc: '' model: [] desc: '' completion_params: [] desc: '' model: [] completion_params. frequency_penalty: 0,5 max_tokens: 4096 temperatura: 0,3 modo: chat nome: Qwen/Qwen2.5-72B-Instruct-128K provedor: Qwen/Qwen2.5-72B-Instruct-128K fluxo de silício prompt_template. - id: b6913d40-d173-45d8-b012-98240d42a196 função: sistema text: '[Função Você é um cientista de modelagem de linguagem grande do LLM que ajuda os usuários a construir dados ajustados que estejam em conformidade com a especificação, levando em conta o conteúdo fornecido pelo usuário! Tarefas - Para um determinado conteúdo, você lista 10 perguntas genéricas de cada vez; - Para cada pergunta, forneça uma resposta citando o texto original do conteúdo e uma explicação ou dedução razoável do conteúdo; - E organize as perguntas e respostas em um formato JSONL padronizado. [Requisitos 1. as perguntas **não** citam diretamente o "conteúdo", elas devem estar próximas da vida real contemporânea; 2. as perguntas devem estar no vernáculo, evitando "falsas, grandes e vazias"; 3. a resposta deve ser fiel ao texto original, e a interpretação do texto original não deve ser desvinculada da ideia principal ou do pensamento do texto original; Especificação de saída * Especificação de saída JSONL, um dado por linha * Cada linha de dados deve conter uma matriz de mensagens, cada uma das quais deve conter três linhas com as funções sistema, usuário e assistente. * Os dados em que a função é sistema são particularmente importantes, pois o prompt do sistema está em treinamento e seu conteúdo usa a "palavra de acionamento" especificada pelo usuário. * Os dados cuja função é usuário correspondem à "pergunta" listada. * Os dados cuja função é assistente correspondem à "resposta" à "pergunta". * A seguir, um exemplo: ``` {"messages": [{"role": "system", "content": "You are a contemporary scholar"}, {"role": "user". "conteúdo": "Como devo estudar?"} , {"role": "assistant", "content": "Hsien-hsien é fácil de colorir; para servir aos pais, pode-se dar o melhor de si; para servir ao governante, pode-se dar o melhor de si; para fazer amizade com os amigos, deve-se ser fiel à palavra dada. Embora eu diga que não aprendi, direi que aprendi."}]} ```'' - id: 61530521-14cf-4eaf-8f06-a4bc89db3cb1 função: usuário text: '```Content'' {{#1735807761855.result#}} "Palavra de gatilho" {{#1735807686274.trigger#}}' selected: false título: LLM tipo: llm variáveis: [] visão. enabled: false altura: 98 id: '1735807764975' position. x: 942 y: 258 positionAbsolute. x: 942 y: 258 selected: true sourcePosition: direita targetPosition: esquerda type: custom dados: dados: y: 258 - data. desc: '' outputs: value_selector: '' - value_selector. - '1735807764975' - text variável: text selected: false título: end tipo: end altura: 90 id: '1735807769820' position. x: 1246 y: 258 positionAbsolute. x: 1246 y: 258 selected: false sourcePosition: direita targetPosition: esquerda type: custom data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - dados. autor: Dify desc: '' altura: 88 selected: false showAuthor: true text: '{"root":{"children":[{"children":[{"detail":0, "format":0, "mode": "normal", "style":"", "text": "Set lower temperatura para melhorar a estabilidade do formato de saída", "type": "text", "version":1}], "direction": "ltr", "format":"", "indent":0, "type": "paragraph", "version":1," textFormat":0}], "direction": "ltr", "format":"", "indent":0, "type": "root", "version":1}}' tema: azul título: '' type: '' largura: 240 altura: 88 id: '1735808753316' position. x: 951.4285714285714 y: 375.7142857142857 positionAbsolute. x: 951.4285714285714 y: 375.7142857142857 y: 375.7142857142857 selected: false sourcePosition: direita targetPosition: esquerda type: custom-note largura: 240 - data. autor: Dify desc: '' altura: 88 selected: false showAuthor: true text: '{"root":{"children":[{"children":[{"detail":0, "format":0, "mode": "normal", "style":"", "text": "Mesclar o conteúdo de vários documentos e interceptar os primeiros caracteres 8W", "type": "text", "version":1}], "direction": "ltr", "format":"", "indent":0, "type": "paragraph", "version":1, "textFormat":0}]," direction": "ltr", "format":"", "indent":0, "type": "root", "version":1}}' tema: azul título: '' type: '' largura: 240 altura: 88 id: '1735808799815' position. x: 640 y: 338.5714285714286 positionAbsolute. x: 640 y: 338.5714285714286 selected: false sourcePosition: direita targetPosition: esquerda type: custom-note width: 240 viewport. x: 0 y: 0 zoom: 0.7
Além de usar ferramentas como o Dify, o uso direto de modelos como o Qwen/Qwen2.5-Coder-32B-Instruct para ajudar a escrever scripts a serem executados também é uma maneira eficiente de construir dados ajustados e pode contornar várias limitações das plataformas tripartidas, aproveitando ao máximo as vantagens da plataforma SiliconCloud de raciocínio eficiente e rico em modelos e coletando mais dados de corpus de alta qualidade. dados.
Treinamento e validação de ajuste fino
Crie uma nova tarefa de ajuste fino na plataforma SiliconCloud, carregue e selecione o arquivo .jsonl que você acabou de salvar e clique em Start Fine-Tuning (Iniciar ajuste fino).
Aguarde até que a tarefa de ajuste fino termine a fila e, quando a execução for concluída, você poderá usar o modelo ajustado ou validar os resultados por meio de uma experiência on-line ou API.
O recurso Compare (Comparar) da experiência on-line do Dialogue Model também permite que você compare as respostas e os resultados do modelo em vários Checkpoint e modelos básicos, escolhendo o modelo que funciona melhor para continuar usando. Modelo de ajuste fino vs. modelo básico:
Comparação entre vários pontos de controle:
Neste ponto, usamos arquivos locais para criar dados ajustados do LLM e ajustamos um LLM Fire Expert. É claro que, com as etapas acima, você também pode tentar criar seu próprio LLM específico de domínio.