Cuando se trata de system prompts, normalmente hay un elemento como system o system prompt que básicamente pasamos cada vez que estamos invocando el flujo apropiado con nuestro modelo para proporcionar el system prompt y como puedes ver aquí, normalmente no solo pasamos el system prompt sino también los mensajes del usuario del user prompt que discutimos antes para que tenga toda la información que necesita para intentar realizar la acción que queremos que realice. También hay numerosas estrategias, así que si quieres profundizar más en esto, realmente recomiendo echar un vistazo a este artículo que tiene un buen nivel de detalle sobre el estado del ecosistema de la ingeniería de prompts, pero hay numerosas estrategias diferentes. Podemos pensar en, ya sabes, shots y ejemplos si discutimos a través de hay realmente numerosos tipos diferentes de estructura para prompts si piensas en cosas como chain of thought y también hay técnicas como meta-prompting también. Todas estas cosas pueden realmente ayudarnos a intentar construir mejores prompts para asegurarnos de que el LLM está haciendo lo que queremos que haga, pero también hay otras prácticas que deberíamos considerar también. Así que piensa en el tipo de tarea y hazlo claro qué tipo de tarea quieres que el LLM realice en tus prompts. Si es una tarea muy compleja, intenta asegurarte de darle el número correcto de ejemplos porque si le das demasiado, podría llevar a complejidad y problemas con el LLM intentando averiguar qué hacer. Por el contrario, muy pocos ejemplos podrían dejarlo realmente ambiguo. Piensa en las entradas, las salidas y el formato como lo hacemos para todos los sistemas que construimos. Piensa cuidadosamente en esa persona que quieres emular y también piensa en el LLM en sí mismo. ¿Podrías usar el LLM para quizás optimizar, ajustar tu prompt o de hecho obtienes mejores resultados con los tipos de prompts que se están pasando a través de diferentes LLMs? Echa un vistazo a todas estas opciones cuando estés pensando en la ingeniería de prompts.
Ahora, lo siguiente de lo que necesitamos hablar es RAG y RAG significa Retrieval Augmented Generation. En términos simples, esto es donde tomas un conjunto de documentos normalmente divididos en piezas a través de un proceso conocido como chunking y luego los almacenamos de una manera normalmente utilizando una vector database que tiene nuestros documentos convertidos a través de un embedding model del cual hablaremos más en un minuto y luego tomaremos una consulta relevante, extraeremos los documentos semánticamente relevantes y luego los pasaremos como parte de nuestro contexto al large language model para obtener el resultado que queremos y esto es algo muy común al fundamentar un LLM y asegurarse de que tiene la información correcta. Ahora, cuando se trata de similarity y semantic search, primero necesitamos entender la diferencia entre eso y el lexical tradicional. El lexical tradicional trabaja con coincidencias exactas para texto, por lo que normalmente utiliza las estructuras de datos que ves aquí conocidas como un inverted index donde nuestros documentos y nuestra consulta pasan por un proceso para extraer los términos relevantes y luego buscamos en nuestro inverted index para encontrar esos términos y apuntarán de regreso a los documentos de los cuales eso se considera un resultado relevante para la consulta que hemos pasado. Pero vector search funciona de manera diferente porque todo se basa en matemáticas de secundaria, así que si piensas en diferentes tipos de documentos, no solo texto ahora sino imágenes, documentos y audio e incluso otros tipos también, pueden ser convertidos en una representación numérica vectorial, es decir, una secuencia de números y esto normalmente es un vector denso y luego hacemos lo mismo con nuestra consulta utilizando el mismo modelo y luego utilizamos uno de una familia de algoritmos conocidos como nearest neighbor para básicamente encontrar cuáles son los vectores más cercanos y devolver los resultados. Pensando en embeddings, los obtenemos de modelos de machine learning que están usando una tarea diferente, así que LLM su tarea es todo sobre generación de texto. Los modelos que usamos para generar embeddings simplemente van a tomar los aspectos semánticos de cualquier tipo de datos dependiendo de la modalidad que soporte, es decir, qué formato soporta y simplemente generará una secuencia de números que representan ese documento que luego podemos tener dentro de un vector space. Así que este es un ejemplo de vector space aquí, una ilustración bidimensional muy simple y lo que verás es que dentro de mi vector space tengo mi primera dimensión de realismo y la segunda de humano y cada uno de los documentos dentro de aquí está posicionado basado en la intensidad con la que cumple esa categoría particular. Así que verás que mis personajes realistas están hacia la parte superior y luego verás que cartoon Vader está en el lado opuesto pero no se considera similar. Luego, cuando vamos y buscamos, básicamente obtendremos el mismo vector embedding de ese modelo de nuestra consulta y luego encontraremos el candidato más cercano utilizando un algoritmo de similitud. Hay numerosos tipos diferentes de medidas de similitud, el predeterminado para elastic search que hemos visto en algunos otros en la mayoría de los casos es cosine similarity y básicamente toma el ángulo entre los dos vectores, tu vector de consulta y uno de los documentos de interés y a medida que el coseno del ángulo tiende hacia uno, eso significa que ese documento se considera semánticamente relevante. Cuando estamos haciendo estas comparaciones, esos algoritmos de nearest neighbor hay numerosas maneras en que se puede hacer, hay numerosos algoritmos diferentes como disk enn y otros. El que se usa bastante popularmente en vector databases incluyendo hemos visto en elastic search sería hierarchical navigable small worlds o hnnsw y la forma en que esto funciona es que divide el espacio del gráfico en capas como puedes ver en la visualización y eso significa que pasamos de comparaciones más dispersas a más detalladas, lo que significa que estamos tratando de equilibrar la precisión pero también la velocidad. Así que este es un ejemplo de consulta y como puedes ver aquí, tengo mi opción knn, especifico el vector field aquí que es básicamente, ya sabes, el nombre del campo donde vive el vector dentro de la vector database, el número de documentos que quiero devolver son los más cercanos es k y luego el número de candidatos a evaluar por shard en este caso lo he establecido como 100 y luego mi query vector aquí verás que básicamente ha tomado esa consulta y la ha puesto y, ya sabes, la ha convertido usando un modelo y luego tengo mi vector listo para usar y cuando termino haciendo eso y cuando termino haciendo eso puedo hacer coincidir documentos no solo basados en las coincidencias exactas de texto sino también la similitud basada en los atributos del modelo. Así que como los humanos, ya sabes, los large language models tienen esta noción de memoria, necesitan aspectos tanto de memoria a corto plazo, es decir, la sesión actual y cosas a más largo plazo que han sucedido en el pasado para ayudarlos a funcionar y asegurarse de que están realizando tareas como esperamos. La memoria a corto plazo simplemente se refiere a la sesión actual, así que si tomamos nuestro ejemplo de planificador de viajes, básicamente el chat actual que estoy teniendo con él sería la memoria a corto plazo y no solo serían los mensajes humanos que estoy enviando sino también las respuestas de la IA también, pero también podemos pensar en el historial de chat las conversaciones que hemos tenido antes, hemos estado planeando otros viajes y esos serían los que almacenamos dentro de la memoria a largo plazo que podría estar en un almacén como una vector database o un archivo o incluso alguna otra forma de memoria para que podamos recuperarlos. Tomando nuestro ejemplo de AI SDK agent lo que verás aquí es que vamos a realmente persistir los mensajes y luego recuperar los relevantes. Así que verás aquí lo que estoy haciendo es que realmente estoy persistiendo el último mensaje y luego lo que estoy haciendo es obtener similares extrayéndolos de Elasticsearch a través de esta utilidad que creé.
Comments