Layered context builder for LLM prompts: RAG + compressed session memory + user profile
Project description
protoprompt
Слоистый сборщик контекста для LLM-промптов. Три независимых, компонуемых слоя кормят модель: RAG по документам, сжатая история сессии и опциональный профиль пользователя. Подключаемое векторное хранилище, подключаемый токенайзер, подключаемая стратегия сжатия.
Зачем
Прод-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 |
Документация
Полная документация собирается в двух языковых версиях:
- 🇷🇺 Русская: https://idxeed.github.io/protoprompt/ru/
- 🇬🇧 English: https://idxeed.github.io/protoprompt/en/
Локальная сборка:
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7d160b1527a87b402d2382c530437be4eb4d5ff18585691fe62c3b7f5c4ae73
|
|
| MD5 |
d61417007baafd254f0fd1e4f6a57b2c
|
|
| BLAKE2b-256 |
f46944fabb140c492b81bb84a5c2cc979ae1874847e95fde638d035fa443582a
|
Provenance
The following attestation bundles were made for protoprompt-0.1.0.tar.gz:
Publisher:
publish.yml on Idxeed/protoprompt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
protoprompt-0.1.0.tar.gz -
Subject digest:
f7d160b1527a87b402d2382c530437be4eb4d5ff18585691fe62c3b7f5c4ae73 - Sigstore transparency entry: 2138370441
- Sigstore integration time:
-
Permalink:
Idxeed/protoprompt@f7a5af2af8fdb83cb7da46bf6bd55b16b58d1ad7 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Idxeed
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f7a5af2af8fdb83cb7da46bf6bd55b16b58d1ad7 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97f4994845c82b3e56381292706d21e5dec4d7c8edce93e7d99f2459354c0f7d
|
|
| MD5 |
e1e31a621940c96258d6ce104d2350da
|
|
| BLAKE2b-256 |
c6176430f8f0926e4de0372af136d7d051e529d90ffee8fb57cbad711ee979b3
|
Provenance
The following attestation bundles were made for protoprompt-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Idxeed/protoprompt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
protoprompt-0.1.0-py3-none-any.whl -
Subject digest:
97f4994845c82b3e56381292706d21e5dec4d7c8edce93e7d99f2459354c0f7d - Sigstore transparency entry: 2138370469
- Sigstore integration time:
-
Permalink:
Idxeed/protoprompt@f7a5af2af8fdb83cb7da46bf6bd55b16b58d1ad7 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Idxeed
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f7a5af2af8fdb83cb7da46bf6bd55b16b58d1ad7 -
Trigger Event:
push
-
Statement type: