Coincidencia de CV
Un flujo que compara CVs con requisitos, calcula coincidencias y devuelve al candidato con mayor ajuste.
Ir a la plantilla🧩 Descripción general
El flujo “Coincidencia de CV” automatiza la comparación de currículos con los requisitos de un puesto. Extrae y procesa los CV almacenados en Google Drive, los convierte en vectores, los indexa en una base de datos vectorial y, cuando el usuario introduce sus datos y los requisitos deseados, busca el CV más parecido y devuelve una recomendación personalizada mediante un modelo de lenguaje.
⚙️ Funcionalidades principales
- Extracción y pre‑procesamiento de CVs desde Google Drive y fragmentación del contenido en trozos manejables.
- Generación de embeddings para cada fragmento y almacenamiento en un vector store Chroma.
- Búsqueda semántica de CVs que coincidan con los requisitos introducidos por el usuario.
- Generación dinámica de prompts que incorporan los requisitos del puesto y el CV más relevante.
- Respuesta generada por un modelo de OpenAI que recomienda al candidato adecuado.
- Interfaz de chat que muestra la recomendación al usuario final.
🔄 Pasos del flujo de trabajo
| Nombre del componente | Rol en el flujo | Entradas clave | Salidas clave |
|---|---|---|---|
| Obtener CV | Recupera los archivos CV de Google Drive | Operation = Get, folder_id = CVs | Data (archivos CV) |
| Dividir Texto Recursivo por Lenguaje | Fragmenta el contenido de los CV en bloques de texto | Data (archivos CV) | Data (fragmentos) |
| Embeddings de OpenAI (5myel) | Convierte cada fragmento en vectores de alta dimensión | Data (fragmentos) | Embeddings |
| Chroma Vector Store (Subir a DB) | Almacena los vectores en la base de datos para búsqueda | Embedding (de los fragmentos), Ingest data (fragmentos) | Vector Store |
| Embeddings de OpenAI (6p7a2) | Genera embeddings para la consulta “CV” | Input = “CV” | Embeddings |
| Chroma Vector Store (Cargar de DB) | Busca los CV más similares usando los embeddings de consulta | Embedding (de la consulta) | Search results (datos de CV) |
| Obtener Texto | Convierte los datos de CV recuperados en texto plano | Data (resultado de búsqueda) | Text (CV en texto) |
| Requisitos | Construye un prompt con los requisitos solicitados por el usuario | Carrera, Certificados, Educación, Experiencia, Habilidades | Prompt (texto con requisitos) |
| Instrucciones | Combina el CV en texto con la pregunta del usuario para formar el prompt final | CV (≈ texto del CV), user_input (consulta del usuario) | Prompt (texto completo) |
| Modelo de OpenAI | Genera la recomendación basada en el prompt final | Input_value = prompt de “Instrucciones” | Text_output (respuesta del modelo) |
| Salida de Chat | Muestra la respuesta del modelo al usuario | Text (salida del modelo) | Message (mensaje de chat) |
🧠 Notas
- El flujo utiliza Google Drive como repositorio de CVs; la operación está configurada en modo “Get” para leer los archivos.
- Los embeddings se generan con OpenAI Embeddings usando el modelo
text-embedding-3-small. - La base de datos vectorial Chroma se crea en el directorio
CV_matchy permite búsquedas de similitud sin límite de resultados. - Los prompts se construyen dinámicamente con las variables
Carrera,Certificados,Educación,Experiencia,Habilidadesy la pregunta del usuario (user_input). - El modelo de OpenAI empleado es
gpt-4o-mini, con una temperatura baja (0.1) para respuestas consistentes. - La visualización final se realiza en un componente de chat que muestra la respuesta como mensaje del “Machine”.
Tip: Si se desea ampliar el conjunto de CVs, simplemente añada más archivos al folder
CVsen Google Drive; el flujo los procesará automáticamente en la próxima ejecución.
graph TD
%%{init: {'theme': 'mc','layout': 'elk'}}%%
TextInput-dvpjv[<div><img src="/_astro/type.Dy26vmDy.svg" style="height: 20px !important;width: 20px !important"/></div>Carrera]
style TextInput-dvpjv stroke:#a170ff
TextInput-s2vgd[<div><img src="/_astro/type.Dy26vmDy.svg" style="height: 20px !important;width: 20px !important"/></div>Certificados]
style TextInput-s2vgd stroke:#a170ff
TextInput-oz3io[<div><img src="/_astro/type.Dy26vmDy.svg" style="height: 20px !important;width: 20px !important"/></div>Habilidades]
style TextInput-oz3io stroke:#a170ff
TextInput-6r3sb[<div><img src="/_astro/type.Dy26vmDy.svg" style="height: 20px !important;width: 20px !important"/></div>Experiencia]
style TextInput-6r3sb stroke:#a170ff
TextInput-ep0wz[<div><img src="/_astro/type.Dy26vmDy.svg" style="height: 20px !important;width: 20px !important"/></div>Educación]
style TextInput-ep0wz stroke:#a170ff
OpenAIModel-a5e3b[<div><img src="/_astro/openAI.CA91HhVI.svg" style="height: 20px !important;width: 20px !important"/></div>OpenAI]
style OpenAIModel-a5e3b stroke:#a170ff
ChatOutput-zlpn1[<div><img src="/_astro/messages-square.BaSDmT6g.svg" style="height: 20px !important;width: 20px !important"/></div>Chat Output]
style ChatOutput-zlpn1 stroke:#a170ff
ParseData-4y52m[<div><img src="/_astro/braces.Djq0PW4_.svg" style="height: 20px !important;width: 20px !important"/></div>Obtener Texto]
style ParseData-4y52m stroke:#a170ff
OpenAIEmbeddings-5myel[<div><img src="/_astro/openAI.CA91HhVI.svg" style="height: 20px !important;width: 20px !important"/></div>OpenAI Embeddings]
style OpenAIEmbeddings-5myel stroke:#a170ff
GDriveFilesComponent-3xa20[<div><img src="/_astro/google_drive.Cutj2ebY.svg" style="height: 20px !important;width: 20px !important"/></div>Obtener CV]
style GDriveFilesComponent-3xa20 stroke:#a170ff
Prompt-3a8sl[<div><img src="/_astro/square-terminal.BMOXc-nZ.svg" style="height: 20px !important;width: 20px !important"/></div>Requisitos]
style Prompt-3a8sl stroke:#a170ff
Prompt-p6nvb[<div><img src="/_astro/square-terminal.BMOXc-nZ.svg" style="height: 20px !important;width: 20px !important"/></div>Instrucciones]
style Prompt-p6nvb stroke:#a170ff
Chroma-regly[<div><img src="/_astro/chroma.Ctr3VfNN.svg" style="height: 20px !important;width: 20px !important"/></div>Subir a DB]
style Chroma-regly stroke:#a170ff
OpenAIEmbeddings-6p7a2[<div><img src="/_astro/openAI.CA91HhVI.svg" style="height: 20px !important;width: 20px !important"/></div>OpenAI Embeddings2]
style OpenAIEmbeddings-6p7a2 stroke:#a170ff
Chroma-r9ojf[<div><img src="/_astro/chroma.Ctr3VfNN.svg" style="height: 20px !important;width: 20px !important"/></div>Cargar de DB]
style Chroma-r9ojf stroke:#a170ff
LanguageRecursiveTextSplitter-rweqg[Language Recursive Text Splitter]
style LanguageRecursiveTextSplitter-rweqg stroke:#a170ff
OpenAIModel-a5e3b -.- ChatOutput-zlpn1
linkStyle 0 stroke:#a170ff
TextInput-dvpjv -.- Prompt-3a8sl
linkStyle 1 stroke:#a170ff
TextInput-s2vgd -.- Prompt-3a8sl
linkStyle 2 stroke:#a170ff
TextInput-ep0wz -.- Prompt-3a8sl
linkStyle 3 stroke:#a170ff
TextInput-6r3sb -.- Prompt-3a8sl
linkStyle 4 stroke:#a170ff
TextInput-oz3io -.- Prompt-3a8sl
linkStyle 5 stroke:#a170ff
Prompt-3a8sl -.- Prompt-p6nvb
linkStyle 6 stroke:#a170ff
ParseData-4y52m -.- Prompt-p6nvb
linkStyle 7 stroke:#a170ff
Prompt-p6nvb -.- OpenAIModel-a5e3b
linkStyle 8 stroke:#a170ff
OpenAIEmbeddings-5myel -.- Chroma-regly
linkStyle 9 stroke:#a170ff
OpenAIEmbeddings-6p7a2 -.- Chroma-r9ojf
linkStyle 10 stroke:#a170ff
Chroma-r9ojf -.- ParseData-4y52m
linkStyle 11 stroke:#a170ff
GDriveFilesComponent-3xa20 -.- LanguageRecursiveTextSplitter-rweqg
linkStyle 12 stroke:#a170ff
LanguageRecursiveTextSplitter-rweqg -.- Chroma-regly
linkStyle 13 stroke:#a170ff