Compare commits
1 Commits
feature/co
...
fix/pdf-du
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2afcdf7b77 |
@@ -60,6 +60,20 @@ python -m apps.colqwen_rag ask my_index --interactive
|
|||||||
- `help`: Show available commands
|
- `help`: Show available commands
|
||||||
- `quit`/`exit`/`q`: Exit interactive mode
|
- `quit`/`exit`/`q`: Exit interactive mode
|
||||||
|
|
||||||
|
## 🧪 Test & Reproduce Results
|
||||||
|
|
||||||
|
Run the reproduction test for issue #119:
|
||||||
|
```bash
|
||||||
|
python test_colqwen_reproduction.py
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
1. ✅ Check dependencies
|
||||||
|
2. 📥 Download sample PDF (Attention Is All You Need paper)
|
||||||
|
3. 🏗️ Build test index
|
||||||
|
4. 🔍 Run sample queries
|
||||||
|
5. 📊 Show how to generate similarity maps
|
||||||
|
|
||||||
## 🎨 Advanced: Similarity Maps
|
## 🎨 Advanced: Similarity Maps
|
||||||
|
|
||||||
For visual similarity analysis, use the existing advanced script:
|
For visual similarity analysis, use the existing advanced script:
|
||||||
48
README.md
48
README.md
@@ -379,54 +379,6 @@ python -m apps.code_rag --repo-dir "./my_codebase" --query "How does authenticat
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### 🎨 ColQwen: Multimodal PDF Retrieval with Vision-Language Models
|
|
||||||
|
|
||||||
Search through PDFs using both text and visual understanding with ColQwen2/ColPali models. Perfect for research papers, technical documents, and any PDFs with complex layouts, figures, or diagrams.
|
|
||||||
|
|
||||||
> **🍎 Mac Users**: ColQwen is optimized for Apple Silicon with MPS acceleration for faster inference!
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build index from PDFs
|
|
||||||
python -m apps.colqwen_rag build --pdfs ./my_papers/ --index research_papers
|
|
||||||
|
|
||||||
# Search with text queries
|
|
||||||
python -m apps.colqwen_rag search research_papers "How does attention mechanism work?"
|
|
||||||
|
|
||||||
# Interactive Q&A
|
|
||||||
python -m apps.colqwen_rag ask research_papers --interactive
|
|
||||||
```
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary><strong>📋 Click to expand: ColQwen Setup & Usage</strong></summary>
|
|
||||||
|
|
||||||
#### Prerequisites
|
|
||||||
```bash
|
|
||||||
# Install dependencies
|
|
||||||
uv pip install colpali_engine pdf2image pillow matplotlib qwen_vl_utils einops seaborn
|
|
||||||
brew install poppler # macOS only, for PDF processing
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Build Index
|
|
||||||
```bash
|
|
||||||
python -m apps.colqwen_rag build \
|
|
||||||
--pdfs ./pdf_directory/ \
|
|
||||||
--index my_index \
|
|
||||||
--model colqwen2 # or colpali
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Search
|
|
||||||
```bash
|
|
||||||
python -m apps.colqwen_rag search my_index "your question here" --top-k 5
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Models
|
|
||||||
- **ColQwen2** (`colqwen2`): Latest vision-language model with improved performance
|
|
||||||
- **ColPali** (`colpali`): Proven multimodal retriever
|
|
||||||
|
|
||||||
For detailed usage, see the [ColQwen Guide](docs/COLQWEN_GUIDE.md).
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### 📧 Your Personal Email Secretary: RAG on Apple Mail!
|
### 📧 Your Personal Email Secretary: RAG on Apple Mail!
|
||||||
|
|
||||||
> **Note:** The examples below currently support macOS only. Windows support coming soon.
|
> **Note:** The examples below currently support macOS only. Windows support coming soon.
|
||||||
|
|||||||
Submodule packages/leann-backend-hnsw/third_party/faiss updated: e2d243c40d...5952745237
@@ -1162,6 +1162,11 @@ Examples:
|
|||||||
print(f"Warning: Could not process {file_path}: {e}")
|
print(f"Warning: Could not process {file_path}: {e}")
|
||||||
|
|
||||||
# Load other file types with default reader
|
# Load other file types with default reader
|
||||||
|
# Exclude PDFs from code_extensions if they were already processed separately
|
||||||
|
other_file_extensions = code_extensions
|
||||||
|
if should_process_pdfs and ".pdf" in code_extensions:
|
||||||
|
other_file_extensions = [ext for ext in code_extensions if ext != ".pdf"]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Create a custom file filter function using our PathSpec
|
# Create a custom file filter function using our PathSpec
|
||||||
def file_filter(
|
def file_filter(
|
||||||
@@ -1177,15 +1182,19 @@ Examples:
|
|||||||
except (ValueError, OSError):
|
except (ValueError, OSError):
|
||||||
return True # Include files that can't be processed
|
return True # Include files that can't be processed
|
||||||
|
|
||||||
other_docs = SimpleDirectoryReader(
|
# Only load other file types if there are extensions to process
|
||||||
docs_dir,
|
if other_file_extensions:
|
||||||
recursive=True,
|
other_docs = SimpleDirectoryReader(
|
||||||
encoding="utf-8",
|
docs_dir,
|
||||||
required_exts=code_extensions,
|
recursive=True,
|
||||||
file_extractor={}, # Use default extractors
|
encoding="utf-8",
|
||||||
exclude_hidden=not include_hidden,
|
required_exts=other_file_extensions,
|
||||||
filename_as_id=True,
|
file_extractor={}, # Use default extractors
|
||||||
).load_data(show_progress=True)
|
exclude_hidden=not include_hidden,
|
||||||
|
filename_as_id=True,
|
||||||
|
).load_data(show_progress=True)
|
||||||
|
else:
|
||||||
|
other_docs = []
|
||||||
|
|
||||||
# Filter documents after loading based on gitignore rules
|
# Filter documents after loading based on gitignore rules
|
||||||
filtered_docs = []
|
filtered_docs = []
|
||||||
|
|||||||
162
test_colqwen_reproduction.py
Normal file
162
test_colqwen_reproduction.py
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Test script to reproduce ColQwen results from issue #119
|
||||||
|
https://github.com/yichuan-w/LEANN/issues/119
|
||||||
|
|
||||||
|
This script demonstrates the ColQwen workflow:
|
||||||
|
1. Download sample PDF
|
||||||
|
2. Convert to images
|
||||||
|
3. Build multimodal index
|
||||||
|
4. Run test queries
|
||||||
|
5. Generate similarity maps
|
||||||
|
"""
|
||||||
|
|
||||||
|
import importlib.util
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("🧪 ColQwen Reproduction Test - Issue #119")
|
||||||
|
print("=" * 50)
|
||||||
|
|
||||||
|
# Check if we're in the right directory
|
||||||
|
repo_root = Path.cwd()
|
||||||
|
if not (repo_root / "apps" / "colqwen_rag.py").exists():
|
||||||
|
print("❌ Please run this script from the LEANN repository root")
|
||||||
|
print(" cd /path/to/LEANN && python test_colqwen_reproduction.py")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("✅ Repository structure looks good")
|
||||||
|
|
||||||
|
# Step 1: Check dependencies
|
||||||
|
print("\n📦 Checking dependencies...")
|
||||||
|
try:
|
||||||
|
import torch
|
||||||
|
|
||||||
|
# Check if pdf2image is available
|
||||||
|
if importlib.util.find_spec("pdf2image") is None:
|
||||||
|
raise ImportError("pdf2image not found")
|
||||||
|
# Check if colpali_engine is available
|
||||||
|
if importlib.util.find_spec("colpali_engine") is None:
|
||||||
|
raise ImportError("colpali_engine not found")
|
||||||
|
|
||||||
|
print("✅ Core dependencies available")
|
||||||
|
print(f" - PyTorch: {torch.__version__}")
|
||||||
|
print(f" - CUDA available: {torch.cuda.is_available()}")
|
||||||
|
print(
|
||||||
|
f" - MPS available: {hasattr(torch.backends, 'mps') and torch.backends.mps.is_available()}"
|
||||||
|
)
|
||||||
|
except ImportError as e:
|
||||||
|
print(f"❌ Missing dependency: {e}")
|
||||||
|
print("\n📥 Install missing dependencies:")
|
||||||
|
print(
|
||||||
|
" uv pip install colpali_engine pdf2image pillow matplotlib qwen_vl_utils einops seaborn"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Step 2: Download sample PDF
|
||||||
|
print("\n📄 Setting up sample PDF...")
|
||||||
|
pdf_dir = repo_root / "test_pdfs"
|
||||||
|
pdf_dir.mkdir(exist_ok=True)
|
||||||
|
sample_pdf = pdf_dir / "attention_paper.pdf"
|
||||||
|
|
||||||
|
if not sample_pdf.exists():
|
||||||
|
print("📥 Downloading sample paper (Attention Is All You Need)...")
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
try:
|
||||||
|
urllib.request.urlretrieve("https://arxiv.org/pdf/1706.03762.pdf", sample_pdf)
|
||||||
|
print(f"✅ Downloaded: {sample_pdf}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Download failed: {e}")
|
||||||
|
print(" Please manually download a PDF to test_pdfs/attention_paper.pdf")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
print(f"✅ Using existing PDF: {sample_pdf}")
|
||||||
|
|
||||||
|
# Step 3: Test ColQwen RAG
|
||||||
|
print("\n🚀 Testing ColQwen RAG...")
|
||||||
|
|
||||||
|
# Build index
|
||||||
|
print("\n1️⃣ Building multimodal index...")
|
||||||
|
build_cmd = f"python -m apps.colqwen_rag build --pdfs {pdf_dir} --index test_attention --model colqwen2 --pages-dir test_pages"
|
||||||
|
print(f" Command: {build_cmd}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = os.system(build_cmd)
|
||||||
|
if result == 0:
|
||||||
|
print("✅ Index built successfully!")
|
||||||
|
else:
|
||||||
|
print("❌ Index building failed")
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Error building index: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Test search
|
||||||
|
print("\n2️⃣ Testing search...")
|
||||||
|
test_queries = [
|
||||||
|
"How does attention mechanism work?",
|
||||||
|
"What is the transformer architecture?",
|
||||||
|
"How do you compute self-attention?",
|
||||||
|
]
|
||||||
|
|
||||||
|
for query in test_queries:
|
||||||
|
print(f"\n🔍 Query: '{query}'")
|
||||||
|
search_cmd = f'python -m apps.colqwen_rag search test_attention "{query}" --top-k 3'
|
||||||
|
print(f" Command: {search_cmd}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = os.system(search_cmd)
|
||||||
|
if result == 0:
|
||||||
|
print("✅ Search completed")
|
||||||
|
else:
|
||||||
|
print("❌ Search failed")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Search error: {e}")
|
||||||
|
|
||||||
|
# Test interactive mode (briefly)
|
||||||
|
print("\n3️⃣ Testing interactive mode...")
|
||||||
|
print(" You can test interactive mode with:")
|
||||||
|
print(" python -m apps.colqwen_rag ask test_attention --interactive")
|
||||||
|
|
||||||
|
# Step 4: Test similarity maps (using existing script)
|
||||||
|
print("\n4️⃣ Testing similarity maps...")
|
||||||
|
similarity_script = (
|
||||||
|
repo_root
|
||||||
|
/ "apps"
|
||||||
|
/ "multimodal"
|
||||||
|
/ "vision-based-pdf-multi-vector"
|
||||||
|
/ "multi-vector-leann-similarity-map.py"
|
||||||
|
)
|
||||||
|
|
||||||
|
if similarity_script.exists():
|
||||||
|
print(" You can generate similarity maps with:")
|
||||||
|
print(f" cd {similarity_script.parent}")
|
||||||
|
print(" python multi-vector-leann-similarity-map.py")
|
||||||
|
print(" (Edit the script to use your local PDF)")
|
||||||
|
|
||||||
|
print("\n🎉 ColQwen reproduction test completed!")
|
||||||
|
print("\n📋 Summary:")
|
||||||
|
print(" ✅ Dependencies checked")
|
||||||
|
print(" ✅ Sample PDF prepared")
|
||||||
|
print(" ✅ Index building tested")
|
||||||
|
print(" ✅ Search functionality tested")
|
||||||
|
print(" ✅ Interactive mode available")
|
||||||
|
print(" ✅ Similarity maps available")
|
||||||
|
|
||||||
|
print("\n🔗 Related repositories to check:")
|
||||||
|
print(" - https://github.com/lightonai/fast-plaid")
|
||||||
|
print(" - https://github.com/lightonai/pylate")
|
||||||
|
print(" - https://github.com/stanford-futuredata/ColBERT")
|
||||||
|
|
||||||
|
print("\n📝 Next steps:")
|
||||||
|
print(" 1. Test with your own PDFs")
|
||||||
|
print(" 2. Experiment with different queries")
|
||||||
|
print(" 3. Generate similarity maps for visual analysis")
|
||||||
|
print(" 4. Compare ColQwen2 vs ColPali performance")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user