¿No te encanta leer los mensajes de compromiso de los demás? ¿No? Pues a mí sí, y mientras leía un mensaje de confirmación muy perspicaz, me di cuenta de todo el contenido sin explotar que hay en varios registros de Git (suponiendo que los desarrolladores a los que sigues escriban mensajes útiles, claro). Así que, ¿no sería genial si pudieras hacer preguntas a un repositorio? Veamos cómo se puede lograr esto haciendo RAG con Couchbase Shell.

TL;DR

Configuración de Couchbase Shell

El paso inicial es instalar y configurar cbsh. Voy a utilizar mi instancia de Capella. Para obtener la configuración puede ir a Conectar de su cluster Capella y seleccione Shell de Couchbase. Esta es la configuración en [[cluster]]. Para configurar el modelo, eche un vistazo a lo que hay bajo [[llm]]. Yo he elegido OpenAI pero hay otros. Es necesario definir el modelo utilizado para la incrustación (que es lo que convierte el texto en un vector) y uno para el Chat. Este toma la pregunta y algún contexto adicional para responder a la pregunta. Y por supuesto necesitarás una clave API.

También necesitas Git instalado, entonces deberías estar todo listo.

Importar el registro de confirmaciones de Git

El primer paso es obtener todos los commits del repo en JSON. Siendo perezoso y viejo, y por viejo me refiero a no estar acostumbrado a preguntarle a una IA, busqué esto en Google, encontré una serie de Gists, que enlazaban a otras Gists, y finalmente me decidí por en este.

Lo descargué, lo busqué, entré en mi repositorio local git de couchbase-shell y lo llamé.

Pero, en beneficio del lector que se pregunte si he tomado la decisión correcta, preguntemos al modelo configurado. Cbsh tiene un pregunte a que le permite hacer esto:

Este comando mostrará cada confirmación en el repositorio como un objeto JSON con el hash de la confirmación, el nombre y el correo electrónico del autor, la fecha y el mensaje de la confirmación. El comando --todos garantiza la inclusión de todas las ramas. En --reverse muestra las confirmaciones en orden cronológico inverso. Por último, la salida se redirige a un archivo commits.json archivo.

Asegúrate de ejecutar este comando en el directorio raíz del repositorio Git del que quieres obtener los commits.

Y resulta que no funciona nada más sacarlo de la caja (chocante, lo sé). Y no tenía toda la información que necesitaba, como la parte del cuerpo del mensaje. Por supuesto que podríamos pasar tiempo afinando esto, pero es muy específico, con un montón de casos extremos.

En cualquier caso ahora tengo una lista de commits en formato JSON:

¿Qué puedes hacer con un array de objetos JSON? Puedes importarlo a través del Capella UI o puedes importarlos con Couchbase Shell. Primero creo el array alcance y colección y seleccionarlos con cb-env, luego crear el índice SQL++.

Dado que cbsh se basa en Nushell, el archivo JSON resultante puede abrirse fácilmente, convertirse en un marco de datos, transformarse en un documento Couchbase e insertarse de este modo:

Consigamos algunos documentos para ver cómo funcionaba:

Así que este es el contenido que podríamos utilizar para el GAR. Es hora de enriquecer estos documentos.

Enriquecer el documento con un modelo de IA

Para enriquecer el doc necesitas tener un modelo configurado. Aquí estoy usando OpenAI y el enriquecer-doc comando cbsh:

La cláusula SELECT devolverá un objeto JSON con el contenido del doc, y campos adicionales id y texto. El texto es el asunto y el cuerpo unidos en una cadena. El objeto se envuelve en un objeto de contenido y se da al vector enriquecer-doc con texto como parámetro, ya que es el campo que se transformará en un vector. Ahora debería haber un textVector en cada documento.

Búsqueda vectorial

Con el fin de buscar a través de estos vectores, tenemos que crear un índice de búsqueda de vectores. Se puede hacer a través de la API o la interfaz de usuario para algo personalizable. Aquí estoy feliz con las opciones por defecto así que uso cbsh en su lugar:

El índice creado utilizará punto_producto como algoritmo de similitud, la dimensionalidad del vector será 1536, el nombre del índice es escriba a y el campo indexado es textVector. El cubo, el ámbito y la colección son los seleccionados a través de cb-env.

Para probar la búsqueda vectorial, hay que convertir la consulta de búsqueda en un vector, y luego enviarlo a la búsqueda:

Por defecto devuelve 3 filas. Vamos a ampliarlo para ver el contenido del documento. Voy a añadir rechazar -i textVector para eliminar el campo vectorial, porque nadie necesita un campo de 1536 líneas en la salida de su terminal:

Pregunte a su repositorio Git

A partir de aquí tienes todos los commits de un repositorio Git almacenados en Couchbase, enriquecidos con un modelo de IA, y todo indexado y consultable. Lo último que hay que hacer es llamar al modelo para ejecutar una consulta con RAG. Comienza convirtiendo una pregunta en un vector, lo canaliza a una búsqueda vectorial, obtiene el documento completo a partir de los IDs de retorno, selecciona el objeto de contenido sin el campo vectorial, convierte cada objeto en un doc JSON (de esta forma podemos enviar el contenido y sus metadatos estructurados), envuelve el jsonText en una tabla y, por último, canalizarlo a la pregunte a mando:

Preguntando al LLM cuándo se introdujo el soporte Gemini. Obtenemos una fecha y un hash de confirmación. Entonces es fácil de verificar usando git show. Aquí hay un poco de repetición, así que puedes declarar una variable para tu pregunta y reutilizarla:

Y ahora todos sabemos por qué hubo que reescribir la caja cliente. Puede que no responda a tus propias preguntas, ¡pero ahora ya sabes cómo obtener respuestas de cualquier repositorio!

Autor

Publicado por Laurent Doguin

Laurent es un metalero empollón que vive en París. Principalmente escribe código en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programación reactiva y otras cosas de moda. También fue Developer Advocate de Clever Cloud y Nuxeo, donde dedicó su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.

2 Comentarios

  1. Muy bueno. Sería interesante incluir el changelog completo, para darle más contexto al LLM.

    1. Laurent Doguin abril 1, 2025 a 6:28 am

      Sí, yo también estaba pensando en Github PR. Muchas posibilidades.

Dejar una respuesta