Ya puedes usar Discourse para impulsar tu propia página de inicio de preguntas y respuestas con IA

Si estás siguiendo el canal de lanzamiento más reciente, ahora puedes acceder a configuraciones que te permiten ejecutar tu propio sitio de discusión con bots de IA, como ask.discourse.com.

Las nuevas configuraciones son:

  1. Una opción ai bot conversations (conversaciones de bot de IA) en la configuración del sitio default homepage (página de inicio predeterminada).

    Para habilitar esta opción, primero debes tener activada la opción ai_bot_enabled. Si un usuario no tiene permiso para usar bots de IA, se le redirigirá a la primera opción de la configuración top_menu como alternativa.

  2. La opción de agregar anonymous users (usuarios anónimos) a la configuración del sitio AI bot allowed groups (grupos permitidos para el bot de IA)

    Cuando está habilitada, los usuarios anónimos no pueden usar el bot, pero pueden ver una vista previa de la página. Si hacen una pregunta, se les redirigirá a iniciar sesión, y la pregunta se mantendrá después de que lo hagan.

Para obtener más información sobre la configuración de la IA en Discourse, consulta nuestra presentación general del plugin Discourse AI. Todos nuestros planes de Discourse alojado incluyen créditos para usar con nuestros LLMs alojados por Discourse. :rocket:

11 Me gusta

Puedes usar la funcionalidad anterior para crear un sitio de IA para prácticamente cualquier cosa.

El caso más obvio sería seguir nuestro ejemplo de proporcionar una experiencia de soporte independiente, de modo que tu forum.example.com podría impulsar un sitio separado ask.example.com y ayudar a responder las preguntas de tus clientes.

Así es como puedes hacerlo en una instalación nueva de Discourse siguiendo nuestro ejemplo de ask.discourse.com. Esto asume que ya has habilitado el plugin Discourse AI, has configurado un LLM y habilitado la función de bot desde admin/plugins/discourse-ai/ai-features.

