Query decomposition for multi-concept retrieval. Use when handling complex queries spanning multiple topics, implementing multi-hop retrieval, or improving coverage for compound questions.
View on GitHubyonatangross/skillforge-claude-plugin
ork
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/yonatangross/skillforge-claude-plugin/blob/main/skills/query-decomposition/SKILL.md -a claude-code --skill query-decompositionInstallation paths:
.claude/skills/query-decomposition/# Query Decomposition
Break complex queries into independent concepts for parallel retrieval and fusion.
## Overview
- Complex queries spanning multiple topics or concepts
- Multi-hop questions requiring chained reasoning
- Queries where single retrieval misses relevant documents
- Improving recall for compound questions
Break complex queries into independent concepts for parallel retrieval and fusion.
## The Problem
Complex queries span multiple topics that may not co-occur in single documents:
```
Query: "How do chunking strategies affect reranking in RAG?"
→ Single search may miss docs about chunking OR reranking
→ Poor coverage across all concepts
```
## The Solution
Decompose into independent concepts, retrieve separately, then fuse:
```
Query: "How do chunking strategies affect reranking in RAG?"
→ Concepts: ["chunking strategies", "reranking methods", "RAG pipeline"]
→ Search each concept independently
→ Fuse results with Reciprocal Rank Fusion (RRF)
→ Full coverage across all topics
```
## Implementation
### 1. Heuristic Detection (Fast Path)
```python
MULTI_CONCEPT_INDICATORS = [
" vs ", " versus ", " compared to ", " or ",
" and ", " with ", " affect ", " impact ",
"difference between", "relationship between",
]
def is_multi_concept_heuristic(query: str) -> bool:
"""Fast check for multi-concept indicators (<1ms)."""
query_lower = query.lower()
return any(ind in query_lower for ind in MULTI_CONCEPT_INDICATORS)
```
### 2. LLM Decomposition
```python
from pydantic import BaseModel, Field
from openai import AsyncOpenAI
class ConceptExtraction(BaseModel):
"""LLM output schema for concept extraction."""
concepts: list[str] = Field(
...,
min_length=1,
max_length=5,
description="Distinct concepts from the query",
)
reasoning: str | None = None
async def decompose_query(
query: str,
llm: AsyncOpenAI,
) -> list[str]:
"""Extract independent concepts using LLM."""
r