Ahora puedes incluir grandes cantidades de texto en tus personas de IA.
Esto ofrece múltiples beneficios:
-
Puedes introducir grandes cantidades de texto en tus bots de IA personalizados que no están presentes en el entrenamiento de los modelos. (por ejemplo: documentos de capacitación internos, informes internos)
-
Puedes anclar mejor una persona con datos concretos (incluso si existen en el conjunto de entrenamiento del modelo), lo que puede ayudar al modelo a citar información específica correctamente y aumentar la calidad de los resultados.
Para agregar cargas:
-
Crea una nueva persona usando la interfaz
/admin/plugins/discourse-ai/ai-personas/. -
Carga los archivos de texto que deseas incluir en tu persona
Antes de cargar archivos, agrega las extensiones relevantes (
.mdy.txt) a través de la configuración del sitioauthorized extensionspara que pueda ser utilizada por la persona.
- Ajusta las opciones de indexación como consideres oportuno.
Prerrequisitos
Para que la opción funcione, deberás tener configurados ai_embeddings_enabled y un ai_embeddings_model.
Discourse AI admite una gran cantidad de modelos de incrustación.
Nuestros clientes alojados obtienen acceso gratuito al modelo de última generación bge-large-en.
Los autoalojadores o las personas que deseen más opciones pueden autoalojar un modelo de incrustación o utilizar modelos de Open AI, Google (Gemini) y más.
¿Es esto un RAG?
La implementación de nuestro soporte de carga es, de hecho, Generación Aumentada por Recuperación.
A un alto nivel, cada vez que estamos a punto de pedirle a un LLM que responda a la pregunta de un usuario, buscamos información muy relevante basada en el texto que ingresaste y la inyectamos en el prompt del sistema.
Explicando las diversas opciones de indexación
¿Qué es un token? Los tokens son primitivas utilizadas por los modelos de lenguaje grandes para dividir el texto. Una excelente explicación visual se encuentra en: https://platform.openai.com/tokenizer
La implementación de carga de Discourse AI viene con los siguientes interruptores:
Upload Chunk Tokens: después de cargar los archivos, los dividimos en partes. Esto te permite controlar el tamaño de las partes. Si una parte es demasiado grande para tu modelo de incrustación, la incrustación se truncará (solo se procesará parte de los tokens).
Upload Chunk Overlap Tokens: este es el número de tokens incluidos del chunk anterior en el actual. Cuanto mayor sea este número, más información duplicada se almacenará en tu índice.
Search Conversation Chunks: esto controla cuántos “chunks” de tokens se incluirán incondicionalmente según la relevancia en el prompt de finalización. Cuanto mayor sea el número, más contexto se proporcionará al LLM (y más caras serán las llamadas). Por ejemplo: Si esto se establece en 10 y Upload Chunk Tokens se establece en 200, cada finalización tendrá una sobrecarga adicional de 2000 tokens.
¿Cómo divide Discourse AI los cuerpos de texto?
Discourse utiliza un Divisor de Texto Recursivo por Caracteres, que intenta mantener juntos párrafos, luego líneas y finalmente palabras al dividir.
Además, Discourse te da control adicional sobre cómo se dividirá tu texto.
El separador [[metadata YOUR METADATA HERE]] se puede usar para dividir grandes cuerpos de texto y resaltar adecuadamente lo que cubre cada sección.
Por ejemplo:
[[metadata about cats]]
a long story about cats
[[metadata about dogs]]
a long story about dogs
Esto permite que un solo documento de texto cubra una gran variedad de contenido y te protege de la “contaminación de chunks”. Tienes la garantía de que solo se incluirán datos sobre gatos en los chunks de gatos y sobre perros en los chunks de perros.
Suena complicado, ¿cómo depuro esto?
Discourse AI viene con la configuración del sitio ai bot debugging enabled groups, los usuarios de este grupo tienen acceso a la depuración de IA:
Las pantallas de depuración de IA pueden ayudarte a obtener una visión de la información que enviamos a la IA.
Basura entra - Basura sale Si proporcionas información inútil o vaga a un LLM, este no puede convertirla mágicamente en información útil.
Esta pantalla puede ayudarte a decidir mejor cuán grandes deben ser tus chunks o si estás incluyendo demasiados o muy pocos chunks.
¿Esto funciona?
Un ejemplo del mundo real es dividir la documentación de HAProxy y alimentarla a una persona:
System Prompt:
Eres un bot especializado en responder preguntas sobre HAProxy.
Vives en un foro de Discourse y renderizas markdown de Discourse.
Al proporcionar respuestas, intenta siempre incluir enlaces a la documentación de HAProxy.
Por ejemplo, así es como enlazarías a la sección 10.1.1. Ten en cuenta que puedes enlazar a una sección o a una opción dentro de ella.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)Sé liberal con los enlaces, son muy útiles.
Contenido de la carga:
processed-haproxy-2.txt (1.2 MB)
Lo que se generó usando el siguiente 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 Claude Opus como GPT-4 pueden fallar estrepitosamente con preguntas complejas. Esto es comprensible ya que se alimentan de todos los tokens de Internet, por lo que 50 versiones diferentes de la documentación de HAProxy y toda la discusión del mundo sobre ella entran en el cerebro, lo que puede confundirlo mucho:
Ejemplos de GPT-4 y Claude 3 Opus confundidos
Ambos son objetivamente no tan buenos como la respuesta ajustada que proporciona el RAG de Discourse:
Ejemplos de GPT-4 y Claude Opus menos confundidos
El futuro
Esperamos sus comentarios. Algunas ideas para el futuro podrían ser:
- Soporte para PDF/DOCX/XLS, etc., para que no necesites convertir a texto.
- División de código fuente/html más inteligente.
- Transformaciones inteligentes de los datos entrantes antes de la indexación.
¡Háganos saber lo que piensa!
Muchas gracias a @Roman por implementar esta función ![]()



