Skip to main content

Layered context builder for LLM prompts: RAG + compressed session memory + user profile

Project description

protoprompt

CI Coverage Python 3.11+ License: MIT RU EN

Слоистый сборщик контекста для LLM-промптов. Три независимых, компонуемых слоя кормят модель: RAG по документам, сжатая история сессии и опциональный профиль пользователя. Подключаемое векторное хранилище, подключаемый токенайзер, подключаемая стратегия сжатия.

English version

Зачем

Прод-LLM-приложения упираются в одну и ту же стену: модели нужен контекст, но окно конечно. Собранная вручную сборка промпта превращается в кашу: документы ищутся отдельно от истории, system prompt дублируется, и каждая команда переписывает один и тот же клей.

protoprompt разделяет три задачи и даёт каждой чистый протокол:

  • StoreProtocol — векторное хранилище (in-memory для тестов, ChromaDB для прода).
  • StrategyProtocol — как сжимать старые ходы длинной сессии.
  • TokenCounter — как считать бюджет финального промпта.

ContextBuilder оркестрирует все три. Результат — единый system_prompt плюс структурированный ContextOutput с описанием того, что вошло (head, tail, RAG, profile), чтобы UI мог показать provenance.

Установка

pip install protoprompt

# С ChromaDB-бэкендом
pip install "protoprompt[chroma]"

# С tiktoken-токенайзером
pip install "protoprompt[tiktoken]"

# Для разработки и документации
pip install "protoprompt[chroma,dev]"

Быстрый старт

import asyncio
from protoprompt import (
    InMemStore,
    ContextBuilder,
    ContextInput,
    Pipeline,
    HeuristicStrategy,
    Session,
)


class MyLLM:
    async def chat(self, messages, model="", **options):
        return "заглушка"

    async def embed(self, texts, model=""):
        # замените на реальные эмбеддинги
        return [[0.1] * 384 for _ in texts]


async def main():
    store = InMemStore()
    store.add("doc-1", ["Париж — столица Франции."], [[0.5] * 384])
    llm = MyLLM()

    builder = ContextBuilder(store, llm)
    out = await builder.build(ContextInput(
        query="Какая столица Франции?",
        system_prompt="Ты учитель географии.",
        doc_ids=[1],
    ))
    print(out.system_prompt)

    pipeline = Pipeline(
        store, llm,
        strategy=HeuristicStrategy(),
        compress_every_n=10,
    )
    session = Session(chat_id="c1", messages=[
        {"role": "user", "content": "Привет"},
        {"role": "assistant", "content": "Здравствуйте!"},
    ])
    if pipeline.should_compress(len(session.messages)):
        await pipeline.compress_and_store(session)


asyncio.run(main())

Архитектура

                 +--------------------+
                 |   ContextBuilder   |
                 |   (оркестратор)    |
                 +---------+----------+
                           |
        +------------------+------------------+------------------+
        |                  |                  |                  |
        v                  v                  v                  v
+---------------+  +----------------+  +---------------+  +---------+
| RAG-поиск     |  | Память сессии  |  | Профиль польз.|  |  Store  |
| (vector top-k)|  | (сжатая)       |  | (из LLM)      |  |  query  |
+---------------+  +----------------+  +---------------+  +---------+
        |                  |                  |
        +--------+---------+--------+---------+
                 |                  |
                 v                  v
        +----------------+  +----------------+
        |  TokenCounter  |  |  StoreProtocol |
        |  (pluggable)   |  |  (in-mem/chroma)|
        +----------------+  +----------------+

Публичный API

Модуль Экспорты
protoprompt Pipeline, ContextBuilder, ContextInput, ContextOutput
protoprompt.store StoreProtocol, InMemStore, ChromaStore
protoprompt.session Session, CompressedBlock, HeuristicStrategy, LLMSummaryStrategy
protoprompt.profile UserProfile, ProfileBuilder
protoprompt.tokens TokenCounter, RegexTokenCounter, TiktokenCounter
protoprompt.llm LLMClientProtocol

Документация

Полная документация собирается в двух языковых версиях:

Локальная сборка:

pip install "protoprompt[dev]"
python scripts/build_docs.py --serve  # обе версии на разных портах

Разработка

git clone https://github.com/Idxeed/protoprompt
cd protoprompt
python -m venv .venv && source .venv/bin/activate
pip install -e ".[chroma,dev]"
pytest

Лицензия

MIT — см. LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

protoprompt-0.1.0.tar.gz (41.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

protoprompt-0.1.0-py3-none-any.whl (23.8 kB view details)

Uploaded Python 3

File details

Details for the file protoprompt-0.1.0.tar.gz.

File metadata

  • Download URL: protoprompt-0.1.0.tar.gz
  • Upload date:
  • Size: 41.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for protoprompt-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f7d160b1527a87b402d2382c530437be4eb4d5ff18585691fe62c3b7f5c4ae73
MD5 d61417007baafd254f0fd1e4f6a57b2c
BLAKE2b-256 f46944fabb140c492b81bb84a5c2cc979ae1874847e95fde638d035fa443582a

See more details on using hashes here.

Provenance

The following attestation bundles were made for protoprompt-0.1.0.tar.gz:

Publisher: publish.yml on Idxeed/protoprompt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file protoprompt-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: protoprompt-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 23.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for protoprompt-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 97f4994845c82b3e56381292706d21e5dec4d7c8edce93e7d99f2459354c0f7d
MD5 e1e31a621940c96258d6ce104d2350da
BLAKE2b-256 c6176430f8f0926e4de0372af136d7d051e529d90ffee8fb57cbad711ee979b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for protoprompt-0.1.0-py3-none-any.whl:

Publisher: publish.yml on Idxeed/protoprompt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page