A label-driven RAG pipeline built on top of paralabelgen.
Project description
labelrag
labelrag is a Python library for label-driven retrieval-augmented generation
pipelines built on top of paralabelgen.
- PyPI distribution:
labelrag - Python import package:
labelrag - Core dependency target:
paralabelgen==0.2.3 - Primary supported extraction path:
paralabelgenLLM concept extraction - First semantic-reranking embedding provider:
sentence-transformers
Install
pip install labelrag
If you want to use the spaCy-backed extraction path, install a compatible English pipeline such as:
python -m spacy download en_core_web_sm
en_core_web_sm is a convenient local option, but the semantic-retrieval
release line targets the paralabelgen==0.2.3 LLM concept-extraction pipeline
as the primary supported extraction path.
The upstream paralabelgen==0.2.3 runtime also supports DeepSeek-backed
extraction through its own configuration surface. labelrag does not introduce
DeepSeek-specific APIs; it continues to pass extraction configuration through to
paralabelgen.
The first shipped semantic-reranking provider uses sentence-transformers.
Its model weights may be downloaded on first use if they are not already cached
locally.
Quick Start
Retrieval-only workflow
from labelrag import (
RAGPipeline,
RAGPipelineConfig,
)
paragraphs = [
"OpenAI builds language models for developers.",
"Developers use language models in production systems.",
"Production systems need monitoring and evaluation tooling.",
]
config = RAGPipelineConfig()
config.labelgen.extractor_mode = "heuristic"
config.labelgen.use_graph_community_detection = False
pipeline = RAGPipeline(config)
pipeline.fit(paragraphs)
retrieval = pipeline.build_context("How do developers use language models?")
print(retrieval.prompt_context)
print(retrieval.metadata)
Retrieval plus provider-backed answer generation
from labelrag import (
OpenAICompatibleAnswerGenerator,
OpenAICompatibleConfig,
RAGPipeline,
RAGPipelineConfig,
)
paragraphs = [
"OpenAI builds language models for developers.",
"Developers use language models in production systems.",
"Production systems need monitoring and evaluation tooling.",
]
config = RAGPipelineConfig()
config.labelgen.extractor_mode = "heuristic"
config.labelgen.use_graph_community_detection = False
pipeline = RAGPipeline(config)
pipeline.fit(paragraphs)
generator = OpenAICompatibleAnswerGenerator(
OpenAICompatibleConfig(
model="mistral-small-latest",
api_key_env_var="MISTRAL_API_KEY",
base_url="https://api.mistral.ai/v1",
)
)
answer = pipeline.answer_with_generator(
"How do developers use language models?",
generator,
)
print(answer.answer_text)
print(answer.metadata)
Retrieval Model
The current retrieval layer is deterministic and still label-driven at the candidate-generation stage.
fit(...)delegates paragraph analysis tolabelgen.LabelGeneratorfit(...)also builds paragraph embeddingsbuild_context(...)maps the question into the fitted label space- retrieval uses greedy coverage over query label IDs
- semantic similarity is used as a secondary ranking signal inside greedy selection
- label-free queries can use configurable fallback strategies
require_full_label_coverage=Truesuppresses partial retrieval results while preserving attempted coverage trace in metadata
Greedy selection order is:
- larger overlap with remaining query labels
- larger semantic similarity
- larger overlap on query concept IDs
- larger total paragraph label count
- lexicographically smaller
paragraph_id
In 0.1.3, the default main-path strategy is slightly more practical when
coverage completes early:
- it first builds the label-overlap candidate universe
- it still runs greedy label coverage first
- if coverage finishes before
max_paragraphs, it backfills from the remaining label-overlap candidates by semantic similarity
This keeps the default path label-bounded while making top_k retrieval less
likely to collapse to a single paragraph for single-label queries.
0.1.2 supports two main-path retrieval strategies:
greedy_label_coverage_semantic_reranklabel_gate_semantic_rank
label_gate_semantic_rank keeps label overlap as a candidate gate but lets
semantic similarity become the primary ranking signal inside that gated set.
0.1.2 supports four label-free fallback strategies:
concept_overlap_onlyconcept_overlap_semantic_rerankconcept_gate_semantic_ranksemantic_only
The default is concept_overlap_semantic_rerank.
concept_gate_semantic_rank mirrors the main gated semantic-first behavior for
label-free queries:
- paragraph concepts must still intersect the query concepts to enter the candidate set
- semantic similarity is then the primary ranking signal inside that gated set
The default strategies remain unchanged in 0.1.3:
- main path:
greedy_label_coverage_semantic_rerank
- label-free fallback:
concept_overlap_semantic_rerank
The retrieval trace now also distinguishes the meaning of retrieval_score
per result through retrieval_score_kind, and the default greedy main path
reports whether semantic backfill ran through semantic_backfill_used.
OpenAI-Compatible Provider Notes
The built-in answer-generation adapter targets a minimal OpenAI-compatible chat-completions API surface.
It supports:
- standard base URLs such as
https://api.openai.com/v1 - full endpoint URLs such as
https://api.mistral.ai/v1/chat/completions - API key injection through explicit config or optional environment-variable lookup
- non-streaming text generation for
answer_with_generator(...)
This adapter is intended to cover providers such as OpenAI, Mistral, and Qwen when they expose an OpenAI-compatible endpoint shape.
Public API
The main public entrypoints are:
RAGPipelineRAGPipelineConfig,RetrievalConfig,PromptConfigIndexedParagraph,LabelRecord,ConceptRecordQueryAnalysis,RetrievedParagraphRetrievalResult,RAGAnswerResultGeneratedAnswer,AnswerGeneratorOpenAICompatibleAnswerGenerator,OpenAICompatibleConfig- convenience re-export:
Paragraph
RAGPipeline also exposes record-oriented inspection helpers for
paragraph/label/concept lookup workflows:
get_paragraph(...)get_label(...)get_paragraph_labels(...)get_paragraph_concepts(...)get_label_paragraphs(...)get_concept_paragraphs(...)
Lower-level ID-oriented helpers remain available when you only need stable IDs:
get_label_paragraph_ids(...)get_paragraph_label_ids(...)get_paragraph_concept_ids(...)get_concept_paragraph_ids(...)
Detailed API notes are available in docs/public_api.md.
Embedding Notes
RAGPipeline.fit(...)now requires an embedding provider- the default runtime path is
RAGPipeline(config)and resolves the embedding provider fromconfig.embedding - explicit
embedding_provider=is still available as an advanced override - the first shipped provider is
SentenceTransformerEmbeddingProvider - the default model is
sentence-transformers/all-MiniLM-L6-v2 - the model may be downloaded on first use
- offline environments should pre-cache the embedding model before running
fit(...)
Common runtime failures:
- missing
sentence-transformerspackage:- reinstall project dependencies, for example
pip install -e .
- reinstall project dependencies, for example
- model load/download failure:
- verify the configured model name
- ensure the model is already cached locally or that the environment can reach Hugging Face
Examples
Runnable examples are available in examples/:
examples/basic_usage.pyexamples/custom_config.pyexamples/inspection_api.pyexamples/fallback_policies.pyexamples/gated_semantic_rank.pyexamples/greedy_backfill.pyexamples/semantic_rerank.pyexamples/save_and_load.pyexamples/provider_answer.py
Example note:
- the runnable example scripts use a tiny local demo embedding provider so they stay runnable offline
- production usage should prefer
SentenceTransformerEmbeddingProvider
Persistence Notes
save(path) produces a human-inspectable directory containing:
manifest.jsonconfig.jsonlabel_generator.jsoncorpus_index.jsonfit_result.jsonparagraph_embeddings.npz
The persistence layer now supports:
jsonjson.gz
Compression is applied to the full saved snapshot rather than mixing compressed and uncompressed artifacts in one directory.
Snapshots written by the current release include a lightweight manifest describing the saved version, persistence format, and expected artifacts.
Public guarantee:
- a saved and reloaded pipeline should preserve retrieval behavior for the same fitted state, question, and config
Current update boundary:
fit(...)is batch-only- adding new paragraphs currently requires a full refit
- save/load restores a static fitted state rather than an incrementally updateable corpus state
Legacy snapshot note:
- loading pre-embedding snapshots remains a best-effort compatibility path
- when older snapshots are missing derived concept inspection tables,
load()may rebuild them from paragraph-side concept data that is still present - when older snapshots predate
paragraph_embeddings.npz,load()may rebuild paragraph embeddings from persisted paragraph texts if an embedding provider is available - persisted manifests include a non-empty
labelrag_version save()fails explicitly if the current package version cannot be determined for manifest writing
Configuration Notes
RetrievalConfig.max_paragraphssets the hard retrieval limitRetrievalConfig.retrieval_strategyselects one of:greedy_label_coverage_semantic_reranklabel_gate_semantic_rank
RetrievalConfig.allow_label_free_fallbackenables deterministic concept fallback behavior for label-free queriesRetrievalConfig.label_free_fallback_strategyselects one of:concept_overlap_onlyconcept_overlap_semantic_rerankconcept_gate_semantic_ranksemantic_only
RetrievalConfig.require_full_label_coveragesuppresses partial retrieval output when not all query labels can be coveredPromptConfig.include_paragraph_idsincludes stable paragraph IDs in the rendered prompt contextPromptConfig.include_label_annotationsincludes paragraph label annotations in rendered prompt contextPromptConfig.max_context_charactersapplies a hard cap to rendered context length
Development Checks
.venv/bin/ruff check . --fix
.venv/bin/pyright
.venv/bin/pytest
Release Checks
.venv/bin/python -m build
.venv/bin/python -m twine check dist/*
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
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 labelrag-0.1.3.tar.gz.
File metadata
- Download URL: labelrag-0.1.3.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
097b68ad48f70ca7e7d5d7d85faba633c74669d03f7d1d0d8818e2bad3c053ae
|
|
| MD5 |
dd39688cde41ae3984ab096ac72f43d3
|
|
| BLAKE2b-256 |
2c26579ce3b57ed808b8d2cf89822187ce4cd395380e62cdc149398f3e737615
|
Provenance
The following attestation bundles were made for labelrag-0.1.3.tar.gz:
Publisher:
publish.yml on HuRuilizhen/labelrag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
labelrag-0.1.3.tar.gz -
Subject digest:
097b68ad48f70ca7e7d5d7d85faba633c74669d03f7d1d0d8818e2bad3c053ae - Sigstore transparency entry: 1495716082
- Sigstore integration time:
-
Permalink:
HuRuilizhen/labelrag@85434d6953ef70758b914a0dc50a64aab38b0585 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/HuRuilizhen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@85434d6953ef70758b914a0dc50a64aab38b0585 -
Trigger Event:
push
-
Statement type:
File details
Details for the file labelrag-0.1.3-py3-none-any.whl.
File metadata
- Download URL: labelrag-0.1.3-py3-none-any.whl
- Upload date:
- Size: 29.3 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 |
a7b0cacf6967144aa6040cf0a9ab910b2787f0354e0e62c07cd32f6713f67824
|
|
| MD5 |
1198020adad93bc7093b9e2daa5c3008
|
|
| BLAKE2b-256 |
63da6b6d75c27e2905ec5482224f96894d25c48a1e3f471907f2d8d4bb4baca7
|
Provenance
The following attestation bundles were made for labelrag-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on HuRuilizhen/labelrag
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
labelrag-0.1.3-py3-none-any.whl -
Subject digest:
a7b0cacf6967144aa6040cf0a9ab910b2787f0354e0e62c07cd32f6713f67824 - Sigstore transparency entry: 1495716472
- Sigstore integration time:
-
Permalink:
HuRuilizhen/labelrag@85434d6953ef70758b914a0dc50a64aab38b0585 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/HuRuilizhen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@85434d6953ef70758b914a0dc50a64aab38b0585 -
Trigger Event:
push
-
Statement type: