Практические заметки: Раскрытие секретов агентной сети: масштабирование ИИ-агентов и больших языковых моделей
Пошаговое руководство по практическим заметкам: разбор концепции агентного сетевого подхода; масштабирование ИИ-агентов и больших языков моделей с использованием контрактов, проверок и готовых блоков кода для команд, внедряющих эту модель.
В этом руководстве пошагово показан путь от сырья до функционирующей системы для проекта «Раскрытие тайн агентных сетей: масштабирование ИИ-агентов и больших языковых моделей на Kubernetes». Основное внимание уделяется практическим шагам, четким проверкам и коду, который можно просто добавить в репозиторий без необходимости догадываться о его назначении. На этапе обзора необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии системы. Необходимо одновременно задокументировать успешный сценарий выполнения и сценарий восстановления. Повторные попытки, проверки человеком и обработка ошибок являются неотъемлемой частью продукта, а не элементами, добавляемыми позже.
Основные узкие места в производственных агентных ИИ-системах
При работе над этапом «Основные узкие места» сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг терпит неудачу, ошибка должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых заголовков — распространенная причина избыточных ресурсов.
Знакомство с стеком: чертеж агентного сетевого строя
При работе над этапом «Знакомство со стеком» сначала запишите контракт: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успешности и не допускайте молчаливого частичного выполнения задачи. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых заголовков — распространенная причина ресурсозатрат.
1. kagent: Среда выполнения агента
При работе над этапом 1 kagent The Agent сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Рядом с функциональными результатами записывайте время выполнения и стоимость токенов или запросов. Отслеживание затрат с самого начала предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — частая причина избыточных затрат. При работе над этапом 1 kagent The Agent сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Документируйте как успешный, так и путь восстановления. Повторные попытки, проверки со стороны человека и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
2. agentgateway: Диспетчер трафика
Механизм Traffic в составе Agentgateway работает наилучшим образом, если рассматривать его как измеримую среду. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема задач. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов за использование.
3. llm-d: Разделитель нагрузки
На этапе работы с нагрузкой моделей типа LLM добрый результат достигается, если рассматривать его как измеримую величину. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма задачи. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия создаваемым файлам, определите критерии успешного выполнения и не соглашайтесь на молчаливое частичное выполнение задачи. Установите лимит токенов на каждый ход и на всю сессию. Инструменты агентов активно расширяют объём контекста; строгие ограничения предотвращают появление неожиданных счетов за использование ресурсов.
4. vLLM: Мощность GPU
На этапе GPU в рамках подхода 4 vLLM лучший результат достигается при рассмотрении его как измеримой среды. Прежде чем расширять объём работ, зафиксируйте один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счёты при переходе от демо-версии к общедоступным средам. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентного типа активно расширяют объём контекста; жесткие ограничения не позволяют демо-версиям превращаться в неожиданные счёты. На этапе GPU в рамках подхода 4 vLLM лучший результат достигается при рассмотрении его как измеримой среды. Прежде чем расширять объём работ, зафиксируйте один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию. Документируйте одновременно успешный путь выполнения задачи и путь восстановления после сбоя. Повторные попытки, проверка человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки.
1. Архитектура системы
На этапе 1 «Архитектура системы» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. При следующем шаге, представляющем собой код или вызов инструмента, лучше использовать структурированные выходные данные с проверкой соответствия шаблону вместо свободного текста.
Как это работает: обработка запроса в сети Mesh
На этапе обработки «под капотом» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия создаваемым объектам, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. При следующем шаге, представляющем собой код или вызов инструмента, отдавайте предпочтение структурированным выходным данным с проверкой по шаблону перед текстовыми описаниями в свободной форме.
2. Установка контроллеров и CRDs
На этапе установки контроллеров CRDs необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Регистрируйте время выполнения и стоимость токенов или запросов вместе с функциональными результатами. Отображение стоимости заранее помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам. При следующем шаге, представляющем собой написание кода или вызов инструмента, предпочтительнее использовать структурированные выходные данные с проверкой схемы вместо свободного текста. На этапе установки контроллеров CRDs необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Документируйте как успешный, так и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
# 1. Install Kubernetes Gateway API & Inference Extension CRDs
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.0/standard-install.yaml
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v0.1.0/manifests.yaml
# 2. Add Helm Registries
helm repo add agentgateway oci://cr.agentgateway.dev/charts
helm repo add kagent https://charts.kagent.dev
helm repo update
# 3. Install agentgateway (Control & Data Plane)
helm upgrade -i agentgateway-crds agentgateway/agentgateway-crds -n agentgateway-system --create-namespace
helm upgrade -i agentgateway agentgateway/agentgateway -n agentgateway-system
# 4. Install kagent (Agent Runtime)
helm upgrade -i kagent kagent/kagent -n kagent-system --create-namespace
3. Развертывание инфраструктуры инференса с использованием GPU (vLLM & llm-d)
При работе над этапом 3 «Развертывание инфраструктуры инференса с использованием GPU» сначала запишите описание требований: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Лучше использовать небольшие, тестируемые модули вместо обширных скриптов. При сбое какого-либо шага причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Храните в кэше стабильные системные инструкции и схемы инструментов. Повторная отправка одинаковых данных — распространенная причина ресурсозатрат.
Заполнение предустановленных значений и декодирование конфигурации развертывания (vllm-infrastructure.yaml)
При работе над этапом развертывания Prefill Decode Deployment vllm-infrastructure сначала запишите условия соглашения: необходимые входные данные, сигнал о успешном выполнении и последствия частичной неудачи. Такой список поможет сохранять честность при последующих изменениях кода. Рассматривайте этот этап как соглашение между входными данными и проверенными выходными результатами. Укажите названия файлов, определите критерии успешности и не допускайте безусловного частичного завершения работы. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых данных является распространенной причиной избыточных ресурсов.
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-prefill
namespace: llm-serving
labels:
app: vllm-prefill
spec:
replicas: 1
selector:
matchLabels:
app: vllm-prefill
template:
metadata:
labels:
app: vllm-prefill
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args:
- "--model"
- "meta-llama/Meta-Llama-3-8B-Instruct"
- "--experimental-prefill-only" # Optimization: Dedicated Prefill role
- "--gpu-memory-utilization"
- "0.90"
- "--port"
- "8000"
ports:
- containerPort: 8000
name: http
resources:
limits:
nvidia.com/gpu: "1" # Schedule on premium compute node
cpu: "4"
memory: 16Gi
volumeMounts:
- mountPath: /root/.cache/huggingface
name: model-cache
- mountPath: /dev/shm
name: dshm
volumes:
- name: model-cache
persistentVolumeClaim:
claimName: vllm-model-cache-pvc
- name: dshm
emptyDir:
medium: Memory
sizeLimit: 4Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-decode
namespace: llm-serving
labels:
app: vllm-decode
spec:
replicas: 3 # Scale out dynamically based on load
selector:
matchLabels:
app: vllm-decode
template:
metadata:
labels:
app: vllm-decode
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args:
- "--model"
- "meta-llama/Meta-Llama-3-8B-Instruct"
- "--experimental-decode-only" # Optimization: Dedicated token generator role
- "--gpu-memory-utilization"
- "0.90"
- "--port"
- "8000"
ports:
- containerPort: 8000
name: http
resources:
limits:
nvidia.com/gpu: "1" # Schedule on low-cost L4/A10G nodes
cpu: "4"
memory: 16Gi
volumeMounts:
- mountPath: /root/.cache/huggingface
name: model-cache
- mountPath: /dev/shm
name: dshm
volumes:
- name: model-cache
persistentVolumeClaim:
claimName: vllm-model-cache-pvc
- name: dshm
emptyDir:
medium: Memory
sizeLimit: 4Gi
Конфигурация llm-d (llmd-routing.yaml)
При работе над этапом настройки llm-d Configuration llmd-routing в формате yaml сначала запишите условия использования: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат заранее предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — распространенная причина избыточных затрат. При работе над этапом настройки llm-d Configuration llmd-routing в формате yaml сначала запишите условия использования: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
apiVersion: inference.networking.x-k8s.io/v1alpha1
kind: InferencePool
metadata:
name: llama3-decode-pool
namespace: llm-serving
spec:
selector:
matchLabels:
app: vllm-decode
targetPort: 8000
---
apiVersion: inference.networking.x-k8s.io/v1alpha1
kind: InferenceObjective
metadata:
name: llama3-serving-objective
namespace: llm-serving
spec:
modelName: "meta-llama/Meta-Llama-3-8B-Instruct"
prefillService:
name: vllm-prefill
port: 8000
decodePool:
name: llama3-decode-pool
4. Настройка agentgateway
Этап 4 «Настройка agentgateway» работает наилучшим образом, если рассматривать его как измеримую единицу. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые элементы вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Установите лимит токенов на один ход и на сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов во время демонстраций.
Определение шлюза (agent-gateway.yaml)
Этап yaml агента-шлюза Gateway Definition работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один эталонный пример ввода-вывода, один случай сбоя и записку о откате перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия файлам, определите критерии успешного выполнения и не допускайте молчаливого частичного завершения задачи. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентов активно расширяют объем контекста; строгие ограничения предотвращают появление неожиданных счетов.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: agent-gateway
namespace: agentgateway-system
spec:
gatewayClassName: agentgateway
listeners:
- name: http
protocol: HTTP
port: 8080
allowedRoutes:
namespaces:
from: All
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: llm-inference-route
namespace: llm-serving
spec:
parentRefs:
- name: agent-gateway
namespace: agentgateway-system
rules:
- matches:
- path:
type: PathPrefix
value: /v1/chat/completions
backendRefs:
- name: llama3-serving-objective
kind: InferenceObjective
group: inference.networking.x-k8s.io
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: mcp-tools-route
namespace: agent-tools
spec:
parentRefs:
- name: agent-gateway
namespace: agentgateway-system
rules:
- matches:
- path:
type: PathPrefix
value: /mcp/tools
backendRefs:
- name: mcp-tool-server-service
port: 50051
5. Развертывание кластера AI-агента kagent
Этап 5 «Развертывание kagent AI» работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один эталонный пример ввода-вывода, один случай сбоя и записку о откате перед расширением объема работ. Записывайте время выполнения и стоимость токенов или запросов вместе с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-версии к общим средам.
apiVersion: apps/v1
kind: Deployment
metadata:
name: kagent-orchestrator
namespace: kagent-system
spec:
replicas: 2
selector:
matchLabels:
app: kagent-orchestrator
template:
metadata:
labels:
app: kagent-orchestrator
spec:
containers:
- name: agent-runtime
image: kagent/runtime:latest
env:
# Route all model and tool API calls through agentgateway
- name: OPENAI_API_BASE
value: "http://agent-gateway.agentgateway-system.svc.cluster.local:8080/v1"
- name: MCP_SERVER_URL
value: "http://agent-gateway.agentgateway-system.svc.cluster.local:8080/mcp/tools"
resources:
limits:
cpu: "2"
memory: 4Gi
requests:
cpu: "1"
memory: 2Gi