• О компании Milvus
  • Начать работу
  • Понятия
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебные пособия
  • Часто задаваемые вопросы
  • API Reference

MemPalace с Milvus

MemPalace — это уровень памяти для кодирующих агентов и длительных рабочих процессов разработки. Он систематизирует знания по проекту в «крылья», «комнаты» и «ящики», а затем обеспечивает возможность поиска исходного контента между сессиями.

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

В примере используется Milvus Lite, поэтому он запускается локально без Docker или отдельного сервера базы данных. Та же конфигурация MemPalace может также указывать на сервер Milvus или Zilliz Cloud для совместных развертываний.

Необходимые условия

Установите MemPalace с его дополнительными зависимостями Milvus из PyPI. В команде намеренно не указана конкретная версия, поэтому при новой установке будет использована последняя доступная версия.

uv tool install "mempalace[milvus]"

Также потребуется Git для загрузки корпуса документации.

В этом руководстве используется локальная модель вложений MiniLM от MemPalace, поэтому ключ API для внешней модели не требуется. При выполнении первой команды добычи или поиска может быть загружена небольшая модель вложений в формате ONNX.

Настройте рабочую область

Создайте рабочую область с отдельными каталогами для документации и MemPalace:

mkdir -p mempalace-milvus-demo
cd mempalace-milvus-demo

export PALACE_DIR="$PWD/palace"
export DOCS_REPO="$PWD/milvus-docs"
export PROJECT_DIR="$PWD/milvus-analyzer-docs"
export MEMPALACE_EMBEDDING_MODEL="minilm"
export MEMPALACE_EMBEDDING_DEVICE="cpu"
export MEMPALACE_EMBEDDING_THREADS="2"

В приведенных ниже командах MemPalace мы передаем --backend milvus. Поскольку удаленный URI Milvus не настроен, MemPalace создает локальную базу данных Milvus Lite по адресу $PALACE_DIR/milvus.db.

Что касается аргумента MilvusClient, используемого бэкендом:

  • Наиболее удобным вариантом является указание uri в виде локального пути, например ./milvus.db. В этом случае Milvus Lite автоматически используется для локального хранения данных.
  • Для более крупного развертывания можно использовать сервер Milvus и установить в качестве URI его конечную точку, например http://localhost:19530.
  • Чтобы использовать Zilliz Cloud, установите в качестве URI и токена публичный конечный пункт кластера и ключ API.

Загрузка корпуса документации Milvus

Репозиторий документации Milvus намного больше, чем требуется для данного примера. Воспользуйтесь функцией «разреженной проверки» Git, чтобы загрузить только каталог документации по анализаторам из ветки v3.0.x:

git clone \
  --depth 1 \
  --filter=blob:none \
  --sparse \
  --branch v3.0.x \
  https://github.com/milvus-io/milvus-docs.git \
  "$DOCS_REPO"

git -C "$DOCS_REPO" sparse-checkout set \
  site/en/userGuide/schema/analyzer

cp -R \
  "$DOCS_REPO/site/en/userGuide/schema/analyzer" \
  "$PROJECT_DIR"

На момент написания данного руководства этот каталог содержит 31 страницу в формате Markdown. В их число входят общие руководства по Analyzer и три группы тесно связанных страниц:

milvus-analyzer-docs/
├── analyzer/       # Built-in language analyzers
├── filter/         # Token filters
├── tokenizer/      # Tokenizers
└── *.md            # Analyzer overviews and selection guides

Проверьте количество исходных страниц:

find "$PROJECT_DIR" -type f -name "*.md" | wc -l

Результат проверки:

31

Точное количество может измениться по мере обновления ветки документации Milvus.

Определение комнат в MemPalace

MemPalace может обнаруживать комнаты во время процесса « mempalace init », но его процесс инициализации также выполняет эвристическую классификацию сущностей в масштабе всего проекта и записывает принятые результаты в реестр сущностей. Этот этап классификации не требуется для определения данного корпуса документации, поэтому мы предоставляем небольшую таксономию напрямую. В процессе интеллектуального анализа MemPalace может по-прежнему присоединять детерминированные эвристические метаданные сущностей и создавать внутренние ссылки между комнатами; эти ассоциации не определяют, в какую комнату попадает файл, и не влияют на приведенный ниже поиск в пределах конкретной комнаты.

