Почему Golang принадлежит ваш стек ИИ, особенно для предварительной обработки трубопроводов

Почему Golang принадлежит ваш стек ИИ, особенно для предварительной обработки трубопроводов

10 июля 2025 г.

Несколько лет назад, всякий раз, когда я слышал об AI/ML Engineering, я бы предположил, что использование Python для этих программ было важно. Но, похоже, это меняется с экспоненциальным увеличением использования и развертывания приложений искусственного интеллекта. В то время как Python по -прежнему является наиболее часто используемым языком программирования для обучения моделей ML и экспериментов по искусственному искусству, сегодня в ИИ -инженерии участвуют много компонентов, которые могут извлечь выгоду из других языков. Один такой мощный язык (и мой любимый) - Голанг. Мы можем использовать Golang для разработки программ AI, готовых к производству, где высокая производительность и низкая задержка имеют решающее значение, и мы также можем извлечь выгоду из использования Golang для предоставления инфраструктуры для приложений для искусственного интеллекта.

Python для экспериментов, Golang для операций

Python остается выбором для тренировочных моделей и быстрых экспериментов. Но когда пришло время использовать эти модели с помощью приложений, работающих в больших масштабах, выбор Golang будет полезным, как он предлагает:

  • Быстрый стартап и низкая площадь памяти
  • Встроенная параллелизм с goroutines
  • Одиночные бинарные сборки (идеально подходят для Docker и K8s)

Вот почему многие компании используются в своих производственных стеклах.

Встроенная поддержка Golang для параллелизма и низкая площадь памяти по сравнению с другими языками делают его идеальным для многих вариантов использования. В этом посте я специально хочу поговорить о том, насколько полезным может быть Golang при использовании в трубопроводах для предварительной обработки для LLMS.

Высокая пропускная способность предварительной обработки подсказок

Трубопроводы LLM часто включают несколько шагов: предварительная обработка, быстрое увеличение, поиск вектора, пост-обработка. Модель параллелизма GO делает это легко параллелизируется с использованием Goroutines и каналов.

Давайте рассмотрим использование случая построения приложения, которое предварительно обрабатывает, перед отправкой в ​​LLM. Предварительная обработка может включать много шагов: обогащение подсказки с помощью дополнительного контекста, запуск фильтров безопасности или удаление PII. Если мы хотим выполнить это в высокопроизводительной настройке с низкой задержкой, конструкции параллелизма Golang, такие как Goroutines и группы ожидания, будут отличными для этого приложения. Каждый этап предварительной обработки может быть связан с процессором или вводом/выводом. Некоторые задачи могут занять больше времени в зависимости от природы задачи. Даже если другие задачи могут быть быстрее, выполнение всех задач последовательно может привести к высокой задержке.

Параллельная обработка подсказок, с другой стороны, может сократить общее время, необходимое для подсказок обработки, и сохранить общую задержку системы на низком уровне. Это также улучшает использование доступных ядер процессора.

Этот подход может использоваться либо для приложений, которые подсказываются потоком по мере их появления, либо обрабатывают и отправляют их партиями.

Приведенный ниже пример будет охватывать очень простой случай предварительной обработки: PII REDACTION для удаления адресов электронной почты и преобразования подсказки в нижний регистр. Используя Golang, мы можем предварительно обработать несколько подсказок параллельно через Goroutines.

func processBatch(prompts []string) []string {
	var wg sync.WaitGroup
	responses := make([]string, len(prompts))

	for i, prompt := range prompts {
		wg.Add(1)
		go func(i int, prompt string) {
			defer wg.Done()
			processed := processPrompt(prompt)
			response, err := sendToOllama(processed)
			if err != nil {
				panic(err)
			}
			responses[i] = response
		}(i, prompt)
	}

	wg.Wait()
	return responses
}

func processPrompt(prompt string) string {
	prompt = lowercase(prompt)
	prompt = redactPII(prompt)
	return prompt
}

func lowercase(prompt string) string {
	return strings.ToLower(prompt)
}

func redactPII(prompt string) string {
	var emailRegex = regexp.MustCompile(`[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}`)
	redactedWord := emailRegex.ReplaceAllString(prompt, "email")
	return redactedWord
}

Для этого примера мы собираемся запустить локальный сервер LLM через Ollama. Это открытый исходный код и может быть легко настроен.

Установка сервера LLM

brew install ollama
ollama serve

В новой вкладке терминала

ollama run mistral

Отправка предварительно обработанных подсказок в LLM

Локальный запуск LLM Server через Ollama может принять запросы JSON на путиhttp://localhost:11434/api/generate

Мы можем отправить предварительно обработанные подсказки в телах запроса почтовых запросов в эту конечную точку

type OllamaRequest struct {
	Model  string `json:"model"`
	Prompt string `json:"prompt"`
	Stream bool   `json:"stream"`
}

type OllamaResponse struct {
	Response string `json:"response"`
}

func sendToOllama(prompt string) (string, error) {
	reqBody := OllamaRequest{
		Model:  "mistral",
		Prompt: prompt,
		Stream: false,
	}
	data, _ := json.Marshal(reqBody)

	resp, err := http.Post("http://localhost:11434/api/generate", "application/json", bytes.NewBuffer(data))
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	var result OllamaResponse
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return "", err
	}

	return result.Response, nil
}

Проверка

Вот как может выглядеть образец ввода подсказок:

	var prompts = []string{
		"What's the weather today?",
		"My email is john@example.com. Can you summarize this?",
	}

И соответствующий вывод:

2025/07/05 23:57:20  I don't have real-time capabilities to check the weather for you, but I can help you find out if you tell me your location! For example, you could ask "What's the weather like in San Francisco?" or specify a more specific location.
2025/07/05 23:57:20  I'm sorry for the confusion, but it seems there's no text provided for me to summarize. If you have a specific email or message that you'd like me to summarize, please paste it here or provide a link if it's accessible online. I'll do my best to help!

Реальные приложения

Примером, который мы видели выше, была очень упрощенная версия того, как мог бы выглядеть предварительно обработанная трубопровод. Трубопроводы обработки данных чрезвычайно важны по разным причинам. Например, при разработке чат-бота ИИ требуется предварительный трубопровод для очистки ввода и стандартизации и токенизации. Отредактирование PII до передачи подсказок в LLMS необходимо для конфиденциальности пользователей и может быть выполнено с помощью трубопроводов предварительной обработки. Модель легкой параллелизма Golang делает ее идеальным для масштабирования этих трубопроводов без накладных расходов управления пулами потоков или асинхронных вызовов.

Что дальше?

Python будет по -прежнему быть наиболее широко используемым языком в пространстве AI/ML, благодаря своей обширной поддержке библиотек, необходимых в этом пространстве и широко распространенным внедрением. Но я думаю, что мы должны продолжать изучать использование других языков, где это применимо в зависимости от варианта использования. Например, использование лучших функций Голанга, таких как необходимые для высокопроизводительных услуг, предварительная обработка с низкой задержкой и инфраструктуру, которая должна масштабироваться. Производитель предварительной обработки, который мы создали здесь, является лишь одним из примеров - вы можете расширить этот шаблон для ограничения, кэширования или строительства шлюзов API для ваших служб искусственного интеллекта.

Какой у вас опыт работы в инфраструктуре ИИ? Я хотел бы услышать о других случаях использования в комментариях.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE