Files
2026-07-13 13:30:30 +08:00

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