Agora você pode incluir grandes blocos de texto em seus personas de IA!
Isso oferece vários benefícios:
-
Você pode introduzir grandes blocos de texto em seus bots de IA personalizados que estão ausentes do treinamento dos modelos. (por exemplo: documentos de treinamento internos, relatórios internos)
-
Você pode fundamentar melhor um persona com dados concretos (mesmo que existam no conjunto de treinamento do modelo), o que pode ajudar o modelo a citar corretamente informações específicas e aumentar a qualidade dos resultados.
Para adicionar uploads:
-
Crie um novo persona usando a interface
/admin/plugins/discourse-ai/ai-personas/. -
Faça o upload dos arquivos de texto que você deseja incluir em seu persona
Antes de fazer o upload dos arquivos, adicione as extensões relevantes (
.mde.txt) através da configuração do siteauthorized extensionspara que ele possa ser usado pelo persona
- Ajuste as opções de indexação conforme achar adequado
Pré-requisitos
Para que a opção funcione, você precisará ter ai_embeddings_enabled e um ai_embeddings_model configurados.
O Discourse AI suporta uma grande quantidade de modelos de embedding.
Nossos clientes hospedados têm acesso gratuito ao modelo de ponta bge-large-en.
Autohospedadores ou pessoas que desejam mais opções podem auto-hospedar um modelo de embedding ou usar modelos da OpenAI, Google (Gemini) e outros.
Isso é um RAG?
A implementação do nosso suporte a upload é de fato Retrieval-Augmented Generation.
Em um nível geral, cada vez que estamos prestes a pedir a um LLM para responder a uma pergunta do usuário, procuramos informações altamente relevantes com base no texto que você inseriu e a injetamos no prompt do sistema.
Explicando as várias opções de indexação
O que é um token? Tokens são primitivas usadas por modelos de linguagem grandes para dividir texto. Uma ótima explicação visual está em: https://platform.openai.com/tokenizer
A implementação de upload do Discourse AI vem com as seguintes opções:
Upload Chunk Tokens: após os arquivos serem carregados, nós os dividimos em pedaços. Isso permite que você controle o tamanho dos pedaços. Se um pedaço for muito grande para o seu modelo de embedding, o embedding será truncado (apenas parte dos tokens será processada).
Upload Chunk Overlap Tokens: Este é o número de tokens incluídos do chunk anterior no atual. Quanto maior esse número, mais informações duplicadas serão armazenadas em seu índice.
Search Conversation Chunks: Isso controla quantos “chunks” de tokens serão incluídos incondicionalmente com base na relevância no prompt de conclusão. Quanto maior o número, mais contexto o LLM receberá (e mais caras serão as chamadas). Por exemplo: Se isso estiver definido como 10 e Upload Chunk Tokens estiver definido como 200, cada conclusão terá um overhead extra de 2000 tokens.
Como o Discourse AI divide grandes blocos de texto?
O Discourse usa um Divisor de Texto Recursivo por Caracteres, que tenta manter parágrafos, depois linhas e, finalmente, palavras juntas ao dividir.
Além disso, o Discourse oferece controle extra sobre como seu texto será dividido.
O separador [[metadata YOUR METADATA HERE]] pode ser usado para dividir grandes blocos de texto e destacar adequadamente o que cada seção cobre.
Por exemplo:
[[metadata sobre gatos]]
uma longa história sobre gatos
[[metadata sobre cachorros]]
uma longa história sobre cachorros
Isso permite que um único documento de texto cubra uma grande variedade de conteúdo e protege você contra “contaminação de chunks”. Você tem a garantia de que apenas dados sobre gatos serão incluídos em chunks de gatos e cachorros em chunks de cachorros.
Parece complicado, como depuro isso?
O Discourse AI vem com a configuração do site ai bot debugging enabled groups, usuários neste grupo têm acesso à depuração de IA:
As telas de depuração de IA podem ajudá-lo a ter uma visão das informações que enviamos para a IA.
Lixo entra - Lixo sai Se você fornecer informações inúteis ou vagas para um LLM, ele não poderá convertê-las magicamente em informações úteis.
Esta tela pode ajudá-lo a decidir melhor o tamanho de seus chunks ou se você está incluindo muitos ou poucos chunks.
Isso funciona?
Um exemplo do mundo real é dividir a documentação do HAProxy e alimentá-la em um persona:
System Prompt:
Você é um bot especializado em responder perguntas sobre HAProxy.
Você vive em um fórum Discourse e renderiza markdown Discourse.
Ao fornecer respostas, sempre tente incluir links de volta para a documentação do HAProxy.
Por exemplo, é assim que você vincularia à seção 10.1.1. Lembre-se de que você pode vincular a uma seção ou a uma opção dentro dela.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)Seja liberal com os links, eles são muito úteis.
Conteúdo do upload:
processed-haproxy-2.txt (1,2 MB)
Que foi gerado usando o seguinte script:
file_content = File.read("configuration.txt")
title = nil
body = nil
last_line = nil
sections = []
file_content.each_line do |line|
if line.strip.match?(/^[-]+$/)
section_number, title = title.to_s.split(" ", 2)
sections << {
section_number: section_number,
title: title,
body: body.to_s.strip
}
title = last_line
body = nil
last_line = nil
else
body = body.to_s + last_line.to_s
last_line = line
end
end
section_number, title = title.to_s.split(" ", 2)
sections << { section_number: section_number, title: title, body: body }
section_names =
sections.map { |section| [section[:section_number], section[:title]] }.to_h
sections[4..-1].each do |section|
title = []
current = +"".freeze
section_number = section[:section_number]
section_number
.split(".")
.each do |number|
current << number
current << "."
title << section_names[current].to_s.strip
end
title = title.join(" - ")
body = section[:body]
next if body.strip.empty?
puts "[[metadata section=\"#{section_number}\" title=\"#{title.strip}\"]]"
puts body
end
Tanto o Claude Opus quanto o GPT-4 podem falhar miseravelmente com perguntas complexas. Isso é compreensível, pois eles se alimentam de todos os tokens da internet, então 50 versões diferentes da documentação do HAProxy e toda a discussão mundial sobre isso entram no cérebro, o que pode confundi-lo bastante:
Exemplos de GPT-4 e Claude 3 Opus confusos
Ambos são objetivamente muito inferiores à resposta ajustada que o Discourse RAG fornece:
Exemplos de GPT-4 e Claude Opus menos confusos
O futuro
Estamos ansiosos por feedback. Algumas ideias para o futuro podem ser:
- Suporte a PDF/DOCX/XLS etc. para que você não precise converter para texto
- Chunking mais inteligente para código fonte / html
- Transformações inteligentes de dados de entrada antes da indexação
Deixe-nos saber o que você pensa!
Um grande agradecimento a @Roman por implementar este recurso ![]()



