Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ NEO4J__DATABASE=neo4j
QDRANT__URL=your_qdrant_url_here
QDRANT__API_KEY=your_qdrant_api_key_here
QDRANT__COLLECTION_NAME=biomedical_papers
QDRANT__EMBEDDING_MODEL=text-embedding-3-large
QDRANT__EMBEDDING_DIMENSION=1536
QDRANT__RERANKER_EMBEDDING_DIMENSION=3072
QDRANT__EMBEDDING_MODEL=text-embedding-3-small
QDRANT__EMBEDDING_DIMENSION=1024
QDRANT__RERANKER_EMBEDDING_DIMENSION=1536
QDRANT__ESTIMATE_BM25_AVG_LEN_ON_X_DOCS=300
QDRANT__CLOUD_INFERENCE=true

Expand All @@ -26,4 +26,4 @@ PUBMED__EMAIL=your_email@example.com

# JSON Data Paths (optional — defaults are data/pubmed_dataset.json and data/gene_dataset.json)
JSON_DATA__PUBMED_JSON_PATH=data/pubmed_dataset.json
JSON_DATA__GENE_JSON_PATH=data/gene_dataset.json
JSON_DATA__GENE_JSON_PATH=data/gene_dataset.json
32 changes: 18 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

<!-- Providers -->