Создайте файл $PROJECT_DIR/mempalace.yaml со следующим содержанием:

wing: milvus_analyzer_docs
rooms:
  - name: analyzer
    description: Built-in language analyzers and analyzer selection guides
    keywords:
      - analyzer
  - name: filter
    description: Token filters used in analyzer pipelines
    keywords:
      - filter
  - name: tokenizer
    description: Tokenizers and language identification
    keywords:
      - tokenizer
  - name: general
    description: Analyzer documentation that does not fit another room
    keywords: []

Крыло представляет собой весь корпус документации. Комната представляет собой тематическую область. MemPalace направляет файл, сначала проверяя его каталог, затем имя файла, а затем ключевые слова комнаты в его содержании. Например, файл, находящийся в папке filter/, попадает непосредственно в комнату filter.

Затем каждый файл разбивается на перекрывающиеся фрагменты текста. Каждый фрагмент становится ящиком, содержащим дословный текст в формате Markdown и метаданные, такие как wing, room, source_file, chunk_index, а также номера строк исходного кода. Комнаты и ящики остаются логическими метаданными внутри коллекций Milvus в MemPalace; MemPalace не создает отдельную коллекцию Milvus для каждой комнаты.

Импорт документации в Milvus

Извлечение данных из проекта с помощью бэкэнда Milvus:

mempalace \
  --palace "$PALACE_DIR" \
  mine "$PROJECT_DIR" \
  --backend milvus

См. выходные данные из проверенного моментального снимка документации:

=======================================================
  Done.
  Files processed: 31
  Files skipped (already filed or other): 0
  Drawers filed: 473

  By room:
    filter               16 files
    analyzer              8 files
    tokenizer             7 files
=======================================================

MemPalace считывает Markdown без его обобщения или переработки, вычисляет локальные вложения и сохраняет ячейки в Milvus. В протестированном снимке документации 31 файл сформировал 473 ячейки.

Проверьте полученные комнаты и количество ячеек:

mempalace --palace "$PALACE_DIR" status --backend milvus

Справочные данные:

=======================================================
  MemPalace Status -- 473 drawers
=======================================================

  WING: milvus_analyzer_docs
    ROOM: analyzer               212 drawers
    ROOM: filter                 156 drawers
    ROOM: tokenizer              105 drawers

=======================================================

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

Используйте mempalace search для поиска документации по смыслу. В следующем запросе не указаны конкретные файлы или функции Analyzer:

mempalace \
  --palace "$PALACE_DIR" \
  search "How should I analyze documents that mix several languages?" \
  --backend milvus \
  --wing milvus_analyzer_docs \
  --results 3

Эталонный результат (оценки могут варьироваться):

Results for: "How should I analyze documents that mix several languages?"
Wing: milvus_analyzer_docs

[1] milvus_analyzer_docs / analyzer
    Source: multi-language-analyzers.md
    Match: cosine_sim=0.334 bm25=2.469
[2] milvus_analyzer_docs / analyzer
    Source: multi-language-analyzers.md
[3] milvus_analyzer_docs / analyzer
    Source: multi-language-analyzers.md

В проверенном запуске все три результата были получены из multi-language-analyzers.md, хотя корпус также содержал страницы, посвящённые отдельным языковым анализаторам, токенизаторам и фильтрам.

Поиск внутри комнаты

Фильтры комнат полезны, когда связанные концепции встречаются по всему корпусу. Следующий запрос ищет только в комнате filter способ сопоставить эквивалентные термины:

mempalace \
  --palace "$PALACE_DIR" \
  search "How can equivalent terms such as USA and United States match one another?" \
  --backend milvus \
  --wing milvus_analyzer_docs \
  --room filter \
  --results 3

Референсный вывод (оценки могут варьироваться):

Results for: "How can equivalent terms such as USA and United States match one another?"
Wing: milvus_analyzer_docs
Room: filter

[1] milvus_analyzer_docs / filter
    Source: synonym-filter.md
    Match: cosine_sim=0.765 bm25=2.573
[2] milvus_analyzer_docs / filter
    Source: stemmer-filter.md
[3] milvus_analyzer_docs / filter
    Source: stop-filter.md

