Cómo autohospedar un asistente de IA para código validado con NVIDIA NeMo Guardrails

  • El tutorial detalla cómo autohospedar un asistente de IA para código validado utilizando STARCODER2-7B NIM en infraestructura NVIDIA, resolviendo desafíos relacionados con la soberanía de los datos, alucinaciones de paquetes y trazabilidad.
  • Al integrar NVIDIA NeMo Guardrails, una puerta de verificación de CI y métricas de resultados (Prometheus/Grafana), los equipos pueden aplicar restricciones de políticas, detectar riesgos específicos del modelo como dependencias alucinadas y monitorear el impacto de los cambios asistidos por IA frente a la línea base.
  • Toda la validación, la aplicación de políticas y la medición son externas al modelo, lo que permite una adopción incremental, futuras actualizaciones a modelos adaptados al dominio con NVIDIA NeMo Framework y flujos de trabajo de asistencia de IA duraderos y auditables.

El contenido generado por IA puede resumir información de forma incompleta. Verifique la información importante. Más información

Desplegar un asistente de IA para código en un entorno regulado, soberano o sensible al código fuente suele conllevar desafíos. Tres problemas comunes son: el código fuente no puede salir de la red, el asistente inventa ocasionalmente nombres de paquetes que introducen riesgos en la cadena de suministro y no existe una pista de auditoría cuando un cambio generado introduce un defecto.

Este tutorial le guía a través de cómo autohospedar un asistente de programación validado en infraestructura NVIDIA que resuelve estos tres problemas. Al finalizar, tendrá un endpoint de StarCoder2-7B NIM sirviendo completaciones de código desde sus propias GPUs, una política de NVIDIA NeMo Guardrails frente a él que rechaza solicitudes de archivos marcados como solo humanos, una etapa de verificación de CI que detecta paquetes alucinados antes de la revisión, trazabilidad a nivel de commit y un bucle de métricas mínimo que le indica si los parches asistidos por IA están mejorando o perjudicando su tasa de defectos.

Requisitos previos y notas del tutorial

Para seguir el tutorial, necesitará:

  • Una clave de API de NGC
  • Una GPU NVIDIA compatible con al menos 24 GB de memoria (por ejemplo, NVIDIA A10, L4, L40S o A100)
  • Python 3.10+
  • Un repositorio Git contra el cual pueda experimentar

StarCoder2-7B se ejecuta en BF16. Las GPUs NVIDIA H100 y H200 proporcionan el perfil certificado de mayor rendimiento, pero no son necesarias para un piloto. Cada artefacto en este tutorial se muestra en línea y es lo suficientemente pequeño como para copiarlo directamente en su proyecto.

La arquitectura del asistente de programación validado incluye tres capas (Figura 1). En la parte superior, el IDE del desarrollador envía solicitudes a un proxy de NeMo Guardrails que protege al NIM de StarCoder2, el cual sirve las completaciones desde sus propias GPUs. Los commits fluyen luego a través de una puerta de verificación de CI hacia un revisor y la fusión. Las solicitudes de extracción fusionadas alimentan un bucle de métricas de Prometheus y Grafana, cuya señal de tasa de escape retroalimenta la política de NeMo Guardrails para ajustarla.

Los componentes son intencionalmente pequeños. Cada paso es útil por sí mismo, por lo que un equipo puede adoptar el sistema de manera incremental en lugar de tratar la asistencia de IA autohospedada como una única migración a gran escala.

La decisión de diseño importante es que el modelo no es el plano de control. El modelo propone código, pero la aplicación de políticas, la verificación de dependencias, la trazabilidad del código fuente y la medición de resultados residen fuera del modelo, en sistemas en los que los equipos de ingeniería ya confían. Este enfoque mantiene un despliegue comprensible. Si se bloquea una sugerencia, puede inspeccionar la política de NeMo Guardrails. Si se rechaza un paquete, puede inspeccionar la salida del escaneo de dependencias. Si los cambios asistidos por IA presentan regresiones, puede inspeccionar las mismas métricas de producción que utiliza para los cambios realizados por humanos.

Figura 1. Arquitectura de extremo a extremo del asistente de programación validado
Figura 1. Arquitectura de extremo a extremo del asistente de programación validado

Paso 1: Desplegar StarCoder2 como un NVIDIA NIM

NIM distribuye StarCoder2 como un contenedor con un endpoint compatible con OpenAI, que es lo que esperan la mayoría de los asistentes de entornos de desarrollo integrado (IDE). Fije el contenedor a una versión específica del catálogo de NGC, en lugar de utilizar una etiqueta sin versión.

Código
export NGC_API_KEY=<su-clave-ngc>
export STARCODER_NIM_VERSION=<ultima-etiqueta-de-ngc>
export LOCAL_NIM_CACHE=~/.cache/nim
mkdir -p "$LOCAL_NIM_CACHE"
 
docker run -d --name starcoder2-nim \
  --gpus all \
  --shm-size=16GB \
  -e NGC_API_KEY \
  -v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
  -u $(id -u) \
  -p 8000:8000 \
  nvcr.io/nim/bigcode/starcoder2-7b:${STARCODER_NIM_VERSION}

A continuación, verifique el endpoint:

Código
curl http://localhost:8000/v1/health/ready
 
curl http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bigcode/starcoder2-7b",
    "prompt": "def fibonacci(n: int) -> int:\n\t",
    "max_tokens": 64
  }'

Ningún código fuente sale de su red en este punto. El endpoint del modelo es también el mismo artefacto que puede fijar, escanear y promover a través de su catálogo de plataforma interna.

Para un piloto, ejecute el endpoint en un host de GPU compartido y restrinja el acceso a un solo equipo. Para un despliegue más amplio, coloque el NIM detrás de su service mesh o balanceador de carga interno, mantenga la clave NGC en su gestor de secretos y publique la versión de imagen fijada a través del mismo canal de plataforma que utiliza para otros servicios de desarrollador.

Paso 2: Conectar el NIM de StarCoder2 al IDE

La mayoría de los asistentes de IDE modernos aceptan una URL base personalizada compatible con OpenAI. Por ejemplo, Continue puede apuntar directamente al endpoint local del NIM:

Código
{
  "models": [
    {
      "title": "StarCoder2 NIM (autohospedado)",
      "provider": "openai",
      "model": "bigcode/starcoder2-7b",
      "apiBase": "http://localhost:8000/v1",
      "apiKey": "no-necesaria-para-nim-local"
    }
  ],
  "tabAutocompleteModel": {
    "title": "StarCoder2 NIM (autocompletado)",
    "provider": "openai",
    "model": "bigcode/starcoder2-7b",
    "apiBase": "http://localhost:8000/v1"
  }
}

Cursor, Cline y otras herramientas que soportan un endpoint de OpenAI personalizado siguen el mismo patrón.

Para los equipos que ya tienen un estándar de IDE, mantenga estable el endpoint del NIM y haga que el adaptador del IDE sea la parte reemplazable. De esa manera, la organización puede comparar asistentes sin cambiar las capas subyacentes de servicio de modelos, políticas, CI o métricas.

Paso 3: Instalar NVIDIA NeMo Guardrails frente al NIM

Este paso introduce la validación. NeMo Guardrails se sitúa entre el IDE y el NIM y puede rechazar solicitudes que violen una política de tareas escrita. Por ejemplo, “No generar código de autenticación, pagos o criptografía”. Esto se asigna directamente a las rutas de solo humanos que muchos equipos ya definen en las políticas de uso de IA.

Código
pip install nemoguardrails openai
mkdir -p code-rails/config

Ahora, cree code-rails/config/config.yml:

Código
models:
  - type: main
    engine: openai
    parameters:
      base_url: http://localhost:8000/v1
      api_key: no-necesaria-para-nim-local
      model: bigcode/starcoder2-7b
 
rails:
  input:
    flows:
      - check task policy
 
prompts:
  - task: self_check_input
    content: |
      Decida si la siguiente solicitud de código toca alguno de:
        - autenticación / inicio de sesión / gestión de sesiones
        - procesamiento de pagos
        - criptografía / material de claves
        - rutas de archivos bajo src/security/, src/auth/ o src/payments/
      Responda solo con "YES" o "NO".
 
      Solicitud:
      {{ user_input }}

Luego cree code-rails/config/rails.co:

Código
define flow check task policy
  $allowed = execute self_check_input
  if not $allowed
    bot refuse with policy message
    stop
 
define bot refuse with policy message
  "Esta ruta está marcada como solo humana por su política de uso de IA. Por favor, escríbala manualmente y solicite una revisión."

Vía NVIDIA Developer.