# Persona do Discourse AI, suporte para upload

**URL:** https://meta.discourse.org/t/discourse-ai-persona-upload-support/304049
**Category:** Announcements
**Tags:** ai, ai-bot
**Created:** [16 Abril , 2024 07:21 UTC](https://meta.discourse.org/t/discourse-ai-persona-upload-support/304049 "2024-04-16T07:21:43Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [16 Abril , 2024 07:21 UTC](https://meta.discourse.org/t/discourse-ai-persona-upload-support/304049/1 "2024-04-16T07:21:43Z")

</div>

Agora você pode incluir grandes blocos de texto em seus personas de IA!

Isso oferece vários benefícios:

1. 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)

2. 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.

 ![A interface do usuário mostra o upload e a indexação de arquivos, com um arquivo chamado "processed-haproxy-2.txt" já carregado e indexado, e opções para ajustar os parâmetros de indexação. (Legenda por IA)](https://global.discourse-cdn.com/meta/original/4X/9/3/8/9382d8b351e531b3747aae32dac2f1f26cbda5fe.png)

Para adicionar uploads:

1. Crie um novo persona usando a interface `/admin/plugins/discourse-ai/ai-personas/`.

2. 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 (`.md` e `.txt`) através da configuração do site `authorized extensions` para que ele possa ser usado pelo persona

1. 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](https://huggingface.co/BAAI/bge-large-en-v1.5).

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](https://research.ibm.com/blog/retrieval-augmented-generation-RAG).

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](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:

```plaintext
[[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:

 ![Botão de depuração de IA na parte inferior das postagens de IA pelo bot de IA](https://global.discourse-cdn.com/meta/original/4X/a/5/0/a50ff28b12d22ba7cca9f14038be81dd7233141f.png)

 ![Modal de UI de depuração mostrando contagens de tokens e informações completas do prompt](https://global.discourse-cdn.com/meta/original/4X/d/1/3/d1358488bf8c7f988428663254104a1f13c84c2a.png)

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](https://meta.discourse.org/uploads/short-url/78Drf3NhAnYaRHm5fvqWC8zv9h4.txt) (1,2 MB)

Que foi gerado usando o seguinte script:

```ruby
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**

> **[Optimizing Keepalive Probes in HAProxy: A Guide](https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/r1PWS1LOsMsJny6VqNQ2vQ)**
>
> sam: how do I tune keepalive probes in haproxy, include links to documentation

> **[Tuning HAProxy Keepalive Probes: A Guide](https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/iaUfc3xSyLliRGZ_3RFm8w)**
>
> sam: how do I tune keepalive probes in haproxy, include links to documentation

Ambos são objetivamente muito inferiores à resposta ajustada que o Discourse RAG fornece:

**Exemplos de GPT-4 e Claude Opus menos confusos**

> **[Optimizing Keepalive Probes for Enhanced Network Performance](https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/4eaV4H5qMgV7XU_NyKtIGQ)**
>
> sam: how do I tune keepalive probes

> **[Tuning Keepalive Probes for Optimal Performance](https://meta.discourse.org/discourse-ai/ai-bot/shared-ai-conversations/UuvYZFFsQc1Vwkre0shXQw)**
>
> sam: how do I tune keepalive probes?

### 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 🤗

---

_[View the full topic](https://meta.discourse.org/t/discourse-ai-persona-upload-support/304049)._
