Mejorando la calidad de los filtros de búsqueda en Discourse AI

En primer lugar, esto es realmente increíble. ¡Muchas gracias! :heart_eyes:

Tengo una pregunta sobre una persona que creé con estos Comandos Habilitados: Búsqueda, Categorías, Leer, Etiquetas.

También he subido un archivo .txt. Mi objetivo con esta persona es que siempre busque en mi foro y en las cargas, y haga RAG con ambos.

Después de subir el archivo .txt, noté que dejó de buscar en mi foro. Esto es lo que tengo en mi Consulta de Búsqueda Base: #docs #faqs #anking-wiki
#docs y #faqs son categorías, mientras que #anking-wiki es una etiqueta.

Preguntas:

  • ¿Realmente necesito los comandos de categorías y etiquetas? Veo que estos comandos solo enumeran las etiquetas y categorías de mi instancia. Parece que tal vez el comando de búsqueda debería ser suficiente.
  • ¿Está bien mi consulta de búsqueda base?
  • ¿Por qué el bot dejó de buscar en mi foro?
    • ¿Es la solución simplemente ajustar mi prompt para aclarar que siempre debe usar la función de búsqueda?

Aquí está el prompt tal como se ve en la información de depuración:

Eres un asistente útil de Discourse para usuarios de AnkiHub.
Entiendes y generas Discourse Markdown.
Vives en un Mensaje del Foro de Discourse.
Vives en el foro con la URL: https://community.ankihub.net
El título de tu sitio: AnkiHub Community
La descripción es: Un foro comunitario para los proyectos AnkiHub y AnKing
Los participantes en esta conversación son: gpt4o_bot, andrew
La fecha actual es: 2024-06-07 23:32:13 UTC, mucho ha cambiado desde que fuiste
entrenado.
Fuiste entrenado con datos ANTIGUOS, apóyate en la búsqueda para obtener información actualizada sobre este foro.
Al buscar, intenta SIMPLIFICAR los términos de búsqueda.
La búsqueda de Discourse une todos los términos con Y. Reduce y simplifica los términos para encontrar más resultados.

Los siguientes textos te darán orientación adicional para tu respuesta.
Los incluimos porque creemos que son relevantes para el tema de esta conversación.
Textos:

Intenté añadir “Asegúrate de usar siempre la función de búsqueda” a mi prompt. Esto hizo que usara la función de búsqueda, pero con malos resultados:

Aparentemente, realizó 3 búsquedas e informó erróneamente “No se encontraron resultados” las tres veces. Si haces clic en los enlaces de los resultados de búsqueda, puedes ver que, de hecho, hubo resultados. Además, puedes ver que los parámetros de mi “Consulta de Búsqueda Base” no se utilizaron, por lo que buscó en todo el foro en lugar de en las categorías específicas.

Creo que parte del problema aquí es que nuestra búsqueda es un poco confusa:

https://meta.discourse.org/search?q=%23bug%20%23feature%20test

Busca Bug Y Feature - test

Lo que quieres aquí es:

https://meta.discourse.org/search?q=categories%3Abug%2Cfeature%20test

2 Me gusta

Estoy confundido. Esto no funciona como esperaba. Esperaba que la búsqueda devolviera resultados solo de las categorías especificadas. Sin embargo, la búsqueda devuelve resultados de cualquier categoría. El primer resultado de esta búsqueda está en la categoría Theme component.

2 Me gusta

Verdadero, esto parece tener errores, oh no, lo revisaré.

1 me gusta

Esto se soluciona según:

Estoy de acuerdo en que es intuitivo admitir #bug #feature algo, pero esto aún no es compatible y necesita un poco de discusión.

categories:bug,feature algo funcionará ahora, y category:bug,feature algo también lo hará.

1 me gusta

¡Genial! Gracias por sacar esa solución tan rápido. :bowing_man:

Si bien la búsqueda ahora funciona correctamente, el Bot de IA de Discourse todavía no parece funcionar como se esperaba. Aquí están mis observaciones con 3.3.0.beta3-dev (a1d881f625):

  • No utiliza la opción base_query
    • parece ignorarla por completo. ¿es válida mi configuración?
    • hasta donde sé, no hay requisitos para los valores de la consulta de búsqueda base. pero no importa lo que ponga ahí, no se utiliza ni se añade a search_query.
  • Los resultados de la búsqueda no se añaden al contexto para RAG
    • cuando la herramienta de búsqueda se llama (aunque sin el base_query), los resultados no parecen utilizarse en la llamada LLM.
    • ¿Estoy entendiendo mal cómo debería funcionar esta herramienta? Esperaba que hiciera una búsqueda en Discourse y utilizara los resultados de la búsqueda (es decir, el contenido de los temas encontrados) para RAG.
      Ve este ejemplo de solicitud:
JSON de la solicitud
{"model":"gpt-4","messages":[{"role":"system","content":"Eres un asistente amigable y útil para usuarios de Anki especializado en el complemento y la aplicación web AnkiHub.\nEntiendes y generas Discourse Markdown.\nVives en un mensaje del foro de Discourse.\n\nVives en el foro con la URL: https://community.ankihub.net\nRespondes preguntas específicamente sobre el uso de Anki con AnkiHub.\nEl título de tu sitio: AnkiHub Community\nLa descripción es: Un foro comunitario para los proyectos AnkiHub y AnKing\nLos participantes en esta conversación son: gpt4_bot, andrew\nLa fecha actual es: 2024-06-13 18:29:19 UTC, mucho ha cambiado desde que fuiste\nentrenado.\nFuiste entrenado con datos ANTIGUOS, apóyate en la búsqueda para obtener información actualizada sobre este foro\nAl buscar, intenta SIMPLIFICAR los términos de búsqueda\nLa búsqueda de Discourse une todos los términos con Y. Reduce y simplifica los términos para encontrar más resultados."},{"role":"user","content":"¿Puedo comprar cuentas para otros usuarios y suscribirlos automáticamente a mis mazos privados?","name":"andrew"},{"role":"assistant","content":null,"tool_calls":[{"type":"function","function":{"arguments":"{\"search_query\":\"comprar cuentas para otros usuarios suscribir mazos privados\"}","name":"search"},"id":"call_fmzwIbU4ravFRKWRsOQlqGBq"}]},{"role":"tool","tool_call_id":"call_fmzwIbU4ravFRKWRsOQlqGBq","content":"{\"column_names\":[\"title\",\"url\",\"username\",\"excerpt\",\"created\",\"category\",\"likes\",\"topic_views\",\"topic_likes\",\"topic_replies\",\"tags\"],\"rows\":[[166454,\"/t/organizations/166454/1\",\"andrew\",\"<a name=\\\"what-are-ankihub-organizations-1\\\" class=\\\"anchor\\\" href=\\\"#what-are-ankihub-organizations-1\\\"></a>¿Qué son las Organizaciones de AnkiHub?<br>Las Organizaciones de AnkiHub permiten a los Propietarios de Organizaciones comprar AnkiHub para otros usuarios e invitar a esos usuarios a la Organización.<br>Las organizaciones de AnkiHub funcionan de esta manera y tienen las siguientes características:<br><a name=\\\"linked-decks-2\\\" class=\\\"anchor\\\" href=\\\"#linked-decks-2\\\"></a>Mazos Vinculados<br>Los usuarios de tu organización pueden obtener acceso automáticamente yhellip;\",\"2024-02-08T17:44:27.842Z\",\"🎓 Docs > 🤝 Crear y Colaborar\",1,166,1,1],[228569,\"/t/how-can-i-get-my-school-to-buy-ankihub-for-my-class/228569/1\",\"andrew\",\"Algunos estudiantes han logrado que sus escuelas patrocinen AnkiHub para sus clases. Para hacerlo, tu escuela debe crear una Organización de AnkiHub:<br><br>:bulb: Aquí tienes algunos consejos para que tu escuela compre AnkiHub:<br><br>Ponte en contacto con las personas del gobierno estudiantil de tu escuela o con el departamento de mhellip;\",\"2024-05-23T21:40:37.477Z\",\"❓ FAQs\",0,50,0,1],[167190,\"/t/what-happens-after-my-ankihub-subscription-ends/167190/1\",\"Ahmed7\",\"Si tu suscripción a AnkiHub finaliza y no deseas renovarla.<br>Todos tus mazos permanecerán, nada será eliminado. Sin embargo, ya no podrás sincronizar con AnkiHub y recibir nuevos cambios en tus mazos, ni podrás sugerir nuevos cambios o notas a ningún mazo preexistente que yhellip;\",\"2024-02-10T06:14:53.787Z\",\"❓ FAQs\",0,307,0,1],[167280,\"/t/what-if-i-cant-afford-ankihub/167280/1\",\"Ahmed7\",\"AnkiHub tiene un programa de becas para obtener acceso a un precio reducido. Solicita <a href=\\\"https://www.ankihub.net/scholarships\\\">aquí</a>. (Debes <a href=\\\"https://app.ankihub.net/accounts/signup/\\\">registrarte</a> para obtener una cuenta de AnkiHub antes de solicitar).\n\",\"2024-02-10T13:58:24.842Z\",\"❓ FAQs > AnKing Decks\",0,445,0,1,\"anking-wiki\"],[228564,\"/t/does-ankihub-offer-discounts/228564/1\",\"andrew\",\"Actualmente hay dos formas de obtener un descuento en AnkiHub:<br><br>Compra nuestra <a href=\\\"https://app.ankihub.net/memberships/plans/\\\">opción de facturación anual</a> por un mes gratis al año<br><br>AnkiHub está disponible a $4.58/usuario/mes con un descuento de facturación anual. Lamentablemente, no podemos permitirnos descontar más AnkiHub.<br><br><br>Participa en un programa de embajadores<br><br>&hellip;\",\"2024-05-23T21:34:32.829Z\",\"❓ FAQs\",0,90,0,1]],\"args\":{\"search_query\":\"comprar cuentas para otros usuarios suscribir mazos privados\"}}}","name":"search"}],"stream":true,"stream_options":{"include_usage":true},"tools":[{"type":"function","function":{"name":"search","description":"Buscará temas en la instancia de Discourse actual, al renderizar siempre preferirá enlazar a los temas que encuentre","parameters":{"type":"object","properties":{"search_query":{"description":"Palabras clave específicas para buscar, separadas por espacios (corrige la ortografía incorrecta, elimina palabras conectoras)","type":"string"},"user":{"description":"Filtra los resultados de la búsqueda por este nombre de usuario (solo incluye si el usuario pide explícitamente filtrar por usuario)","type":"string"},"order":{"description":"orden de los resultados de la búsqueda","type":"string","enum":["latest","latest_topic","oldest","views","likes"]},"limit":{"description":"limita el número de resultados devueltos (generalmente prefiere mantener el predeterminado)","type":"integer"},"max_posts":{"description":"número máximo de publicaciones en los temas (temas donde mucha gente publicó)","type":"integer"},"tags":{"description":"lista de etiquetas para buscar. Usa + para unir con O, usa , para unir con Y","type":"string"},"category":{"description":"nombre de la categoría para filtrar","type":"string"},"before":{"description":"solo temas creados antes de una fecha específica YYYY-MM-DD","type":"string"},"after":{"description":"solo temas creados después de una fecha específica YYYY-MM-DD","type":"string"},"status":{"description":"busca temas en un estado particular","type":"string","enum":["open","closed","archived","noreplies","single_user"]}},"required":[]}}},{"type":"function","function":{"name":"read","description":"Leerá un tema o una publicación en esta instancia de Discourse","parameters":{"type":"object","properties":{"topic_id":{"description":"el id del tema a leer","type":"integer"},"post_numbers":{"description":"los números de publicación a leer (opcional)","type":"array","items":{"type":"integer"}}},"required":["topic_id"]}}}]}]}

