Skip to main content

Semantic search for QMDC workspaces - hybrid search, graph walk, inferred edges

Project description

QMDC Semantic

Semantic search for QMDC workspaces with hybrid approach (FTS5 + Dense embeddings) and graph walk.

Installation

cd qmdc-semantic
uv pip install -e .

Requirements:

  • Python 3.12+
  • qmdc (install from ../qmdc-py)
  • sqlite-vec extension
  • Ollama (for local embeddings) or OpenRouter API key

Quick Start

# 1. Index a workspace
qmdc-semantic index /path/to/workspace

# 2. Search
qmdc-semantic search /path/to/workspace "how to test LSP"

# Impact scan (query from file)
qmdc-semantic search /path/to/workspace --from-file task.qmd.md

Configuration

Create .qmdc-semantic/config.yaml in workspace or ~/.qmdc-semantic/config.yaml globally:

embedding:
  provider: ollama        # ollama | openrouter
  model: nomic-embed-text
  base_url: http://localhost:11434

# Or for OpenRouter:
# embedding:
#   provider: openrouter
#   model: openai/text-embedding-3-small
#   api_key_env: OPENROUTER_API_KEY

chunking:
  min_text_length: 10
  long_field_threshold: 50

inferred:
  similarity_threshold: 0.7
  top_k: 50

Features

  • Hybrid Search: Combines FTS5 keyword search with dense vector search
  • RRF Fusion: Reciprocal Rank Fusion for combining rankings
  • Graph Walk: Expands results through explicit and inferred edges
  • Inferred Edges: Computes semantic similarity between objects
  • Incremental Update: Hash-based diff for efficient re-indexing
  • Parent Document Retrieval: Returns context for child chunks

CLI Commands

index

qmdc-semantic index [WORKSPACE_PATH] [--force] [--verbose]

Creates/updates embeddings in .qmdc-semantic/embeddings.db.

Options:

  • --force, -f: Reindex all chunks (ignore cache)
  • --verbose, -v: Verbose output

search

qmdc-semantic search [WORKSPACE_PATH] "query" [-k N] [--depth N] [--from-file FILE]

Search for relevant objects.

Options:

  • -k, --top-k: Number of results (default: 10)
  • --depth, -d: Graph walk depth (default: 2)
  • --from-file, -f: Use file content as query (for impact scan)
  • --verbose, -v: Verbose output

API Usage

from qmdc_semantic import load_config, Storage, extract_chunks, semantic_search

# Load config
config = load_config("/path/to/workspace")

# Initialize storage
storage = Storage("/path/to/workspace")

# Extract and index chunks (see cli.py for full flow)
chunks = extract_chunks("/path/to/workspace", config.chunking)

# Search
results = semantic_search(
    storage=storage,
    query="how to test LSP",
    config=config,
    top_k=10,
    depth=2,
)

for result in results:
    print(f"{result['object_kind']}: {result['object_id']}")
    print(f"  Score: {result['score']:.3f}")

Storage

Data is stored in .qmdc-semantic/embeddings.db (SQLite):

  • chunks: Metadata and text for each chunk
  • vec_chunks_{dim}: Vector embeddings (via sqlite-vec)
  • chunks_fts: FTS5 index for keyword search
  • inferred_edges: Semantic similarity edges

Git LFS: For large workspaces, consider using Git LFS for the database file:

git lfs track ".qmdc-semantic/*.db"

Development

# Install with dev dependencies
uv pip install -e ".[dev]"

# Run tests
uv run pytest tests/ -v

# Run linter
uv run ruff check .

License

AGPL-3.0-or-later © mikilabs

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

qmdc_semantic-1.0.0.tar.gz (50.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qmdc_semantic-1.0.0-py3-none-any.whl (43.1 kB view details)

Uploaded Python 3

File details

Details for the file qmdc_semantic-1.0.0.tar.gz.

File metadata

  • Download URL: qmdc_semantic-1.0.0.tar.gz
  • Upload date:
  • Size: 50.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for qmdc_semantic-1.0.0.tar.gz
Algorithm Hash digest
SHA256 48d89c275024e09c9fbeae6c4fe33c3825888674043a79499d98cd0943e687b8
MD5 8238d2cded8971b4faeb3d690f0b2a38
BLAKE2b-256 a1eadc43a6bac0ade18015b5cbad058077d742bede28d9e9f39bff9899245817

See more details on using hashes here.

File details

Details for the file qmdc_semantic-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: qmdc_semantic-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 43.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for qmdc_semantic-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ca88f919080da9df773984f8d155bbf18c0024715a13e723020e2e0c7239490b
MD5 2cafd631281e9d3f748b4d21e7248f7d
BLAKE2b-256 36fdca3d7290fbfa76441f8344dfe1c9eb953b0f31a71af78b7fc8ac8b1e3f14

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page