Aprendizagem pessoal com IA
e orientação prática

4 etapas para o ajuste fino do LLM: um guia prático para criar grandes modelos de domínio com o SiliconCloud

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'
modo: 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: ''
modelo: [] 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.

Não pode ser reproduzido sem permissão:Chefe do Círculo de Compartilhamento de IA " 4 etapas para o ajuste fino do LLM: um guia prático para criar grandes modelos de domínio com o SiliconCloud

Chefe do Círculo de Compartilhamento de IA

O Chief AI Sharing Circle se concentra no aprendizado de IA, fornecendo conteúdo abrangente de aprendizado de IA, ferramentas de IA e orientação prática. Nosso objetivo é ajudar os usuários a dominar a tecnologia de IA e explorar juntos o potencial ilimitado da IA por meio de conteúdo de alta qualidade e compartilhamento de experiências práticas. Seja você um iniciante em IA ou um especialista sênior, este é o lugar ideal para adquirir conhecimento, aprimorar suas habilidades e realizar inovações.

Entre em contato conosco
pt_BRPortuguês do Brasil