![]()
В предыдущем уроке агенты масштабировались вверх в облако. Этот урок переносит их вниз на одну машину. К концу вы получите рабочего инженерного помощника, который рассуждает, вызывает инструменты, читает ваши файлы и ищет по вашей документации — без единого запроса к облачной инференции.
Почему это может быть нужно? Три причины, которые часто возникают в реальной инженерной работе:
Но при этом вы меняете передовую облачную модель на малую языковую модель (SLM), которая работает на вашем CPU, GPU или NPU. Этот урок расскажет, как строить агентов, которые хороши в таких условиях, а не притворяться, что этих ограничений нет.
В этом уроке вы узнаете:
После завершения урока вы будете знать, как:
Для этого урока предполагается, что вы завершили предыдущие уроки и уверенно работаете с:
Также вам потребуется:
requirements.txt, плюс foundry-local-sdk, openai и chromadb для этого урока.Передовая облачная модель имеет сотни миллиардов параметров и за ней стоит дата-центр. Малые языковые модели имеют несколько миллиардов параметров и должны помещаться в RAM вашего ноутбука. Эта разница задаёт чёткие ожидания.
SLM хорошо справляются с:
SLM менее сильны в:
Выигрышная стратегия для локальных агентов: пусть SLM оркестрирует, а инструменты делают основную работу. Модель не должна знать ваш код — ей нужно знать, когда вызвать read_file и search_docs. Это идеально сочетается с сильными сторонами SLM.
flowchart LR
U[Разработчик] --> A[Локальный агент SLM]
A -->|выбирает инструмент| T1[read_file]
A -->|выбирает инструмент| T2[search_docs RAG]
A -->|выбирает инструмент| T3[analyze_code]
T1 --> A
T2 --> A
T3 --> A
A --> R[Ответ, полностью на устройстве]
Microsoft Foundry Local — лёгкая среда выполнения, которая скачивает, управляет и обслуживает модели полностью на вашей машине. Самая важная для нас функция — это предоставление OpenAI-совместимого HTTP endpoint — значит, OpenAI SDK и OpenAI клиент Microsoft Agent Framework работают с ней, меняя только base_url. Всё, что вы узнали о построении агентов, применяется напрямую; меняется только место endpoint — с облака на localhost.
Foundry Local также автоматически выбирает лучший билд модели под ваше оборудование — CPU, CUDA/GPU или NPU — так что не нужно оптимизировать вручную под каждую машину.
Установите Foundry Local (см. документацию для вашей ОС), затем проверьте, что всё работает:
# Установите (пример; следуйте документации для вашей платформы)
winget install Microsoft.FoundryLocal # Windows
# brew install microsoft/foundrylocal/foundrylocal # macOS
# Загрузите модель Qwen и запустите ее, затем запустите локальный сервис
foundry model run qwen2.5-7b-instruct
foundry service status
После запуска сервиса вы получите локальный OpenAI-совместимый endpoint (обычно http://localhost:PORT/v1). В ноутбуке используется foundry-local-sdk для автоматического обнаружения endpoint, так что не нужно жестко задавать порт.
Агент — только если он умеет вызывать инструменты. Многие SLM умеют чатиться, но генерируют ненадежные, некорректные вызовы. Qwen модели обучены именно для вызова функций и стабильно формируют корректные структуры вызовов — благодаря этому локальный чат-модель превращается в локального агента.
Поток такой же, как знакомый вам цикл вызова инструментов, только выполняется на устройстве:
sequenceDiagram
participant U as Пользователь
participant A as Агент Qwen (локально)
participant T as Локальный инструмент
U->>A: "Что делает auth.py?"
A->>A: Решить: вызвать read_file
A->>T: read_file("auth.py")
T-->>A: содержимое файла
A->>A: Анализ содержимого
A-->>U: Объяснение
Поиск по документации — вот где локальные агенты проявляют себя. Вместо того, чтобы надеяться, что SLM запомнила документацию вашего фреймворка, вы встраиваете эти документы в локальную векторную базу данных и позволяете агенту извлекать нужные куски по запросу.
Мы используем Chroma — встроенное хранилище векторов, которое работает в процессе без необходимости отдельного сервера. Вся цепочка полностью локальна: локальная модель встраивания → локальные векторы → локальный поиск → локальная SLM.
flowchart TB
D[Ваши документы / код] --> E[Локальная модель встраивания]
E --> V[(Chroma векторная БД - на диске)]
Q[Запрос агента] --> QE[Встроить запрос локально]
QE --> V
V -->|топ-k фрагментов| A[Агент Qwen]
A --> Ans[Обоснованный ответ]
Это та же схема Agentic RAG из Урока 5 — единственное отличие, что все компоненты запускаются на вашей машине.
MCP — транспорт, а не облачный сервис. MCP сервер может работать как локальный процесс на stdio, предоставляя инструменты агенту через стандартный протокол. Это позволяет использовать растущую экосистему MCP-серверов — доступ к файловой системе, операции git, запросы к базам — полностью офлайн.
Безопасность отличается от облака, но не отсутствует: локальный MCP-сервер работает с правами вашего пользователя, так что ограничьте область его работы (например, каталог проекта, а не домашнюю папку) и проверяйте его выводы как входные данные.
Локальное первенство не значит только локальное. Зрелые системы маршрутизируют по чувствительности и сложности:
| Ситуация | Где выполняется |
|---|---|
| Чувствительный код/данные или офлайн | Локальная SLM |
| Простейшая, ограниченная задача | Локальная SLM (дешево, быстро) |
| Сложное многошаговое рассуждение на не чувствительных данных | Облачная модель |
| Всё во время отключения связи | Локальная SLM (грейсфул деградация) |
Это отражает идею маршрутизации моделей из Урока 16 — за исключением того, что теперь одна из «моделей» — это ваша собственная машина. Надёжный дизайн переключается на локальную модель при отсутствии облака, так что качество агента падает, но он не выходит из строя.
flowchart LR
Q[Запрос] --> S{Чувствительный или офлайн?}
S -->|да| L[Локальный SLM]
S -->|нет| C{Требуется глубокое рассуждение?}
C -->|нет| L
C -->|да| Cloud[Облачная модель]
L --> Out[Ответ]
Cloud --> Out
Откройте code_samples/17-local-agent-foundry-local.ipynb и пройдите задачу. Вы создадите локального инженерного ассистента, который полностью работает на вашей машине и может:
Ни один запрос на инференцию в облаке не используется.
Ассистент подключается к Foundry Local через OpenAI-совместимый endpoint, так что код агента почти не отличается от уроков с облаком — меняется только клиент:
from foundry_local import FoundryLocalManager
from openai import OpenAI
# Foundry Local обнаруживает/загружает модель и предоставляет нам локальную конечную точку.
manager = FoundryLocalManager(\"qwen2.5-7b-instruct\")
client = OpenAI(base_url=manager.endpoint, api_key=manager.api_key) # api_key — это локальный заполнитель
Инструменты — обычные функции на Python, ограниченные каталогом проекта:
def read_file(path: str) -> str:
\"\"\"Read a file, but only inside the sandboxed project directory.\"\"\"
full = (PROJECT_ROOT / path).resolve()
if PROJECT_ROOT not in full.parents and full != PROJECT_ROOT:
return \"Access denied: path is outside the project directory.\"
return full.read_text(encoding=\"utf-8\")
Обратите внимание на проверку песочницы — даже локально инструмент, читающий произвольные пути, представляет риск. Ноутбук ограничивает каждый инструмент корнем одного проекта.
Проверьте свои знания перед выполнением задания.
1. Назовите две конкретных причины запускать агента локально, а не в облаке.
2. Какое рекомендуемое распределение обязанностей между SLM и инструментами в локальном агенте и почему?
3. Что позволяет повторно использовать облачный код агента с Foundry Local?
4. Почему мы используем именно функцию вызова модели Qwen, а не любую SLM?
5. Какие компоненты локального конвейера RAG запускаются на машине?
6. Локальный MCP-сервер работает на вашей машине. Значит ли это, что он автоматически безопасен? Какие меры предосторожности следует соблюдать?
7. Опишите разумное правило гибридного маршрутизации, включающее локальную модель.
8. Какой реалистичный минимум ОЗУ для запуска локального агента из этого урока и что даёт больше памяти?
Расширьте локального инженерного ассистента до локального обозревателя документации для небольшого проекта на ваш выбор (можно использовать одну из папок уроков этого репозитория).
Ваша работа должна:
Добавить инструмент find_todos, который сканирует проект на наличие комментариев TODO/FIXME и возвращает их с указанием файла и номера строки — с той же проверкой песочницы, что и у read_file.
Затем напишите короткий абзац о том, что бы вы перенесли в облако, а что оставили бы локально для этого рецензента, и почему. Оценивается, правильно ли связаны локальные компоненты и насколько логичен ваш гибридный подход — а не качество модели.
В этом уроке вы создали агента, который полностью работает на вашем собственном компьютере:
Это завершает цикл развертывания: Урок 16 масштабировал агентов в Microsoft Foundry, а этот урок масштабировал их вниз на одну рабочую станцию. Следующий урок посвящён безопасности развернутых агентов.
Развёртывание масштабируемых агентов
Обеспечение безопасности AI агентов
Отказ от ответственности: Этот документ был переведен с использованием сервиса машинного перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.