Hace unos años, cada vez que escuché de AI/ML Engineering, supongo que usar Python para estos programas period esencial. Pero esto parece estar cambiando con el aumento exponencial en el uso y la implementación de aplicaciones de IA. Si bien Python continúa siendo el lenguaje de programación más utilizado para capacitar a los modelos ML y la experimentación de ingeniería de IA, hay muchos componentes involucrados en la ingeniería de IA hoy que podrían beneficiarse de otros idiomas. Uno de esos poderosos lenguaje (y mi favorito) es Golang. Podemos usar Golang para desarrollar programas de IA listos para la producción donde el alto rendimiento y la baja latencia son cruciales, y también podemos beneficiarnos de usar Golang para proporcionar infraestructura para aplicaciones de IA.
Python para experimentos, Golang para operaciones
Python sigue siendo la opción para los modelos de entrenamiento y la experimentación rápida. Pero cuando llegue el momento de utilizar estos modelos a través de aplicaciones ejecutadas a gran escala, elegir Golang será beneficioso como ofrece:
- Inicio rápido y huella de baja memoria
- Concurrencia incorporada con goroutinas
- Construcciones binarias individuales (perfectas para Docker y K8)
Es por eso que muchas empresas usan en sus pilas de producción.
El soporte incorporado de Golang para la concurrencia y la baja huella de memoria en comparación con otros idiomas lo hacen ultimate para muchos casos de uso. En esta publicación, quiero hablar específicamente sobre cuán beneficioso puede ser Golang cuando se usa en el preprocesamiento de tuberías para LLM.
Preprocesamiento de alto rendimiento de las indicaciones
Las tuberías de LLM a menudo implican múltiples pasos: preprocesamiento, aumento rápido, búsqueda de vectores, postprocesamiento. El modelo de concurrencia de GO hace que esto sea fácil de paralelizar con el uso de goroutinas y canales.
Consideremos el caso de uso de la creación de una aplicación que previa previos indica antes de enviar a LLM. El preprocesamiento podría implicar muchos pasos: enriquecer el mensaje con contexto adicional, ejecutar filtros de seguridad o eliminar PII. Si queremos realizar esto en una configuración de bajo rendimiento de baja latencia, las construcciones de concurrencia de Golang, como las goroutinas y los grupos de espera, serán excelentes para esta aplicación. Cada paso de preprocesamiento puede estar unido a la CPU o en I/O. Algunas tareas pueden llevar más tiempo según la naturaleza de la tarea. Incluso si otras tareas pudieran ser más rápidas, realizar todas las tareas secuencialmente puede conducir a una alta latencia.
El procesamiento paralelo de las indicaciones, por otro lado, puede reducir el tiempo complete tardado para el procesamiento de indicaciones y mantener baja la latencia normal del sistema. Esto también mejora la utilización de los núcleos de CPU disponibles.
Este enfoque se puede utilizar para aplicaciones que transmiten a medida que vengan, o procesen y las envíen en lotes.
El siguiente ejemplo cubrirá un caso de uso de preprocesamiento muy easy: PII Redaction para eliminar las direcciones de correo electrónico y convertir la solicitud en minúsculas. Usando Golang, podemos preprocesar varias indicaciones en paralelo a través de Goroutinas.
func processBatch(prompts []string) []string {
var wg sync.WaitGroup
responses := make([]string, len(prompts))
for i, immediate := vary prompts {
wg.Add(1)
go func(i int, immediate string) {
defer wg.Achieved()
processed := processPrompt(immediate)
response, err := sendToOllama(processed)
if err != nil {
panic(err)
}
responses[i] = response
}(i, immediate)
}
wg.Wait()
return responses
}
func processPrompt(immediate string) string {
immediate = lowercase(immediate)
immediate = redactPII(immediate)
return immediate
}
func lowercase(immediate string) string {
return strings.ToLower(immediate)
}
func redactPII(immediate string) string {
var emailRegex = regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}`)
redactedWord := emailRegex.ReplaceAllString(immediate, "e-mail")
return redactedWord
}
Para este ejemplo, ejecutaremos un servidor LLM native a través de Ollama. Es de código abierto y se puede configurar fácilmente.
Instalación del servidor LLM
brew set up ollama
ollama serve
En una nueva pestaña terminal
ollama run mistral
Enviar indicaciones preprocesadas a LLM
Ejecutando localmente el servidor LLM a través de Ollama puede aceptar solicitudes JSON en la ruta
Podemos enviar las indicaciones preprocesadas en los cuerpos de solicitud posteriores a ese punto closing
kind OllamaRequest struct {
Mannequin string `json:"mannequin"`
Immediate string `json:"immediate"`
Stream bool `json:"stream"`
}
kind OllamaResponse struct {
Response string `json:"response"`
}
func sendToOllama(immediate string) (string, error) {
reqBody := OllamaRequest{
Mannequin: "mistral",
Immediate: immediate,
Stream: false,
}
information, _ := json.Marshal(reqBody)
resp, err := http.Put up("", "software/json", bytes.NewBuffer(information))
if err != nil {
return "", err
}
defer resp.Physique.Shut()
var end result OllamaResponse
if err := json.NewDecoder(resp.Physique).Decode(&end result); err != nil {
return "", err
}
return end result.Response, nil
}
Verificación
Así es como puede ser una entrada de indicaciones de muestra:
var prompts = []string{
"What is the climate at this time?",
"My e-mail is [email protected]. Are you able to summarize this?",
}
Y la salida correspondiente:
2025/07/05 23:57:20 I haven't got real-time capabilities to verify the climate for you, however I can assist you discover out should you inform me your location! For instance, you might ask "What is the climate like in San Francisco?" or specify a extra particular location.
2025/07/05 23:57:20 I am sorry for the confusion, however it appears there isn't any textual content offered for me to summarize. You probably have a selected e-mail or message that you just'd like me to summarize, please paste it right here or present a hyperlink if it is accessible on-line. I am going to do my greatest to assist!
Aplicaciones del mundo actual
El ejemplo que vimos anteriormente fue una versión muy simplificada de cómo podría ser una tubería de preprocesamiento. Las tuberías de procesamiento de datos son extremadamente importantes por una variedad de razones. Por ejemplo, al desarrollar un chatbot Ai, se requiere una tubería de preprocesamiento para la limpieza de la entrada y la estandarización y la tokenización. Redacting PII antes de que se pasen las indicaciones a LLMS es esencial para la privacidad del usuario y se puede hacer mediante el preprocesamiento de tuberías. El modelo de concurrencia liviano de Golang lo hace ultimate para escalar estas tuberías sin la sobrecarga de la gestión de grupos de hilos o devoluciones de llamada de asíncrono.
¿Qué sigue?
Python continuará siendo el lenguaje más utilizado en el espacio AI/ML, debido a su vasto soporte para las bibliotecas requeridas en este espacio y una adopción generalizada. Pero creo que deberíamos seguir explorando el uso de otros idiomas donde corresponda dependiendo del caso de uso. Por ejemplo, la utilización de las mejores características de Golang donde sea necesario, como en servicios de alto rendimiento, preprocesamiento de baja latencia e infraestructura que necesita escalar. La tubería de preprocesamiento que construimos aquí es solo un ejemplo: puede extender este patrón para limitar, almacenar en caché o construir puertas de enlace API para sus servicios de IA.
¿Cuál es tu experiencia con GO en la infraestructura de IA? Me encantaría escuchar sobre otros casos de uso en los comentarios.