Мотивация
Как LLM взаимодействует со своей средой в ваших системах? Не взаимодействует. Это API вызова и ответа. Я постоянно слышу Агенты то, Агенты сё, но мне кажется, что без доступа к инструментам, которые позволяют им наблюдать или манипулировать своей средой, Агенты принципиально ограничены в выполнении тех значимых задач, которые нам интересны.
Первые десять раз, когда я вижу новое модное слово, я стараюсь изо всех сил игнорировать шум, но после того, как Model Context Protocol (MCP) начал всплывать, я вникаю в него. Представляя последовательный формат для рекламы существования инструментов и ресурсов и того, как их использовать, он аккуратно решает проблему. Когда вам нужно создать новый коннектор для LLM к инструменту или базе данных, вы можете найти готовый сервер MCP с открытым исходным кодом и добавить его. У MCP также есть корпоративный спонсор, который его поддерживает — Anthropic , один из ключевых игроков отрасли — поэтому он был догфудным (dogfed?) с самого начала и создавался на века.
Related MCP server: Zaturn
План
Мне нравится изучать что-то новое, решая реальные проблемы — я считаю, что так результаты лучше застревают в моей голове. Я проделал массу работы по Retrieval Augmented Generation (RAG) и готовлю большую ее часть для открытого исходного кода, и я вижу MCP как следующую эволюцию в архитектурах RAG. Я думаю, что в ближайшем будущем, если вы хорошо делаете RAG, вы будете делать это поверх MCP.
Я недавно изучал инвестиции в недвижимость, ожидая коррекции рынка в течение ближайшего года или двух. Я собираюсь загрузить некоторые бесплатные данные Zillow в базу данных, а затем запустить на ней сервер MCP. Затем я собираюсь запустить сервер FastAPI, который подключается к серверу MCP и обслуживает запросы из пользовательского интерфейса htmx. Конечная цель — чат-бот, который может помочь мне изучить эти данные о недвижимости и принять некоторые решения о том, на каких рынках искать сделки.
Данные, которые я собираюсь загрузить, включают:
Индекс стоимости жилья Zillow (ZHVI) — показатель типичной стоимости жилья для определенного региона и типа жилья в пределах от 65-го до 95-го процентиля.
Прогноз стоимости жилья от Zillow (ZHVF) – перспективная оценка тенденций стоимости жилья, основанная на текущих и исторических рыночных данных.
Индекс арендной платы Zillow Observed Rent Index (ZORI) — сглаженный показатель типичных рыночных арендных ставок, наблюдаемых в текущих и нерыночных объявлениях об аренде.
Прогноз наблюдаемой арендной платы Zillow (ZORF) – прогнозируемые изменения цен на аренду на основе тенденций ZORI и рыночных показателей.
Вы можете заметить, что я исключаю данные ZHVI из-за их отсутствия — они только недавно начали их отслеживать.
Это очень специфичные для предметной области данные — вы вряд ли захотите делать предположения о данных, не прочитав определения — поэтому я думаю, что это будет отличным примером, поскольку обладатель степени магистра права не сможет интуитивно разобраться в тривиальном наборе проблем.
Я хочу попросить LLM помочь мне найти рынок с балансом доступных домов с арендной платой, которая приносит доход с большими прогнозируемыми будущими темпами роста. Я также не хочу принимать эти прогнозируемые темпы роста как должное — давайте немного попрограммируем, чтобы увидеть, как часто и в какой области они, как правило, оказываются правильными. Я ожидаю, что это потребует много оперативной инженерии для создания различных запросов. Затем я смогу сохранить эти подсказки как подсказки MCP, чтобы предлагать их чат-боту и выполнять в базе данных.
Я выбираю sqlite в качестве базы данных, поскольку она хранит память в локальном файле, поэтому не требуется перезагрузка или поднятие/опускание базы данных. Я собираюсь запустить базу данных в контейнере для переносимости, поэтому сохранение состояния базы данных в файле означает, что я могу рассматривать ее как «кэшированную» загрузку данных, если захочу. Таким образом, мне не нужно перезагружать данные Zillow в базу данных каждый раз, когда я перезапускаю контейнер, если я монтирую его к локальному тому.
Чтобы иметь возможность общаться с этими данными, я знаю, что мне нужно написать какой-то сервер MCP, который может выполнять запросы к таблицам, которые мы только что написали. Я думаю, что мне нужно будет кодировать полезные запросы как подсказки MCP или инструменты, которые затем представляются LLM за клиентом MCP из того, что я прочитал до сих пор, но я пока не уверен, как это выглядит на практике. Я начинаю с этой документации от langchain, смешанной с несколькими другими вещами, которые я читал, в качестве начального сервера, из которого я могу построить. Затем я в основном следовал документации Anthropic для написания начала моего клиента MCP, хотя я заменил большую часть их кода на агент langgraph ReAct. Затем я не был уверен, как заставить клиент и сервер общаться друг с другом, поэтому я нашел эту действительно замечательную документацию MCP , в которой говорится о различных методах транспортировки, встроенных в MCP. Я использую метод по умолчанию, который заключается в передаче сообщений в процессе между клиентом и сервером с помощью stdio. Это будет один контейнер с локальной базой данных и бэкендом приложения внутри, так что это имеет смысл, но для чего-либо производственного уровня я представляю, что сервер MCP будет отделен от бэкенда, что потребует более сложной конфигурации потоковой передачи HTTP. Я оставлю это на тот случай, когда мне придется создать что-то подобное для работы.
Прямо сейчас это один скрипт, который я выполняю для генерации одного сообщения. Чтобы сделать это полезным, мне нужно прикрепить веб-сервер, который принимает пользовательские запросы и пропускает их через эти функции. Чтобы сделать веб-сервер полезным, мне понадобится фронтенд, который выглядит как интерфейс чата, чтобы делать запросы к серверу. Streamlit в последнее время был в моде для проектов ИИ, подобных этому, и я пробовал его в предыдущих проектах , а также в качестве внутреннего инструментария для работы, но я пришел к выводу, что запуск медленного кода React из медленного кода Python, требующий целого дополнительного куска серверного кода, который вам нужно развернуть для Python, — не лучший способ создания легковесных фронтендов. Никто не хочет переписывать доказательство концепции во что-то по-настоящему производственного уровня после его одобрения, поэтому часто кажется, что этого просто не происходит. Я написал больше, чем положено, на React, что устранило бы посредника Python здесь, но это действительно кажется излишеством. Каждый раз, когда я создаю что-то fullstack, я в конечном итоге делаю больше фронтенд-разработки, чем я на самом деле пытался изучить. HTMX уже некоторое время находится на моем радаре, и я собираюсь попробовать его для этого проекта — он смехотворно легкий и обеспечивает именно минималистичную функциональность, которая требуется низкологичному интерфейсу, такому как приложение чата. Кроме того, мемы элитные . Единственное, что это влияет на мой выбор сервера, — это то, что мне нужно возвращать шаблонизированный HTML, поэтому я собираюсь использовать jinja для шаблонизации моих веб-страниц и отправлять их с тегом скрипта HTMX. Это серьезно все, что вам нужно для запуска, это потрясающе.
Хотя серверы Echo не очень интересны, так что давайте подключим нашего агента LLM. Я добавил клиент MCP в жизненный цикл сервера FastAPI, привязав его к состоянию приложения, чтобы его можно было передавать между работниками потокобезопасным способом, а не так, как клиент/сервер построены с пулами. Мы просто передаем сообщение агенту и форматируем вывод в небольшой html, а затем передаем его обратно в UI.