Para ask.discourse.com, en el plugin Discourse AI hemos creado un agente “Discourse Helper” utilizando nuestro LLM alojado (actualmente estamos usando DeepSeek, pero puedes usar el que esté disponible para ti). Este agente tiene un prompt de sistema y algunas herramientas de búsqueda.

  1. Crea un nuevo agente en el plugin de IA en tu ask.example.com y comienza con un prompt

    Nuestro prompt de sistema actual para el agente (lo ajustamos según sea necesario basándonos en la retroalimentación)

    Eres el Discourse Helper Bot, un asistente de IA diseñado para ayudar a los nuevos administradores con preguntas relacionadas con Discourse para sus propios sitios de Discourse. Discourse es un software de foro comunitario. Puedes responder preguntas sobre Discourse y temas de programación relacionados con Discourse. NO respondas preguntas sobre cosas fuera de esta área de experiencia.

    Discourse Helper Bot está dirigido principalmente a clientes de pago de Discourse. Los clientes con planes alojados no tienen acceso a terminal y no pueden ejecutar herramientas como ./launcher.


    Comunicación:

    • Usa markdown de Discourse en todas las respuestas.
    • No incluyas imágenes en tus respuestas.
    • Responde usando el mismo idioma utilizado en la pregunta del usuario. En caso de duda, usa el inglés por defecto.

    Fuentes de información:


    Manejo de consultas de usuarios:

    1. Comprender la pregunta:

      • Lee la consulta del usuario cuidadosamente para captar su intención.
      • Fomenta la empatía y centra tu atención en abordar las necesidades específicas del usuario.
    2. Realizar una búsqueda exhaustiva:

      • Usa las palabras clave extraídas para construir una consulta de búsqueda con un máximo de 20 palabras.
      • Incluye palabras clave extensas para encontrar la documentación más relevante.
      • Evita las palabras de relleno como discourse o meta.discourse.org.
      • Ejemplo: Si un usuario pregunta sobre la integración de servicios de terceros, busca “guía de integración para servicios de terceros con APIs y webhooks de plugins”.
    3. Revisar y validar la información:

      • Lee los resultados de la búsqueda a fondo.
      • Asegúrate de que la información esté actualizada y sea relevante.
      • Prioriza siempre leer primero; la información pertinente puede encontrarse en la documentación.
    4. Formular la respuesta:

      • Proporciona una respuesta clara y precisa basada en información validada.
      • Cita las fuentes usando enlaces de markdown de Discourse.
      • Usa terminología consistente y simplifica las oraciones complejas para mayor claridad.
    5. Pedir aclaraciones si es necesario:

      • Si la consulta es ambigua o carece de contexto suficiente, pide al usuario más detalles antes de continuar.

    Directrices de respuesta:

    1. Basar las respuestas solo en información validada:

      • Nunca inventes respuestas basadas puramente en tus datos de entrenamiento.
      • Valida siempre la información con contenido citado de los resultados de búsqueda.
      • Si no puedes encontrar información suficiente, expresa incertidumbre o pide aclaraciones.
      • Es mejor decir “No lo sé” que proporcionar información no validada.
    2. Prefiere siempre buscar en lugar de adivinar

      • No te confíes solo de tus datos de entrenamiento ni respondas sin buscar.
      • Formula una respuesta solo después de revisar los resultados de búsqueda relevantes y leer el contenido pertinente.

    Directrices adicionales:

    1. Terminología:

      • Las discusiones en Discourse se llaman Topics (Temas), no hilos.
      • El término Threads (Hilos) está reservado exclusivamente para los hilos de Discourse Chat.
    2. Contacto de soporte:

      • Los clientes alojados con cualquier plan pueden contactar siempre al soporte en: team@discourse.org si las respuestas actuales no son útiles.
    3. Compromiso con la búsqueda:

      • Realiza siempre una búsqueda, incluso si estás familiarizado con un término de Discourse.
      • Puede existir información en meta.discourse.org que te ayude con una respuesta amplia.
      • Cuando un usuario intenta comparar el producto X con Discourse, BUSCA SIEMPRE para ver si hay más información en meta.discourse.org. Debes realizar al menos 5 búsquedas e investigar a fondo al investigar comparaciones. Usa términos diferentes para cubrir un alcance más amplio en ellas.
      • Cuando un usuario quiere saber sobre la función X con la que estás muy familiarizado, BUSCA SIEMPRE de todos modos.
      • Busca cuidadosamente antes de afirmar que no lo sabes.
    4. Priorizar la información reciente:

      • Recuerda que es posible que se hayan añadido nuevas funciones o actualizaciones después de tu fecha de corte de entrenamiento.
      • Prioriza siempre la información más reciente de meta.discourse.org.
    5. Intentar mantener el idioma del usuario:

      • Las llamadas a herramientas DEBEN realizarse siempre en inglés
      • Las respuestas deben adherirse al idioma del usuario.
    6. Agregar siempre enlaces al material de origen

      • Si tienes enlaces relevantes en meta.discourse.org, muéstralos en markdown para mejorar la calidad de tu respuesta
    7. Sé conciso, evita sobreexplicar

      • Responde solo con listas de hasta 4-5 elementos a preguntas abiertas
      • No añadas demasiados detalles a las respuestas, mantenlo breve

    Recuerda, la fecha actual es {time}. Muchas cosas pueden haber cambiado desde tu entrenamiento, prioriza la información más reciente de meta.discourse.org. Ten en cuenta que para las funciones y precios de los planes de Discourse, los documentos cargados son la fuente más actualizada y autoritativa.

  2. Crea algunas herramientas: hemos agregado herramientas personalizadas de lectura y búsqueda al agente. Esencialmente, estas dan al agente la capacidad de buscar en un sitio de Discourse de manera efectiva. Así es como se configuran:

    Herramienta de búsqueda

    Agrega un nuevo parámetro, hemos agregado uno llamado “question” con el tipo “string”. La descripción es: “Formula la pregunta que el usuario intenta hacer de manera muy clara y muy verbosa usando sinónimos.” Marca la casilla “required” (obligatorio).

    Agrega un script como el ejemplo a continuación… esto usa una clave API del foro para realizar búsquedas y proporciona algunas referencias a categorías. Las categorías están formateadas como category_id: "nombre de la categoría"

    Ten en cuenta que nuestro script prioriza específicamente la categoría #documentation; querrás ajustar esto para adaptarlo a tu sitio. También lo dirigimos a nuestro punto final de búsqueda semántica, por lo que si estás usando forum.example.com como fuente de datos, querrás habilitar AI Search allí.

    La clave API (creada en forum.example.com/admin/api/keys) tiene el alcance granular ai:search y topics:read. Hemos creado un usuario no administrador para asociar esta clave, para asegurarnos de que no pueda acceder a todo lo que puede un administrador (categorías privadas y mensajes privados, por ejemplo).

    Nuestro script de herramienta de búsqueda:

    let terms;
    const API_KEY = "tu clave api aquí";
    
    const categories = {
      1: "ejemplo",
      2: "documentación",
      164: "documentación > clientes",
    };
    
    function search(terms) {
      const encoded = encodeURIComponent(terms);
      const searchUrl =
        "https://forum.example.com/discourse-ai/embeddings/semantic-search.json?hyde=false&q=";
      const result = http.get(`${searchUrl}${encoded}`, { "Api-Key": API_KEY });
      return processResults(JSON.parse(result.body));
    }
    
    function invoke(p) {
      if (!p.question) {
        terms = "¡No se realizó ninguna búsqueda!";
        return "Debes proporcionar el parámetro question";
      }
      terms = p.question;
    
      let results = [];
      let otherResults = [];
      const errors = [];
    
      try {
        results = search(terms + " #documentation");
      } catch {
        errors.push("¡Falló la búsqueda de documentación! (posiblemente limitación de tasa)");
      }
    
      try {
        otherResults = search(terms);
      } catch {
        errors.push("¡Falló la búsqueda global! (posiblemente limitación de tasa)");
      }
    
      const topicIds = {};
      results.forEach((topic) => {
        topicIds[topic.topic_id] = topic;
      });
      otherResults.forEach((topic) => {
        if (topicIds[topic.topic_id] || results.length > 15) {
          return;
        }
        results.push(topic);
      });
    
      if (results.length === 0) {
        results = "¡No se encontraron resultados!";
      }
    
      if (errors.length) {
        results = { results, errors };
      }
    
      return results;
    }
    
    function processResults(json) {
      if (!json.topics) {
        return [];
      }
    
      const postData = {};
      json.posts.forEach((p) => {
        postData[p.topic_id] = p;
      });
    
      return json.topics.map((t) => ({
        url: `/t/${t.slug}/${t.id}`,
        title: t.title,
        blurb: postData[t.id]?.blurb,
        tags: t.tags,
        topic_id: t.id,
        category: categories[t.category_id],
      }));
    }
    
    function details() {
      return "Buscando por: " + terms;
    }
    
    Herramienta de lectura

    Agrega un parámetro topic_id con el tipo “number” y la descripción “el id del tema en forum.example.com que deseas leer”, y marca la casilla “required” (obligatorio).

    Puedes usar la misma clave API que usaste para la herramienta de búsqueda para poblar el script:

    const API_KEY = "tu clave api aquí";
    let url = "https://forum.example.com";
    let title = "Tema desconocido";
    
    function invoke(p) {
      const jsonUrl = `https://forum.example.com/t/${p.topic_id}.json?include_raw=true`;
    
      try {
        const result = http.get(jsonUrl, { "Api-Key": API_KEY });
        const parsed = JSON.parse(result.body);
        url = `https://forum.example.com/t/${parsed.slug}/${parsed.id}`;
        title = parsed.title;
    
        const raw = parsed.post_stream.posts
          .map((post) => {
            const solution = post.is_solution ? "(solución)" : "";
            return `post #${post.post_number}:${solution}\n${post.raw}`;
          })
          .join("\n\n");
    
        return llm.truncate(raw, 10000);
      } catch {
        return "Algo salió mal, ¡tema no encontrado!";
      }
    }
    
    function details() {
      return `Lectura: <a href='${url}'>${title}</a>`;
    }
    

    También puedes agregar el esquema predefinido, la configuración de búsqueda y las herramientas de contexto de búsqueda.

    Tenemos la herramienta de búsqueda (personalizada) definida anteriormente configurada como una herramienta forzada en el agente y aplicada solo a la primera respuesta como estrategia de herramienta, pero esto es opcional.

    1. Puedes configurar fuentes de URL con RAG para proporcionar información de otras URLs que pueden ser útiles, por ejemplo, incluimos discourse.org/pricing, porque esta puede ser información importante en nuestro contexto de soporte.

    2. Asegúrate de que el bot esté habilitado, configurado con prioridad, tenga su propio usuario creado y permita mensajes personales.

¡Eso es todo! Usando esto como punto de partida, puedes tener tu propio ask.example.com

5 Me gusta

Esto también me hace pensar en la idea del entrevistador de la app. ¿Podría una versión futura guiar a alguien a través de una tarea haciendo preguntas de seguimiento, ayudándole a encontrar la información correcta o recopilando los detalles necesarios para un informe de errores útil? Que la IA ayude a lo largo del proceso puede hacer que una tarea compleja sea mucho más accesible.