459 lines
18 KiB
Markdown
459 lines
18 KiB
Markdown
# Auto RAG Eval: Automated Benchmark Generation for RAG Systems
|
|
|
|
| Authors |
|
|
| --- |
|
|
| [Pouya Omran](https://github.com/PouyaOmran) |
|
|
| [Tanya Dixit](https://github.com/coderkhaleesi) |
|
|
| [Jingyi Wang](https://github.com/Jingyi-Wang-jessie) |
|
|
|
|
## TL;DR - Quick Start
|
|
|
|
```bash
|
|
# 1. Install requirements
|
|
pip install -r requirements.txt
|
|
|
|
# 2. Download required files from Google Cloud Storage
|
|
gcloud storage cp gs://github-repo/search/auto-rag-eval/qa_profiles.json .
|
|
|
|
# 3. Set up environment
|
|
# Edit .env with your values:
|
|
# - PROJECT_ID=your-gcp-project-id
|
|
# - LOCATION=us-central1
|
|
# - DATA_STORE_ID=your-vertex-ai-search-datastore-id
|
|
|
|
# 4. Authenticate with Google Cloud
|
|
gcloud auth application-default login
|
|
|
|
# 5. Generate benchmark
|
|
python main.py --docs 2 --chunks 2 --clues 2 --profiles 2
|
|
|
|
# 6. (Optional) Transform benchmark for evaluation frameworks
|
|
python transform_benchmark.py benchmark.json converted_benchmark.json
|
|
```
|
|
|
|
That's it! Your benchmark Q&A pairs will be saved to `benchmark.json`.
|
|
|
|
## What is it?
|
|
|
|
Auto RAG Eval is an automated benchmark generation tool for evaluating Retrieval-Augmented Generation (RAG) systems.
|
|
It creates high-quality question-answer pairs from your document corpus using Google Cloud's Vertex AI Search and Gemini models.
|
|
|
|
The primary component of this solution is the **Benchmark Generator** (`main.py`), which creates the Q&A pairs from your documents in Vertex AI Search.
|
|
|
|
A secondary utility, the **Benchmark Transformer** (`transform_benchmark.py`), is also provided. This simple script can be used to convert the generated benchmark into a format compatible with evaluation frameworks like Google's Agent Development Kit (ADK).
|
|
|
|
## Why do we need this solution?
|
|
|
|
### The Challenge
|
|
- **Manual Benchmark Creation is Time-Consuming**: Creating quality benchmarks for RAG systems manually can take weeks or months
|
|
- **Coverage Gaps**: Human-created benchmarks often miss edge cases and don't comprehensively cover the document corpus
|
|
- **Scalability Issues**: As document stores grow, maintaining relevant benchmarks becomes increasingly difficult
|
|
- **Evaluation Consistency**: Without standardized benchmarks, it's hard to consistently evaluate RAG system performance
|
|
|
|
### The Solution
|
|
Auto RAG Eval addresses these challenges by:
|
|
- **Automating Benchmark Generation**: Creates hundreds of Q&A pairs in hours instead of weeks
|
|
- **Ensuring Comprehensive Coverage**: Systematically samples documents and chunks to cover the entire corpus
|
|
- **Multi-Stage Quality Control**: Uses multiple AI agents to review and validate each Q&A pair
|
|
- **Scalable Architecture**: Works with any size Vertex AI Search data store
|
|
- **Format Flexibility**: Transforms benchmarks into various formats for different evaluation frameworks
|
|
|
|
## How to use this solution
|
|
|
|
### Prerequisites
|
|
|
|
1. **Google Cloud Project** with the following APIs enabled:
|
|
- Vertex AI API
|
|
- Discovery Engine API (for Vertex AI Search)
|
|
- Cloud Storage API
|
|
|
|
2. **Authentication**:
|
|
```bash
|
|
# Set up Application Default Credentials
|
|
gcloud auth application-default login
|
|
```
|
|
|
|
3. **Vertex AI Search Data Store**:
|
|
- Create a data store in Vertex AI Search
|
|
- Ingest your documents into the data store
|
|
- Note the data store ID
|
|
- Detailed instructions on creating a data store in Google Cloud Console:
|
|
1. **Navigate to AI Applications** in the Google Cloud Console
|
|
2. **Create a new data store** for your application
|
|
3. **Configure the parser settings**:
|
|
- Set the parser to either **Digital Parser** or **Layout Parser**
|
|
4. **Enable Advanced Chunking Configuration**:
|
|
- ✓ Tick **"Include ancestor headings in chunks"**
|
|
- Keep all other settings at their default values
|
|
5. **Ingest your free text documents** into the data store
|
|
6. **Copy the DATA_STORE_ID** from the console
|
|
7. **Add the DATA_STORE_ID to your `.env` file**:
|
|
DATA_STORE_ID=your-data-store-id
|
|
|
|
Upload the documents in exemplary_docs to the datastore from gs://github-repo/search/auto-rag-eval/
|
|
|
|
4. **Python Environment**:
|
|
```bash
|
|
# Install all required dependencies
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
5. **Required Files**:
|
|
- `qa_profiles.json`: Q&A generation profiles. Download it from Google Cloud Storage:
|
|
```bash
|
|
gcloud storage cp gs://github-repo/search/auto-rag-eval/qa_profiles.json .
|
|
```
|
|
- `.env`: Environment configuration (create from `env_example`)
|
|
|
|
### Step 1: Configure Environment
|
|
|
|
Create a `.env` file based on `env_example`:
|
|
|
|
```bash
|
|
# Copy the example file
|
|
cp env_example .env
|
|
|
|
# Edit with your values
|
|
PROJECT_ID=your-gcp-project-id
|
|
LOCATION=us-central1
|
|
DATA_STORE_ID=your-data-store-id
|
|
```
|
|
|
|
### Step 2: Generate Benchmark
|
|
|
|
Run the benchmark generator with default settings:
|
|
|
|
```bash
|
|
python main.py
|
|
```
|
|
|
|
Or customize the generation parameters:
|
|
|
|
```bash
|
|
python main.py \
|
|
--docs 5 \
|
|
--chunks 3 \
|
|
--clues 2 \
|
|
--profiles 2 \
|
|
--chunks-to-merge 3 \
|
|
--output-file my_benchmark.json \
|
|
--qa-profiles-file custom_profiles.json
|
|
```
|
|
|
|
**Parameters**:
|
|
- `--project-id`: Override PROJECT_ID from .env file
|
|
- `--location`: Override LOCATION from .env file
|
|
- `--data-store-id`: Override DATA_STORE_ID from .env file
|
|
- `--docs`: Number of documents to process (default: 2)
|
|
- `--chunks`: Number of chunks per document (default: 2)
|
|
- `--clues`: Number of clues per chunk (default: 2)
|
|
- `--profiles`: Number of Q&A profiles per clue (default: 2)
|
|
- `--chunks-to-merge`: Number of chunks to merge into bigger chunks (default: 3)
|
|
- `--output-file`: Output JSON filename (default: benchmark.json)
|
|
- `--qa-profiles-file`: Path to custom QA profiles JSON file (default: qa_profiles.json in script directory)
|
|
- `--llm-model`: LLM model to use (default: gemini-2.0-flash)
|
|
- `--top-k-chunks`: Number of top chunks to retrieve during context search (default: 3)
|
|
- `--neighbour-chunks`: Number of neighboring chunks to include for context (default: 0)
|
|
- `--max-retries`: Maximum retry attempts for API calls (default: 3)
|
|
|
|
### Step 3: Transform Benchmark (Optional)
|
|
|
|
After generating your benchmark, you can optionally convert it for use with evaluation frameworks like the Agent Development Kit (ADK). You can use the standalone Python script.
|
|
|
|
```bash
|
|
python transform_benchmark.py benchmark.json converted_bench.json
|
|
```
|
|
|
|
The script accepts command-line arguments:
|
|
- First argument: Input benchmark file path
|
|
- Second argument: Output file path
|
|
- Optional `--indent`: JSON indentation level (default: 2)
|
|
|
|
The transformer converts from Auto RAG Eval format:
|
|
```json
|
|
{
|
|
"context": "...",
|
|
"Q&A Gen Profile": {...},
|
|
"Question": "...",
|
|
"Answer": "..."
|
|
}
|
|
```
|
|
|
|
To ADK evaluation format:
|
|
```json
|
|
{
|
|
"query": "...",
|
|
"expected_tool_use": [],
|
|
"reference": "..."
|
|
}
|
|
```
|
|
|
|
## Architecture Overview
|
|
|
|
### System Architecture
|
|
|
|
Auto RAG Eval follows a sophisticated multi-stage pipeline architecture that orchestrates various AI models and services to generate high-quality Q&A pairs:
|
|
|
|
```
|
|
┌─────────────────────────┐
|
|
│ Vertex AI Search │
|
|
│ (Document Store) │
|
|
└───────────┬─────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────┐ ┌─────────────────────┐
|
|
│ Document Selection │────▶│ Chunk Processing │
|
|
│ - List all documents │ │ - Retrieve chunks │
|
|
│ - Random sampling │ │ - Merge chunks │
|
|
└─────────────────────────┘ └──────────┬──────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────┐
|
|
│ Clue Generation │
|
|
│ - Identify topics │
|
|
│ - Generate question│
|
|
└──────────┬──────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────┐ ┌─────────────────────┐
|
|
│ Context Retrieval │────▶│ Context Distillation│
|
|
│ - Search with clues │ │ - Relevance filter │
|
|
│ - Find related chunks │ │ - Extract focused │
|
|
└─────────────────────────┘ │ content │
|
|
└──────────┬──────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────┐ ┌─────────────────────┐
|
|
│ Q&A Profile Generation │────▶│ Q&A Generation │
|
|
│ - Analyze context │ │ - Create Q&A pairs │
|
|
│ - Suggest profiles │ │ - Self-contained │
|
|
└─────────────────────────┘ └──────────┬──────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────┐ ┌─────────────────────┐
|
|
│ Multi-Agent Review │────▶│ Incremental Saving │
|
|
│ - 3 AI critics │ │ - Immediate save │
|
|
│ - Consensus decision │ │ - JSON output │
|
|
└─────────────────────────┘ └─────────────────────┘
|
|
```
|
|
|
|
### Data Flow
|
|
|
|
The data flows through the pipeline as follows:
|
|
|
|
1. **Input**: Vertex AI Search data store containing your documents
|
|
2. **Processing**: Documents → Chunks → Clues → Retrieved Contexts → Distilled Context → Profiles → Q&As
|
|
3. **Output**: JSON file with validated Q&A pairs
|
|
|
|
### Detailed Pipeline Stages
|
|
|
|
1. **Document Selection**
|
|
- Lists all documents from Vertex AI Search data store
|
|
- Randomly selects specified number of documents
|
|
- Ensures diverse coverage of the corpus
|
|
|
|
2. **Chunk Processing**
|
|
- Retrieves chunks for each selected document
|
|
- Merges consecutive chunks into bigger chunks for better context
|
|
- Default: merges 3 chunks together
|
|
- Randomly selects chunks for processing
|
|
|
|
3. **Clue Generation**
|
|
- For each chunk, generates potential questions (clues)
|
|
- Uses Gemini model to identify key topics and concepts
|
|
- Ensures questions are answerable from the text
|
|
|
|
4. **Context Retrieval**
|
|
- For each clue, searches for relevant contexts using Vertex AI Search
|
|
- Enhances the clue with hypothetical examples and descriptions
|
|
- Retrieves top-k most relevant chunks from the entire corpus
|
|
- Can include neighboring chunks for additional context
|
|
|
|
5. **Context Distillation**
|
|
- Extracts only the most relevant portions from retrieved contexts
|
|
- Uses both individual block-level and overall document-level relevance assessment
|
|
- Filters out irrelevant information to create focused context
|
|
- Aggregates relevant text from multiple sources
|
|
|
|
6. **Q&A Profile Generation**
|
|
- Analyzes the distilled context to suggest Q&A generation profiles
|
|
- Profiles vary by customizable dimensions from `qa_profiles.json`
|
|
- Default dimensions: Type, Persona, Scope, Difficulty
|
|
- Generates diverse profiles for comprehensive coverage
|
|
|
|
7. **Q&A Generation**
|
|
- Creates question-answer pairs based on profiles and distilled context
|
|
- Ensures Q&As are self-contained and context-based
|
|
- Questions synthesize information across the entire context
|
|
- Answers are grounded only in the provided text
|
|
|
|
### Key Design Decisions
|
|
|
|
1. **Incremental Processing**: Each Q&A is saved immediately upon approval, preventing data loss
|
|
2. **Multi-Stage Relevance**: Both individual and aggregate relevance assessment ensures comprehensive context
|
|
3. **Consensus-Based Review**: Multiple AI critics ensure high-quality output
|
|
4. **Flexible Profiles**: Customizable Q&A dimensions via external JSON configuration
|
|
5. **Retry Mechanisms**: Automatic retry with exponential backoff for API resilience
|
|
6. **Progress Tracking**: Detailed logging with [LOGGING] prefix for monitoring
|
|
|
|
### API Integration Points
|
|
|
|
- **Vertex AI Search**: Document listing, chunk retrieval, semantic search
|
|
- **Gemini Models**: Clue generation, profile suggestion, Q&A generation, review
|
|
- **Google Cloud Storage**: Optional for document storage
|
|
- **Discovery Engine API**: Core search and retrieval functionality
|
|
|
|
### Key Features
|
|
|
|
- **Fault Tolerance**: Automatic retry with exponential backoff for API failures
|
|
- **Progress Tracking**: Detailed logging with [LOGGING] prefix
|
|
- **Incremental Saving**: Each Q&A saved immediately upon approval
|
|
- **Quality Control**: Multi-agent review system ensures high-quality outputs
|
|
- **Diversity**: Generates varied Q&A types for comprehensive evaluation
|
|
|
|
## Example Data and Output
|
|
|
|
### Exemplary Documents
|
|
|
|
This repository includes a folder `exemplary_docs/` containing three PDF documents about Google AI agents:
|
|
- `input_2_ai-responsibility-update-published-february-2025.pdf` - Google's AI responsibility update
|
|
- `input_2_exec_guide_gen_ai.pdf` - Executive guide to generative AI
|
|
- `input_2_google-about-generative-ai.pdf` - General information about Google's generative AI
|
|
|
|
These documents were ingested into a Vertex AI Search data store with the following settings:
|
|
- **LLM feature enabled** for table and image annotation
|
|
- **Layout parser option** enabled during ingestion time
|
|
- The data store ID is configured in the `env example` file
|
|
|
|
### Generated Benchmark Files
|
|
|
|
From these exemplary documents, we have generated:
|
|
- `benchmark.json` - The raw benchmark output from Auto RAG Eval containing 15 Q&A pairs
|
|
- `converted_benchmark.json` - The transformed benchmark ready for evaluation frameworks
|
|
|
|
## Output Format
|
|
|
|
### Auto RAG Eval Benchmark Format (benchmark.json)
|
|
```json
|
|
[
|
|
{
|
|
"context": "The distilled context used for Q&A generation",
|
|
"Q&A Gen Profile": {
|
|
"type": "How-to",
|
|
"persona": "The Expert",
|
|
"scope": "Whole",
|
|
"difficulty": "Hard"
|
|
},
|
|
"Question": "The generated question",
|
|
"Answer": "The generated answer"
|
|
}
|
|
]
|
|
```
|
|
|
|
### ADK Format (after transformation)
|
|
```json
|
|
[
|
|
{
|
|
"query": "The generated question",
|
|
"expected_tool_use": [],
|
|
"reference": "The generated answer"
|
|
}
|
|
]
|
|
```
|
|
|
|
## Customizing Q&A Profiles
|
|
|
|
The `qa_profiles.json` file contains the configuration for Q&A generation. The updated script now supports flexible dimension handling:
|
|
|
|
### What You Can Customize:
|
|
|
|
1. **Dimension Names**: You can rename dimensions (e.g., "Type" → "QuestionType", "Persona" → "AudienceLevel")
|
|
2. **Number of Dimensions**: Add or remove dimensions as needed (minimum 1 dimension required)
|
|
3. **Dimension Values**: Add, remove, or modify values within each dimension
|
|
4. **Value Descriptions**: Customize descriptions for each value
|
|
|
|
### Structure Requirements:
|
|
|
|
The only requirement is maintaining this JSON structure:
|
|
```json
|
|
{
|
|
"parameters": {
|
|
"YourDimensionName": {
|
|
"description": "Description of this dimension",
|
|
"values": {
|
|
"ValueName1": {"description": "Description of this value"},
|
|
"ValueName2": {"description": "Description of this value"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Example: Custom Profile with Different Dimensions
|
|
|
|
```json
|
|
{
|
|
"parameters": {
|
|
"Domain": {
|
|
"description": "Subject area",
|
|
"values": {
|
|
"Technical": {"description": "Technical documentation"},
|
|
"Business": {"description": "Business processes"}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Note
|
|
|
|
While RAG-Crusher employs an intelligent, LLM-infused methodology to automatically generate high-quality benchmarks, the
|
|
generated Q&A pairs should be treated with caution. Despite the multi-stage quality control and multi-agent review process,
|
|
the ultimate validity and accuracy of the generated benchmarks should be verified by human domain experts who are familiar with
|
|
the subject matter.
|
|
We recommend:
|
|
|
|
Having subject matter experts review the generated Q&A pairs before using them in production evaluations
|
|
Treating the generated benchmark as a starting point that requires human validation
|
|
Being particularly careful with answers related to critical, safety-sensitive, or highly specialized domains
|
|
Manually reviewing a representative sample of the generated pairs to ensure they meet your quality standards
|
|
|
|
The tool is designed to accelerate benchmark creation, not to replace human expertise and judgment.
|
|
|
|
|
|
### To customize profiles:
|
|
1. Edit `qa_profiles.json` with your desired dimensions and values
|
|
2. Run the benchmark generator - it will automatically adapt to your new structure
|
|
3. The script will validate the structure and use whatever dimensions you provide
|
|
|
|
## Monitoring and Troubleshooting
|
|
|
|
### Logging
|
|
- Look for `[LOGGING]` prefix in console output for detailed execution tracking
|
|
- Each function entry/exit is logged
|
|
- API retry attempts are logged with error details
|
|
|
|
### Common Issues
|
|
|
|
1. **Authentication Errors**:
|
|
```bash
|
|
gcloud auth application-default login
|
|
```
|
|
|
|
2. **API Rate Limits**:
|
|
- Adjust delays in the code
|
|
- Reduce concurrent processing
|
|
|
|
3. **Empty Benchmark**:
|
|
- Check data store ID is correct
|
|
- Verify documents are properly ingested
|
|
- Check API permissions
|
|
|
|
4. **Memory Issues**:
|
|
- Process fewer documents at once
|
|
- Reduce chunk merge size
|
|
|
|
5. **Missing qa_profiles.json**:
|
|
- The script will use default profiles if the file is missing
|
|
- Check that the file is in the same directory as the script
|