[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"portal-settings:stajic:ru":3,"public-menus:all":38,"post:ollama-is-not-the-product-building-production-ready-open-llm-applications:ru":221,"related:post:ollama-is-not-the-product-building-production-ready-open-llm-applications:ru:1":1201},{"statusCode":4,"data":5,"message":37},200,{"tenantId":6,"lang":7,"defaultLang":8,"siteUrl":9,"contactEmail":10,"brandName":11,"logoUrl":12,"siteName":11,"siteDescription":13,"ogImage":10,"robotsIndex":14,"socialLinks":10,"reservedSlugs":10,"seoPolicy":15},"stajic","ru","de","https:\u002F\u002Fstajic.de",null,"Stajic Platform","\u002FLogo_Planet.svg","Stajic Portal",true,{"branding":16,"relatedContent":17,"crossDomainLinks":18},{"logoUrl":12},{"enabled":14},[19,22,25,28,31,34],{"url":20,"label":21,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Ffigure.rocks","figure.rocks",{"url":23,"label":24,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Floving.rocks","loving.rocks",{"url":26,"label":27,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.com","bazify.com",{"url":29,"label":30,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.de","bazify.de",{"url":32,"label":33,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.at","bazify.at",{"url":35,"label":36,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.ba","bazify.ba","Portal settings resolved",[39,45],{"id":40,"name":41,"location":42,"isActive":14,"isDefault":43,"items":44},1,"main-navigation","header",false,[],{"id":46,"name":47,"location":48,"isActive":14,"isDefault":14,"items":49},4,"main-menu","sidebar",[50,66,79,93,103,118,133],{"id":51,"title":52,"url":60,"target":61,"icon":62,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":64,"portfolioId":10,"children":65},"item-18",{"de":53,"en":54,"es":55,"fr":56,"it":54,"ru":57,"sr":58,"zh":59},"Startseite","Home","Inicio","Accueil","Главная","Почетна","首页","\u002Ffull-stack-web-developer-munich-performance-seo-and-maintainable-builds","_self","i-lucide-home","page",111,[],{"id":67,"title":68,"url":75,"target":61,"icon":76,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":77,"portfolioId":10,"children":78},"item-22",{"de":69,"en":69,"es":70,"fr":69,"it":71,"ru":72,"sr":73,"zh":74},"Vision","Visión","Visione","Видение","Визија","想象","\u002Fueber-uns-webdesign-muenchen-webaplikation","i-lucide-eye",113,[],{"id":80,"title":81,"url":89,"target":61,"icon":90,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":91,"portfolioId":10,"children":92},"item-19",{"de":82,"en":83,"es":84,"fr":83,"it":85,"ru":86,"sr":87,"zh":88},"Leistungen","Services","Servicios","Servizi","Услуги","Услуге","服务","\u002Fservices-dienstleistungen-muenchen","i-lucide-wrench",116,[],{"id":94,"title":95,"url":99,"target":61,"icon":100,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":101,"portfolioId":10,"children":102},"item-23",{"de":96,"en":96,"es":96,"fr":96,"it":96,"ru":97,"sr":97,"zh":98},"Blog","Блог","博客","\u002Fblog","i-lucide-book-open",112,[],{"id":104,"title":105,"url":114,"target":61,"icon":115,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":116,"portfolioId":10,"children":117},"item-32",{"de":106,"en":107,"es":108,"fr":109,"it":110,"ru":111,"sr":112,"zh":113},"Neue Technologien","New Technologies","Nuevas tecnologías","Nouvelles technologies","Nuove tecnologie","Новые технологии","Нове технологије","新技术！","\u002Fneue-webtechnologien","i-lucide-sparkles",122,[],{"id":119,"title":120,"url":129,"target":61,"icon":130,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":131,"portfolioId":10,"children":132},"item-20",{"de":121,"en":122,"es":123,"fr":124,"it":125,"ru":126,"sr":127,"zh":128},"Kontakt","Contact us!","Contacto","Contact","Contatto","Контакт","Контактирајте нас","联系我们！","\u002Fcontact","i-lucide-mail",115,[],{"id":134,"title":135,"url":144,"target":61,"icon":145,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":146,"portfolioId":10,"children":147},"item-21",{"de":136,"en":137,"es":138,"fr":139,"it":140,"ru":141,"sr":142,"zh":143},"Unsere Arbeit","Our Work","Nuestro trabajo","Nos réalisations","I nostri lavori","Наши работы","Наши радови","文件夹","\u002Fportfolio","i-lucide-briefcase",114,[148,161,175,191,206],{"id":149,"title":150,"url":144,"target":61,"icon":159,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":146,"portfolioId":10,"children":160},"item-24",{"de":151,"en":152,"es":153,"fr":154,"it":155,"ru":156,"sr":157,"zh":158},"Alle Projekte","All Projects","Todos los proyectos","Tous les projets","Tutti i progetti","Все проекты","Сви пројекти","所有项目","i-lucide-grid-3x3",[],{"id":162,"title":163,"url":171,"target":61,"icon":172,"isActive":14,"type":173,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":10,"children":174},"item-29",{"de":164,"en":165,"es":166,"fr":167,"it":168,"ru":169,"sr":170,"zh":143},"Local Roots, Global Reach","Local Roots - Global Reach","Empresa local ","Entreprise locale","Azienda locale","Местная компания","Локално предузеће глобално тржиште","\u002Fportfolio\u002Flocal-roots-global-reach-communication-media-systems-for-modern-business","i-lucide-globe-2","custom",[],{"id":176,"title":177,"url":186,"target":61,"icon":187,"isActive":14,"type":188,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":189,"children":190},"menu-2916d060-8681-482a-af9a-c107a8bc30d8",{"de":178,"en":179,"es":180,"fr":181,"it":182,"ru":183,"sr":184,"zh":185},"Von Rohdaten zu verifizierbarem KI-Kontext: Eine praktische Architektur für agentenbereite Informationen","From Raw Data to Verifiable AI Context:","De datos sin procesar a contexto de IA verificable: una arquitectura práctica para información lista para agentes","Des données brutes au contexte d'IA vérifiable : une architecture pratique pour des informations prêtes pour les agents","Dai dati grezzi a un contesto IA verificabile: Un'architettura pratica per informazioni pronte per gli agenti","От необработанных данных к верифицируемому контексту ИИ: практическая архитектура информации, готовой для агентов","Od sirovih podataka do proverljivog AI konteksta: Praktična arhitektura za informacije spremne za agente","从原始数据到可验证的 AI 上下文：面向智能体就绪信息的实用架构","\u002Fportfolio\u002Ffrom-raw-data-to-verifiable-ai-context-a-practical-architecture-for-agent-ready-information","i-lucide-database","portfolio",22,[],{"id":192,"title":193,"url":202,"target":61,"icon":203,"isActive":14,"type":188,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":204,"children":205},"menu-e2061cd7-ff53-49d5-a0e8-3d49090577c0",{"de":194,"en":195,"es":196,"fr":197,"it":198,"ru":199,"sr":200,"zh":201},"Präsenzplattformen — Unternehmenskommunikation","Presence Platforms — Enterprise Communication","Plataformas de presencia — Comunicación empresarial","Plateformes de présence — Communication d'entreprise","Presence Platforms — Comunicazione aziendale","Платформы присутствия — Корпоративные коммуникации","Presence platforme — Poslovna komunikacija","Presence 平台 — 企业通信","\u002Fportfolio\u002Fpresence-platforms-enterprise-communication-that-wins-without-competing","i-lucide-badge-percent",21,[],{"id":207,"title":208,"url":217,"target":61,"icon":218,"isActive":14,"type":188,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":219,"children":220},"menu-a781582e-e90d-418e-b8c9-b070bc37c37e",{"de":209,"en":210,"es":211,"fr":212,"it":213,"ru":214,"sr":215,"zh":216},"Maximierung des POS-ROI durch Konsistenz","Maximizing POS ROI Through Consistent","Maximizar el ROI del POS a través de constante","Maximiser le ROI du PDV grâce à la cohérence","Massimizzare il ROI del POS attraverso costante","Максимизация ROI POS за счет последовательного","Maksimizacija POS ROI-ja kroz dosledno","通过持续最大化 POS 投资回报率","\u002Fportfolio\u002Ffrom-vision-to-value-maximizing-pos-roi-through-consistent-ci-creation-and-strategic-branding","i-lucide-briefcase-business",11,[],{"statusCode":4,"data":222,"message":1200},{"id":223,"title":224,"slug":225,"content":226,"contentJson":227,"excerpt":626,"featuredImage":627,"featuredImageAlt":628,"featuredImageCaption":10,"featuredImageTitle":10,"featuredImageCopyright":10,"featuredImageAuthor":10,"featuredImageSourceUrl":10,"featuredImageLicense":10,"featuredImageIsAiGenerated":43,"status":629,"publishedAt":630,"createdAt":631,"updatedAt":632,"seoLocalePaths":633,"categories":642,"author":663,"translations":668},"459","Ollama — это не продукт: создание готовых к продакшену приложений на базе открытых LLM","ollama-is-not-the-product-building-production-ready-open-llm-applications","\u003Ch1>Ollama — это не продукт: создание готовых к эксплуатации приложений на основе открытых LLM\u003C\u002Fh1>\n\u003Cp>Такие инструменты, как \u003Cb>Ollama\u003C\u002Fb>, сделали локальное экспериментирование с LLM почти беспрепятственным. Установите среду выполнения, загрузите модель, отправьте запрос — и локальный ассистент ответит через секунды. Это полезно. Но это также самая простая часть пути.\u003C\u002Fp>\n\u003Cp>Демонстрация в терминале — это не приложение. Локальная модель — это не продукт. Продуктивное приложение на основе открытых LLM требует контролируемого приема данных, поиска, разграничения прав доступа, оценки, логирования, абстракции провайдера, дисциплины развертывания и пользовательского рабочего процесса, решающего реальную бизнес-задачу.\u003C\u002Fp>\n\u003Cp>Основной тезис прост: \u003Cb>Ollama — это среда выполнения, а не продукт\u003C\u002Fb>. Продукт находится на уровне приложения вокруг модели. Этот уровень определяет, какие документы видны, какие фрагменты извлекаются, какие подсказки используются, как оцениваются ответы, как регистрируются сбои и можно ли доверять системе в повседневной работе.\u003C\u002Fp>\n\u003Cp>Именно здесь локальный ИИ становится интересным для команд, создающих частных ассистентов, инструменты внутреннего знания, SaaS-функции с поддержкой LLM или корпоративных помощников рабочих процессов. Модель может работать локально, но конфиденциальность, надежность и бизнес-ценность существуют только при правильной инженерии всей системы.\u003C\u002Fp>\n\u003Ch2>Ollama — это среда выполнения, а не продукт\u003C\u002Fh2>\n\u003Cp>Ollama отлично подходит для запуска и обслуживания открытых моделей локально. Он особенно силен для исследований, рабочих процессов разработчиков, PoC и команд, которые хотят протестировать поведение модели, не привязываясь сразу к облачному провайдеру. Он предоставляет локальное взаимодействие с моделью через API и уровни совместимости, упрощающие подключение существующих инструментов в стиле OpenAI.\u003C\u002Fp>\n\u003Cp>Это не означает, что Ollama решает проблему приложения. Он не знает автоматически, какие корпоративные документы может читать пользователь. Он не создает изоляцию арендаторов, версионирование документов, аудиторские следы, атрибуцию источников, наборы данных для оценки или бизнес-специфичные пользовательские интерфейсы. Эти обязанности остаются на уровне архитектуры приложения.\u003C\u002Fp>\n\u003Cul>\u003Cli>\u003Cb>Ollama помогает с:\u003C\u002Fb> локальным выполнением модели, быстрым экспериментированием, доступом к модели через API, PoC без подключения к сети и производительностью разработчика.\u003C\u002Fli>\u003Cli>\u003Cb>Ollama не решает самостоятельно:\u003C\u002Fb> контроль доступа, качество RAG, жизненный цикл документов, границы арендаторов, оценку, аудит логирования, мониторинг, поведение при сбоях или проектирование корпоративных рабочих процессов.\u003C\u002Fli>\u003Cli>\u003Cb>Архитектурная ошибка:\u003C\u002Fb> рассматривать локальный вывод как уже готовый безопасный ИИ-продукт.\u003C\u002Fli>\u003C\u002Ful>\n\u003Cblockquote class=\"border-l-4 border-gray-300 pl-4 italic\">Модель — это самая простая часть. Уровень приложения — вот где живет ценность продукта.\u003Ccite class=\"block mt-2 text-sm\">— Архитектурный принцип\u003C\u002Fcite>\u003C\u002Fblockquote>\n\u003Ch2>Демо, PoC и эксплуатация — это разные этапы\u003C\u002Fh2>\n\u003Cp>Многие инициативы с открытыми LLM терпят неудачу, потому что команды путают работающее демо с производственной возможностью. Разница не косметическая. Каждый уровень зрелости имеет свою цель, свой профиль рисков и свои инженерные требования.\u003C\u002Fp>\n\u003Ctable class=\"w-full border-collapse\">\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Этап\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Что он доказывает\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Типичная настройка\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Чего еще не хватает\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Демо\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Модель может ответить на запрос локально.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ollama на ноутбуке, одна модель, один запрос, без реального контроля данных.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Права доступа, поиск, логи, оценка, развертывание, мониторинг, пользовательский рабочий процесс.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">PoC\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Небольшая контролируемая система может отвечать на вопросы по выбранным документам или рабочим процессам.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Базовый веб-интерфейс, скрипт приема, векторный поиск, ограниченное число пользователей, ограниченный объем документов.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Масштабирование, управление, тестовые наборы данных, стратегия отката, аудируемость, модель поддержки.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Эксплуатация\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Множество пользователей могут безопасно и многократно использовать систему в реальной работе.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Приложение с аутентификацией, изоляция арендаторов, конвейер RAG, наблюдаемость, абстракция провайдера, резервное копирование, процесс релиза.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Непрерывное улучшение, расширение оценки, операционная зрелость.\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftable>\n\u003Cp>PoC может быть намеренно небольшим. Эксплуатация не может быть намеренно слепой. Как только в систему попадают реальные пользователи, частные данные, бизнес-решения и требования соответствия, архитектура должна стать явной.\u003C\u002Fp>\n\u003Ch2>Где здесь место RAG\u003C\u002Fh2>\n\u003Cp>\u003Cb>Retrieval-Augmented Generation\u003C\u002Fb> — это самый распространенный мост между языковой моделью и частными бизнес-знаниями. Модель не знает магическим образом внутренние документы, контракты, тикеты, спецификации продуктов или инструкции. Приложение должно извлечь соответствующий контекст, прежде чем попросить модель ответить.\u003C\u002Fp>\n\u003Cp>Практический поток RAG выглядит так:\u003C\u002Fp>\n\u003Col>\u003Cli>Документы загружаются или синхронизируются из контролируемых источников.\u003C\u002Fli>\u003Cli>Текст извлекается, очищается и разбивается на фрагменты.\u003C\u002Fli>\u003Cli>Фрагменты получают метаданные, такие как арендатор, владелец, версия документа, URL источника, область доступа и временная метка.\u003C\u002Fli>\u003Cli>Для каждого фрагмента генерируются эмбеддинги.\u003C\u002Fli>\u003Cli>Векторы сохраняются в pgvector, Qdrant или другом уровне поиска.\u003C\u002Fli>\u003Cli>Во время запроса приложение проверяет права доступа перед поиском.\u003C\u002Fli>\u003Cli>Соответствующие фрагменты извлекаются с помощью поиска по сходству и фильтров метаданных.\u003C\u002Fli>\u003Cli>Конструктор подсказок внедряет выбранный контекст в запрос к модели.\u003C\u002Fli>\u003Cli>Ответ генерируется с цитатами, границами уверенности и откатом «нет ответа» при слабом поиске.\u003C\u002Fli>\u003C\u002Fol>\n\u003Cp>RAG снижает галлюцинации, но не устраняет их полностью. Плохая стратегия разбиения на чанки, слабые метаданные, отсутствие фильтров разрешений, низкокачественные эмбеддинги или слишком широкий поиск все еще могут приводить к убедительным, но неверным ответам. Серьезные RAG-системы требуют пороговых значений, цитирований, журналов поиска и оценки.\u003C\u002Fp>\n\u003Ch2>Практическая локальная архитектура Open-LLM\u003C\u002Fh2>\n\u003Cp>Реалистичный путь к продакшену не требует экзотической инфраструктуры. Для многих команд надежная первая архитектура может использовать обычный веб-стек: Nuxt для фронтенда, Nitro или Node API, PostgreSQL в качестве основной базы данных, pgvector для поиска, Ollama как локальную среду выполнения, Prisma для доступа к данным и фоновые воркеры для загрузки и создания эмбеддингов.\u003C\u002Fp>\n\u003Cpre class=\"code-block\">\u003Ccode>Вопрос пользователя | v\nПользовательский интерфейс | v\nAPI \u002F Бэкенд | +--&gt; Аутентификация +--&gt; Проверка прав арендатора и роли | v\nУровень поиска | +--&gt; Метаданные PostgreSQL +--&gt; pgvector или Qdrant векторный поиск +--&gt; Порог схожести | v\nПостроитель промптов | +--&gt; системный промпт +--&gt; найденные чанки +--&gt; ссылки на источники +--&gt; правила отсутствия ответа | v\nАбстракция LLM-провайдера | +--&gt; Ollama \u002F локальная модель +--&gt; запасной облачный провайдер +--&gt; будущая собственная среда выполнения | v\nОтвет с источниками | v\nЛоги, трассировки, метрики, набор данных для оценки\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Эта архитектура сохраняет модель заменяемой. Ollama может быть первой средой выполнения, но система не должна быть привязана к одному движку вывода. Чистая архитектура разделяет пользовательский рабочий процесс, поиск, построение промптов, провайдера модели и наблюдаемость.\u003C\u002Fp>\n\u003Cul>\u003Cli>\u003Cb>Фронтенд:\u003C\u002Fb> Nuxt или другой веб-интерфейс для аутентифицированных пользовательских рабочих процессов.\u003C\u002Fli>\u003Cli>\u003Cb>Бэкенд\u002FAPI:\u003C\u002Fb> Nitro, Node.js или FastAPI для оркестрации, разрешений и маршрутизации провайдеров.\u003C\u002Fli>\u003Cli>\u003Cb>База данных:\u003C\u002Fb> PostgreSQL для документов, пользователей, арендаторов, ролей, промптов, логов и метаданных.\u003C\u002Fli>\u003Cli>\u003Cb>Векторный поиск:\u003C\u002Fb> pgvector для простого интегрированного поиска или Qdrant, когда векторный поиск становится выделенным сервисом.\u003C\u002Fli>\u003Cli>\u003Cb>Среда выполнения модели:\u003C\u002Fb> Ollama для локального выполнения, сервер llama.cpp для легковесного обслуживания или vLLM для высокопроизводительного обслуживания на GPU.\u003C\u002Fli>\u003Cli>\u003Cb>Хранилище:\u003C\u002Fb> локальная файловая система или S3-совместимое объектное хранилище для загруженных файлов и извлеченных артефактов.\u003C\u002Fli>\u003Cli>\u003Cb>Воркеры:\u003C\u002Fb> фоновая загрузка, разбиение на чанки, создание эмбеддингов, переиндексация и обработка версий документов.\u003C\u002Fli>\u003Cli>\u003Cb>Наблюдаемость:\u003C\u002Fb> логи, метрики, трассировки промптов, трассировки поиска, отслеживание задержек и результаты оценки.\u003C\u002Fli>\u003C\u002Ful>\n\u003Ch2>Контрольный список готовности к продакшену\u003C\u002Fh2>\n\u003Cp>Следующий контрольный список — это разница между демо-версией локальной модели и работоспособным приложением Open-LLM:\u003C\u002Fp>\n\u003Cul>\u003Cli>Каждый документ и чанк имеют tenant_id.\u003C\u002Fli>\u003Cli>Поиск блокируется до проверки прав пользователя и роли.\u003C\u002Fli>\u003Cli>Документы включают метаданные, источник, владельца, версию, состояние жизненного цикла и политику хранения.\u003C\u002Fli>\u003Cli>Стратегия разбиения на чанки документирована и протестирована на реальных документах.\u003C\u002Fli>\u003Cli>Выбор модели эмбеддингов явный и версионированный.\u003C\u002Fli>\u003Cli>Конфигурация векторного индекса воспроизводима.\u003C\u002Fli>\u003Cli>Порог схожести предотвращает слепое использование слабого контекста.\u003C\u002Fli>\u003Cli>Ответы включают цитирование источников или ссылки на источники, где это возможно.\u003C\u002Fli>\u003Cli>Используется запасной вариант «нет ответа», когда уверенность в поиске слишком низка.\u003C\u002Fli>\u003Cli>Шаблоны промптов версионированы и контролируются при выпуске.\u003C\u002Fli>\u003Cli>Абстракция LLM-провайдера создается с самого начала.\u003C\u002Fli>\u003Cli>Структурированный вывод проверяется перед использованием в дальнейшем.\u003C\u002Fli>\u003Cli>Набор данных для оценки содержит реальные вопросы, ожидаемые источники и неприемлемые ответы.\u003C\u002Fli>\u003Cli>Журналы поиска показывают, какие чанки были использованы для каждого ответа.\u003C\u002Fli>\u003Cli>Мониторинг задержек, использования токенов, нагрузки GPU\u002FCPU и частоты ошибок.\u003C\u002Fli>\u003Cli>Правила конфиденциальности и хранения охватывают загрузки, извлеченный текст, чанки, эмбеддинги, промпты, ответы и логи.\u003C\u002Fli>\u003Cli>Документированы пути развертывания, резервного копирования, восстановления, отката и инцидентов.\u003C\u002Fli>\u003C\u002Ful>\n\u003Cp>Это напрямую связано с \u003Ca href=\"\u002Fru\u002Fenterprise\">Enterprise Delivery OS\u003C\u002Fa>: полезный ИИ — это не только решение о модели. Это дисциплина доставки, доказательства, контроль, метрики и операционная ответственность.\u003C\u002Fp>\n\u003Ch2>Абстракция провайдера: не привязывайтесь к одной модели\u003C\u002Fh2>\n\u003Cp>Локальные модели ценны для случаев, чувствительных к конфиденциальности, офлайн-сценариев, контроля затрат и внутренних экспериментов. Облачные модели могут быть более сильными для сложных рассуждений, программирования, многоязычной точности или мультимодальной работы. Продакшен-приложение не должно рассматривать ни одну модель как постоянную инфраструктуру.\u003C\u002Fp>\n\u003Cp>Абстракция провайдера позволяет одному и тому же рабочему процессу приложения вызывать Ollama, OpenAI, Gemini, Anthropic, Mistral, vLLM или другую собственную конечную точку без переписывания продукта. Приложение выбирает провайдера на основе варианта использования, чувствительности данных, задержки, стоимости и требований к качеству.\u003C\u002Fp>\n\u003Cpre class=\"code-block\">\u003Ccode>type LlmProvider = &quot;ollama&quot; | &quot;openai&quot; | &quot;gemini&quot; | &quot;anthropic&quot; | &quot;vllm&quot;; type ChatInput = { provider: LlmProvider; model: string; tenantId: string; userId: string; question: string; context: Array&lt;{ chunkId: string; sourceTitle: string; text: string; }&gt;;\n}; async function chat(input: ChatInput) { await assertUserCanAccessContext(input.userId, input.context); const messages = buildRagMessages({ question: input.question, context: input.context, rules: [ &quot;Отвечай только на основе предоставленного контекста, когда это возможно.&quot;, &quot;Указывай названия источников.&quot;, &quot;Сообщай, когда контекста недостаточно.&quot; ] }); return llm.chat({ provider: input.provider, model: input.model, messages, trace: { tenantId: input.tenantId, userId: input.userId, promptVersion: &quot;rag-v3.2&quot; } });\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Ключевая идея не в синтаксисе TypeScript. Ключевая идея — это граница. Приложение владеет разрешениями, поиском, правилами промптов, трассировкой и оценкой. Провайдер только генерирует вывод модели.\u003C\u002Fp>\n\u003Ch2>pgvector против Qdrant\u003C\u002Fh2>\n\u003Cp>Для многих приложений Open-LLM решение о векторном хранилище вначале простое: если PostgreSQL уже является вашей основной системой, \u003Cb>pgvector\u003C\u002Fb> — это хорошая отправная точка. Он держит метаданные, разрешения, записи документов и векторы рядом. Это снижает операционную сложность.\u003C\u002Fp>\n\u003Cp>\u003Cb>Qdrant\u003C\u002Fb> становится более привлекательным, когда векторный поиск должен стать выделенным сервисом: больший масштаб поиска, расширенная фильтрация, специализированная индексация, гибридные шаблоны поиска или независимое масштабирование инфраструктуры поиска.\u003C\u002Fp>\n\u003Ctable class=\"w-full border-collapse\">\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Вариант\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Наилучшее применение\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Сильные стороны\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Компромиссы\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">pgvector\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">PoC, ранний продакшн, системы, уже построенные на PostgreSQL.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Единая база данных, SQL-соединения, ACID-поведение, более простое управление, метаданные рядом с векторами.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Менее специализирован, чем выделенная векторная база данных при больших масштабах поиска.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Qdrant\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Выделенные сервисы семантического поиска, большие векторные нагрузки, расширенные фильтрация и шаблоны поиска.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Целенаправленный векторный поиск, мощная модель фильтрации, независимое масштабирование, API, ориентированные на поиск.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Добавляет еще один компонент инфраструктуры и операционную поверхность.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Начните с простого\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Большинство корпоративных команд, начинающих с частных RAG-приложений.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Меньший архитектурный риск, более быстрая доставка, более легкий путь аудита.\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Может потребоваться миграция позже, если поиск станет центральным и высокомасштабным.\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftable>\n\u003Cp>Практическое правило: начинайте с pgvector, когда PostgreSQL уже управляет вашими бизнес-данными, а масштаб поиска умеренный. Переходите на Qdrant, когда векторный поиск становится самостоятельной продуктовой возможностью.\u003C\u002Fp>\n\u003Ch2>Проверка безопасности и конфиденциальности\u003C\u002Fh2>\n\u003Cp>Локальный вывод не означает автоматически безопасный ИИ. Это означает только то, что выполнение модели может происходить локально. Полный путь данных все еще важен: загруженные файлы, извлеченный текст, чанки, эмбеддинги, логи, подсказки, ответы, резервные копии, доступ разработчиков, инструменты администрирования и экспорт аналитики.\u003C\u002Fp>\n\u003Cp>Эмбеддинги также требуют внимания. Они не являются исходным документом, но все же представляют информацию, полученную из конфиденциального контента. Относитесь к ним как к части защищенного пути данных, особенно когда они связаны с метаданными, исходными записями, пользовательскими запросами или идентификаторами арендаторов.\u003C\u002Fp>\n\u003Cul>\u003Cli>Не индексируйте документы, пока не известны правила доступа.\u003C\u002Fli>\u003Cli>Не извлекайте чанки без фильтров по арендатору и роли.\u003C\u002Fli>\u003Cli>Не логируйте полные подсказки и ответы без правил хранения.\u003C\u002Fli>\u003Cli>Не отправляйте конфиденциальный контекст в облачную модель, если политика этого не разрешает.\u003C\u002Fli>\u003Cli>Не предполагайте, что локальное равно GDPR-совместимому; соответствие зависит от полного дизайна обработки.\u003C\u002Fli>\u003Cli>Не позволяйте копиям для оценки и отладки стать неконтролируемыми теневыми наборами данных.\u003C\u002Fli>\u003C\u002Ful>\n\u003Cp>Вот где \u003Ca href=\"\u002Fru\u002Fblog\u002Fenterprise-grade-multi-tenant-architecture-for-an-international-platform\">многоэкземплярная SaaS-архитектура\u003C\u002Fa> имеет значение. Если арендаторы, роли, владение данными и операционные границы слабы, добавление локальной LLM может усилить риск вместо его снижения.\u003C\u002Fp>\n\u003Ch2>Оценка не является опциональной\u003C\u002Fh2>\n\u003Cp>Продуктовое Open-LLM приложение нуждается в цикле оценки. Без него у команд есть только анекдоты. Несколько хороших демо-ответов не доказывают, что поиск работает, что подсказка стабильна или что модель ведет себя безопасно в реальном использовании.\u003C\u002Fp>\n\u003Cp>Минимальный набор данных для оценки должен включать реальные вопросы пользователей, ожидаемые исходные документы, неприемлемые ответы, случаи без ответа и регрессионные тесты для предыдущих сбоев. Каждое изменение в чанкинге, эмбеддингах, подсказках, провайдере модели или пороге поиска должно тестироваться на этом наборе данных.\u003C\u002Fp>\n\u003Cul>\u003Cli>\u003Cb>Оценка поиска:\u003C\u002Fb> Получила ли система правильные исходные чанки?\u003C\u002Fli>\u003Cli>\u003Cb>Оценка ответа:\u003C\u002Fb> Остался ли ответ в рамках извлеченного контекста?\u003C\u002Fli>\u003Cli>\u003Cb>Оценка безопасности:\u003C\u002Fb> Избежала ли система запрещенных разглашений или несанкционированных данных?\u003C\u002Fli>\u003Cli>\u003Cb>Операционная оценка:\u003C\u002Fb> Остались ли задержка, частота сбоев и стоимость в допустимых пределах?\u003C\u002Fli>\u003Cli>\u003Cb>Регрессионная оценка:\u003C\u002Fb> Привело ли обновление модели или подсказки к нарушению ранее корректного поведения?\u003C\u002Fli>\u003C\u002Ful>\n\u003Cp>RAG уменьшает галлюцинации, но не устраняет необходимость в оценке. Оценка — это контур управления, который превращает умный прототип в улучшающийся продукт.\u003C\u002Fp>\n\u003Ch2>Дисциплина развертывания: Модель — это событие релиза\u003C\u002Fh2>\n\u003Cp>Смена модели — это не безобидная настройка конфигурации. Она может изменить стиль ответа, поведение рассуждения, качество языка, задержку, использование токенов, дисциплину цитирования и режимы сбоев. В продакшне обновления модели должны обрабатываться как события релиза.\u003C\u002Fp>\n\u003Cp>Это означает версионирование подсказок, моделей эмбеддингов, настроек поиска, идентификаторов моделей, маршрутов провайдеров и результатов оценки. Это также означает наличие логики отката. Если новая модель вызывает ухудшение ответов, основанных на поиске, или нарушает структурированный вывод, системе нужен контролируемый путь возврата к известной рабочей конфигурации.\u003C\u002Fp>\n\u003Cp>Это соответствует той же операционной логике, что и \u003Ca href=\"\u002Fru\u002Fenterprise\u002Freference-models\u002Fdelivery-and-change\">Доставка и изменения\u003C\u002Fa> и \u003Ca href=\"\u002Fru\u002Fenterprise\u002Freference-models\u002Fdigital-platform\">Архитектура платформы, готовой к ИИ\u003C\u002Fa>: стабильная доставка требует повторяемых контролей, а не героических ручных исправлений.\u003C\u002Fp>\n\u003Ch2>Заключение: Продакшн начинается там, где заканчивается демо\u003C\u002Fh2>\n\u003Cp>Ollama может начать путь. Он делает локальное выполнение модели доступным и снижает барьер для экспериментов. Это ценно. Но продуктовое приложение начинается там, где заканчивается демо.\u003C\u002Fp>\n\u003Cp>Модель — это лишь один заменяемый компонент. Настоящий продукт — это управляемая система вокруг нее: сбор данных, права доступа, извлечение, промпты, маршрутизация провайдеров, оценка, логи, мониторинг, развертывание, резервное копирование и пользовательский рабочий процесс. Именно там конфиденциальность становится реальной, качество — измеримым, а бизнес-ценность — воспроизводимой.\u003C\u002Fp>\n\u003Cp>Серьезное приложение на базе Open-LLM строится на основе инженерной дисциплины, а не просто разовым запуском локальной модели. Ollama может положить начало этому пути, но промышленное приложение начинается там, где заканчивается демо-версия.\u003C\u002Fp>\n\u003Cp>Тема:\u003C\u002Fp>\n\u003Cp>Ollama, Open LLM, RAG, pgvector, Qdrant, Local AI, LLMOps, абстракция провайдеров, корпоративная архитектура ИИ\u003C\u002Fp>",{"time":228,"blocks":229,"version":625},1782680211700,[230,235,241,246,251,256,262,267,272,283,291,296,301,327,332,337,342,347,364,369,374,379,385,390,404,409,414,437,442,447,452,457,462,467,472,477,482,507,512,517,522,527,539,544,549,554,559,570,575,580,585,590,595,600,605,610,615,620],{"id":231,"data":232,"type":42,"tunes":234},"HsB_-_Sdzh",{"text":233,"level":40},"Ollama — это не продукт: создание готовых к эксплуатации приложений на основе открытых LLM",{},{"id":236,"data":237,"type":239,"tunes":240},"G_FTnJiMVo",{"text":238},"Такие инструменты, как \u003Cb>Ollama\u003C\u002Fb>, сделали локальное экспериментирование с LLM почти беспрепятственным. Установите среду выполнения, загрузите модель, отправьте запрос — и локальный ассистент ответит через секунды. Это полезно. Но это также самая простая часть пути.","paragraph",{},{"id":242,"data":243,"type":239,"tunes":245},"fVa1sJxmy6",{"text":244},"Демонстрация в терминале — это не приложение. Локальная модель — это не продукт. Продуктивное приложение на основе открытых LLM требует контролируемого приема данных, поиска, разграничения прав доступа, оценки, логирования, абстракции провайдера, дисциплины развертывания и пользовательского рабочего процесса, решающего реальную бизнес-задачу.",{},{"id":247,"data":248,"type":239,"tunes":250},"f6EzZPNhRc",{"text":249},"Основной тезис прост: \u003Cb>Ollama — это среда выполнения, а не продукт\u003C\u002Fb>. Продукт находится на уровне приложения вокруг модели. Этот уровень определяет, какие документы видны, какие фрагменты извлекаются, какие подсказки используются, как оцениваются ответы, как регистрируются сбои и можно ли доверять системе в повседневной работе.",{},{"id":252,"data":253,"type":239,"tunes":255},"wjgsXAJQ-i",{"text":254},"Именно здесь локальный ИИ становится интересным для команд, создающих частных ассистентов, инструменты внутреннего знания, SaaS-функции с поддержкой LLM или корпоративных помощников рабочих процессов. Модель может работать локально, но конфиденциальность, надежность и бизнес-ценность существуют только при правильной инженерии всей системы.",{},{"id":257,"data":258,"type":42,"tunes":261},"NnYUiRBtwJ",{"text":259,"level":260},"Ollama — это среда выполнения, а не продукт",2,{},{"id":263,"data":264,"type":239,"tunes":266},"nVrpsWCll3",{"text":265},"Ollama отлично подходит для запуска и обслуживания открытых моделей локально. Он особенно силен для исследований, рабочих процессов разработчиков, PoC и команд, которые хотят протестировать поведение модели, не привязываясь сразу к облачному провайдеру. Он предоставляет локальное взаимодействие с моделью через API и уровни совместимости, упрощающие подключение существующих инструментов в стиле OpenAI.",{},{"id":268,"data":269,"type":239,"tunes":271},"_aQOCMkaG8",{"text":270},"Это не означает, что Ollama решает проблему приложения. Он не знает автоматически, какие корпоративные документы может читать пользователь. Он не создает изоляцию арендаторов, версионирование документов, аудиторские следы, атрибуцию источников, наборы данных для оценки или бизнес-специфичные пользовательские интерфейсы. Эти обязанности остаются на уровне архитектуры приложения.",{},{"id":273,"data":274,"type":281,"tunes":282},"jeeZbnQvh7",{"meta":275,"items":276,"style":280},{},[277,278,279],"\u003Cb>Ollama помогает с:\u003C\u002Fb> локальным выполнением модели, быстрым экспериментированием, доступом к модели через API, PoC без подключения к сети и производительностью разработчика.","\u003Cb>Ollama не решает самостоятельно:\u003C\u002Fb> контроль доступа, качество RAG, жизненный цикл документов, границы арендаторов, оценку, аудит логирования, мониторинг, поведение при сбоях или проектирование корпоративных рабочих процессов.","\u003Cb>Архитектурная ошибка:\u003C\u002Fb> рассматривать локальный вывод как уже готовый безопасный ИИ-продукт.","unordered","list",{},{"id":284,"data":285,"type":289,"tunes":290},"U8K0Qat9xz",{"text":286,"caption":287,"alignment":288},"Модель — это самая простая часть. Уровень приложения — вот где живет ценность продукта.","Архитектурный принцип","left","quote",{},{"id":292,"data":293,"type":42,"tunes":295},"NYU66FQDT8",{"text":294,"level":260},"Демо, PoC и эксплуатация — это разные этапы",{},{"id":297,"data":298,"type":239,"tunes":300},"-EGq4eScAy",{"text":299},"Многие инициативы с открытыми LLM терпят неудачу, потому что команды путают работающее демо с производственной возможностью. Разница не косметическая. Каждый уровень зрелости имеет свою цель, свой профиль рисков и свои инженерные требования.",{},{"id":302,"data":303,"type":325,"tunes":326},"V_OydBfVSx",{"content":304,"stretched":43,"withHeadings":14},[305,310,315,320],[306,307,308,309],"Этап","Что он доказывает","Типичная настройка","Чего еще не хватает",[311,312,313,314],"Демо","Модель может ответить на запрос локально.","Ollama на ноутбуке, одна модель, один запрос, без реального контроля данных.","Права доступа, поиск, логи, оценка, развертывание, мониторинг, пользовательский рабочий процесс.",[316,317,318,319],"PoC","Небольшая контролируемая система может отвечать на вопросы по выбранным документам или рабочим процессам.","Базовый веб-интерфейс, скрипт приема, векторный поиск, ограниченное число пользователей, ограниченный объем документов.","Масштабирование, управление, тестовые наборы данных, стратегия отката, аудируемость, модель поддержки.",[321,322,323,324],"Эксплуатация","Множество пользователей могут безопасно и многократно использовать систему в реальной работе.","Приложение с аутентификацией, изоляция арендаторов, конвейер RAG, наблюдаемость, абстракция провайдера, резервное копирование, процесс релиза.","Непрерывное улучшение, расширение оценки, операционная зрелость.","table",{},{"id":328,"data":329,"type":239,"tunes":331},"ikp3g9j4So",{"text":330},"PoC может быть намеренно небольшим. Эксплуатация не может быть намеренно слепой. Как только в систему попадают реальные пользователи, частные данные, бизнес-решения и требования соответствия, архитектура должна стать явной.",{},{"id":333,"data":334,"type":42,"tunes":336},"f1xN0TAU53",{"text":335,"level":260},"Где здесь место RAG",{},{"id":338,"data":339,"type":239,"tunes":341},"wVTJ2-nEg8",{"text":340},"\u003Cb>Retrieval-Augmented Generation\u003C\u002Fb> — это самый распространенный мост между языковой моделью и частными бизнес-знаниями. Модель не знает магическим образом внутренние документы, контракты, тикеты, спецификации продуктов или инструкции. Приложение должно извлечь соответствующий контекст, прежде чем попросить модель ответить.",{},{"id":343,"data":344,"type":239,"tunes":346},"fvxr_M2czf",{"text":345},"Практический поток RAG выглядит так:",{},{"id":348,"data":349,"type":281,"tunes":363},"tVZHbBjBJe",{"meta":350,"items":352,"style":362},{"counterType":351},"numeric",[353,354,355,356,357,358,359,360,361],"Документы загружаются или синхронизируются из контролируемых источников.","Текст извлекается, очищается и разбивается на фрагменты.","Фрагменты получают метаданные, такие как арендатор, владелец, версия документа, URL источника, область доступа и временная метка.","Для каждого фрагмента генерируются эмбеддинги.","Векторы сохраняются в pgvector, Qdrant или другом уровне поиска.","Во время запроса приложение проверяет права доступа перед поиском.","Соответствующие фрагменты извлекаются с помощью поиска по сходству и фильтров метаданных.","Конструктор подсказок внедряет выбранный контекст в запрос к модели.","Ответ генерируется с цитатами, границами уверенности и откатом «нет ответа» при слабом поиске.","ordered",{},{"id":365,"data":366,"type":239,"tunes":368},"5VP9OTHrad",{"text":367},"RAG снижает галлюцинации, но не устраняет их полностью. Плохая стратегия разбиения на чанки, слабые метаданные, отсутствие фильтров разрешений, низкокачественные эмбеддинги или слишком широкий поиск все еще могут приводить к убедительным, но неверным ответам. Серьезные RAG-системы требуют пороговых значений, цитирований, журналов поиска и оценки.",{},{"id":370,"data":371,"type":42,"tunes":373},"6R3G0KzeXf",{"text":372,"level":260},"Практическая локальная архитектура Open-LLM",{},{"id":375,"data":376,"type":239,"tunes":378},"hsYURnHqGd",{"text":377},"Реалистичный путь к продакшену не требует экзотической инфраструктуры. Для многих команд надежная первая архитектура может использовать обычный веб-стек: Nuxt для фронтенда, Nitro или Node API, PostgreSQL в качестве основной базы данных, pgvector для поиска, Ollama как локальную среду выполнения, Prisma для доступа к данным и фоновые воркеры для загрузки и создания эмбеддингов.",{},{"id":380,"data":381,"type":383,"tunes":384},"ie58nqmk5o",{"code":382},"Вопрос пользователя | v\nПользовательский интерфейс | v\nAPI \u002F Бэкенд | +--> Аутентификация +--> Проверка прав арендатора и роли | v\nУровень поиска | +--> Метаданные PostgreSQL +--> pgvector или Qdrant векторный поиск +--> Порог схожести | v\nПостроитель промптов | +--> системный промпт +--> найденные чанки +--> ссылки на источники +--> правила отсутствия ответа | v\nАбстракция LLM-провайдера | +--> Ollama \u002F локальная модель +--> запасной облачный провайдер +--> будущая собственная среда выполнения | v\nОтвет с источниками | v\nЛоги, трассировки, метрики, набор данных для оценки","code",{},{"id":386,"data":387,"type":239,"tunes":389},"HCdDDntKaG",{"text":388},"Эта архитектура сохраняет модель заменяемой. Ollama может быть первой средой выполнения, но система не должна быть привязана к одному движку вывода. Чистая архитектура разделяет пользовательский рабочий процесс, поиск, построение промптов, провайдера модели и наблюдаемость.",{},{"id":391,"data":392,"type":281,"tunes":403},"jx3zLyUEmA",{"meta":393,"items":394,"style":280},{},[395,396,397,398,399,400,401,402],"\u003Cb>Фронтенд:\u003C\u002Fb> Nuxt или другой веб-интерфейс для аутентифицированных пользовательских рабочих процессов.","\u003Cb>Бэкенд\u002FAPI:\u003C\u002Fb> Nitro, Node.js или FastAPI для оркестрации, разрешений и маршрутизации провайдеров.","\u003Cb>База данных:\u003C\u002Fb> PostgreSQL для документов, пользователей, арендаторов, ролей, промптов, логов и метаданных.","\u003Cb>Векторный поиск:\u003C\u002Fb> pgvector для простого интегрированного поиска или Qdrant, когда векторный поиск становится выделенным сервисом.","\u003Cb>Среда выполнения модели:\u003C\u002Fb> Ollama для локального выполнения, сервер llama.cpp для легковесного обслуживания или vLLM для высокопроизводительного обслуживания на GPU.","\u003Cb>Хранилище:\u003C\u002Fb> локальная файловая система или S3-совместимое объектное хранилище для загруженных файлов и извлеченных артефактов.","\u003Cb>Воркеры:\u003C\u002Fb> фоновая загрузка, разбиение на чанки, создание эмбеддингов, переиндексация и обработка версий документов.","\u003Cb>Наблюдаемость:\u003C\u002Fb> логи, метрики, трассировки промптов, трассировки поиска, отслеживание задержек и результаты оценки.",{},{"id":405,"data":406,"type":42,"tunes":408},"CG1PJLbPuV",{"text":407,"level":260},"Контрольный список готовности к продакшену",{},{"id":410,"data":411,"type":239,"tunes":413},"aOHxNXO4Mk",{"text":412},"Следующий контрольный список — это разница между демо-версией локальной модели и работоспособным приложением Open-LLM:",{},{"id":415,"data":416,"type":281,"tunes":436},"TBkg7dLMT1",{"meta":417,"items":418,"style":280},{},[419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435],"Каждый документ и чанк имеют tenant_id.","Поиск блокируется до проверки прав пользователя и роли.","Документы включают метаданные, источник, владельца, версию, состояние жизненного цикла и политику хранения.","Стратегия разбиения на чанки документирована и протестирована на реальных документах.","Выбор модели эмбеддингов явный и версионированный.","Конфигурация векторного индекса воспроизводима.","Порог схожести предотвращает слепое использование слабого контекста.","Ответы включают цитирование источников или ссылки на источники, где это возможно.","Используется запасной вариант «нет ответа», когда уверенность в поиске слишком низка.","Шаблоны промптов версионированы и контролируются при выпуске.","Абстракция LLM-провайдера создается с самого начала.","Структурированный вывод проверяется перед использованием в дальнейшем.","Набор данных для оценки содержит реальные вопросы, ожидаемые источники и неприемлемые ответы.","Журналы поиска показывают, какие чанки были использованы для каждого ответа.","Мониторинг задержек, использования токенов, нагрузки GPU\u002FCPU и частоты ошибок.","Правила конфиденциальности и хранения охватывают загрузки, извлеченный текст, чанки, эмбеддинги, промпты, ответы и логи.","Документированы пути развертывания, резервного копирования, восстановления, отката и инцидентов.",{},{"id":438,"data":439,"type":239,"tunes":441},"tdTcmD4DEO",{"text":440},"Это напрямую связано с \u003Ca href=\"\u002Fru\u002Fenterprise\">Enterprise Delivery OS\u003C\u002Fa>: полезный ИИ — это не только решение о модели. Это дисциплина доставки, доказательства, контроль, метрики и операционная ответственность.",{},{"id":443,"data":444,"type":42,"tunes":446},"zOuV7s1ByX",{"text":445,"level":260},"Абстракция провайдера: не привязывайтесь к одной модели",{},{"id":448,"data":449,"type":239,"tunes":451},"gPuC35eEAc",{"text":450},"Локальные модели ценны для случаев, чувствительных к конфиденциальности, офлайн-сценариев, контроля затрат и внутренних экспериментов. Облачные модели могут быть более сильными для сложных рассуждений, программирования, многоязычной точности или мультимодальной работы. Продакшен-приложение не должно рассматривать ни одну модель как постоянную инфраструктуру.",{},{"id":453,"data":454,"type":239,"tunes":456},"ssy1KKIyUv",{"text":455},"Абстракция провайдера позволяет одному и тому же рабочему процессу приложения вызывать Ollama, OpenAI, Gemini, Anthropic, Mistral, vLLM или другую собственную конечную точку без переписывания продукта. Приложение выбирает провайдера на основе варианта использования, чувствительности данных, задержки, стоимости и требований к качеству.",{},{"id":458,"data":459,"type":383,"tunes":461},"droVs9NwWG",{"code":460},"type LlmProvider = \"ollama\" | \"openai\" | \"gemini\" | \"anthropic\" | \"vllm\"; type ChatInput = { provider: LlmProvider; model: string; tenantId: string; userId: string; question: string; context: Array\u003C{ chunkId: string; sourceTitle: string; text: string; }>;\n}; async function chat(input: ChatInput) { await assertUserCanAccessContext(input.userId, input.context); const messages = buildRagMessages({ question: input.question, context: input.context, rules: [ \"Отвечай только на основе предоставленного контекста, когда это возможно.\", \"Указывай названия источников.\", \"Сообщай, когда контекста недостаточно.\" ] }); return llm.chat({ provider: input.provider, model: input.model, messages, trace: { tenantId: input.tenantId, userId: input.userId, promptVersion: \"rag-v3.2\" } });\n}",{},{"id":463,"data":464,"type":239,"tunes":466},"TqpI4xqkq1",{"text":465},"Ключевая идея не в синтаксисе TypeScript. Ключевая идея — это граница. Приложение владеет разрешениями, поиском, правилами промптов, трассировкой и оценкой. Провайдер только генерирует вывод модели.",{},{"id":468,"data":469,"type":42,"tunes":471},"RuZt2H8Qtd",{"text":470,"level":260},"pgvector против Qdrant",{},{"id":473,"data":474,"type":239,"tunes":476},"-nl0_dtw9s",{"text":475},"Для многих приложений Open-LLM решение о векторном хранилище вначале простое: если PostgreSQL уже является вашей основной системой, \u003Cb>pgvector\u003C\u002Fb> — это хорошая отправная точка. Он держит метаданные, разрешения, записи документов и векторы рядом. Это снижает операционную сложность.",{},{"id":478,"data":479,"type":239,"tunes":481},"mJJZ9Vhiy4",{"text":480},"\u003Cb>Qdrant\u003C\u002Fb> становится более привлекательным, когда векторный поиск должен стать выделенным сервисом: больший масштаб поиска, расширенная фильтрация, специализированная индексация, гибридные шаблоны поиска или независимое масштабирование инфраструктуры поиска.",{},{"id":483,"data":484,"type":325,"tunes":506},"ZNBNQmWTqi",{"content":485,"stretched":43,"withHeadings":14},[486,491,496,501],[487,488,489,490],"Вариант","Наилучшее применение","Сильные стороны","Компромиссы",[492,493,494,495],"pgvector","PoC, ранний продакшн, системы, уже построенные на PostgreSQL.","Единая база данных, SQL-соединения, ACID-поведение, более простое управление, метаданные рядом с векторами.","Менее специализирован, чем выделенная векторная база данных при больших масштабах поиска.",[497,498,499,500],"Qdrant","Выделенные сервисы семантического поиска, большие векторные нагрузки, расширенные фильтрация и шаблоны поиска.","Целенаправленный векторный поиск, мощная модель фильтрации, независимое масштабирование, API, ориентированные на поиск.","Добавляет еще один компонент инфраструктуры и операционную поверхность.",[502,503,504,505],"Начните с простого","Большинство корпоративных команд, начинающих с частных RAG-приложений.","Меньший архитектурный риск, более быстрая доставка, более легкий путь аудита.","Может потребоваться миграция позже, если поиск станет центральным и высокомасштабным.",{},{"id":508,"data":509,"type":239,"tunes":511},"EaNwvz0Ala",{"text":510},"Практическое правило: начинайте с pgvector, когда PostgreSQL уже управляет вашими бизнес-данными, а масштаб поиска умеренный. Переходите на Qdrant, когда векторный поиск становится самостоятельной продуктовой возможностью.",{},{"id":513,"data":514,"type":42,"tunes":516},"Xm3eJKCflO",{"text":515,"level":260},"Проверка безопасности и конфиденциальности",{},{"id":518,"data":519,"type":239,"tunes":521},"rdIR5uvVuv",{"text":520},"Локальный вывод не означает автоматически безопасный ИИ. Это означает только то, что выполнение модели может происходить локально. Полный путь данных все еще важен: загруженные файлы, извлеченный текст, чанки, эмбеддинги, логи, подсказки, ответы, резервные копии, доступ разработчиков, инструменты администрирования и экспорт аналитики.",{},{"id":523,"data":524,"type":239,"tunes":526},"IhqG3kxPSc",{"text":525},"Эмбеддинги также требуют внимания. Они не являются исходным документом, но все же представляют информацию, полученную из конфиденциального контента. Относитесь к ним как к части защищенного пути данных, особенно когда они связаны с метаданными, исходными записями, пользовательскими запросами или идентификаторами арендаторов.",{},{"id":528,"data":529,"type":281,"tunes":538},"QvcBrg8G6B",{"meta":530,"items":531,"style":280},{},[532,533,534,535,536,537],"Не индексируйте документы, пока не известны правила доступа.","Не извлекайте чанки без фильтров по арендатору и роли.","Не логируйте полные подсказки и ответы без правил хранения.","Не отправляйте конфиденциальный контекст в облачную модель, если политика этого не разрешает.","Не предполагайте, что локальное равно GDPR-совместимому; соответствие зависит от полного дизайна обработки.","Не позволяйте копиям для оценки и отладки стать неконтролируемыми теневыми наборами данных.",{},{"id":540,"data":541,"type":239,"tunes":543},"_YLdd4iHrS",{"text":542},"Вот где \u003Ca href=\"\u002Fru\u002Fblog\u002Fenterprise-grade-multi-tenant-architecture-for-an-international-platform\">многоэкземплярная SaaS-архитектура\u003C\u002Fa> имеет значение. Если арендаторы, роли, владение данными и операционные границы слабы, добавление локальной LLM может усилить риск вместо его снижения.",{},{"id":545,"data":546,"type":42,"tunes":548},"I6V0KMIQjb",{"text":547,"level":260},"Оценка не является опциональной",{},{"id":550,"data":551,"type":239,"tunes":553},"yaKCxuptHO",{"text":552},"Продуктовое Open-LLM приложение нуждается в цикле оценки. Без него у команд есть только анекдоты. Несколько хороших демо-ответов не доказывают, что поиск работает, что подсказка стабильна или что модель ведет себя безопасно в реальном использовании.",{},{"id":555,"data":556,"type":239,"tunes":558},"Kq_qe2AL-v",{"text":557},"Минимальный набор данных для оценки должен включать реальные вопросы пользователей, ожидаемые исходные документы, неприемлемые ответы, случаи без ответа и регрессионные тесты для предыдущих сбоев. Каждое изменение в чанкинге, эмбеддингах, подсказках, провайдере модели или пороге поиска должно тестироваться на этом наборе данных.",{},{"id":560,"data":561,"type":281,"tunes":569},"oBlROQd5Li",{"meta":562,"items":563,"style":280},{},[564,565,566,567,568],"\u003Cb>Оценка поиска:\u003C\u002Fb> Получила ли система правильные исходные чанки?","\u003Cb>Оценка ответа:\u003C\u002Fb> Остался ли ответ в рамках извлеченного контекста?","\u003Cb>Оценка безопасности:\u003C\u002Fb> Избежала ли система запрещенных разглашений или несанкционированных данных?","\u003Cb>Операционная оценка:\u003C\u002Fb> Остались ли задержка, частота сбоев и стоимость в допустимых пределах?","\u003Cb>Регрессионная оценка:\u003C\u002Fb> Привело ли обновление модели или подсказки к нарушению ранее корректного поведения?",{},{"id":571,"data":572,"type":239,"tunes":574},"9gDXPLZ6Rp",{"text":573},"RAG уменьшает галлюцинации, но не устраняет необходимость в оценке. Оценка — это контур управления, который превращает умный прототип в улучшающийся продукт.",{},{"id":576,"data":577,"type":42,"tunes":579},"Hi1K8JLPUo",{"text":578,"level":260},"Дисциплина развертывания: Модель — это событие релиза",{},{"id":581,"data":582,"type":239,"tunes":584},"sEpigdnlkD",{"text":583},"Смена модели — это не безобидная настройка конфигурации. Она может изменить стиль ответа, поведение рассуждения, качество языка, задержку, использование токенов, дисциплину цитирования и режимы сбоев. В продакшне обновления модели должны обрабатываться как события релиза.",{},{"id":586,"data":587,"type":239,"tunes":589},"sLXBCBh3E0",{"text":588},"Это означает версионирование подсказок, моделей эмбеддингов, настроек поиска, идентификаторов моделей, маршрутов провайдеров и результатов оценки. Это также означает наличие логики отката. Если новая модель вызывает ухудшение ответов, основанных на поиске, или нарушает структурированный вывод, системе нужен контролируемый путь возврата к известной рабочей конфигурации.",{},{"id":591,"data":592,"type":239,"tunes":594},"pcbe8eGMbe",{"text":593},"Это соответствует той же операционной логике, что и \u003Ca href=\"\u002Fru\u002Fenterprise\u002Freference-models\u002Fdelivery-and-change\">Доставка и изменения\u003C\u002Fa> и \u003Ca href=\"\u002Fru\u002Fenterprise\u002Freference-models\u002Fdigital-platform\">Архитектура платформы, готовой к ИИ\u003C\u002Fa>: стабильная доставка требует повторяемых контролей, а не героических ручных исправлений.",{},{"id":596,"data":597,"type":42,"tunes":599},"mOhI-jF1zx",{"text":598,"level":260},"Заключение: Продакшн начинается там, где заканчивается демо",{},{"id":601,"data":602,"type":239,"tunes":604},"3mXK980w23",{"text":603},"Ollama может начать путь. Он делает локальное выполнение модели доступным и снижает барьер для экспериментов. Это ценно. Но продуктовое приложение начинается там, где заканчивается демо.",{},{"id":606,"data":607,"type":239,"tunes":609},"9O27eQ_Svm",{"text":608},"Модель — это лишь один заменяемый компонент. Настоящий продукт — это управляемая система вокруг нее: сбор данных, права доступа, извлечение, промпты, маршрутизация провайдеров, оценка, логи, мониторинг, развертывание, резервное копирование и пользовательский рабочий процесс. Именно там конфиденциальность становится реальной, качество — измеримым, а бизнес-ценность — воспроизводимой.",{},{"id":611,"data":612,"type":239,"tunes":614},"4Lyy3E4ZsF",{"text":613},"Серьезное приложение на базе Open-LLM строится на основе инженерной дисциплины, а не просто разовым запуском локальной модели. Ollama может положить начало этому пути, но промышленное приложение начинается там, где заканчивается демо-версия.",{},{"id":616,"data":617,"type":239,"tunes":619},"eKPRtinG5L",{"text":618},"Тема:",{},{"id":621,"data":622,"type":239,"tunes":624},"GMa6lE1NNl",{"text":623},"Ollama, Open LLM, RAG, pgvector, Qdrant, Local AI, LLMOps, абстракция провайдеров, корпоративная архитектура ИИ",{},"2.31","Запустить локальную модель с Ollama просто. Создать готовое к продакшену Open-LLM-приложение сложнее: для этого требуются RAG, контроль доступа, абстракция провайдеров, оценка, логирование, дисциплина развертывания и контролируемый уровень приложения вокруг модели.","\u002Fuploads\u002F2026\u002F06\u002Follama-is-not-the-product-building-production-ready-open-llm-applications-1782679361640-h0usqf.webp","ollama-is-not-the-product-building-production-ready-open-llm-applications-1782679361640-h0usqf","PUBLISHED","2026-06-28T16:39:00.000Z","2026-06-28T20:39:17.972Z","2026-06-28T20:56:51.719Z",{"en":634,"de":635,"sr":636,"es":637,"fr":638,"it":639,"ru":640,"zh":641},"\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Fde\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Fsr\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Fes\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Ffr\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Fit\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Fru\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications","\u002Fzh\u002Fblog\u002Follama-is-not-the-product-building-production-ready-open-llm-applications",[643,647,651,655,659],{"id":644,"name":645,"slug":646},39,"Enterprise Delivery OS","enterprise",{"id":648,"name":649,"slug":650},87,"Плейбук: LLMOps","llmops",{"id":652,"name":653,"slug":654},58,"Оценка и гейты качества","evaluation",{"id":656,"name":657,"slug":658},89,"Стенд оценки","evaluation-harness",{"id":660,"name":661,"slug":662},85,"Гейты качества","quality-gates",{"id":664,"login":665,"email":666,"displayName":667},"20","rooth8233","","Aleksandar Stajić",[669,1001],{"lang":670,"title":671,"content":672,"contentJson":673,"excerpt":1000},"en","Ollama Is Not the Product: Building Production-Ready Open-LLM Applications","{\"time\":1782679301267,\"blocks\":[{\"id\":\"HsB_-_Sdzh\",\"type\":\"header\",\"data\":{\"text\":\"Ollama Is Not the Product: Building Production-Ready Open-LLM Applications\",\"level\":1},\"tunes\":{}},{\"id\":\"G_FTnJiMVo\",\"type\":\"paragraph\",\"data\":{\"text\":\"Tools like \u003Cb>Ollama\u003C\u002Fb> have made local LLM experimentation almost frictionless. Install the runtime, pull a model, send a prompt, and a local assistant answers in seconds. That is useful. It is also the easiest part of the journey.\"},\"tunes\":{}},{\"id\":\"fVa1sJxmy6\",\"type\":\"paragraph\",\"data\":{\"text\":\"A terminal demo is not an application. A local model is not a product. A productive Open-LLM application needs controlled data ingestion, retrieval, permissions, evaluation, logging, provider abstraction, deployment discipline, and a user workflow that solves a real business problem.\"},\"tunes\":{}},{\"id\":\"f6EzZPNhRc\",\"type\":\"paragraph\",\"data\":{\"text\":\"The core thesis is simple: \u003Cb>Ollama is a runtime, not the product\u003C\u002Fb>. The product lives in the application layer around the model. That layer decides which documents are visible, which chunks are retrieved, which prompts are used, how answers are evaluated, how failures are logged, and whether the system can be trusted in daily work.\"},\"tunes\":{}},{\"id\":\"wjgsXAJQ-i\",\"type\":\"paragraph\",\"data\":{\"text\":\"This is where local AI becomes interesting for teams building private assistants, internal knowledge tools, LLM-enabled SaaS features, or enterprise workflow copilots. The model can run locally, but privacy, reliability, and business value only exist if the full system is engineered properly.\"},\"tunes\":{}},{\"id\":\"NnYUiRBtwJ\",\"type\":\"header\",\"data\":{\"text\":\"Ollama Is a Runtime, Not a Product\",\"level\":2},\"tunes\":{}},{\"id\":\"nVrpsWCll3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Ollama is excellent for running and serving open models locally. It is especially strong for exploration, developer workflows, PoCs, and teams that want to test model behavior without immediately committing to a cloud provider. It exposes local model interaction through APIs and compatibility layers that make it easier to connect existing OpenAI-style tooling.\"},\"tunes\":{}},{\"id\":\"_aQOCMkaG8\",\"type\":\"paragraph\",\"data\":{\"text\":\"That does not mean Ollama solves the application problem. It does not automatically know which company documents a user may read. It does not create tenant isolation, document versioning, audit trails, source attribution, evaluation datasets, or business-specific UI workflows. Those responsibilities stay with the application architecture.\"},\"tunes\":{}},{\"id\":\"jeeZbnQvh7\",\"type\":\"list\",\"data\":{\"style\":\"unordered\",\"meta\":{},\"items\":[\"\u003Cb>Ollama helps with:\u003C\u002Fb> local model execution, fast experimentation, API-based model access, offline-first PoCs, and developer productivity.\",\"\u003Cb>Ollama does not solve by itself:\u003C\u002Fb> access control, RAG quality, document lifecycle, tenant boundaries, evaluation, audit logging, monitoring, fallback behavior, or enterprise workflow design.\",\"\u003Cb>The architectural mistake:\u003C\u002Fb> treating local inference as if it were already a secure AI product.\"]},\"tunes\":{}},{\"id\":\"U8K0Qat9xz\",\"type\":\"quote\",\"data\":{\"text\":\"The model is the easiest part. The application layer is where the product value lives.\",\"caption\":\"Architecture principle\",\"alignment\":\"left\"},\"tunes\":{}},{\"id\":\"NYU66FQDT8\",\"type\":\"header\",\"data\":{\"text\":\"Demo, PoC, and Production Are Different Stages\",\"level\":2},\"tunes\":{}},{\"id\":\"-EGq4eScAy\",\"type\":\"paragraph\",\"data\":{\"text\":\"Many Open-LLM initiatives fail because teams confuse a working demo with a production capability. The difference is not cosmetic. Each maturity level has a different goal, different risk profile, and different engineering requirement.\"},\"tunes\":{}},{\"id\":\"V_OydBfVSx\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Stage\",\"What it proves\",\"Typical setup\",\"What is still missing\"],[\"Demo\",\"A model can answer a prompt locally.\",\"Ollama on a laptop, one model, one prompt, no real data control.\",\"Permissions, retrieval, logs, evaluation, deployment, monitoring, user workflow.\"],[\"PoC\",\"A small controlled system can answer questions over selected documents or workflows.\",\"Basic web UI, ingestion script, vector search, limited users, limited document scope.\",\"Scale, governance, test datasets, fallback strategy, auditability, support model.\"],[\"Production\",\"Multiple users can use the system safely and repeatedly inside real work.\",\"Authenticated app, tenant isolation, RAG pipeline, observability, provider abstraction, backups, release process.\",\"Continuous improvement, evaluation expansion, operational maturity.\"]]},\"tunes\":{}},{\"id\":\"ikp3g9j4So\",\"type\":\"paragraph\",\"data\":{\"text\":\"A PoC can be intentionally small. Production cannot be intentionally blind. Once real users, private data, business decisions, and compliance expectations enter the system, the architecture must become explicit.\"},\"tunes\":{}},{\"id\":\"f1xN0TAU53\",\"type\":\"header\",\"data\":{\"text\":\"Where RAG Fits In\",\"level\":2},\"tunes\":{}},{\"id\":\"wVTJ2-nEg8\",\"type\":\"paragraph\",\"data\":{\"text\":\"\u003Cb>Retrieval-Augmented Generation\u003C\u002Fb> is the most common bridge between a language model and private business knowledge. The model does not magically know internal documents, contracts, tickets, product specs, or runbooks. The application must retrieve relevant context before asking the model to answer.\"},\"tunes\":{}},{\"id\":\"fvxr_M2czf\",\"type\":\"paragraph\",\"data\":{\"text\":\"A practical RAG flow looks like this:\"},\"tunes\":{}},{\"id\":\"tVZHbBjBJe\",\"type\":\"list\",\"data\":{\"style\":\"ordered\",\"meta\":{\"counterType\":\"numeric\"},\"items\":[\"Documents are uploaded or synchronized from controlled sources.\",\"Text is extracted, cleaned, and split into chunks.\",\"Chunks receive metadata such as tenant, owner, document version, source URL, access scope, and timestamp.\",\"Embeddings are generated for each chunk.\",\"Vectors are stored in pgvector, Qdrant, or another retrieval layer.\",\"At query time, the application checks permissions before retrieval.\",\"Relevant chunks are retrieved with similarity search and metadata filters.\",\"The prompt builder injects selected context into the model request.\",\"The answer is generated with citations, confidence boundaries, and no-answer fallback when retrieval is weak.\"]},\"tunes\":{}},{\"id\":\"5VP9OTHrad\",\"type\":\"paragraph\",\"data\":{\"text\":\"RAG reduces hallucinations, but it does not eliminate them. A poor chunking strategy, weak metadata, missing permission filters, low-quality embeddings, or overly broad retrieval can still produce convincing but wrong answers. Serious RAG systems need thresholds, citations, retrieval logs, and evaluation.\"},\"tunes\":{}},{\"id\":\"6R3G0KzeXf\",\"type\":\"header\",\"data\":{\"text\":\"A Practical Local Open-LLM Architecture\",\"level\":2},\"tunes\":{}},{\"id\":\"hsYURnHqGd\",\"type\":\"paragraph\",\"data\":{\"text\":\"A realistic production path does not require exotic infrastructure. For many teams, a strong first architecture can use a normal web stack: Nuxt for the frontend, a Nitro or Node API, PostgreSQL as the system of record, pgvector for retrieval, Ollama as a local runtime, Prisma for data access, and background workers for ingestion and embeddings.\"},\"tunes\":{}},{\"id\":\"ie58nqmk5o\",\"type\":\"code\",\"data\":{\"code\":\"User question | v\\nFrontend UI | v\\nAPI \u002F Backend | +--> Authentication +--> Tenant and role permission check | v\\nRetrieval layer | +--> PostgreSQL metadata +--> pgvector or Qdrant vector search +--> similarity threshold | v\\nPrompt builder | +--> system prompt +--> retrieved chunks +--> source references +--> no-answer rules | v\\nLLM provider abstraction | +--> Ollama \u002F local model +--> cloud model fallback +--> future self-hosted runtime | v\\nAnswer with sources | v\\nLogs, traces, metrics, evaluation dataset\"},\"tunes\":{}},{\"id\":\"HCdDDntKaG\",\"type\":\"paragraph\",\"data\":{\"text\":\"This architecture keeps the model replaceable. Ollama can be the first runtime, but the system should not be locked to one inference engine. A clean architecture separates user workflow, retrieval, prompt construction, model provider, and observability.\"},\"tunes\":{}},{\"id\":\"jx3zLyUEmA\",\"type\":\"list\",\"data\":{\"style\":\"unordered\",\"meta\":{},\"items\":[\"\u003Cb>Frontend:\u003C\u002Fb> Nuxt or another web UI for authenticated user workflows.\",\"\u003Cb>Backend\u002FAPI:\u003C\u002Fb> Nitro, Node.js, or FastAPI for orchestration, permissions, and provider routing.\",\"\u003Cb>Database:\u003C\u002Fb> PostgreSQL for documents, users, tenants, roles, prompts, logs, and metadata.\",\"\u003Cb>Vector search:\u003C\u002Fb> pgvector for simple integrated retrieval or Qdrant when vector search becomes a dedicated service.\",\"\u003Cb>Model runtime:\u003C\u002Fb> Ollama for local execution, llama.cpp server for lightweight serving, or vLLM for higher-throughput GPU serving.\",\"\u003Cb>Storage:\u003C\u002Fb> local filesystem or S3-compatible object storage for uploaded files and extracted artifacts.\",\"\u003Cb>Workers:\u003C\u002Fb> background ingestion, chunking, embedding, re-indexing, and document version processing.\",\"\u003Cb>Observability:\u003C\u002Fb> logs, metrics, prompt traces, retrieval traces, latency tracking, and evaluation results.\"]},\"tunes\":{}},{\"id\":\"CG1PJLbPuV\",\"type\":\"header\",\"data\":{\"text\":\"The Production Readiness Checklist\",\"level\":2},\"tunes\":{}},{\"id\":\"aOHxNXO4Mk\",\"type\":\"paragraph\",\"data\":{\"text\":\"The following checklist is the difference between a local model demo and a usable Open-LLM application:\"},\"tunes\":{}},{\"id\":\"TBkg7dLMT1\",\"type\":\"list\",\"data\":{\"style\":\"unordered\",\"meta\":{},\"items\":[\"Every document and chunk has a tenant_id.\",\"Retrieval is blocked until user and role permissions are checked.\",\"Documents include metadata, source, owner, version, lifecycle state, and retention policy.\",\"Chunking strategy is documented and tested against real documents.\",\"Embedding model selection is explicit and versioned.\",\"Vector index configuration is reproducible.\",\"Similarity threshold prevents weak context from being used blindly.\",\"Answers include source citations or source references where possible.\",\"No-answer fallback is used when retrieval confidence is too low.\",\"Prompt templates are versioned and release-controlled.\",\"LLM provider abstraction is built from the start.\",\"Structured output is validated before downstream use.\",\"Evaluation dataset contains real questions, expected sources, and unacceptable answers.\",\"Retrieval logs show which chunks were used for each answer.\",\"Latency, token usage, GPU\u002FCPU load, and error rates are monitored.\",\"Privacy and retention rules cover uploads, extracted text, chunks, embeddings, prompts, responses, and logs.\",\"Deployment, backup, restore, rollback, and incident paths are documented.\"]},\"tunes\":{}},{\"id\":\"tdTcmD4DEO\",\"type\":\"paragraph\",\"data\":{\"text\":\"This connects directly with \u003Ca href=\\\"\u002Fenterprise\\\">Enterprise Delivery OS\u003C\u002Fa>: useful AI is not only a model decision. It is delivery discipline, evidence, controls, metrics, and operational ownership.\"},\"tunes\":{}},{\"id\":\"zOuV7s1ByX\",\"type\":\"header\",\"data\":{\"text\":\"Provider Abstraction: Do Not Marry One Model\",\"level\":2},\"tunes\":{}},{\"id\":\"gPuC35eEAc\",\"type\":\"paragraph\",\"data\":{\"text\":\"Local models are valuable for privacy-sensitive use cases, offline scenarios, cost control, and internal experimentation. Cloud models may still be stronger for difficult reasoning, coding, multilingual accuracy, or multimodal work. A production application should not treat any one model as permanent infrastructure.\"},\"tunes\":{}},{\"id\":\"ssy1KKIyUv\",\"type\":\"paragraph\",\"data\":{\"text\":\"A provider abstraction allows the same application workflow to call Ollama, OpenAI, Gemini, Anthropic, Mistral, vLLM, or another self-hosted endpoint without rewriting the product. The application decides the provider based on use case, data sensitivity, latency, cost, and quality requirements.\"},\"tunes\":{}},{\"id\":\"droVs9NwWG\",\"type\":\"code\",\"data\":{\"code\":\"type LlmProvider = \\\"ollama\\\" | \\\"openai\\\" | \\\"gemini\\\" | \\\"anthropic\\\" | \\\"vllm\\\"; type ChatInput = { provider: LlmProvider; model: string; tenantId: string; userId: string; question: string; context: Array\u003C{ chunkId: string; sourceTitle: string; text: string; }>;\\n}; async function chat(input: ChatInput) { await assertUserCanAccessContext(input.userId, input.context); const messages = buildRagMessages({ question: input.question, context: input.context, rules: [ \\\"Answer only from provided context when possible.\\\", \\\"Cite source titles.\\\", \\\"Say when the context is insufficient.\\\" ] }); return llm.chat({ provider: input.provider, model: input.model, messages, trace: { tenantId: input.tenantId, userId: input.userId, promptVersion: \\\"rag-v3.2\\\" } });\\n}\"},\"tunes\":{}},{\"id\":\"TqpI4xqkq1\",\"type\":\"paragraph\",\"data\":{\"text\":\"The key idea is not the TypeScript syntax. The key idea is the boundary. The application owns permissions, retrieval, prompt rules, tracing, and evaluation. The provider only produces the model output.\"},\"tunes\":{}},{\"id\":\"RuZt2H8Qtd\",\"type\":\"header\",\"data\":{\"text\":\"pgvector vs Qdrant\",\"level\":2},\"tunes\":{}},{\"id\":\"-nl0_dtw9s\",\"type\":\"paragraph\",\"data\":{\"text\":\"For many Open-LLM applications, the vector store decision is simple at the beginning: if PostgreSQL is already your system of record, \u003Cb>pgvector\u003C\u002Fb> is a strong starting point. It keeps metadata, permissions, document records, and vectors close together. That reduces operational complexity.\"},\"tunes\":{}},{\"id\":\"mJJZ9Vhiy4\",\"type\":\"paragraph\",\"data\":{\"text\":\"\u003Cb>Qdrant\u003C\u002Fb> becomes more attractive when vector search needs to become a dedicated service: larger retrieval scale, advanced filtering, specialized indexing, hybrid search patterns, or independent scaling of retrieval infrastructure.\"},\"tunes\":{}},{\"id\":\"ZNBNQmWTqi\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Option\",\"Best fit\",\"Strengths\",\"Trade-offs\"],[\"pgvector\",\"PoCs, early production, systems already built on PostgreSQL.\",\"Single database, SQL joins, ACID behavior, simpler operations, metadata close to vectors.\",\"Less specialized than a dedicated vector database at large retrieval scale.\"],[\"Qdrant\",\"Dedicated semantic search services, larger vector workloads, advanced filtering and retrieval patterns.\",\"Purpose-built vector search, strong filtering model, independent scaling, retrieval-focused APIs.\",\"Adds another infrastructure component and operational surface.\"],[\"Start simple\",\"Most enterprise teams beginning with private RAG applications.\",\"Lower architecture risk, faster delivery, easier audit path.\",\"May need migration later if retrieval becomes central and high-scale.\"]]},\"tunes\":{}},{\"id\":\"EaNwvz0Ala\",\"type\":\"paragraph\",\"data\":{\"text\":\"A practical rule: start with pgvector when PostgreSQL already owns your business data and the retrieval scale is moderate. Move to Qdrant when vector search becomes a product capability of its own.\"},\"tunes\":{}},{\"id\":\"Xm3eJKCflO\",\"type\":\"header\",\"data\":{\"text\":\"Security and Privacy Reality Check\",\"level\":2},\"tunes\":{}},{\"id\":\"rdIR5uvVuv\",\"type\":\"paragraph\",\"data\":{\"text\":\"Local inference does not automatically mean secure AI. It only means the model execution can happen locally. The full data path still matters: uploaded files, extracted text, chunks, embeddings, logs, prompts, responses, backups, developer access, admin tools, and analytics exports.\"},\"tunes\":{}},{\"id\":\"IhqG3kxPSc\",\"type\":\"paragraph\",\"data\":{\"text\":\"Embeddings also deserve care. They are not the original document, but they still represent information derived from sensitive content. Treat them as part of the protected data path, especially when they are tied to metadata, source records, user queries, or tenant identifiers.\"},\"tunes\":{}},{\"id\":\"QvcBrg8G6B\",\"type\":\"list\",\"data\":{\"style\":\"unordered\",\"meta\":{},\"items\":[\"Do not index documents before access rules are known.\",\"Do not retrieve chunks without tenant and role filters.\",\"Do not log full prompts and responses without retention rules.\",\"Do not send sensitive context to a cloud model unless the policy allows it.\",\"Do not assume that local equals GDPR-compliant; compliance depends on the complete processing design.\",\"Do not let evaluation and debugging copies become uncontrolled shadow datasets.\"]},\"tunes\":{}},{\"id\":\"_YLdd4iHrS\",\"type\":\"paragraph\",\"data\":{\"text\":\"This is where \u003Ca href=\\\"\u002Fblog\u002Fenterprise-grade-multi-tenant-architecture-for-an-international-platform\\\">multi-instance SaaS architecture\u003C\u002Fa> matters. If tenants, roles, data ownership, and operational boundaries are weak, adding a local LLM can amplify risk instead of reducing it.\"},\"tunes\":{}},{\"id\":\"I6V0KMIQjb\",\"type\":\"header\",\"data\":{\"text\":\"Evaluation Is Not Optional\",\"level\":2},\"tunes\":{}},{\"id\":\"yaKCxuptHO\",\"type\":\"paragraph\",\"data\":{\"text\":\"A production Open-LLM application needs an evaluation loop. Without it, teams only have anecdotes. A few good demo answers do not prove that retrieval works, that the prompt is stable, or that the model behaves safely across real usage.\"},\"tunes\":{}},{\"id\":\"Kq_qe2AL-v\",\"type\":\"paragraph\",\"data\":{\"text\":\"A minimal evaluation dataset should include real user questions, expected source documents, unacceptable answers, no-answer cases, and regression tests for previous failures. Every change to chunking, embeddings, prompts, model provider, or retrieval threshold should be tested against that dataset.\"},\"tunes\":{}},{\"id\":\"oBlROQd5Li\",\"type\":\"list\",\"data\":{\"style\":\"unordered\",\"meta\":{},\"items\":[\"\u003Cb>Retrieval evaluation:\u003C\u002Fb> Did the system fetch the right source chunks?\",\"\u003Cb>Answer evaluation:\u003C\u002Fb> Did the answer stay grounded in the retrieved context?\",\"\u003Cb>Safety evaluation:\u003C\u002Fb> Did the system avoid forbidden disclosures or unauthorized data?\",\"\u003Cb>Operational evaluation:\u003C\u002Fb> Did latency, failure rate, and cost stay inside acceptable limits?\",\"\u003Cb>Regression evaluation:\u003C\u002Fb> Did a model or prompt upgrade break previously correct behavior?\"]},\"tunes\":{}},{\"id\":\"9gDXPLZ6Rp\",\"type\":\"paragraph\",\"data\":{\"text\":\"RAG reduces hallucinations, but it does not remove the need for evaluation. Evaluation is the control loop that turns a clever prototype into an improving product.\"},\"tunes\":{}},{\"id\":\"Hi1K8JLPUo\",\"type\":\"header\",\"data\":{\"text\":\"Deployment Discipline: The Model Is a Release Event\",\"level\":2},\"tunes\":{}},{\"id\":\"sEpigdnlkD\",\"type\":\"paragraph\",\"data\":{\"text\":\"Changing a model is not a harmless configuration tweak. It can change answer style, reasoning behavior, language quality, latency, token usage, citation discipline, and failure modes. In production, model upgrades should be handled like release events.\"},\"tunes\":{}},{\"id\":\"sLXBCBh3E0\",\"type\":\"paragraph\",\"data\":{\"text\":\"That means versioning prompts, embedding models, retrieval settings, model identifiers, provider routes, and evaluation results. It also means having rollback logic. If a new model causes worse retrieval-grounded answers or breaks structured output, the system needs a controlled path back to the known-good configuration.\"},\"tunes\":{}},{\"id\":\"pcbe8eGMbe\",\"type\":\"paragraph\",\"data\":{\"text\":\"This fits the same operating logic as \u003Ca href=\\\"\u002Fenterprise\u002Freference-models\u002Fdelivery-and-change\\\">Delivery &amp; Change\u003C\u002Fa> and \u003Ca href=\\\"\u002Fenterprise\u002Freference-models\u002Fdigital-platform\\\">AI-ready platform architecture\u003C\u002Fa>: stable delivery requires repeatable controls, not heroic manual fixes.\"},\"tunes\":{}},{\"id\":\"mOhI-jF1zx\",\"type\":\"header\",\"data\":{\"text\":\"Conclusion: Production Begins Where the Demo Ends\",\"level\":2},\"tunes\":{}},{\"id\":\"3mXK980w23\",\"type\":\"paragraph\",\"data\":{\"text\":\"Ollama can start the journey. It makes local model execution accessible and lowers the barrier to experimentation. That is valuable. But the production application begins where the demo ends.\"},\"tunes\":{}},{\"id\":\"9O27eQ_Svm\",\"type\":\"paragraph\",\"data\":{\"text\":\"The model is only one replaceable component. The real product is the controlled system around it: ingestion, permissions, retrieval, prompts, provider routing, evaluation, logs, monitoring, deployment, backup, and user workflow. That is where privacy becomes real, quality becomes measurable, and business value becomes repeatable.\"},\"tunes\":{}},{\"id\":\"4Lyy3E4ZsF\",\"type\":\"paragraph\",\"data\":{\"text\":\"A serious Open-LLM application is built through engineering discipline, not by running a local model once. Ollama can start the journey, but the production application begins where the demo ends.\"},\"tunes\":{}},{\"id\":\"eKPRtinG5L\",\"type\":\"paragraph\",\"data\":{\"text\":\"Theme:\"},\"tunes\":{}},{\"id\":\"GMa6lE1NNl\",\"type\":\"paragraph\",\"data\":{\"text\":\"Ollama, Open LLM, RAG, pgvector, Qdrant, Local AI, LLMOps, Provider Abstraction, Enterprise AI Architecture\"},\"tunes\":{}}],\"version\":\"2.31.5\"}",{"time":674,"blocks":675,"version":999},1782679301267,[676,679,683,687,691,695,699,703,707,715,720,724,728,751,755,759,763,767,781,785,789,793,797,801,814,818,822,844,848,852,856,860,864,868,872,876,880,902,906,910,914,918,929,933,937,941,945,955,959,963,967,971,975,979,983,987,991,995],{"id":231,"data":677,"type":42,"tunes":678},{"text":671,"level":40},{},{"id":236,"data":680,"type":239,"tunes":682},{"text":681},"Tools like \u003Cb>Ollama\u003C\u002Fb> have made local LLM experimentation almost frictionless. Install the runtime, pull a model, send a prompt, and a local assistant answers in seconds. That is useful. It is also the easiest part of the journey.",{},{"id":242,"data":684,"type":239,"tunes":686},{"text":685},"A terminal demo is not an application. A local model is not a product. A productive Open-LLM application needs controlled data ingestion, retrieval, permissions, evaluation, logging, provider abstraction, deployment discipline, and a user workflow that solves a real business problem.",{},{"id":247,"data":688,"type":239,"tunes":690},{"text":689},"The core thesis is simple: \u003Cb>Ollama is a runtime, not the product\u003C\u002Fb>. The product lives in the application layer around the model. That layer decides which documents are visible, which chunks are retrieved, which prompts are used, how answers are evaluated, how failures are logged, and whether the system can be trusted in daily work.",{},{"id":252,"data":692,"type":239,"tunes":694},{"text":693},"This is where local AI becomes interesting for teams building private assistants, internal knowledge tools, LLM-enabled SaaS features, or enterprise workflow copilots. The model can run locally, but privacy, reliability, and business value only exist if the full system is engineered properly.",{},{"id":257,"data":696,"type":42,"tunes":698},{"text":697,"level":260},"Ollama Is a Runtime, Not a Product",{},{"id":263,"data":700,"type":239,"tunes":702},{"text":701},"Ollama is excellent for running and serving open models locally. It is especially strong for exploration, developer workflows, PoCs, and teams that want to test model behavior without immediately committing to a cloud provider. It exposes local model interaction through APIs and compatibility layers that make it easier to connect existing OpenAI-style tooling.",{},{"id":268,"data":704,"type":239,"tunes":706},{"text":705},"That does not mean Ollama solves the application problem. It does not automatically know which company documents a user may read. It does not create tenant isolation, document versioning, audit trails, source attribution, evaluation datasets, or business-specific UI workflows. Those responsibilities stay with the application architecture.",{},{"id":273,"data":708,"type":281,"tunes":714},{"meta":709,"items":710,"style":280},{},[711,712,713],"\u003Cb>Ollama helps with:\u003C\u002Fb> local model execution, fast experimentation, API-based model access, offline-first PoCs, and developer productivity.","\u003Cb>Ollama does not solve by itself:\u003C\u002Fb> access control, RAG quality, document lifecycle, tenant boundaries, evaluation, audit logging, monitoring, fallback behavior, or enterprise workflow design.","\u003Cb>The architectural mistake:\u003C\u002Fb> treating local inference as if it were already a secure AI product.",{},{"id":284,"data":716,"type":289,"tunes":719},{"text":717,"caption":718,"alignment":288},"The model is the easiest part. The application layer is where the product value lives.","Architecture principle",{},{"id":292,"data":721,"type":42,"tunes":723},{"text":722,"level":260},"Demo, PoC, and Production Are Different Stages",{},{"id":297,"data":725,"type":239,"tunes":727},{"text":726},"Many Open-LLM initiatives fail because teams confuse a working demo with a production capability. The difference is not cosmetic. Each maturity level has a different goal, different risk profile, and different engineering requirement.",{},{"id":302,"data":729,"type":325,"tunes":750},{"content":730,"stretched":43,"withHeadings":14},[731,736,741,745],[732,733,734,735],"Stage","What it proves","Typical setup","What is still missing",[737,738,739,740],"Demo","A model can answer a prompt locally.","Ollama on a laptop, one model, one prompt, no real data control.","Permissions, retrieval, logs, evaluation, deployment, monitoring, user workflow.",[316,742,743,744],"A small controlled system can answer questions over selected documents or workflows.","Basic web UI, ingestion script, vector search, limited users, limited document scope.","Scale, governance, test datasets, fallback strategy, auditability, support model.",[746,747,748,749],"Production","Multiple users can use the system safely and repeatedly inside real work.","Authenticated app, tenant isolation, RAG pipeline, observability, provider abstraction, backups, release process.","Continuous improvement, evaluation expansion, operational maturity.",{},{"id":328,"data":752,"type":239,"tunes":754},{"text":753},"A PoC can be intentionally small. Production cannot be intentionally blind. Once real users, private data, business decisions, and compliance expectations enter the system, the architecture must become explicit.",{},{"id":333,"data":756,"type":42,"tunes":758},{"text":757,"level":260},"Where RAG Fits In",{},{"id":338,"data":760,"type":239,"tunes":762},{"text":761},"\u003Cb>Retrieval-Augmented Generation\u003C\u002Fb> is the most common bridge between a language model and private business knowledge. The model does not magically know internal documents, contracts, tickets, product specs, or runbooks. The application must retrieve relevant context before asking the model to answer.",{},{"id":343,"data":764,"type":239,"tunes":766},{"text":765},"A practical RAG flow looks like this:",{},{"id":348,"data":768,"type":281,"tunes":780},{"meta":769,"items":770,"style":362},{"counterType":351},[771,772,773,774,775,776,777,778,779],"Documents are uploaded or synchronized from controlled sources.","Text is extracted, cleaned, and split into chunks.","Chunks receive metadata such as tenant, owner, document version, source URL, access scope, and timestamp.","Embeddings are generated for each chunk.","Vectors are stored in pgvector, Qdrant, or another retrieval layer.","At query time, the application checks permissions before retrieval.","Relevant chunks are retrieved with similarity search and metadata filters.","The prompt builder injects selected context into the model request.","The answer is generated with citations, confidence boundaries, and no-answer fallback when retrieval is weak.",{},{"id":365,"data":782,"type":239,"tunes":784},{"text":783},"RAG reduces hallucinations, but it does not eliminate them. A poor chunking strategy, weak metadata, missing permission filters, low-quality embeddings, or overly broad retrieval can still produce convincing but wrong answers. Serious RAG systems need thresholds, citations, retrieval logs, and evaluation.",{},{"id":370,"data":786,"type":42,"tunes":788},{"text":787,"level":260},"A Practical Local Open-LLM Architecture",{},{"id":375,"data":790,"type":239,"tunes":792},{"text":791},"A realistic production path does not require exotic infrastructure. For many teams, a strong first architecture can use a normal web stack: Nuxt for the frontend, a Nitro or Node API, PostgreSQL as the system of record, pgvector for retrieval, Ollama as a local runtime, Prisma for data access, and background workers for ingestion and embeddings.",{},{"id":380,"data":794,"type":383,"tunes":796},{"code":795},"User question | v\nFrontend UI | v\nAPI \u002F Backend | +--> Authentication +--> Tenant and role permission check | v\nRetrieval layer | +--> PostgreSQL metadata +--> pgvector or Qdrant vector search +--> similarity threshold | v\nPrompt builder | +--> system prompt +--> retrieved chunks +--> source references +--> no-answer rules | v\nLLM provider abstraction | +--> Ollama \u002F local model +--> cloud model fallback +--> future self-hosted runtime | v\nAnswer with sources | v\nLogs, traces, metrics, evaluation dataset",{},{"id":386,"data":798,"type":239,"tunes":800},{"text":799},"This architecture keeps the model replaceable. Ollama can be the first runtime, but the system should not be locked to one inference engine. A clean architecture separates user workflow, retrieval, prompt construction, model provider, and observability.",{},{"id":391,"data":802,"type":281,"tunes":813},{"meta":803,"items":804,"style":280},{},[805,806,807,808,809,810,811,812],"\u003Cb>Frontend:\u003C\u002Fb> Nuxt or another web UI for authenticated user workflows.","\u003Cb>Backend\u002FAPI:\u003C\u002Fb> Nitro, Node.js, or FastAPI for orchestration, permissions, and provider routing.","\u003Cb>Database:\u003C\u002Fb> PostgreSQL for documents, users, tenants, roles, prompts, logs, and metadata.","\u003Cb>Vector search:\u003C\u002Fb> pgvector for simple integrated retrieval or Qdrant when vector search becomes a dedicated service.","\u003Cb>Model runtime:\u003C\u002Fb> Ollama for local execution, llama.cpp server for lightweight serving, or vLLM for higher-throughput GPU serving.","\u003Cb>Storage:\u003C\u002Fb> local filesystem or S3-compatible object storage for uploaded files and extracted artifacts.","\u003Cb>Workers:\u003C\u002Fb> background ingestion, chunking, embedding, re-indexing, and document version processing.","\u003Cb>Observability:\u003C\u002Fb> logs, metrics, prompt traces, retrieval traces, latency tracking, and evaluation results.",{},{"id":405,"data":815,"type":42,"tunes":817},{"text":816,"level":260},"The Production Readiness Checklist",{},{"id":410,"data":819,"type":239,"tunes":821},{"text":820},"The following checklist is the difference between a local model demo and a usable Open-LLM application:",{},{"id":415,"data":823,"type":281,"tunes":843},{"meta":824,"items":825,"style":280},{},[826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842],"Every document and chunk has a tenant_id.","Retrieval is blocked until user and role permissions are checked.","Documents include metadata, source, owner, version, lifecycle state, and retention policy.","Chunking strategy is documented and tested against real documents.","Embedding model selection is explicit and versioned.","Vector index configuration is reproducible.","Similarity threshold prevents weak context from being used blindly.","Answers include source citations or source references where possible.","No-answer fallback is used when retrieval confidence is too low.","Prompt templates are versioned and release-controlled.","LLM provider abstraction is built from the start.","Structured output is validated before downstream use.","Evaluation dataset contains real questions, expected sources, and unacceptable answers.","Retrieval logs show which chunks were used for each answer.","Latency, token usage, GPU\u002FCPU load, and error rates are monitored.","Privacy and retention rules cover uploads, extracted text, chunks, embeddings, prompts, responses, and logs.","Deployment, backup, restore, rollback, and incident paths are documented.",{},{"id":438,"data":845,"type":239,"tunes":847},{"text":846},"This connects directly with \u003Ca href=\"\u002Fenterprise\">Enterprise Delivery OS\u003C\u002Fa>: useful AI is not only a model decision. It is delivery discipline, evidence, controls, metrics, and operational ownership.",{},{"id":443,"data":849,"type":42,"tunes":851},{"text":850,"level":260},"Provider Abstraction: Do Not Marry One Model",{},{"id":448,"data":853,"type":239,"tunes":855},{"text":854},"Local models are valuable for privacy-sensitive use cases, offline scenarios, cost control, and internal experimentation. Cloud models may still be stronger for difficult reasoning, coding, multilingual accuracy, or multimodal work. A production application should not treat any one model as permanent infrastructure.",{},{"id":453,"data":857,"type":239,"tunes":859},{"text":858},"A provider abstraction allows the same application workflow to call Ollama, OpenAI, Gemini, Anthropic, Mistral, vLLM, or another self-hosted endpoint without rewriting the product. The application decides the provider based on use case, data sensitivity, latency, cost, and quality requirements.",{},{"id":458,"data":861,"type":383,"tunes":863},{"code":862},"type LlmProvider = \"ollama\" | \"openai\" | \"gemini\" | \"anthropic\" | \"vllm\"; type ChatInput = { provider: LlmProvider; model: string; tenantId: string; userId: string; question: string; context: Array\u003C{ chunkId: string; sourceTitle: string; text: string; }>;\n}; async function chat(input: ChatInput) { await assertUserCanAccessContext(input.userId, input.context); const messages = buildRagMessages({ question: input.question, context: input.context, rules: [ \"Answer only from provided context when possible.\", \"Cite source titles.\", \"Say when the context is insufficient.\" ] }); return llm.chat({ provider: input.provider, model: input.model, messages, trace: { tenantId: input.tenantId, userId: input.userId, promptVersion: \"rag-v3.2\" } });\n}",{},{"id":463,"data":865,"type":239,"tunes":867},{"text":866},"The key idea is not the TypeScript syntax. The key idea is the boundary. The application owns permissions, retrieval, prompt rules, tracing, and evaluation. The provider only produces the model output.",{},{"id":468,"data":869,"type":42,"tunes":871},{"text":870,"level":260},"pgvector vs Qdrant",{},{"id":473,"data":873,"type":239,"tunes":875},{"text":874},"For many Open-LLM applications, the vector store decision is simple at the beginning: if PostgreSQL is already your system of record, \u003Cb>pgvector\u003C\u002Fb> is a strong starting point. It keeps metadata, permissions, document records, and vectors close together. That reduces operational complexity.",{},{"id":478,"data":877,"type":239,"tunes":879},{"text":878},"\u003Cb>Qdrant\u003C\u002Fb> becomes more attractive when vector search needs to become a dedicated service: larger retrieval scale, advanced filtering, specialized indexing, hybrid search patterns, or independent scaling of retrieval infrastructure.",{},{"id":483,"data":881,"type":325,"tunes":901},{"content":882,"stretched":43,"withHeadings":14},[883,888,892,896],[884,885,886,887],"Option","Best fit","Strengths","Trade-offs",[492,889,890,891],"PoCs, early production, systems already built on PostgreSQL.","Single database, SQL joins, ACID behavior, simpler operations, metadata close to vectors.","Less specialized than a dedicated vector database at large retrieval scale.",[497,893,894,895],"Dedicated semantic search services, larger vector workloads, advanced filtering and retrieval patterns.","Purpose-built vector search, strong filtering model, independent scaling, retrieval-focused APIs.","Adds another infrastructure component and operational surface.",[897,898,899,900],"Start simple","Most enterprise teams beginning with private RAG applications.","Lower architecture risk, faster delivery, easier audit path.","May need migration later if retrieval becomes central and high-scale.",{},{"id":508,"data":903,"type":239,"tunes":905},{"text":904},"A practical rule: start with pgvector when PostgreSQL already owns your business data and the retrieval scale is moderate. Move to Qdrant when vector search becomes a product capability of its own.",{},{"id":513,"data":907,"type":42,"tunes":909},{"text":908,"level":260},"Security and Privacy Reality Check",{},{"id":518,"data":911,"type":239,"tunes":913},{"text":912},"Local inference does not automatically mean secure AI. It only means the model execution can happen locally. The full data path still matters: uploaded files, extracted text, chunks, embeddings, logs, prompts, responses, backups, developer access, admin tools, and analytics exports.",{},{"id":523,"data":915,"type":239,"tunes":917},{"text":916},"Embeddings also deserve care. They are not the original document, but they still represent information derived from sensitive content. Treat them as part of the protected data path, especially when they are tied to metadata, source records, user queries, or tenant identifiers.",{},{"id":528,"data":919,"type":281,"tunes":928},{"meta":920,"items":921,"style":280},{},[922,923,924,925,926,927],"Do not index documents before access rules are known.","Do not retrieve chunks without tenant and role filters.","Do not log full prompts and responses without retention rules.","Do not send sensitive context to a cloud model unless the policy allows it.","Do not assume that local equals GDPR-compliant; compliance depends on the complete processing design.","Do not let evaluation and debugging copies become uncontrolled shadow datasets.",{},{"id":540,"data":930,"type":239,"tunes":932},{"text":931},"This is where \u003Ca href=\"\u002Fblog\u002Fenterprise-grade-multi-tenant-architecture-for-an-international-platform\">multi-instance SaaS architecture\u003C\u002Fa> matters. If tenants, roles, data ownership, and operational boundaries are weak, adding a local LLM can amplify risk instead of reducing it.",{},{"id":545,"data":934,"type":42,"tunes":936},{"text":935,"level":260},"Evaluation Is Not Optional",{},{"id":550,"data":938,"type":239,"tunes":940},{"text":939},"A production Open-LLM application needs an evaluation loop. Without it, teams only have anecdotes. A few good demo answers do not prove that retrieval works, that the prompt is stable, or that the model behaves safely across real usage.",{},{"id":555,"data":942,"type":239,"tunes":944},{"text":943},"A minimal evaluation dataset should include real user questions, expected source documents, unacceptable answers, no-answer cases, and regression tests for previous failures. Every change to chunking, embeddings, prompts, model provider, or retrieval threshold should be tested against that dataset.",{},{"id":560,"data":946,"type":281,"tunes":954},{"meta":947,"items":948,"style":280},{},[949,950,951,952,953],"\u003Cb>Retrieval evaluation:\u003C\u002Fb> Did the system fetch the right source chunks?","\u003Cb>Answer evaluation:\u003C\u002Fb> Did the answer stay grounded in the retrieved context?","\u003Cb>Safety evaluation:\u003C\u002Fb> Did the system avoid forbidden disclosures or unauthorized data?","\u003Cb>Operational evaluation:\u003C\u002Fb> Did latency, failure rate, and cost stay inside acceptable limits?","\u003Cb>Regression evaluation:\u003C\u002Fb> Did a model or prompt upgrade break previously correct behavior?",{},{"id":571,"data":956,"type":239,"tunes":958},{"text":957},"RAG reduces hallucinations, but it does not remove the need for evaluation. Evaluation is the control loop that turns a clever prototype into an improving product.",{},{"id":576,"data":960,"type":42,"tunes":962},{"text":961,"level":260},"Deployment Discipline: The Model Is a Release Event",{},{"id":581,"data":964,"type":239,"tunes":966},{"text":965},"Changing a model is not a harmless configuration tweak. It can change answer style, reasoning behavior, language quality, latency, token usage, citation discipline, and failure modes. In production, model upgrades should be handled like release events.",{},{"id":586,"data":968,"type":239,"tunes":970},{"text":969},"That means versioning prompts, embedding models, retrieval settings, model identifiers, provider routes, and evaluation results. It also means having rollback logic. If a new model causes worse retrieval-grounded answers or breaks structured output, the system needs a controlled path back to the known-good configuration.",{},{"id":591,"data":972,"type":239,"tunes":974},{"text":973},"This fits the same operating logic as \u003Ca href=\"\u002Fenterprise\u002Freference-models\u002Fdelivery-and-change\">Delivery &amp; Change\u003C\u002Fa> and \u003Ca href=\"\u002Fenterprise\u002Freference-models\u002Fdigital-platform\">AI-ready platform architecture\u003C\u002Fa>: stable delivery requires repeatable controls, not heroic manual fixes.",{},{"id":596,"data":976,"type":42,"tunes":978},{"text":977,"level":260},"Conclusion: Production Begins Where the Demo Ends",{},{"id":601,"data":980,"type":239,"tunes":982},{"text":981},"Ollama can start the journey. It makes local model execution accessible and lowers the barrier to experimentation. That is valuable. But the production application begins where the demo ends.",{},{"id":606,"data":984,"type":239,"tunes":986},{"text":985},"The model is only one replaceable component. The real product is the controlled system around it: ingestion, permissions, retrieval, prompts, provider routing, evaluation, logs, monitoring, deployment, backup, and user workflow. That is where privacy becomes real, quality becomes measurable, and business value becomes repeatable.",{},{"id":611,"data":988,"type":239,"tunes":990},{"text":989},"A serious Open-LLM application is built through engineering discipline, not by running a local model once. Ollama can start the journey, but the production application begins where the demo ends.",{},{"id":616,"data":992,"type":239,"tunes":994},{"text":993},"Theme:",{},{"id":621,"data":996,"type":239,"tunes":998},{"text":997},"Ollama, Open LLM, RAG, pgvector, Qdrant, Local AI, LLMOps, Provider Abstraction, Enterprise AI Architecture",{},"2.31.5","Running a local model with Ollama is easy. Building a production-ready Open-LLM application is harder: it requires RAG, access control, provider abstraction, evaluation, logging, deployment discipline and a controlled application layer around the model.\n",{"lang":7,"title":224,"content":226,"contentJson":1002,"excerpt":626},{"time":228,"blocks":1003,"version":625},[1004,1007,1010,1013,1016,1019,1022,1025,1028,1033,1036,1039,1042,1050,1053,1056,1059,1062,1067,1070,1073,1076,1079,1082,1087,1090,1093,1098,1101,1104,1107,1110,1113,1116,1119,1122,1125,1133,1136,1139,1142,1145,1150,1153,1156,1159,1162,1167,1170,1173,1176,1179,1182,1185,1188,1191,1194,1197],{"id":231,"data":1005,"type":42,"tunes":1006},{"text":233,"level":40},{},{"id":236,"data":1008,"type":239,"tunes":1009},{"text":238},{},{"id":242,"data":1011,"type":239,"tunes":1012},{"text":244},{},{"id":247,"data":1014,"type":239,"tunes":1015},{"text":249},{},{"id":252,"data":1017,"type":239,"tunes":1018},{"text":254},{},{"id":257,"data":1020,"type":42,"tunes":1021},{"text":259,"level":260},{},{"id":263,"data":1023,"type":239,"tunes":1024},{"text":265},{},{"id":268,"data":1026,"type":239,"tunes":1027},{"text":270},{},{"id":273,"data":1029,"type":281,"tunes":1032},{"meta":1030,"items":1031,"style":280},{},[277,278,279],{},{"id":284,"data":1034,"type":289,"tunes":1035},{"text":286,"caption":287,"alignment":288},{},{"id":292,"data":1037,"type":42,"tunes":1038},{"text":294,"level":260},{},{"id":297,"data":1040,"type":239,"tunes":1041},{"text":299},{},{"id":302,"data":1043,"type":325,"tunes":1049},{"content":1044,"stretched":43,"withHeadings":14},[1045,1046,1047,1048],[306,307,308,309],[311,312,313,314],[316,317,318,319],[321,322,323,324],{},{"id":328,"data":1051,"type":239,"tunes":1052},{"text":330},{},{"id":333,"data":1054,"type":42,"tunes":1055},{"text":335,"level":260},{},{"id":338,"data":1057,"type":239,"tunes":1058},{"text":340},{},{"id":343,"data":1060,"type":239,"tunes":1061},{"text":345},{},{"id":348,"data":1063,"type":281,"tunes":1066},{"meta":1064,"items":1065,"style":362},{"counterType":351},[353,354,355,356,357,358,359,360,361],{},{"id":365,"data":1068,"type":239,"tunes":1069},{"text":367},{},{"id":370,"data":1071,"type":42,"tunes":1072},{"text":372,"level":260},{},{"id":375,"data":1074,"type":239,"tunes":1075},{"text":377},{},{"id":380,"data":1077,"type":383,"tunes":1078},{"code":382},{},{"id":386,"data":1080,"type":239,"tunes":1081},{"text":388},{},{"id":391,"data":1083,"type":281,"tunes":1086},{"meta":1084,"items":1085,"style":280},{},[395,396,397,398,399,400,401,402],{},{"id":405,"data":1088,"type":42,"tunes":1089},{"text":407,"level":260},{},{"id":410,"data":1091,"type":239,"tunes":1092},{"text":412},{},{"id":415,"data":1094,"type":281,"tunes":1097},{"meta":1095,"items":1096,"style":280},{},[419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435],{},{"id":438,"data":1099,"type":239,"tunes":1100},{"text":440},{},{"id":443,"data":1102,"type":42,"tunes":1103},{"text":445,"level":260},{},{"id":448,"data":1105,"type":239,"tunes":1106},{"text":450},{},{"id":453,"data":1108,"type":239,"tunes":1109},{"text":455},{},{"id":458,"data":1111,"type":383,"tunes":1112},{"code":460},{},{"id":463,"data":1114,"type":239,"tunes":1115},{"text":465},{},{"id":468,"data":1117,"type":42,"tunes":1118},{"text":470,"level":260},{},{"id":473,"data":1120,"type":239,"tunes":1121},{"text":475},{},{"id":478,"data":1123,"type":239,"tunes":1124},{"text":480},{},{"id":483,"data":1126,"type":325,"tunes":1132},{"content":1127,"stretched":43,"withHeadings":14},[1128,1129,1130,1131],[487,488,489,490],[492,493,494,495],[497,498,499,500],[502,503,504,505],{},{"id":508,"data":1134,"type":239,"tunes":1135},{"text":510},{},{"id":513,"data":1137,"type":42,"tunes":1138},{"text":515,"level":260},{},{"id":518,"data":1140,"type":239,"tunes":1141},{"text":520},{},{"id":523,"data":1143,"type":239,"tunes":1144},{"text":525},{},{"id":528,"data":1146,"type":281,"tunes":1149},{"meta":1147,"items":1148,"style":280},{},[532,533,534,535,536,537],{},{"id":540,"data":1151,"type":239,"tunes":1152},{"text":542},{},{"id":545,"data":1154,"type":42,"tunes":1155},{"text":547,"level":260},{},{"id":550,"data":1157,"type":239,"tunes":1158},{"text":552},{},{"id":555,"data":1160,"type":239,"tunes":1161},{"text":557},{},{"id":560,"data":1163,"type":281,"tunes":1166},{"meta":1164,"items":1165,"style":280},{},[564,565,566,567,568],{},{"id":571,"data":1168,"type":239,"tunes":1169},{"text":573},{},{"id":576,"data":1171,"type":42,"tunes":1172},{"text":578,"level":260},{},{"id":581,"data":1174,"type":239,"tunes":1175},{"text":583},{},{"id":586,"data":1177,"type":239,"tunes":1178},{"text":588},{},{"id":591,"data":1180,"type":239,"tunes":1181},{"text":593},{},{"id":596,"data":1183,"type":42,"tunes":1184},{"text":598,"level":260},{},{"id":601,"data":1186,"type":239,"tunes":1187},{"text":603},{},{"id":606,"data":1189,"type":239,"tunes":1190},{"text":608},{},{"id":611,"data":1192,"type":239,"tunes":1193},{"text":613},{},{"id":616,"data":1195,"type":239,"tunes":1196},{"text":618},{},{"id":621,"data":1198,"type":239,"tunes":1199},{"text":623},{},"Post erfolgreich abgerufen",{"items":1202,"source":1285,"manualIds":1286,"manualMatchedIds":1287},[1203,1210,1217,1223,1230,1237,1244,1251,1257,1264,1271,1278],{"id":1204,"slug":1205,"title":1206,"excerpt":1207,"featuredImage":1208,"publishedAt":1209},"480","when-should-an-ai-stop-trusting-its-own-knowledge-the-retrieval-trigger","Когда ИИ должен перестать доверять собственным знаниям? — Триггер извлечения","Модель ИИ не нуждается в поиске для каждого вопроса. Важная проблема — знать, когда её внутренних знаний уже недостаточно. Триггер поиска — это практическая граница принятия решений, которая определяет, когда система ИИ должна перестать полагаться исключительно на знания модели и получить внешние доказательства перед ответом.","\u002Fuploads\u002F2026\u002F09\u002Fwhen-should-an-ai-stop-trusting-its-own-knowledge-the-retrieval-trigger-1790574991244-f4rpyg.webp","2026-09-28T01:49:00.000Z",{"id":1211,"slug":1212,"title":1213,"excerpt":1214,"featuredImage":1215,"publishedAt":1216},"361","model-view-controller-mvc","Модель-Представление-Контроллер (MVC): Структурная основа современных веб-приложений","Model-View-Controller, обычно сокращаемый до MVC, остается одним из самых долговечных архитектурных паттернов в разработке программного обеспечения. Он предоставляет командам практичный способ разделения бизнес-логики, представления и взаимодействия с пользователем, благодаря чему приложения легче создавать, расширять, тестировать и поддерживать. В этой статье объясняется, что такое MVC, почему он по-прежнему важен, как он вписывается в современные веб-стеки и как он связан с более широкой архитектурой платформы, качеством поставки, стратегией миграции и операционной зрелостью.","\u002Fuploads\u002F2026\u002F03\u002Fmodel-view-controller-mvc-1774872805793-0bjubu.webp","2023-04-12T12:57:00.000Z",{"id":1218,"slug":658,"title":1219,"excerpt":1220,"featuredImage":1221,"publishedAt":1222},"434","Исчерпывающее руководство по Evaluation Harness: освоение оценки производительности LLM","Это руководство содержит подробный обзор Evaluation Harness — важного фреймворка для строгой оценки возможностей больших языковых моделей (LLM) в корпоративных конвейерах LLMOps. Узнайте о настройке, лучших практиках и продвинутых методах для обеспечения надежного бенчмаркинга и оптимизации моделей.","\u002Fuploads\u002F2026\u002F04\u002Fevaluation-harness-1775466944495-4s0xv2.webp","2026-03-01T17:50:00.000Z",{"id":1224,"slug":1225,"title":1226,"excerpt":1227,"featuredImage":1228,"publishedAt":1229},"460","ai-agent-reliability-why-the-final-answer-is-not-enough","Надёжность ИИ-агентов: почему финального ответа недостаточно","Правильный вывод не доказывает правильность рассуждений, безопасность выполнения или надежность системы.","\u002Fuploads\u002F2026\u002F09\u002Fai-agent-reliability-why-the-final-answer-is-not-enough-1788955466306-pl0qhz.webp","2026-09-09T04:01:00.000Z",{"id":1231,"slug":1232,"title":1233,"excerpt":1234,"featuredImage":1235,"publishedAt":1236},"384","new-qwen-3-5-plus","Новый Qwen 3.5-Plus: Open-source ИИ — теперь всё серьезно","Откройте для себя революционные функции и преимущества Qwen 3.5-Plus от Alibaba — меняющего правила игры ИИ с открытым исходным кодом для разработчиков.","\u002Fuploads\u002F2026\u002F02\u002Fnew-qwen-3-5-plus-1771515512741-dcbi9p.webp","2026-02-19T10:23:00.000Z",{"id":1238,"slug":1239,"title":1240,"excerpt":1241,"featuredImage":1242,"publishedAt":1243},"477","computer-use-agents-why-a-successful-demo-can-still-be-an-unreliable-system","Агенты для управления компьютером: почему успешная демонстрация всё ещё может быть ненадёжной системой","Агенты для управления компьютером теперь могут выполнять впечатляющие рабочие процессы в браузере и на рабочем столе, но один успешный запуск доказывает способность—а не надежность. В этой статье показано, как проверять повторяемость, устойчивость к условиям среды, управление на длинном горизонте, осведомленность о состоянии, верификацию результатов и безопасную обработку целей.","\u002Fuploads\u002F2026\u002F09\u002Fcomputer-use-agents-why-a-successful-demo-can-still-be-an-unreliable-system-1790352854690-75qnrg.webp","2026-09-25T12:13:00.000Z",{"id":1245,"slug":1246,"title":1247,"excerpt":1248,"featuredImage":1249,"publishedAt":1250},"468","ai-agent-memory-is-not-rag-how-to-separate-memory-retrieval-state-and-context","Память ИИ-агента — это не RAG: как разграничить память, извлечение, состояние и контекст","Память агента, RAG, состояние и контекст часто используются так, будто они взаимозаменяемы. Это не так. Эта практическая архитектурная модель разделяет четыре уровня, показывает, где место каждого из них, и объясняет, что ломается, когда системы объединяют их в одно целое.","\u002Fuploads\u002F2026\u002F09\u002Fai-agent-memory-is-not-rag-how-to-separate-memory-retrieval-state-and-context-1790350560308-np0xy6.webp","2026-09-25T11:34:00.000Z",{"id":1252,"slug":1253,"title":1254,"excerpt":1255,"featuredImage":1235,"publishedAt":1256},"445","qwen-3-6-in-production-release-runbook-ai-rollback-and-llmops-versioning","Qwen 3.6 в продакшене: ранбук релиза, откат ИИ и версионирование LLMOps","Qwen 3.6 — это не просто очередное обновление модели. Это одновременно событие релиза, сценарий отката и проблема версионирования. В этой статье объясняется, как следует работать с Qwen 3.6 в продакшене, используя дисциплину LLMOps, прослеживаемость промптов и моделей, контролируемое развертывание и готовность к откату на основе фактических данных.","2026-05-04T02:49:00.000Z",{"id":1258,"slug":1259,"title":1260,"excerpt":1261,"featuredImage":1262,"publishedAt":1263},"469","rag-failed-but-which-layer-actually-failed-a-diagnostic-method","RAG не сработал — но какой именно слой на самом деле отказал? Метод диагностики","Когда ответ RAG неверен, обвинять поиск или модель — слишком расплывчато. Этот диагностический метод изолирует покрытие источников, построение запроса, поиск, ранжирование, сборку контекста, генерацию, атрибуцию доказательств и актуальность — так что фактический сбой можно воспроизвести и исправить.","\u002Fuploads\u002F2026\u002F09\u002Frag-failed-but-which-layer-actually-failed-a-diagnostic-method-1790350847177-pior4c.webp","2026-09-24T19:39:00.000Z",{"id":1265,"slug":1266,"title":1267,"excerpt":1268,"featuredImage":1269,"publishedAt":1270},"478","what-is-rag-the-simplest-explanation-of-how-it-works","Что такое RAG? Самое простое объяснение того, как это работает","RAG звучит сложно, но идея проста: прежде чем ИИ ответит, он сначала находит полезную информацию из источника знаний и передаёт эту информацию языковой модели. В этом руководстве объясняются RAG, LLM, состояние, память и инструменты с помощью одной простой ментальной модели.","\u002Fuploads\u002F2026\u002F09\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works-1790377492124-khjagt.webp","2026-09-25T19:03:00.000Z",{"id":1272,"slug":1273,"title":1274,"excerpt":1275,"featuredImage":1276,"publishedAt":1277},"381","enterprise-grade-multi-tenant-architecture-for-an-international-platform","Мультитенантная архитектура корпоративного уровня для международной платформы","Loving Rocks является корпоративной свадебной платформой, разработанной с истинной многоарендной архитектурой, изолированными базами данных для каждого арендатора и встроенной интернационализацией для глобальной масштабируемости, безопасности и долгосрочной операционной стабильности.","\u002Fuploads\u002F2026\u002F01\u002Fenterprise-grade-multi-tenant-architecture-for-an-international-platform-1769789121298-b6v7ak.webp","2026-01-30T12:04:00.000Z",{"id":1279,"slug":1280,"title":1281,"excerpt":1282,"featuredImage":1283,"publishedAt":1284},"479","where-does-an-llm-get-its-data-rag-data-sources-in-python","Откуда LLM берёт данные? Источники данных RAG в Python","LLM не знает магическим образом о ваших файлах, базах данных или API. Это практическое продолжение серии о RAG показывает на простом Python, как внешние данные становятся извлекаемыми доказательствами: от текстовых файлов и SQL до полнотекстового поиска, эмбеддингов, сборки контекста и финального вызова LLM.","\u002Fuploads\u002F2026\u002F09\u002Fwhere-does-an-llm-get-its-data-rag-data-sources-in-python-1790517200521-nfsi5i.webp","2026-09-27T05:51:00.000Z","fallback",[],[]]