Puedes ver que se llamó a la herramienta de búsqueda pero no contiene el base_query.

También puedes ver que el content solo contiene el prompt del sistema predeterminado, sin ninguno de los resultados de la búsqueda.

  • No muestra el número correcto de resultados de búsqueda
    • dice 0 cuando hay muchos o 5 cuando hay 0
    • no parece correlacionarse ni con los resultados de búsqueda normales ni con los resultados de similitud semántica
  • El bot agregará parámetros de consulta inválidos
    • por ejemplo, agregó category:non-existent-category al final de la consulta.

:pleading_face: Solicitudes

  • Sería muy útil si hubiera una opción para habilitar el registro detallado para discourse-ai, para que aquellos que no sabemos Ruby (¡estoy aprendiendo! :nerd_face:) podamos obtener rápidamente información sobre lo que sucede internamente visitando /logs
  • Cuando se utiliza la herramienta de búsqueda, añadir los mejores resultados al contexto para RAG
  • Consejos sobre cómo asegurar que se utilice el base_query.

¿Tengo razón al pensar que la llamada a la función debería estar insertando los resultados de la llamada a la herramienta en el prompt según esto?

Entonces, ¿quizás está actualizando el prompt, pero eso no está claro en la solicitud que se muestra desde la herramienta de depuración?

