ragmint 0.2.1__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ragmint might be problematic. Click here for more details.

Files changed (60) hide show
  1. ragmint-0.4.0/MANIFEST.in +3 -0
  2. ragmint-0.4.0/PKG-INFO +457 -0
  3. ragmint-0.4.0/README.md +413 -0
  4. {ragmint-0.2.1 → ragmint-0.4.0}/pyproject.toml +44 -14
  5. ragmint-0.4.0/src/ragmint/autotuner.py +199 -0
  6. ragmint-0.4.0/src/ragmint/core/chunking.py +86 -0
  7. ragmint-0.4.0/src/ragmint/core/embeddings.py +55 -0
  8. ragmint-0.4.0/src/ragmint/core/pipeline.py +62 -0
  9. ragmint-0.4.0/src/ragmint/core/retriever.py +165 -0
  10. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/explainer.py +5 -3
  11. ragmint-0.4.0/src/ragmint/integrations/config_adapter.py +96 -0
  12. ragmint-0.4.0/src/ragmint/integrations/langchain_prebuilder.py +99 -0
  13. ragmint-0.4.0/src/ragmint/tests/test_autotuner.py +64 -0
  14. ragmint-0.4.0/src/ragmint/tests/test_config_adapter.py +39 -0
  15. ragmint-0.4.0/src/ragmint/tests/test_embeddings.py +46 -0
  16. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_explainer_integration.py +1 -1
  17. ragmint-0.4.0/src/ragmint/tests/test_integration_autotuner_ragmint.py +47 -0
  18. ragmint-0.4.0/src/ragmint/tests/test_langchain_prebuilder.py +82 -0
  19. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_pipeline.py +3 -2
  20. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_retriever.py +3 -2
  21. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_tuner.py +1 -1
  22. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tuner.py +87 -21
  23. ragmint-0.4.0/src/ragmint/utils/__init__.py +0 -0
  24. ragmint-0.4.0/src/ragmint.egg-info/PKG-INFO +457 -0
  25. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint.egg-info/SOURCES.txt +8 -0
  26. ragmint-0.4.0/src/ragmint.egg-info/requires.txt +35 -0
  27. ragmint-0.2.1/PKG-INFO +0 -27
  28. ragmint-0.2.1/src/ragmint/autotuner.py +0 -33
  29. ragmint-0.2.1/src/ragmint/core/chunking.py +0 -22
  30. ragmint-0.2.1/src/ragmint/core/embeddings.py +0 -19
  31. ragmint-0.2.1/src/ragmint/core/pipeline.py +0 -38
  32. ragmint-0.2.1/src/ragmint/core/retriever.py +0 -33
  33. ragmint-0.2.1/src/ragmint/tests/test_autotuner.py +0 -42
  34. ragmint-0.2.1/src/ragmint/tests/test_integration_autotuner_ragmint.py +0 -60
  35. ragmint-0.2.1/src/ragmint.egg-info/PKG-INFO +0 -27
  36. ragmint-0.2.1/src/ragmint.egg-info/requires.txt +0 -15
  37. {ragmint-0.2.1 → ragmint-0.4.0}/LICENSE +0 -0
  38. {ragmint-0.2.1 → ragmint-0.4.0}/setup.cfg +0 -0
  39. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/__init__.py +0 -0
  40. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/__main__.py +0 -0
  41. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/core/__init__.py +0 -0
  42. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/core/evaluation.py +0 -0
  43. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/core/reranker.py +0 -0
  44. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/experiments/__init__.py +0 -0
  45. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/experiments/validation_qa.json +0 -0
  46. {ragmint-0.2.1/src/ragmint/optimization → ragmint-0.4.0/src/ragmint/integrations}/__init__.py +0 -0
  47. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/leaderboard.py +0 -0
  48. {ragmint-0.2.1/src/ragmint/tests → ragmint-0.4.0/src/ragmint/optimization}/__init__.py +0 -0
  49. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/optimization/search.py +0 -0
  50. {ragmint-0.2.1/src/ragmint/utils → ragmint-0.4.0/src/ragmint/tests}/__init__.py +0 -0
  51. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/conftest.py +0 -0
  52. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_explainer.py +0 -0
  53. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_leaderboard.py +0 -0
  54. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/tests/test_search.py +0 -0
  55. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/utils/caching.py +0 -0
  56. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/utils/data_loader.py +0 -0
  57. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/utils/logger.py +0 -0
  58. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint/utils/metrics.py +0 -0
  59. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint.egg-info/dependency_links.txt +0 -0
  60. {ragmint-0.2.1 → ragmint-0.4.0}/src/ragmint.egg-info/top_level.txt +0 -0
