¿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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# con bash, extrae tu historial de commit a json fuente git-registro-json.sh && git-registro-json > commitlog.json # con cbsh, crear ámbito, colección y colección Índice primario ámbitos crear gitlog; cb-env alcance gitlog;colecciones crear comete; cb-env colección comete; consulta "CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`" # Importar el documento de la colección seleccionada abra commitlog.json | envolver contenido | insertar id { |it| echo $it.contenido.commitHash } | doc upsert # Enriquecer el documento con el modelo por defecto consulta "SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c" | envolver contenido| vector enriquecer-doc texto | doc upsert # Crear un índice vectorial vector crear-índice --similitud-métrico punto_producto comete textVector 1536 # Run RAG vector enriquecer-texto "géminis" | vector busque en comete textVector --vecinos 20| seleccione id |doc consiga| seleccione contenido | rechace -i contenido.textVector | par-cada {|x| a json} | envolver contenido| pregunte a "cuándo y en qué commit se añadió la compatibilidad con gemini llm" |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
versión = 1 [[llm]] identificador = "OpenAI" proveedor = "OpenAI" incrustar_modelo = "text-embedding-3-small" chat_modelo = "gpt-3.5-turbo" api_clave = "sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxx" [[cluster]] identificador = "capella" conexión = "couchbases://cb.xxxxxxx.cloud.couchbase.com" nombre de usuario = "Laurent Doguin" nombre de usuario = "USUARIO" contraseña = "CONTRASEÑA" cubo por defecto = "cbsh" ámbito por defecto = "gitlog" |
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é.
1 |
fuente git-registro-json.sh && git-registro-json > commitlog.json |
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:
1 2 3 4 5 6 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.commits > pregunte a "obtener los commits completos en json para un repositorio git" A consiga el completo comete en a Git repositorio como JSON, usted puede utilice el siguiente comando: git registro --bonito=formato:'{%n "commit": "%H",%n "author": "%an <%ae>",%n "date": "%ad",%n "message": "%f"%n},' --fecha=iso --invertir --todos > comete.json |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[ { .... }, { "autor": { "nombre": "Michael Nitschinger", "email": "michael@nitschinger.at", "fecha": "Thu, 20 Feb 2020 21:29:20 +0100", "dateISO8601": "2020-02-20T21:29:20+01:00" }, "cuerpo": "", "commitHash": "7a0d269fffd10045a63d40ca460deba944531890", "commitHashAbbreviated": "7a0d269", "committer": { "nombre": "Michael Nitschinger", "email": "michael@nitschinger.at", "fecha": "Thu, 20 Feb 2020 21:29:20 +0100", "dateISO8601": "2020-02-20T21:29:20+01:00" }, "codificación": "", "notas": "", "padre": "", "parentAbbreviated": "", "refs": "", "firma": { "llave": "A6BCCB72D65B0D0F", "firmante": "", "verificationFlag": "E" }, "asunto": "Compromiso inicial", "subjectSanitized": "Compromiso inicial", "árbol": "3db442f3ef0438de58f72235e2658e5368a6752b", "árbolAbreviado": "3db442f" }] |
¿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++.
1 |
ámbitos crear gitlog; cb-env alcance gitlog; colecciones crear comete; cb-env colección comete; consulta "CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`" |
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:
1 2 3 4 5 6 7 8 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > abra commitlog.json |envolver contenido | insertar id { |it| echo $it.contenido.commitHash }| doc upsert ╭───┬───────────┬─────────┬────────┬──────────┬─────────╮ │ # │ procesado │ éxito │ fracasado │ fracasos │ cluster │ ├───┼───────────┼─────────┼────────┼──────────┼─────────┤ │ 0 │ 660 │ 660 │ 0 │ │ capella │ │ ╰───┴───────────┴─────────┴────────┴──────────┴─────────╯ |
Consigamos algunos documentos para ver cómo funcionaba:
1 2 3 4 5 6 7 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > consulta "SELECT subject, body FROM `commits` LIMIT 1" ╭───┬──────────────┬──────┬─────────╮ │ # │ sujeto │ cuerpo │ grupo │ ├───┼──────────────┼──────┼─────────┤ │ 0 │ Bump Nushell │ │ capella │ ╰───┴──────────────┴──────┴─────────╯ |
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:
1 2 3 4 5 6 7 8 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > consulta "SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c" | envolver contenido| vector enriquecer-doc texto | doc upsert Inserción lote 1/1 ╭───┬───────────┬─────────┬────────┬──────────┬─────────╮ │ # │ procesado │ éxito │ fracasado │ fracasos │ cluster │ ├───┼───────────┼─────────┼────────┼──────────┼─────────┤ │ 0 │ 61 │ 61 │ 0 │ │ capella │ ╰───┴───────────┴─────────┴────────┴──────────┴─────────╯ |
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:
1 2 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > vector crear-índice --similitud-métrico punto_producto comete textVector 1536 |
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:
1 2 3 4 5 6 7 8 9 10 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > vector enriquecer-texto "Soporte TLS" | vector busque en comete textVector Inserción lote 1/1 ╭───┬──────────────────────────────────────────┬────────────┬─────────╮ │ # │ id │ puntuación │ cluster │ ├───┼──────────────────────────────────────────┼────────────┼─────────┤ │ 0 │ f2c1f124269884c88ab3925c7c5a8914298a2fbc │ 0.37283808 │ capella │ │ 1 │ da28adf7adbe910cd06c960d9c25d7316d666d1c │ 0.33915368 │ capella │ │ 2 │ f0f82353e7c060030cc2511ffab1edbcc263d099 │ 0.3294143 │ capella │ ╰───┴──────────────────────────────────────────┴────────────┴─────────╯ |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > vector enriquecer-texto "géminis" | vector busque en comete textVector --vecinos 10| seleccione id |doc consiga| seleccione contenido | rechace -i contenido.textVector | par-cada {|x| a json} | envolver contenido| pregunte a "cuándo y en qué commit se añadió la compatibilidad con gemini llm" Inserción lote 1/1 Géminis LLM soporte fue añadido en el escriba a con el tema "Añadir soporte para Gemini llm". Este escriba a fue autor por Jack Westwood en Mayo 15, 2024, con el escriba a hash "3da9b4a3532ab4f432428319361909cc14a035af". 👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > git Mostrar 3da9b4a3532ab4f432428319361909cc14a035af escriba a 3da9b4a3532ab4f432428319361909cc14a035af Autor: Jack Westwood <jack.westwood@couchbase.com> Fecha: Miércoles Mayo 15 15:40:13 2024 +0100 Añadir soporte para Géminis llm .... |
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:
1 2 3 4 |
👤 Laurent Doguin 🏠 capella en ☁️ cbsh.gitlog.comete > deje pregunta = "¿por qué se reescribió la caja cliente? "; vector enriquecer-texto $pregunta | vector busque en comete textVector --vecinos 10| seleccione id |doc consiga| seleccione contenido | rechace -i contenido.textVector | par-cada {|x| a json} | envolver contenido| pregunte a $pregunta Inserción lote 1/1 En cliente caja fue reescrito a dirección cuestiones tal como incoherencia, dificultad en uso, y código organización. En reescribir dividir el cliente en clave-valor (kv) y HTTP clientes, cada consumiendo a común HTTP manipulador. Este separación en varios clientes y archivos mejorado código organización y hecho el clientes más fácil a comprender y utilice. Además, varios mejoras eran hecho a el HTTP manipulador, errores, y tiempo de ejecución instanciación en el cliente caja a mejorar en general funcionalidad y rendimiento. En reescribir esfuerzo dirigido a racionalizar el cliente caja, en it más robusto, mantenible, y usuario-amable. |
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!
-
- Empieza con Capella gratis
- Lea nuestro Guía de incrustaciones LLM
- Leer más de mis blogs de desarrolladores sobre búsqueda vectorial y más
- Pruebe Shell de Couchbase hoy
Muy bueno. Sería interesante incluir el changelog completo, para darle más contexto al LLM.
Sí, yo también estaba pensando en Github PR. Muchas posibilidades.