¿No debería ver todo el contexto allí? Si no es así, eso es confuso porque todo el contexto del prompt es visible cuando se usa una persona que hace RAG con cargas.

Todavía estoy confundido por el número de resultados que se informan.

Dicho esto, estoy obteniendo mucho mejores resultados después de agregar lo siguiente al prompt del sistema.

  • Siempre llama a las funciones de búsqueda y lectura.
  • Llama a la función de búsqueda no más de 3 veces.
  • Al llamar a la función de búsqueda, usa siempre este valor para el parámetro de categoría: “docs,faqs”

Esto va a ser un cambio de juego absoluto una vez que tenga las cosas configuradas correctamente.

No estoy seguro de si eres consciente de esto, pero efectivamente nos estás empoderando con algo mucho más poderoso de lo que Intercom intenta lograr.

Ya estoy intentando secuestrar el messenger de Intercom dirigiendo a los usuarios directamente a Discourse AI :nerd_face: :

El enlace AnkiHub AI abre un mensaje privado con el bot de IA con un enlace como este: /new-message?username=ankihubai_bot

Sí, la herramienta de depuración muestra todo lo que enviamos al LLM.

Acabo de hacer una corrección en el número de resultados por:

No estábamos enlazando correctamente a una consulta filtrada.

Recomiendo no hacer esto, use base_query, acabo de probar que funciona bien: categories:docs,faqs


Recomiendo no usar GPT4 hoy en día, asegúrese de usar GPT4o o Turbo, son mucho más baratos y rápidos.

Solo estoy comprobando… ¿habilitó ai_bot_debugging_allowed_groups para que vea el botón de depuración?

2 Me gusta

Sí. Te enviaré un breve vídeo para mostrar que los resultados de la llamada a la función read no se utilizan en el prompt.

También noté que la función read nunca se llama a menos que agregue una nota en el prompt del sistema: “siempre llama a la función read”. Sería genial si hubiera una manera de tener más control sobre las llamadas a funciones. Por ejemplo, establecer tool_choice: "required" en el caso de OpenAI.

Lo acabo de intentar de nuevo con esta consulta base y se utilizaron los parámetros de búsqueda correctos. Es la primera vez que lo veo funcionar. :person_shrugging:

Lo sé, solo estoy experimentando con diferentes modelos en este momento :smile: Me preguntaba si GPT4 decidiría hacer llamadas a funciones diferentes. Haiku suena muy prometedor.

1 me gusta

Muchas gracias

oh, eso es correcto, la inyección de indicaciones del sistema solo ocurrirá si la persona tiene cargas. Si no hay cargas, no inyectamos nada.

Sin cargas, no usamos la inyección incondicional de indicaciones del sistema y, en su lugar, confiamos en las llamadas a herramientas con resultados de llamadas a herramientas, puede verlas al desplazarse.

Un modo sin herramientas dirigido a temas es ciertamente interesante, consumiría una buena cantidad de tokens, el desafío sin embargo es extraer el contenido correcto de un tema.

Si un tema, por ejemplo, tiene 5000 tokens, ¿qué tokens elegiríamos? ¿cómo elegiríamos los tokens correctos?

Tal como está, solo tenemos N tokens incrustados por tema dependiendo del modelo de incrustación que esté utilizando.

Por lo tanto, necesitaríamos comenzar a incrustar más fragmentos por tema o idear un algoritmo para determinar qué parte del tema es la más interesante.

2 Me gusta

Estoy confundido. Si los resultados de invocar la herramienta de lectura no se utilizan para RAG, ¿qué hace invocar la herramienta de lectura? Veo que los resultados de la llamada a la herramienta de lectura se colocan en el contexto sin procesar, pero no parece que el LLM lo esté utilizando de ninguna manera.

Mi caso de uso deseado es simple: habilitar RAG en un subconjunto de temas según base_query.

Creo que sería mejor no depender de Discourse para dividir mis temas en varios fragmentos, cada uno con su propia incrustación. Más bien, quiero ser responsable de elaborar mis Documentos y Preguntas Frecuentes de manera que estén optimizados para RAG. Es decir, la totalidad de la publicación principal de los temas debería ser incrustable. Estoy hablando de temas wiki aquí, cuyas respuestas pueden y deben ser descartadas.

ada-002 tiene una entrada máxima de tokens de 8191, que es suficiente para cualquier documento o pregunta frecuente bien escrito. Dichos temas deberían estar muy por debajo de este límite. voyage ai tiene una longitud de contexto mucho mayor. de 16000.