[![Qdrant](https://img.shields.io/badge/Qdrant-1.15.1-5A31F4?logo=qdrant&logoColor=white)](https://qdrant.tech/)
[![Neo4j](https://img.shields.io/badge/Neo4j-5.28.2-008CC1?logo=neo4j&logoColor=white)](https://neo4j.com/)
[![OpenAI](https://img.shields.io/badge/OpenAI-2.3.0-412991?logo=openai&logoColor=white)](https://openai.com/)
[![Qdrant](https://img.shields.io/badge/Qdrant-5A31F4?logo=qdrant&logoColor=white)](https://qdrant.tech/)
[![Neo4j](https://img.shields.io/badge/Neo4j-008CC1?logo=neo4j&logoColor=white)](https://neo4j.com/)
[![OpenAI](https://img.shields.io/badge/OpenAI-412991?logo=openai&logoColor=white)](https://openai.com/)

</div>

Expand Down Expand Up @@ -105,7 +105,7 @@ biomedical-graphrag/
1. Clone the repository:

```bash
git clone git@github.com:thierrypdamiba/biomedical-graphrag.git
git clone git@github.com:qdrant-labs/biomedical-graphrag.git
cd biomedical-graphrag
```

Expand Down Expand Up @@ -156,9 +156,9 @@ NEO4J__DATABASE=neo4j
QDRANT__URL=http://localhost:6333
QDRANT__API_KEY=your_qdrant_api_key
QDRANT__COLLECTION_NAME=biomedical_papers
QDRANT__EMBEDDING_MODEL=text-embedding-3-large
QDRANT__EMBEDDING_DIMENSION=1536
QDRANT__RERANKER_EMBEDDING_DIMENSION=3072
QDRANT__EMBEDDING_MODEL=text-embedding-3-small
QDRANT__EMBEDDING_DIMENSION=1024
QDRANT__RERANKER_EMBEDDING_DIMENSION=1536
QDRANT__ESTIMATE_BM25_AVG_LEN_ON_X_DOCS=300
QDRANT__CLOUD_INFERENCE=false

Expand Down Expand Up @@ -227,9 +227,7 @@ Notes:
- This project uses OpenAI embeddings **Matryoshka Representation Learning (MRL)** feature:
- `QDRANT__EMBEDDING_DIMENSION` is the prefix dimension used for **retrieval** (stored in Qdrant as the `Dense` vector).
- `QDRANT__RERANKER_EMBEDDING_DIMENSION` is the (larger) prefix dimension used for **reranking** (stored in Qdrant as the `Reranker` vector).
- `make ingest-qdrant-data` currently recreates the collection each run (see `qdrant_ingestion.py`).
If you don't want that, change `recreate=True` to `False`. There's also an `only_new` parameter which defaults to `True`, so we ingest only papers whose PMID is not already
present in the collection. Set `only_new=False` if you'd prefer to overwrite existing points or on a clean ingestion (then it should be `False`!)
- `make ingest-qdrant-data` recreates the collection each run (`recreate=True` in `qdrant_ingestion.py`); set it to `False` to keep existing points. The `only_new` flag (default `True`) skips PMIDs already in the collection.
- The collection is configured by default with **scalar quantization** (compressed dense vectors).
- `QDRANT__CLOUD_INFERENCE=true` enables **Qdrant Cloud Inference** when embeddings are computed by Qdrant Cloud.
- `QDRANT__ESTIMATE_BM25_AVG_LEN_ON_X_DOCS` controls how many documents are sampled to estimate the average abstract length used by **BM25**. This helps calibrate BM25-based scoring when using dense+BM25 hybrid retrieval.
Expand Down Expand Up @@ -290,12 +288,14 @@ make run-api
```bash
curl -X POST http://localhost:8765/api/graphrag-query \
-H "Content-Type: application/json" \
-d '{"query": "What genes are associated with breast cancer?", "limit": 5}'
-d '{"query": "What genes are associated with breast cancer?", "limit": 5, "openai_api_key": "sk-..."}'
```

> `openai_api_key` is required on every request. It is used transiently and never stored or logged. A rejected key returns HTTP 401 with `detail: openai_key_rejected`.

### Frontend

The frontend is maintained in a separate repository: **[biomedical-graphrag-frontend](https://github.com/thierrypdamiba/biomedical-graphrag-frontend)**
The frontend is maintained in a separate repository: **[biomedical-graphrag-frontend](https://github.com/qdrant-labs/biomedical-graphrag-frontend)**

The quickest way to run it locally:

Expand All @@ -307,13 +307,13 @@ make run-frontend
Or manually:

```bash
git clone https://github.com/thierrypdamiba/biomedical-graphrag-frontend.git
git clone https://github.com/qdrant-labs/biomedical-graphrag-frontend.git
cd biomedical-graphrag-frontend
pnpm install
pnpm dev
```

The frontend connects to the hosted backend at `https://biomedical-graphrag-9qqm.onrender.com` by default, or you can point it to a local backend via `GRAPHRAG_API_URL=http://localhost:8765`.
The frontend requires `GRAPHRAG_API_URL` to point at this backend.

### Docker

Expand All @@ -330,6 +330,10 @@ docker run --rm -p 8765:8765 --env-file .env biomedical-graphrag:latest
curl http://localhost:8765/health
```

### Deploy to Vercel

Runs as a container via `Dockerfile.vercel`.

### Troubleshooting

- **Make fails immediately with ".env file is missing"**
Expand Down
6 changes: 3 additions & 3 deletions src/biomedical_graphrag/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ class QdrantSettings(BaseModel):
default="biomedical_papers", description="Collection name for Qdrant instance"
)
embedding_model: str = Field(
default="text-embedding-3-large", description="OpenAI embedding model to use"
default="text-embedding-3-small", description="OpenAI embedding model to use"
)
embedding_dimension: int = Field(
default=1536, description="Dimension of the OpenAI embedding for retrieval (using OpenAI's MRL)"
default=1024, description="Dimension of the OpenAI embedding for retrieval (using OpenAI's MRL)"
)
reranker_embedding_dimension: int = Field(
default=3072,
default=1536,
description="Dimension of the OpenAI embedding for reranking (using OpenAI's MRL)",
)
estimate_bm25_avg_len_on_x_docs: int = Field(
Expand Down
12 changes: 6 additions & 6 deletions tests/integration/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ def test_settings_creation_with_defaults() -> None:
qdrant_settings = QdrantSettings()
assert qdrant_settings.url == "http://localhost:6333"
assert qdrant_settings.collection_name == "biomedical_papers"
assert qdrant_settings.embedding_model == "text-embedding-3-large"
assert qdrant_settings.embedding_dimension == 1536
assert qdrant_settings.reranker_embedding_dimension == 3072
assert qdrant_settings.embedding_model == "text-embedding-3-small"
assert qdrant_settings.embedding_dimension == 1024
assert qdrant_settings.reranker_embedding_dimension == 1536
assert qdrant_settings.estimate_bm25_avg_len_on_x_docs == 300
assert qdrant_settings.cloud_inference is False

Expand Down Expand Up @@ -76,9 +76,9 @@ def test_qdrant_settings_validation() -> None:

assert qdrant_settings.url == "http://localhost:6333"
assert qdrant_settings.collection_name == "biomedical_papers"
assert qdrant_settings.embedding_model == "text-embedding-3-large"
assert qdrant_settings.embedding_dimension == 1536
assert qdrant_settings.reranker_embedding_dimension == 3072
assert qdrant_settings.embedding_model == "text-embedding-3-small"
assert qdrant_settings.embedding_dimension == 1024
assert qdrant_settings.reranker_embedding_dimension == 1536
assert qdrant_settings.estimate_bm25_avg_len_on_x_docs == 300
assert qdrant_settings.cloud_inference is False
assert qdrant_settings.api_key.get_secret_value() == ""
6 changes: 3 additions & 3 deletions tests/integration/test_databases.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,9 @@ def test_qdrant_settings_validation(self) -> None:

assert qdrant_settings.url == "http://localhost:6333"
assert qdrant_settings.collection_name == "biomedical_papers"
assert qdrant_settings.embedding_model == "text-embedding-3-large"
assert qdrant_settings.embedding_dimension == 1536
assert qdrant_settings.reranker_embedding_dimension == 3072
assert qdrant_settings.embedding_model == "text-embedding-3-small"
assert qdrant_settings.embedding_dimension == 1024
assert qdrant_settings.reranker_embedding_dimension == 1536
assert qdrant_settings.estimate_bm25_avg_len_on_x_docs == 300
assert qdrant_settings.cloud_inference is False

Expand Down
Loading