@@ -0,0 +1,3 @@
1
+ include README.md
2
+ include LICENSE
3
+ recursive-include src/ragmint/experiments *.json
ragmint-0.4.0/PKG-INFO ADDED
@@ -0,0 +1,457 @@
1
+ Metadata-Version: 2.4
2
+ Name: ragmint
3
+ Version: 0.4.0
4
+ Summary: A modular framework for evaluating and optimizing RAG pipelines.
5
+ Author-email: Andre Oliveira <oandreoliveira@outlook.com>
6
+ License: Apache License 2.0
7
+ Project-URL: Homepage, https://github.com/andyolivers/ragmint
8
+ Project-URL: Documentation, https://andyolivers.com
9
+ Project-URL: Issues, https://github.com/andyolivers/ragmint/issues
10
+ Keywords: RAG,LLM,retrieval,optimization,AI,evaluation,chunking,autotuning
11
+ Requires-Python: >=3.9
12
+ Description-Content-Type: text/markdown
13
+ License-File: LICENSE
14
+ Requires-Dist: numpy<2.0.0
15
+ Requires-Dist: pandas>=2.0
16
+ Requires-Dist: scikit-learn>=1.3
17
+ Requires-Dist: sentence-transformers>=2.2.2
18
+ Requires-Dist: chromadb>=0.3.1
19
+ Requires-Dist: faiss-cpu; sys_platform != "darwin"
20
+ Requires-Dist: faiss-cpu==1.7.4; sys_platform == "darwin"
21
+ Requires-Dist: rank-bm25>=0.2.2
22
+ Requires-Dist: optuna>=3.0
23
+ Requires-Dist: tqdm
24
+ Requires-Dist: colorama
25
+ Requires-Dist: pyyaml
26
+ Requires-Dist: python-dotenv
27
+ Requires-Dist: openai>=1.0.0
28
+ Requires-Dist: google-generativeai>=0.8.0
29
+ Requires-Dist: anthropic>=0.25.0
30
+ Requires-Dist: supabase>=2.4.0
31
+ Requires-Dist: pytest
32
+ Requires-Dist: langchain>=0.2.5
33
+ Requires-Dist: langchain-community>=0.2.5
34
+ Requires-Dist: langchain-text-splitters>=0.2.1
35
+ Provides-Extra: dev
36
+ Requires-Dist: black; extra == "dev"
37
+ Requires-Dist: flake8; extra == "dev"
38
+ Requires-Dist: isort; extra == "dev"
39
+ Requires-Dist: pytest-cov; extra == "dev"
40
+ Provides-Extra: docs
41
+ Requires-Dist: mkdocs; extra == "docs"
42
+ Requires-Dist: mkdocs-material; extra == "docs"
43
+ Dynamic: license-file
44
+
45
+ # Ragmint
46
+
47
+ ![Python](https://img.shields.io/badge/python-3.9%2B-blue)
48
+ ![License](https://img.shields.io/badge/license-Apache%202.0-green)
49
+ ![Tests](https://github.com/andyolivers/ragmint/actions/workflows/tests.yml/badge.svg)
50
+ ![Optuna](https://img.shields.io/badge/Optuna-Integrated-orange)
51
+ ![Status](https://img.shields.io/badge/Status-Active-success)
52
+
53
+ ![](/assets/images/ragmint-banner.png)
54
+
55
+ **Ragmint** (Retrieval-Augmented Generation Model Inspection & Tuning) is a modular, developer-friendly Python library for **evaluating, optimizing, and tuning RAG (Retrieval-Augmented Generation) pipelines**.
56
+
57
+ It provides a complete toolkit for **retriever selection**, **embedding model tuning**, **automated RAG evaluation**, and **config-driven prebuilding** of pipelines with support for **Optuna-based Bayesian optimization**, **Auto-RAG tuning**, **chunking**, and **explainability** through Gemini or Claude.
58
+
59
+ ---
60
+
61
+ ## ✨ Features
62
+
63
+ - ✅ **Automated hyperparameter optimization** (Grid, Random, Bayesian via Optuna).
64
+ - 🤖 **Auto-RAG Tuner** — dynamically recommends retriever–embedding pairs based on corpus size and document statistics, **suggests multiple chunk sizes with overlaps**, and can **test configurations to identify the best-performing RAG setup**.
65
+ - 🧠 **Explainability Layer** — interprets RAG performance via Gemini or Claude APIs.
66
+ - 🏆 **Leaderboard Tracking** — stores and ranks experiment runs via JSON or external DB.
67
+ - 🔍 **Built-in RAG evaluation metrics** — faithfulness, recall, BLEU, ROUGE, latency.
68
+ - 📦 **Chunking system** — automatic or configurable `chunk_size` and `overlap` for documents with multiple suggested pairs.
69
+ - ⚙️ **Retrievers** — FAISS, Chroma, scikit-learn.
70
+ - 🧩 **Embeddings** — Hugging Face.
71
+ - 💾 **Caching, experiment tracking, and reproducibility** out of the box.
72
+ - 🧰 **Clean modular structure** for easy integration in research and production setups.
73
+ - 🏗️ **Langchain Prebuilder** — prepares pipelines, applies chunking, embeddings, and vector store creation automatically.
74
+ - ⚙️ **Config Adapter (LangchainConfigAdapter)** — normalizes configuration, fills defaults, validates retrievers.
75
+
76
+ ---
77
+
78
+ ## 🚀 Quick Start
79
+
80
+ ### 1️⃣ Installation
81
+
82
+ ```bash
83
+ git clone https://github.com/andyolivers/ragmint.git
84
+ cd ragmint
85
+ pip install -e .
86
+ ```
87
+
88
+ > The `-e` flag installs Ragmint in editable (development) mode.
89
+ > Requires **Python ≥ 3.9**.
90
+
91
+ ---
92
+
93
+ ### 2️⃣ Run a RAG Optimization Experiment
94
+
95
+ ```bash
96
+ python ragmint/main.py --config configs/default.yaml --search bayesian
97
+ ```
98
+
99
+ Example `configs/default.yaml`:
100
+ ```yaml
101
+ retriever: faiss
102
+ embedding_model: text-embedding-3-small
103
+ chunk_size: 500
104
+ overlap: 100
105
+ reranker:
106
+ mode: mmr
107
+ lambda_param: 0.5
108
+ optimization:
109
+ search_method: bayesian
110
+ n_trials: 20
111
+ ```
112
+
113
+ ---
114
+
115
+ ### 3️⃣ Manual Pipeline Usage
116
+
117
+ ```python
118
+ from ragmint.prebuilder import PreBuilder
119
+ from ragmint.tuner import RAGMint
120
+
121
+ # Prebuild pipeline (chunking, embeddings, vector store)
122
+ prebuilder = PreBuilder(
123
+ docs_path="data/docs/",
124
+ config_path="configs/default.yaml"
125
+ )
126
+ pipeline = prebuilder.build_pipeline()
127
+
128
+ # Initialize RAGMint with prebuilt components
129
+ rag = RAGMint(pipeline=pipeline)
130
+
131
+ # Run optimization
132
+ best, results = rag.optimize(validation_set=None, metric="faithfulness", trials=3)
133
+ print("Best configuration:", best)
134
+
135
+ ```
136
+ ---
137
+ # 🧩 Embeddings and Retrievers
138
+
139
+ **Ragmint** supports a flexible set of embeddings and retrievers, allowing you to adapt easily to various **RAG architectures**.
140
+
141
+ ---
142
+ ## 🧩 Chunking System
143
+
144
+ * **Automatically splits documents** into chunks with `chunk_size` and `overlap` parameters.
145
+ * **Supports default values** if not provided in configuration.
146
+ * **Optimized** for downstream **retrieval and embeddings**.
147
+ * **Enables adaptive chunking strategies** in future releases.
148
+
149
+ ---
150
+ ## 🧩 Langchain Config Adapter
151
+
152
+ * **Ensures consistent configuration** across pipeline components.
153
+ * **Normalizes retriever and embedding names** (e.g., `faiss`, `sentence-transformers/...`).
154
+ * **Adds default chunk parameters** when missing.
155
+ * **Validates retriever backends** and **raises clear errors** for unsupported options.
156
+
157
+ ---
158
+ ## 🧩 Langchain Prebuilder
159
+
160
+ **Automates pipeline preparation:**
161
+ 1. Reads documents
162
+ 2. Applies chunking
163
+ 3. Creates embeddings
164
+ 4. Initializes retriever / vector store
165
+ 5. Returns ready-to-use pipeline** for RAGMint or custom usage.
166
+
167
+ ---
168
+
169
+ ## 🔤 Available Embeddings (Hugging Face)
170
+
171
+ You can select from the following models:
172
+
173
+ * `sentence-transformers/all-MiniLM-L6-v2` — **lightweight**, general-purpose
174
+ * `sentence-transformers/all-mpnet-base-v2` — **higher accuracy**, slower
175
+ * `BAAI/bge-base-en-v1.5` — **multilingual**, dense embeddings
176
+ * `intfloat/multilingual-e5-base` — ideal for **multilingual corpora**
177
+
178
+
179
+
180
+ ### Configuration Example
181
+
182
+ Use the following format in your config file to specify the embedding model:
183
+
184
+ ```yaml
185
+ embedding_model: sentence-transformers/all-MiniLM-L6-v2
186
+ ```
187
+ ---
188
+
189
+ ## 🔍 Available Retrievers
190
+
191
+ **Ragmint** integrates multiple **retrieval backends** to suit different needs:
192
+
193
+ | Retriever | Description |
194
+ | :--- | :--- |
195
+ | **FAISS** | Fast vector similarity search; efficient for dense embeddings |
196
+ | **Chroma** | Persistent vector DB; works well for incremental updates |
197
+ | **scikit-learn (NearestNeighbors)** | Lightweight, zero-dependency local retriever |
198
+
199
+
200
+ ### Configuration Example
201
+
202
+ To specify the retriever in your configuration file, use the following format:
203
+
204
+ ```yaml
205
+ retriever: faiss
206
+ ```
207
+
208
+ ---
209
+
210
+ ## 🧪 Dataset Options
211
+
212
+ Ragmint can automatically load evaluation datasets for your RAG pipeline:
213
+
214
+ | Mode | Example | Description |
215
+ |------|----------|-------------|
216
+ | 🧱 **Default** | `validation_set=None` | Uses built-in `experiments/validation_qa.json` |
217
+ | 📁 **Custom File** | `validation_set="data/my_eval.json"` | Load your own QA dataset (JSON or CSV) |
218
+ | 🌐 **Hugging Face Dataset** | `validation_set="squad"` | Automatically downloads benchmark datasets (requires `pip install datasets`) |
219
+
220
+ ### Example
221
+
222
+ ```python
223
+ from ragmint.tuner import RAGMint
224
+
225
+ ragmint = RAGMint(
226
+ docs_path="data/docs/",
227
+ retrievers=["faiss", "chroma"],
228
+ embeddings=["text-embedding-3-small"],
229
+ rerankers=["mmr"],
230
+ )
231
+
232
+ # Use built-in default
233
+ ragmint.optimize(validation_set=None)
234
+
235
+ # Use Hugging Face benchmark
236
+ ragmint.optimize(validation_set="squad")
237
+
238
+ # Use your own dataset
239
+ ragmint.optimize(validation_set="data/custom_qa.json")
240
+ ```
241
+
242
+ ---
243
+
244
+ ## 🧠 Auto-RAG Tuner
245
+
246
+ The **AutoRAGTuner** automatically analyzes your corpus and recommends retriever–embedding combinations based on corpus statistics (size and average document length). It also **suggests multiple chunk sizes with overlaps** to improve retrieval performance.
247
+
248
+ Beyond recommendations, it can **run full end-to-end testing** of the suggested configurations and **identify the best-performing RAG setup** for your dataset.
249
+
250
+
251
+ ```python
252
+ from ragmint.autotuner import AutoRAGTuner
253
+
254
+ # Initialize with your documents
255
+ tuner = AutoRAGTuner(docs_path="data/docs/")
256
+
257
+ # Recommend configurations and suggest chunk sizes
258
+ recommendation = tuner.recommend(num_chunk_pairs=5)
259
+ print("Initial recommendation:", recommendation)
260
+
261
+ # Run full auto-tuning on validation set
262
+ best_config, results = tuner.auto_tune(validation_set="data/validation.json", trials=5)
263
+ print("Best configuration after testing:", best_config)
264
+ print("All trial results:", results)
265
+ ```
266
+
267
+ ---
268
+
269
+ ## 🏆 Leaderboard Tracking
270
+
271
+ Track and visualize your best experiments across runs.
272
+
273
+ ```python
274
+ from ragmint.leaderboard import Leaderboard
275
+
276
+ lb = Leaderboard("experiments/leaderboard.json")
277
+ lb.add_entry({"trial": 1, "faithfulness": 0.87, "latency": 0.12})
278
+ lb.show_top(3)
279
+ ```
280
+
281
+ ---
282
+
283
+ ## 🧠 Explainability with Gemini / Claude
284
+
285
+ Compare two RAG configurations and receive **natural language insights** on why one performs better.
286
+
287
+ ```python
288
+ from ragmint.explainer import explain_results
289
+
290
+ config_a = {"retriever": "FAISS", "embedding_model": "OpenAI"}
291
+ config_b = {"retriever": "Chroma", "embedding_model": "SentenceTransformers"}
292
+
293
+ explanation = explain_results(config_a, config_b, model="gemini")
294
+ print(explanation)
295
+ ```
296
+
297
+ > Set your API keys in a `.env` file or via environment variables:
298
+ > ```
299
+ > export GEMINI_API_KEY="your_gemini_key"
300
+ > export ANTHROPIC_API_KEY="your_claude_key"
301
+ > ```
302
+
303
+ ---
304
+
305
+ ## 🧩 Folder Structure
306
+
307
+ ```
308
+ ragmint/
309
+ ├── core/
310
+ │ ├── pipeline.py
311
+ │ ├── retriever.py
312
+ │ ├── reranker.py
313
+ │ ├── embeddings.py
314
+ │ ├── chunking.py
315
+ │ └── evaluation.py
316
+ ├── integration/
317
+ │ ├── config_adapter.py
318
+ │ └── langchain_prebuilder.py
319
+ ├── autotuner.py
320
+ ├── explainer.py
321
+ ├── leaderboard.py
322
+ ├── tuner.py
323
+ ├── utils/
324
+ ├── configs/
325
+ ├── experiments/
326
+ ├── tests/
327
+ └── main.py
328
+ ```
329
+
330
+ ---
331
+
332
+ ## 🧪 Running Tests
333
+
334
+ ```bash
335
+ pytest -v
336
+ ```
337
+
338
+ To include integration tests with Gemini or Claude APIs:
339
+ ```bash
340
+ pytest -m integration
341
+ ```
342
+
343
+ ---
344
+
345
+ ## ⚙️ Configuration via `pyproject.toml`
346
+
347
+ Your `pyproject.toml` includes all required dependencies:
348
+
349
+ ```toml
350
+ [project]
351
+ name = "ragmint"
352
+ version = "0.1.0"
353
+ dependencies = [
354
+ # Core ML + Embeddings
355
+ "numpy<2.0.0",
356
+ "pandas>=2.0",
357
+ "scikit-learn>=1.3",
358
+ "sentence-transformers>=2.2.2",
359
+
360
+ # Retrieval backends
361
+ "chromadb>=0.4",
362
+ "faiss-cpu; sys_platform != 'darwin'", # For Linux/Windows
363
+ "faiss-cpu==1.7.4; sys_platform == 'darwin'", # Optional fix for macOS MPS
364
+ "rank-bm25>=0.2.2", # For BM25 retriever
365
+
366
+ # Optimization & evaluation
367
+ "optuna>=3.0",
368
+ "tqdm",
369
+ "colorama",
370
+
371
+ # RAG evaluation and data utils
372
+ "pyyaml",
373
+ "python-dotenv",
374
+
375
+ # Explainability and LLM APIs
376
+ "openai>=1.0.0",
377
+ "google-generativeai>=0.8.0",
378
+ "anthropic>=0.25.0",
379
+
380
+ # Integration / storage
381
+ "supabase>=2.4.0",
382
+
383
+ # Testing
384
+ "pytest",
385
+
386
+ # LangChain integration layer
387
+ "langchain>=0.2.5",
388
+ "langchain-community>=0.2.5",
389
+ "langchain-text-splitters>=0.2.1"
390
+ ]
391
+ ```
392
+
393
+ ---
394
+
395
+ ## 📊 Example Experiment Workflow
396
+
397
+ 1. Define your retriever, embedding, and reranker setup
398
+ 2. Launch optimization (Grid, Random, Bayesian) or AutoTune
399
+ 3. Compare performance with explainability
400
+ 4. Persist results to leaderboard for later inspection
401
+
402
+ ---
403
+
404
+ ## 🧬 Architecture Overview
405
+
406
+ ```mermaid
407
+ flowchart TD
408
+ A[Query] --> B[Chunking / Preprocessing]
409
+ B --> C[Embedder]
410
+ C --> D[Retriever]
411
+ D --> E[Reranker]
412
+ E --> F[Generator]
413
+ F --> G[Evaluation]
414
+ G --> H[AutoRAGTuner / Optuna]
415
+ H --> I[Suggested Configs & Chunk Sizes]
416
+ I --> J[Best Configuration]
417
+ J -->|Update Params| C
418
+
419
+ ```
420
+
421
+ ---
422
+
423
+ ## 📘 Example Output
424
+
425
+ ```
426
+ [INFO] Starting Auto-RAG Tuning
427
+ [INFO] Suggested retriever=Chroma, embedding_model=sentence-transformers/all-MiniLM-L6-v2
428
+ [INFO] Suggested chunk-size candidates: [(380, 80), (420, 100), (350, 70), (400, 90), (360, 75)]
429
+ [INFO] Running full evaluation on validation set with 5 trials
430
+ [INFO] Trial 1 finished: faithfulness=0.82, latency=0.40s
431
+ [INFO] Trial 2 finished: faithfulness=0.85, latency=0.44s
432
+ ...
433
+ [INFO] Best configuration after testing: {'retriever': 'Chroma', 'embedding_model': 'sentence-transformers/all-MiniLM-L6-v2', 'chunk_size': 400, 'overlap': 90, 'strategy': 'sentence'}
434
+ ```
435
+
436
+ ---
437
+
438
+ ## 🧠 Why Ragmint?
439
+
440
+ - Built for **RAG researchers**, **AI engineers**, and **LLM ops**
441
+ - Works with **LangChain**, **LlamaIndex**, or standalone setups
442
+ - Designed for **extensibility** — plug in your own retrievers, models, or metrics
443
+ - Integrated **explainability and leaderboard** modules for research and production
444
+
445
+ ---
446
+
447
+ ## ⚖️ License
448
+
449
+ Licensed under the **Apache License 2.0** — free for personal, research, and commercial use.
450
+
451
+ ---
452
+
453
+ ## 👤 Author
454
+
455
+ **André Oliveira**
456
+ [andyolivers.com](https://andyolivers.com)
457
+ Data Scientist | AI Engineer