¿Qué tal algo tan simple como esto:

  • (tokens en el prompt del sistema - tokens en el mensaje del usuario) = tokens restantes totales disponibles
  • inyectar tantos temas en el prompt como sea posible basándose en tokens restantes totales disponibles
    • usar solo la primera publicación de los temas encontrados

Supongo que la solución provisional a corto plazo podría ser la siguiente:

  • crear una persona que utilice la herramienta de búsqueda
  • exportar todos los temas que se puedan encontrar con la herramienta de búsqueda
    • No necesitaré dividir estos documentos porque
      • No me importan las respuestas a los temas
      • El tema wiki principal ya es lo suficientemente pequeño como para incrustar todo el tema.
  • Subir esos documentos a la persona para RAG

De esta manera, la persona realmente hará RAG con los resultados de la búsqueda.

¡Espero que esto tenga sentido! Hazme saber si algo no está claro.

1 me gusta

Cuando lees algo, se inyecta en el flujo de la conversación.

Por ejemplo:

  • ¿Puedes leer X?
  • Llamada a la herramienta leer X
  • Resultado de la herramienta “la página”
  • Respuesta del LLM

RAG es un término muy sobrecargado, pero al final leer un tema lo añade al contexto, el LLM al final es responsable de cómo usarlo, varios LLM pueden hacer un mejor o peor uso de él.

Por ejemplo: [Untitled AI bot PM] - AI Conversation - Discourse Meta

La herramienta de búsqueda ya inserta extractos de temas, tenerla y un RAG sobre el mismo contenido no tiene sentido.

Lo que dices, supongo, es que “la búsqueda proporciona contexto, pero no suficiente contexto”.

Así que una solución es exportar todos los temas importantes a un archivo, y luego usarlo como RAG. No uses la herramienta de búsqueda.


Lo más sencillo por ahora es:

categories:cat1,cat2,cat3 in:first

Esto restringirá la herramienta de búsqueda solo a las primeras publicaciones.

Es muy eficiente, mira:

Esto funciona porque la herramienta de búsqueda inyecta lo siguiente en el contexto:


También quiero un modo “rag” incondicional donde puedas optar por inyectar aún más datos (por ejemplo, encontrar los 5 documentos principales e inyectar hasta 5000 tokens por documento, intentando encontrar las secciones más relevantes).

Es un cambio complicado, llegaremos allí, pero por ahora… la búsqueda + lectura te llevan bastante lejos.

2 Me gusta

Solo digo… están muy cerca de ese punto en el que deben hacer una introducción sobre cuáles son las reglas básicas de cómo usar la IA. Quiero decir, ya tienen algo similar para CSS y un par de cosas más.

2 Me gusta

Ya veo. Eso tiene sentido. De los documentos de OpenAI sobre la llamada a funciones:

La secuencia básica de pasos para la llamada a funciones es la siguiente:

  1. Llame al modelo con la consulta del usuario y un conjunto de funciones definidas en el parámetro functions.
  2. El modelo puede optar por llamar a una o más funciones; si lo hace, el contenido será un objeto JSON serializado que se adhiere a su esquema personalizado (nota: el modelo puede alucinar parámetros).
  3. Analice la cadena en JSON en su código y llame a su función con los argumentos proporcionados si existen.
  4. Vuelva a llamar al modelo adjuntando la respuesta de la función como un nuevo mensaje, y deje que el modelo resuma los resultados al usuario.

Críticamente, no era consciente de #4. No me di cuenta de que los resultados de invocar la herramienta se adjuntaban como mensajes. ¡Pensé que dependía completamente del cliente si los resultados se usaban en llamadas posteriores! Así que me confundí cuando no vi los resultados de la llamada a la herramienta en el propio prompt. :facepalm: Todo esto tiene mucho más sentido ahora. ¡Gracias!

:+1: :pray: Suena como que la única desventaja aquí es que las respuestas del bot no incluirán esos agradables resultados de búsqueda. ¿Recomendaría encarecidamente usar cargas de documentos y la herramienta de búsqueda por alguna razón, aunque sea un poco redundante? Me pregunto si los beneficios de obtener los resultados de la búsqueda en la conversación valdrán la pena.

Tienes que probarlo, podría funcionar, podría darte resultados sorprendentes y mucho depende del LLM que estés utilizando.

1 me gusta