Ora puoi includere grandi blocchi di testo nelle tue persona AI!
Ciò offre molteplici vantaggi:
-
Puoi introdurre grandi blocchi di testo nei tuoi bot AI personalizzati che sono assenti dall’addestramento dei modelli. (ad esempio: documenti di formazione interni, report interni)
-
Puoi ancorare meglio una persona con dati concreti (anche se esistono nel set di addestramento del modello) il che può aiutare il modello a citare correttamente informazioni specifiche e aumentare la qualità dei risultati.
Per aggiungere caricamenti:
-
Crea una nuova persona utilizzando l’interfaccia
/admin/plugins/discourse-ai/ai-personas/. -
Carica i file di testo che desideri includere nella tua persona
Prima di caricare i file, aggiungi le estensioni pertinenti (
.mde.txt) tramite l’impostazione del sitoauthorized extensionsin modo che possano essere utilizzate dalla persona
- Regola le opzioni di indicizzazione come ritieni opportuno
Prerequisiti
Affinché l’opzione funzioni, dovrai avere configurato ai_embeddings_enabled e un ai_embeddings_model.
Discourse AI supporta un’enorme quantità di modelli di embedding.
I nostri clienti ospitati ottengono l’accesso gratuito al modello all’avanguardia bge-large-en.
Gli self-hoster o coloro che desiderano più scelta possono ospitare autonomamente un modello di embedding o utilizzare modelli di Open AI, Google (Gemini) e altri.
È un RAG?
L’implementazione del nostro supporto per il caricamento è infatti Retrieval-Augmented Generation.
A grandi linee, ogni volta che stiamo per chiedere a un LLM di rispondere a una domanda dell’utente, cerchiamo informazioni altamente pertinenti basate sul testo che hai inserito e le inseriamo nel prompt di sistema.
Spiegazione delle varie opzioni di indicizzazione
Cos’è un token? i token sono primitive utilizzate dai modelli linguistici di grandi dimensioni per suddividere il testo. Una spiegazione visiva eccellente è disponibile su: https://platform.openai.com/tokenizer
L’implementazione del caricamento di Discourse AI è dotata dei seguenti interruttori:
Upload Chunk Tokens: dopo che i file vengono caricati, li dividiamo in pezzi. Questo ti permette di controllare quanto sono grandi i pezzi. Se un pezzo è troppo grande per il tuo modello di embedding, l’embedding verrà troncato (verrà gestita solo una parte dei token).
Upload Chunk Overlap Tokens: questo è il numero di token inclusi dal chunk precedente in quello corrente. Maggiore è questo numero, più informazioni duplicate verranno memorizzate nel tuo indice.
Search Conversation Chunks: questo controlla quanti “chunk” di token verranno inclusi incondizionatamente in base alla pertinenza nel prompt di completamento. Maggiore è il numero, più contesto verrà fornito all’LLM (e più costose saranno le chiamate). Ad esempio: se questo è impostato su 10 e Upload Chunk Tokens è impostato su 200, ogni completamento avrà un overhead aggiuntivo di 2000 token.
Come fa Discourse AI a suddividere i corpi di testo?
Discourse utilizza un Recursive Character Text Splitter, che tenta di mantenere insieme paragrafi, righe e infine parole durante la suddivisione.
Inoltre, Discourse ti offre un controllo aggiuntivo su come verrà suddiviso il tuo testo.
Il separatore [[metadata YOUR METADATA HERE]] può essere utilizzato per suddividere grandi blocchi di testo e evidenziare correttamente cosa copre ciascuna sezione.
Ad esempio:
[[metadata about cats]]
a long story about cats
[[metadata about dogs]]
a long story about dogs
Ciò consente a un singolo documento di testo di coprire un’ampia varietà di contenuti e ti protegge dalla “contaminazione dei chunk”. Hai la garanzia che solo i dati sui gatti saranno inclusi nei chunk sui gatti e i cani nei chunk sui cani.
Sembra complicato, come posso fare il debug?
Discourse AI fornisce l’impostazione del sito ai bot debugging enabled groups, gli utenti in questo gruppo hanno accesso al debug dell’AI:
Le schermate di debug dell’AI possono aiutarti a ottenere una visione delle informazioni che inviamo all’AI.
Garbage in - Garbage out Se fornisci informazioni inutili o vaghe a un LLM, questo non può trasformarle magicamente in informazioni utili
Questa schermata può aiutarti a decidere meglio quanto dovrebbero essere grandi i tuoi chunk o se stai includendo troppi o troppo pochi chunk.
Funziona davvero?
Un esempio reale è la suddivisione della documentazione HAProxy e il suo inserimento in una persona:
System Prompt:
Sei un bot specializzato nel rispondere a domande su HAProxy.
Vivi su un forum Discourse e renderizzi il markdown di Discourse.
Quando fornisci risposte, cerca sempre di includere link alla documentazione HAProxy.
Ad esempio, ecco come collegheresti alla sezione 10.1.1. tieni presente che puoi collegarti a una sezione o a un’opzione al suo interno.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)Sii generoso con i link, sono molto utili.
Contenuto caricato:
processed-haproxy-2.txt (1,2 MB)
Che è stato generato utilizzando il seguente 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 = +" "
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
Sia Claude Opus che GPT-4 possono fallire miseramente con domande complesse. Questo è comprensibile poiché si nutrono di tutti i token su Internet, quindi 50 versioni diverse della documentazione HAProxy e tutte le discussioni del mondo al riguardo entrano nel cervello, il che può confonderlo molto:
Esempi di GPT-4 e Claude 3 Opus confusi
Entrambi sono oggettivamente non così buoni come la risposta ottimizzata fornita dal Discourse RAG:
Esempi di GPT-4 e Claude Opus meno confusi
Il futuro
Attendiamo con impazienza il tuo feedback, alcune idee per il futuro potrebbero essere:
- Supporto per PDF/DOCX/XLS ecc. in modo da non dover convertire in testo
- Chunking più intelligente per codice sorgente / html
- Trasformazioni intelligenti dei dati in ingresso prima dell’indicizzazione
Facci sapere cosa ne pensi!
Un grande ringraziamento a @Roman per aver implementato questa funzionalità ![]()



