La semana pasada agregamos un bot de preguntas y respuestas que responde preguntas de nuestra documentación . Esto aprovecha la tecnología ChatGPT para responder preguntas de la documentación de Xata, aunque el modelo OpenAI GPT nunca se entrenó en los documentos de Xata.
La forma en que hacemos esto es utilizando un enfoque sugerido por Simon Willison en esta publicación de blog . El mismo enfoque se puede encontrar también en un libro de cocina de OpenAI . La idea es la siguiente:
Ejecute una búsqueda de texto en la documentación para encontrar el contenido más relevante para la pregunta realizada por el usuario.
Produzca un indicador con esta forma general:
With these rules: {rules} And this text: {context} Given the above text, answer the question: {question} Answer:
Envíe el aviso a la API de ChatGPT y deje que el modelo complete la respuesta.
Descubrimos que esto funciona bastante bien y, combinado con una temperatura del modelo relativamente baja (el concepto de temperatura se explica en esta publicación de blog ), esto tiende a producir resultados correctos y fragmentos de código, siempre que la respuesta se pueda encontrar en el documentación.
Una limitación clave de este enfoque es que el indicador que crea en el segundo paso anterior debe tener un máximo de 4000 tokens (~3000 palabras). Esto significa que el primer paso, la búsqueda de texto para seleccionar los documentos más relevantes, se vuelve realmente importante. Si el paso de búsqueda hace un buen trabajo y proporciona el contexto correcto, ChatGPT tiende a hacer también un buen trabajo para producir un resultado correcto y directo.
Entonces, ¿cuál es la mejor manera de encontrar las piezas de contenido más relevantes en la documentación? El libro de cocina de OpenAI, así como el blog de Simon, utilizan lo que se denomina búsqueda semántica. La búsqueda semántica aprovecha el modelo de lenguaje para generar incorporaciones tanto para la pregunta como para el contenido. Las incrustaciones son matrices de números que representan el texto en un número de dimensiones. Los fragmentos de texto que tienen incrustaciones similares tienen un significado similar. Esto significa que una buena estrategia es encontrar las piezas de contenido que tienen las incrustaciones más similares a las incrustaciones de preguntas.
Pida a ChatGPT que extraiga las palabras clave de la pregunta, con un aviso como este:
Extract keywords for a search query from the text provided. Add synonyms for words where a more common one exists.
Utilice las palabras clave proporcionadas para realizar una búsqueda de texto libre y elegir los mejores resultados
Poniéndolo en un solo diagrama, los dos métodos se ven así:
Hemos probado ambos en nuestra documentación y hemos notado algunos pros y contras.
Comencemos comparando algunos resultados. Ambos se ejecutan en la misma base de datos y ambos usan el modelo ChatGPT gpt-3.5-turbo
. Como hay aleatoriedad involucrada, realicé cada pregunta 2 o 3 veces y elegí lo que me pareció el mejor resultado.
Responda con la búsqueda de vectores:
Responda con búsqueda por palabra clave:
Veredicto : ambas versiones proporcionaron la respuesta correcta, sin embargo, la búsqueda de vectores es un poco más completa. Ambos encontraron la página de documentos correcta, pero creo que nuestra heurística basada en aspectos destacados seleccionó un fragmento de texto más corto en el caso de la estrategia de palabras clave.
Ganador: búsqueda de vectores.
Puntuación: 1-0
Responda con la búsqueda de vectores:
Responda con búsqueda por palabra clave:
Veredicto: resultado decepcionante para la búsqueda de vectores, que de alguna manera se perdió la página dedicada de Deno en nuestros documentos. Encontró algún otro contenido relevante de Deno, pero no la página que contenía el ejemplo muy útil.
Ganador: búsqueda por palabra clave.
Puntuación: 1-1
Con búsqueda vectorial:
Con búsqueda por palabra clave:
Veredicto: Ambos encontraron la página correcta ("Importar un archivo CSV"), pero la versión de búsqueda de palabras clave logró obtener una respuesta más completa. Ejecuté esto varias veces para asegurarme de que no es una casualidad. Creo que la diferencia radica en cómo se selecciona el fragmento de texto (junto a las palabras clave en el caso de una búsqueda por palabra clave, desde el principio de la página en el caso de una búsqueda vectorial).
Ganador: búsqueda por palabra clave.
Puntuación: 1-2
Con búsqueda vectorial:
Con búsqueda por palabra clave:
Veredicto: la búsqueda vectorial funcionó mejor en esta, porque encontró la página "Filtrado" en la que había más ejemplos que ChatGPT podría usar para redactar la respuesta. La respuesta de búsqueda de palabras clave se rompe sutilmente, porque usa "consulta" en lugar de "filtro" para el nombre del método.
Ganador: búsqueda de vectores.
Puntuación: 2-2
Con búsqueda vectorial:
Con búsqueda por palabra clave:
Veredicto: Este es un empate, porque ambas respuestas son bastante buenas. Los dos eligieron páginas diferentes para resumir en una respuesta, pero ambos hicieron un buen trabajo y no puedo elegir un ganador.
Puntuación: 3-3
Esta es una solicitud de Xata de muestra utilizada para la búsqueda de palabras clave:
// POST https://workspace-id.eu-west-1.xata.sh/db/docs:main/tables/search/ask { "question": "What is Xata?", "rules": [ "Do not answer questions about pricing or the free tier. Respond that Xata has several options available, please check https://xata.io/pricing for more information.", "If the user asks a how-to question, provide a code snippet in the language they asked for with TypeScript as the default.", "Only answer questions that are relating to the defined context or are general technical questions. If asked about a question outside of the context, you can respond with \"It doesn't look like I have enough information to answer that. Check the documentation or contact support.\"", "Results should be relevant to the context provided and match what is expected for a cloud database.", "If the question doesn't appear to be answerable from the context provided, but seems to be a question about TypeScript, Javascript, or REST APIs, you may answer from outside of the provided context.", "If you answer with Markdown snippets, prefer the GitHub flavour.", "Your name is DanGPT" ], "searchType": "keyword", "search": { "fuzziness": 1, "target": [ "slug", { "column": "title", "weight": 4 }, "content", "section", { "column": "keywords", "weight": 4 } ], "boosters": [ { "valueBooster": { "column": "section", "value": "guide", "factor": 18 } } ] } }
Y esto es lo que usamos para la búsqueda de vectores:
// POST https://workspace-id.eu-west-1.xata.sh/db/docs:main/tables/search/ask { "question": "How do I get a record by id?", "rules": [ "Do not answer questions about pricing or the free tier. Respond that Xata has several options available, please check https://xata.io/pricing for more information.", "If the user asks a how-to question, provide a code snippet in the language they asked for with TypeScript as the default.", "Only answer questions that are relating to the defined context or are general technical questions. If asked about a question outside of the context, you can respond with \"It doesn't look like I have enough information to answer that. Check the documentation or contact support.\"", "Results should be relevant to the context provided and match what is expected for a cloud database.", "If the question doesn't appear to be answerable from the context provided, but seems to be a question about TypeScript, Javascript, or REST APIs, you may answer from outside of the provided context.", "Your name is DanGPT" ], "searchType": "vector", "vectorSearch": { "column": "embeddings", "contentColumn": "content", "filter": { "section": "guide" } } }
Como puede ver, la versión de búsqueda de palabras clave tiene más configuraciones, configurando borrosidad y potenciadores y pesos de columna. La búsqueda vectorial solo utiliza un filtro. Llamaría a esto una ventaja para la búsqueda de palabras clave: tiene más diales para ajustar la búsqueda y, por lo tanto, obtener mejores respuestas. Pero también es más trabajo, y los resultados de la búsqueda de vectores son bastante buenos sin este ajuste.
En nuestro caso, ya hemos ajustado la búsqueda de palabras clave para nuestra funcionalidad de búsqueda de documentos. Por lo tanto, no fue necesariamente un trabajo adicional, y mientras jugábamos con ChatGPT, también descubrimos mejoras en nuestros documentos y búsqueda. Además, resulta que Xata tiene una interfaz de usuario muy agradable para ajustar la búsqueda de palabras clave, por lo que el trabajo no fue difícil al principio (planificando una publicación de blog separada sobre eso).
No hay ninguna razón por la cual la búsqueda vectorial no pueda tener también impulsores y pesos de columna y cosas por el estilo, pero aún no lo tenemos en Xata y no conozco ninguna otra solución que lo haga tan fácil como hacemos palabras clave. sintonía de búsqueda. Y, en general, existe más técnica anterior a la búsqueda de palabras clave, pero es muy posible que la búsqueda vectorial se ponga al día.
Por ahora, llamaré a la búsqueda de palabras clave el ganador
Puntuación: 3-4
Nuestra documentación ya tenía una función de búsqueda, dog-fooding Xata, por lo que era bastante sencillo extenderla a un bot de chat. Xata ahora también es compatible con la búsqueda de vectores de forma nativa, pero su uso requería agregar incrustaciones para todas las páginas de documentación y descubrir una buena estrategia de fragmentación. Hemos utilizado la API de incrustaciones de OpenAI para producir las incrustaciones de texto, que tenían un costo mínimo.
Ganador: Búsqueda por palabra clave
Puntuación 3-5
El enfoque de búsqueda de palabras clave necesita un viaje de ida y vuelta adicional a la API de ChatGPT. Esto se suma en términos de latencia al resultado que comenzó a transmitirse en la interfaz de usuario. Según mis mediciones, esto agrega alrededor de 1,8 s de tiempo extra.
Con búsqueda vectorial:
Con búsqueda por palabra clave:
Nota: El tiempo total y los tiempos de descarga de contenido aquí no son relevantes, ya que dependen principalmente de la duración de la respuesta generada. Mire la barra "Esperando respuesta del servidor" (la verde) para comparar.
Ganador: búsqueda de vectores
Puntuación: 4-5
La versión de búsqueda de palabras clave necesita hacer una llamada API adicional a la API de ChatGPT, por otro lado, la versión de búsqueda de vectores necesita producir incrustaciones para todos los documentos en la base de datos más la pregunta.
A menos que estemos hablando de muchos documentos, voy a llamar a esto un empate.
Puntuación: 5-6
¡El marcador está apretado! En nuestro caso, hemos optado por usar la búsqueda por palabra clave por ahora, principalmente porque tenemos más formas de ajustarla y, como resultado, genera respuestas ligeramente mejores para nuestro conjunto de preguntas de prueba. Además, cualquier mejora que hagamos en la búsqueda beneficiará automáticamente tanto a la búsqueda como a los casos de uso del chat. A medida que mejoramos nuestras capacidades de búsqueda vectorial con más opciones de ajuste, es posible que cambiemos a la búsqueda vectorial o a un enfoque híbrido en el futuro.
Si desea configurar un bot de chat similar para su propia documentación, o cualquier tipo de base de conocimiento, puede implementar fácilmente lo anterior utilizando el punto final de pregunta de Xata. Crea una cuenta gratis y únete a nosotros en Discord . ¡Estaré encantado de ayudarte personalmente a ponerlo en marcha!