Vous pouvez désormais inclure de grands blocs de texte dans vos personas d’IA !
Cela offre plusieurs avantages :
-
Vous pouvez introduire de grands blocs de texte dans vos bots d’IA personnalisés qui sont absents de l’entraînement des modèles. (par exemple : documents de formation internes, rapports internes)
-
Vous pouvez mieux ancrer un persona avec des données concrètes (même si elles existent dans l’ensemble d’entraînement du modèle), ce qui peut aider le modèle à citer correctement des informations spécifiques et à améliorer la qualité des résultats.
Pour ajouter des téléchargements :
-
Créez un nouveau persona en utilisant l’interface
/admin/plugins/discourse-ai/ai-personas/. -
Téléchargez les fichiers texte que vous souhaitez inclure dans votre persona
Avant de télécharger des fichiers, veuillez ajouter les extensions pertinentes (
.mdet.txt) via le paramètre du siteauthorized extensionsafin qu’il puisse être utilisé par le persona
- Ajustez les options d’indexation selon vos besoins
Pré-requis
Pour que l’option fonctionne, vous devez avoir configuré ai_embeddings_enabled et un ai_embeddings_model.
Discourse AI prend en charge un très grand nombre de modèles d’intégration.
Nos clients hébergés bénéficient d’un accès gratuit au modèle de pointe bge-large-en.
Les auto-hébergeurs ou ceux qui souhaitent plus de choix peuvent auto-héberger un modèle d’intégration ou utiliser des modèles d’Open AI, de Google (Gemini) et plus encore.
Est-ce un RAG ?
L’implémentation de notre support de téléchargement est en effet une Génération Augmentée par Récupération.
À un niveau élevé, chaque fois que nous sommes sur le point de demander à un LLM de répondre à la question d’un utilisateur, nous recherchons des informations très pertinentes basées sur le texte que vous avez entré et nous les injectons dans l’invite système.
Explication des différentes options d’indexation
Qu’est-ce qu’un token ? Les tokens sont des primitives utilisées par les grands modèles linguistiques pour diviser le texte. Une excellente explication visuelle se trouve ici : https://platform.openai.com/tokenizer
L’implémentation de téléchargement de Discourse AI est livrée avec les options suivantes :
Upload Chunk Tokens : après le téléchargement des fichiers, nous les divisons en morceaux. Cela vous permet de contrôler la taille des morceaux. Si un morceau est trop grand pour votre modèle d’intégration, l’intégration sera tronquée (seule une partie des tokens sera traitée).
Upload Chunk Overlap Tokens : il s’agit du nombre de tokens inclus du morceau précédent dans le morceau actuel. Plus ce nombre est élevé, plus la quantité d’informations dupliquées sera stockée dans votre index.
Search Conversation Chunks : cela contrôle le nombre de “morceaux” de tokens qui seront inclus sans condition en fonction de leur pertinence dans l’invite de complétion. Plus le nombre est élevé, plus le contexte fourni au LLM sera important (et plus les appels seront coûteux). Par exemple : Si ce paramètre est défini sur 10 et Upload Chunk Tokens sur 200, chaque complétion aura un surcoût de 2000 tokens.
Comment Discourse AI divise-t-il les blocs de texte ?
Discourse utilise un “Recursive Character Text Splitter”, qui tente de conserver les paragraphes, puis les lignes et enfin les mots ensemble lors de la division.
De plus, Discourse vous donne un contrôle supplémentaire sur la manière dont votre texte sera divisé.
Le séparateur [[metadata VOTRE MÉTA-DONNÉE ICI]] peut être utilisé pour diviser de grands blocs de texte et mettre en évidence correctement ce que chaque section couvre.
Par exemple :
[[metadata sur les chats]]
une longue histoire sur les chats
[[metadata sur les chiens]]
une longue histoire sur les chiens
Cela permet à un seul document texte de couvrir une grande variété de contenu et vous protège de la “contamination des chunks”. Vous avez la garantie que seules les données sur les chats seront incluses dans les chunks sur les chats et les chiens dans les chunks sur les chiens.
Cela semble compliqué, comment puis-je déboguer cela ?
Discourse AI est livré avec le paramètre du site ai bot debugging enabled groups, les utilisateurs de ce groupe ont accès au débogage de l’IA :
Les écrans de débogage de l’IA peuvent vous donner un aperçu des informations que nous envoyons à l’IA.
Garbage in - Garbage out Si vous fournissez des informations inutiles ou vagues à un LLM, il ne peut pas les convertir magiquement en informations utiles.
Cet écran peut vous aider à mieux décider de la taille de vos chunks ou si vous incluez trop ou trop peu de chunks.
Est-ce que cela fonctionne ?
Un exemple concret est la division de la documentation HAProxy et son intégration dans un persona :
Invite système :
Vous êtes un bot spécialisé dans la réponse aux questions sur HAProxy.
Vous vivez sur un forum Discourse et rendez le markdown Discourse.
Lorsque vous fournissez des réponses, essayez toujours d’inclure des liens vers la documentation HAProxy.
Par exemple, voici comment vous lieriez à la section 10.1.1. Gardez à l’esprit que vous pouvez lier à une section ou à une option à l’intérieur.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)Soyez généreux avec les liens, ils sont très utiles.
Contenu du téléchargement :
processed-haproxy-2.txt (1,2 Mo)
Qui a été généré en utilisant le script suivant :
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
Claude Opus et GPT-4 peuvent tous deux échouer lamentablement avec des questions complexes. C’est compréhensible car ils se nourrissent de tous les tokens sur Internet, donc 50 versions différentes de la documentation HAProxy et toutes les discussions du monde à son sujet entrent dans leur cerveau, ce qui peut les rendre très confus :
Exemples de GPT-4 et Claude 3 Opus confus
Tous deux sont objectivement bien moins bons que la réponse affinée fournie par le RAG de Discourse :
Exemples de GPT-4 et Claude Opus moins confus
L’avenir
Nous attendons avec impatience vos commentaires. Voici quelques idées pour l’avenir :
- Support PDF/DOCX/XLS etc. pour que vous n’ayez pas besoin de convertir en texte
- Chunking plus intelligent pour le code source / HTML
- Transformations intelligentes des données entrantes avant l’indexation
Faites-nous savoir ce que vous en pensez !
Un grand merci à @Roman pour avoir mis en œuvre cette fonctionnalité ![]()



