Skip to content

Commit 7ec9582

Browse files
authored
fix: support pgvector v0.7.0+ (#63)
1 parent 574e407 commit 7ec9582

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

poetry.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ ragas = { version = ">=0.1.12", optional = true }
5252
typer = ">=0.12.5"
5353
# Frontend:
5454
chainlit = { version = ">=1.2.0", optional = true }
55+
# Utilities:
56+
packaging = ">=23.0"
5557

5658
[tool.poetry.extras] # https://python-poetry.org/docs/pyproject/#extras
5759
chainlit = ["chainlit"]

src/raglite/_database.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
from functools import lru_cache
77
from hashlib import sha256
88
from pathlib import Path
9-
from typing import Any
9+
from typing import Any, cast
1010
from xml.sax.saxutils import escape
1111

1212
import numpy as np
1313
from markdown_it import MarkdownIt
14+
from packaging import version
15+
from packaging.version import Version
1416
from pydantic import ConfigDict
1517
from sqlalchemy.engine import Engine, make_url
1618
from sqlmodel import JSON, Column, Field, Relationship, Session, SQLModel, create_engine, text
@@ -310,6 +312,18 @@ def from_chunks(
310312
)
311313

312314

315+
def _pgvector_version(session: Session) -> Version:
316+
try:
317+
result = session.execute(
318+
text("SELECT extversion FROM pg_extension WHERE extname = 'vector'")
319+
)
320+
pgvector_version = version.parse(cast(str, result.scalar_one()))
321+
except Exception as e:
322+
error_message = "Unable to parse pgvector version, is pgvector installed?"
323+
raise ValueError(error_message) from e
324+
return pgvector_version
325+
326+
313327
@lru_cache(maxsize=1)
314328
def create_database_engine(config: RAGLiteConfig | None = None) -> Engine:
315329
"""Create a database engine and initialize it."""
@@ -358,17 +372,19 @@ def create_database_engine(config: RAGLiteConfig | None = None) -> Engine:
358372
CREATE INDEX IF NOT EXISTS keyword_search_chunk_index ON chunk USING GIN (to_tsvector('simple', body));
359373
""")
360374
)
361-
session.execute(
362-
text(f"""
375+
create_vector_index_sql = f"""
363376
CREATE INDEX IF NOT EXISTS vector_search_chunk_index ON chunk_embedding
364377
USING hnsw (
365378
(embedding::halfvec({embedding_dim}))
366379
halfvec_{metrics[config.vector_search_index_metric]}_ops
367380
);
368381
SET hnsw.ef_search = {20 * 4 * 8};
369-
SET hnsw.iterative_scan = {'relaxed_order' if config.reranker else 'strict_order'};
370-
""")
371-
)
382+
"""
383+
# Enable iterative scan for pgvector v0.8.0 and up.
384+
pgvector_version = _pgvector_version(session)
385+
if pgvector_version and pgvector_version >= version.parse("0.8.0"):
386+
create_vector_index_sql += f"\nSET hnsw.iterative_scan = {'relaxed_order' if config.reranker else 'strict_order'};"
387+
session.execute(text(create_vector_index_sql))
372388
session.commit()
373389
elif db_backend == "sqlite":
374390
# Create a virtual table for keyword search on the chunk table.

0 commit comments

Comments
 (0)