mirror of
https://github.com/HKUDS/LightRAG.git
synced 2025-07-28 11:20:03 +00:00
271 lines
7.4 KiB
Markdown
271 lines
7.4 KiB
Markdown
![]() |
# Rerank Integration in LightRAG
|
||
|
|
||
|
This document explains how to configure and use the rerank functionality in LightRAG to improve retrieval quality.
|
||
|
|
||
|
## ⚠️ Important: Parameter Priority
|
||
|
|
||
|
**QueryParam.top_k has higher priority than rerank_top_k configuration:**
|
||
|
|
||
|
- When you set `QueryParam(top_k=5)`, it will override the `rerank_top_k=10` setting in LightRAG configuration
|
||
|
- This means the actual number of documents sent to rerank will be determined by QueryParam.top_k
|
||
|
- For optimal rerank performance, always consider the top_k value in your QueryParam calls
|
||
|
- Example: `rag.aquery(query, param=QueryParam(mode="naive", top_k=20))` will use 20, not rerank_top_k
|
||
|
|
||
|
## Overview
|
||
|
|
||
|
Reranking is an optional feature that improves the quality of retrieved documents by re-ordering them based on their relevance to the query. This is particularly useful when you want higher precision in document retrieval across all query modes (naive, local, global, hybrid, mix).
|
||
|
|
||
|
## Architecture
|
||
|
|
||
|
The rerank integration follows the same design pattern as the LLM integration:
|
||
|
|
||
|
- **Configurable Models**: Support for multiple rerank providers through a generic API
|
||
|
- **Async Processing**: Non-blocking rerank operations
|
||
|
- **Error Handling**: Graceful fallback to original results
|
||
|
- **Optional Feature**: Can be enabled/disabled via configuration
|
||
|
- **Code Reuse**: Single generic implementation for Jina/Cohere compatible APIs
|
||
|
|
||
|
## Configuration
|
||
|
|
||
|
### Environment Variables
|
||
|
|
||
|
Set these variables in your `.env` file or environment:
|
||
|
|
||
|
```bash
|
||
|
# Enable/disable reranking
|
||
|
ENABLE_RERANK=True
|
||
|
|
||
|
# Rerank model configuration
|
||
|
RERANK_MODEL=BAAI/bge-reranker-v2-m3
|
||
|
RERANK_MAX_ASYNC=4
|
||
|
RERANK_TOP_K=10
|
||
|
|
||
|
# API configuration
|
||
|
RERANK_API_KEY=your_rerank_api_key_here
|
||
|
RERANK_BASE_URL=https://api.your-provider.com/v1/rerank
|
||
|
|
||
|
# Provider-specific keys (optional alternatives)
|
||
|
JINA_API_KEY=your_jina_api_key_here
|
||
|
COHERE_API_KEY=your_cohere_api_key_here
|
||
|
```
|
||
|
|
||
|
### Programmatic Configuration
|
||
|
|
||
|
```python
|
||
|
from lightrag import LightRAG
|
||
|
from lightrag.rerank import custom_rerank, RerankModel
|
||
|
|
||
|
# Method 1: Using environment variables (recommended)
|
||
|
rag = LightRAG(
|
||
|
working_dir="./rag_storage",
|
||
|
llm_model_func=your_llm_func,
|
||
|
embedding_func=your_embedding_func,
|
||
|
# Rerank automatically configured from environment variables
|
||
|
)
|
||
|
|
||
|
# Method 2: Explicit configuration
|
||
|
rerank_model = RerankModel(
|
||
|
rerank_func=custom_rerank,
|
||
|
kwargs={
|
||
|
"model": "BAAI/bge-reranker-v2-m3",
|
||
|
"base_url": "https://api.your-provider.com/v1/rerank",
|
||
|
"api_key": "your_api_key_here",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
rag = LightRAG(
|
||
|
working_dir="./rag_storage",
|
||
|
llm_model_func=your_llm_func,
|
||
|
embedding_func=your_embedding_func,
|
||
|
enable_rerank=True,
|
||
|
rerank_model_func=rerank_model.rerank,
|
||
|
rerank_top_k=10,
|
||
|
)
|
||
|
```
|
||
|
|
||
|
## Supported Providers
|
||
|
|
||
|
### 1. Custom/Generic API (Recommended)
|
||
|
|
||
|
For Jina/Cohere compatible APIs:
|
||
|
|
||
|
```python
|
||
|
from lightrag.rerank import custom_rerank
|
||
|
|
||
|
# Your custom API endpoint
|
||
|
result = await custom_rerank(
|
||
|
query="your query",
|
||
|
documents=documents,
|
||
|
model="BAAI/bge-reranker-v2-m3",
|
||
|
base_url="https://api.your-provider.com/v1/rerank",
|
||
|
api_key="your_api_key_here",
|
||
|
top_k=10
|
||
|
)
|
||
|
```
|
||
|
|
||
|
### 2. Jina AI
|
||
|
|
||
|
```python
|
||
|
from lightrag.rerank import jina_rerank
|
||
|
|
||
|
result = await jina_rerank(
|
||
|
query="your query",
|
||
|
documents=documents,
|
||
|
model="BAAI/bge-reranker-v2-m3",
|
||
|
api_key="your_jina_api_key"
|
||
|
)
|
||
|
```
|
||
|
|
||
|
### 3. Cohere
|
||
|
|
||
|
```python
|
||
|
from lightrag.rerank import cohere_rerank
|
||
|
|
||
|
result = await cohere_rerank(
|
||
|
query="your query",
|
||
|
documents=documents,
|
||
|
model="rerank-english-v2.0",
|
||
|
api_key="your_cohere_api_key"
|
||
|
)
|
||
|
```
|
||
|
|
||
|
## Integration Points
|
||
|
|
||
|
Reranking is automatically applied at these key retrieval stages:
|
||
|
|
||
|
1. **Naive Mode**: After vector similarity search in `_get_vector_context`
|
||
|
2. **Local Mode**: After entity retrieval in `_get_node_data`
|
||
|
3. **Global Mode**: After relationship retrieval in `_get_edge_data`
|
||
|
4. **Hybrid/Mix Modes**: Applied to all relevant components
|
||
|
|
||
|
## Configuration Parameters
|
||
|
|
||
|
| Parameter | Type | Default | Description |
|
||
|
|-----------|------|---------|-------------|
|
||
|
| `enable_rerank` | bool | False | Enable/disable reranking |
|
||
|
| `rerank_model_name` | str | "BAAI/bge-reranker-v2-m3" | Model identifier |
|
||
|
| `rerank_model_max_async` | int | 4 | Max concurrent rerank calls |
|
||
|
| `rerank_top_k` | int | 10 | Number of top results to return ⚠️ **Overridden by QueryParam.top_k** |
|
||
|
| `rerank_model_func` | callable | None | Custom rerank function |
|
||
|
| `rerank_model_kwargs` | dict | {} | Additional rerank parameters |
|
||
|
|
||
|
## Example Usage
|
||
|
|
||
|
### Basic Usage
|
||
|
|
||
|
```python
|
||
|
import asyncio
|
||
|
from lightrag import LightRAG, QueryParam
|
||
|
from lightrag.llm.openai import gpt_4o_mini_complete, openai_embedding
|
||
|
|
||
|
async def main():
|
||
|
# Initialize with rerank enabled
|
||
|
rag = LightRAG(
|
||
|
working_dir="./rag_storage",
|
||
|
llm_model_func=gpt_4o_mini_complete,
|
||
|
embedding_func=openai_embedding,
|
||
|
enable_rerank=True,
|
||
|
)
|
||
|
|
||
|
# Insert documents
|
||
|
await rag.ainsert([
|
||
|
"Document 1 content...",
|
||
|
"Document 2 content...",
|
||
|
])
|
||
|
|
||
|
# Query with rerank (automatically applied)
|
||
|
result = await rag.aquery(
|
||
|
"Your question here",
|
||
|
param=QueryParam(mode="hybrid", top_k=5) # ⚠️ This top_k=5 overrides rerank_top_k
|
||
|
)
|
||
|
|
||
|
print(result)
|
||
|
|
||
|
asyncio.run(main())
|
||
|
```
|
||
|
|
||
|
### Direct Rerank Usage
|
||
|
|
||
|
```python
|
||
|
from lightrag.rerank import custom_rerank
|
||
|
|
||
|
async def test_rerank():
|
||
|
documents = [
|
||
|
{"content": "Text about topic A"},
|
||
|
{"content": "Text about topic B"},
|
||
|
{"content": "Text about topic C"},
|
||
|
]
|
||
|
|
||
|
reranked = await custom_rerank(
|
||
|
query="Tell me about topic A",
|
||
|
documents=documents,
|
||
|
model="BAAI/bge-reranker-v2-m3",
|
||
|
base_url="https://api.your-provider.com/v1/rerank",
|
||
|
api_key="your_api_key_here",
|
||
|
top_k=2
|
||
|
)
|
||
|
|
||
|
for doc in reranked:
|
||
|
print(f"Score: {doc.get('rerank_score')}, Content: {doc.get('content')}")
|
||
|
```
|
||
|
|
||
|
## Best Practices
|
||
|
|
||
|
1. **Parameter Priority Awareness**: Remember that QueryParam.top_k always overrides rerank_top_k configuration
|
||
|
2. **Performance**: Use reranking selectively for better performance vs. quality tradeoff
|
||
|
3. **API Limits**: Monitor API usage and implement rate limiting if needed
|
||
|
4. **Fallback**: Always handle rerank failures gracefully (returns original results)
|
||
|
5. **Top-k Selection**: Choose appropriate `top_k` values in QueryParam based on your use case
|
||
|
6. **Cost Management**: Consider rerank API costs in your budget planning
|
||
|
|
||
|
## Troubleshooting
|
||
|
|
||
|
### Common Issues
|
||
|
|
||
|
1. **API Key Missing**: Ensure `RERANK_API_KEY` or provider-specific keys are set
|
||
|
2. **Network Issues**: Check `RERANK_BASE_URL` and network connectivity
|
||
|
3. **Model Errors**: Verify the rerank model name is supported by your API
|
||
|
4. **Document Format**: Ensure documents have `content` or `text` fields
|
||
|
|
||
|
### Debug Mode
|
||
|
|
||
|
Enable debug logging to see rerank operations:
|
||
|
|
||
|
```python
|
||
|
import logging
|
||
|
logging.getLogger("lightrag.rerank").setLevel(logging.DEBUG)
|
||
|
```
|
||
|
|
||
|
### Error Handling
|
||
|
|
||
|
The rerank integration includes automatic fallback:
|
||
|
|
||
|
```python
|
||
|
# If rerank fails, original documents are returned
|
||
|
# No exceptions are raised to the user
|
||
|
# Errors are logged for debugging
|
||
|
```
|
||
|
|
||
|
## API Compatibility
|
||
|
|
||
|
The generic rerank API expects this response format:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"results": [
|
||
|
{
|
||
|
"index": 0,
|
||
|
"relevance_score": 0.95
|
||
|
},
|
||
|
{
|
||
|
"index": 2,
|
||
|
"relevance_score": 0.87
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
This is compatible with:
|
||
|
- Jina AI Rerank API
|
||
|
- Cohere Rerank API
|
||
|
- Custom APIs following the same format
|