Первый результат должен быть взят из комнаты synonym-filter.md. Ограничение по комнате применяется через метаданные ящиков перед векторным поиском, поэтому ящики токенизаторов и языковых анализаторов исключаются из этого поиска.

Поиск точных терминов

CLI MemPalace сочетает семантическое сходство с сигналами BM25 при ранжировании кандидатов векторного поиска. Поэтому точные названия конфигураций и названия функций могут улучшить ранжирование без переключения в отдельный режим поиска CLI.

mempalace \
  --palace "$PALACE_DIR" \
  search "language_identifier tokenizer" \
  --backend milvus \
  --wing milvus_analyzer_docs \
  --room tokenizer \
  --results 3

Пример вывода (оценки могут варьироваться):

Results for: "language_identifier tokenizer"
Wing: milvus_analyzer_docs
Room: tokenizer

[1] milvus_analyzer_docs / tokenizer
    Source: language-identifier.md
    Match: cosine_sim=0.420 bm25=0.969
[2] milvus_analyzer_docs / tokenizer
    Source: language-identifier.md
[3] milvus_analyzer_docs / tokenizer
    Source: lindera-tokenizer.md

Результаты должны отдавать предпочтение language-identifier.md, где описан токенизатор language_identifier, используемый для выбора анализаторов на основе обнаруженного языка.

Проверка коллекций Milvus

MemPalace автоматически управляет своей схемой Milvus. Чтобы проверить, что было сохранено, сохраните следующий скрипт как inspect_milvus.py. Он открывает ту же базу данных Milvus Lite, просматривает коллекции и подсчитывает ящики по комнатам:

import os
from collections import Counter

from pymilvus import MilvusClient


client = MilvusClient(uri=os.environ["MEMPALACE_MILVUS_LITE_PATH"])

for collection_name in sorted(client.list_collections()):
    stats = client.get_collection_stats(collection_name)
    schema = client.describe_collection(collection_name)
    fields = [field["name"] for field in schema["fields"]]
    print(f"{collection_name}: rows={stats['row_count']}, fields={fields}")

client.load_collection("mempalace_drawers")
rows = client.query(
    collection_name="mempalace_drawers",
    filter='metadata["wing"] == "milvus_analyzer_docs"',
    limit=2000,
    output_fields=["metadata"],
)
room_counts = Counter(row["metadata"]["room"] for row in rows)
print("Drawers by room:", dict(sorted(room_counts.items())))

Запустите скрипт с тем же набором опциональных зависимостей, что и в CLI:

export MEMPALACE_MILVUS_LITE_PATH="$PALACE_DIR/milvus.db"
uv run --with "mempalace[milvus]" inspect_milvus.py

Пример вывода:

mempalace_closets: rows=74, fields=['id', 'document', 'metadata', 'vector', 'sparse']
mempalace_drawers: rows=473, fields=['id', 'document', 'metadata', 'vector', 'sparse']
Drawers by room: {'analyzer': 212, 'filter': 156, 'tokenizer': 105}

Для тестируемого моментального снимка документации файл mempalace_drawers содержал 473 строки, а файл mempalace_closets — 74 записи внутренней навигации. Количество шкафов и ящиков не обязательно должно совпадать. Метаданные ящиков показали 212 ящиков в файле analyzer, 156 — в filter и 105 — в tokenizer.

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

Дополнительно: использование сервера Milvus или Zilliz Cloud

Для совместного развертывания установите переменные среды подключения к Milvus перед запуском тех же команд MemPalace CLI. Оставьте их не установленными, чтобы использовать локальную базу данных Milvus Lite, показанную выше.

Для сервера Milvus:

export MEMPALACE_MILVUS_URI="http://localhost:19530"
export MEMPALACE_MILVUS_DB_NAME="default"
export MEMPALACE_MILVUS_NAMESPACE="team-memory"

Для Zilliz Cloud:

export MEMPALACE_MILVUS_URI="https://your-cluster.api.region.zillizcloud.com"
export MEMPALACE_MILVUS_TOKEN="your-api-key"
export MEMPALACE_MILVUS_DB_NAME="default"
export MEMPALACE_MILVUS_NAMESPACE="team-memory"

Команды, приведенные в этом руководстве, были проверены с использованием Milvus Lite. Приведенные выше настройки для сервера и облака являются дополнительными конфигурациями развертывания и не требовались для локальной проверки.

Заключение

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