░█████████ ░███ ░██████ ░███████ ░████████
░██ ░██ ░██░██ ░██ ░██ ░██ ░██ ░██ ░██
░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░███████
░█████████ ░█████████ ░██ █████ ░██ ░██ ░████████ ░██
░██ ░██ ░██ ░██ ░██ ██ ░██ ░██ ░██ ░██ ░███████
░██ ░██ ░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██ ░██
░██ ░██ ░██ ░██ ░█████░█ ░███████ ░█████████ ░███████
This repository is designed for benchmarking popular Retrieval-Augmented Generation (RAG) databases. It enables you to:
- Measure latency for reading and writing data to various vector databases.
- Visualize metrics and compare performance using a built-in Streamlit dashboard and Grafana.
- Easily extend the framework to support new database providers.
- Modify and experiment with the codebase to suit your research or production needs.
- Streamlit Dashboard: Query databases, visualize results, and compare metrics interactively.
- Extensible Structure: Add new database providers with minimal code changes.
- Dockerized Services: Each database runs in its own Docker service for easy setup and isolation.
- Metrics Visualization: Out-of-the-box Grafana dashboard for latency and token usage.
Note: You need to have Docker installed
git clone <this-repo>
cd ragSet up LangChain and LangSmith
To visualize metrics, you will need to set up Langchain/Langsmith tracking. It is free and easy.
- Create Langchain Account
- Get API Key
- Create a project
Keep note of your API Key and Project name, you will need those later.
Create a .env file in the project root:
# Guardian API related information
GUARDIAN_API_KEY=<your key here>
# Claude related information
ANTHROPIC_API_KEY=<your key here>
# Langsmith related information
LANGSMITH_API_KEY=<your key here>
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
LANGSMITH_PROJECT=<name of your langsmith project>
LANGSMITH_TRACING="true"
LANGSMITH_API_KEY="<your-key>"
DATABASE_TYPE="<name of database>"
HOST="localhost" or shared IPv4 address -
Install PostgreSQL; ensure you write down your login somewhere safe.
-
build Docker image for PostgreSQL using 'docker-compose build --no-cache"
-
Run Docker for PostgreSQL using
docker-compose up -
When done, close Docker using
docker-compose down
In working directory, run
chmod +x run.sh && ./run.sh.
Run run.bat.
Use the POST endpoint on the Docker container to upload articles to either database; this will upload 10 articles from the Guardian API.
If you're hosting a shared database, run docker compose up --build; this loads up the app with uvicorn at 0.0.0.0:8000.
Run docker compose build(if not built previously) & docker compose up in rag/services/streamlit
Ensure you've pip installed requirements in your local virtual env.
On Mac, run the script at dev/run.sh
On Windows, run the script at dev/run.bat (by clicking it in file explorer)
Run uvicorn services.postgres_controller:app --reload --port 8001.
(You will need to activate your venv & pip install -r requirements.txt)
Run uvicorn services.clickhouse_controller:app --reload --port 8000.
(You will need to activate your venv & pip install -r requirements.txt)
Run uvicorn services.cassandra.cassandra_controller:app --reload.
cdinto thellmfolder.- Run
docker-compose up; this will create a Docker container for Grafana on port3000. - In your browser, open
localhost:3000, and login using usernameadminand passwordadmin. - Add a new data source with the following parameters:
- Server address: the IP of your container.
- Server port:
8123 - Protocol:
HTTP - Skip TLS Verify:
true - Username:
user - Password:
default - Default database:
guardian - Default table:
langchain_metrics
- Save and test the data source, and verify it connects successfully.
- Import
dashboard.jsonfrom thellmfolder. - You should now have a local Grafana with metrics data; the metrics tab on the Streamlit application should now also work.
If you want to use the LLM and/or use the POST steps of the langchain pipeline, set the variables USE_POST and USE_LLM to "true" in your .env file.
curl "http://localhost:8000/related-articles?query="
curl -X POST "http://localhost:8000/upload-articles"
POSTGRES_DB= POSTGRES_USER= POSTGRES_PASSWORD= POSTGRES_PORT=<port postgres will run on, normally 5432>
#### 3. Run Services
You have the option to choose between ClickHouse, PostgreSQL, and Cassandra as databases to use in benchmarking.
You can run any of them by the following (this example sets up ClickHouse):
```bash
cd services/clickhouse
docker compose up --build
cd services/streamlit
docker compose up --buildYour streamlit application should now be running.
- The Streamlit service automatically creates a Grafana dashboard within the app, accessble at
https://localhost:8501.
- Use the Streamlit dashboard to run queries against any configured database.
- Latency and token usage metrics are automatically collected and visualized.
- You can choose from Single Question, Multi Batch Question (simulating concurrent users), and Multi Batch Multi Questions (simulating multiple users with different questions).
-
Create a new folder under
/services(e.g.,/services/mydb). -
Add your Docker setup (
Dockerfile,docker-compose.yml) and controller/DAO code. -
Extend the
DatabaseEnum inllm/llm_utils/langchain_pipeline.py:class Database(Enum): CLICKHOUSE = ("clickhouse", 8000) POSTGRES = ("postgres", 8001) CASSANDRA = ("cassandra", 8003) MYDB = ("mydb", <your-port>)
-
Implement your controller to expose the required endpoints (
/related-articles,/upload-articles). -
Update the dashboard (if needed) to include your new provider in the selection.
- The codebase is modular—add new database backends by following the existing service structure.
- The Streamlit dashboard auto-detects available databases from the
DatabaseEnum. - Metrics collection is built-in; extend or modify as needed for your research.
Happy benchmarking!