Showing preview only (3,713K chars total). Download the full file or copy to clipboard to get everything.
Repository: NirDiamant/RAG_Techniques
Branch: main
Commit: 69a08b03154e
Files: 49
Total size: 3.5 MB
Directory structure:
gitextract_uht8b4vm/
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── github-test.yml
│ └── local-test.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── all_rag_techniques/
│ ├── Agentic_RAG.ipynb
│ ├── HyDe_Hypothetical_Document_Embedding.ipynb
│ ├── HyPE_Hypothetical_Prompt_Embeddings.ipynb
│ ├── Microsoft_GraphRag.ipynb
│ ├── adaptive_retrieval.ipynb
│ ├── choose_chunk_size.ipynb
│ ├── context_enrichment_window_around_chunk.ipynb
│ ├── context_enrichment_window_around_chunk_with_llamaindex.ipynb
│ ├── contextual_chunk_headers.ipynb
│ ├── contextual_compression.ipynb
│ ├── crag.ipynb
│ ├── dartboard.ipynb
│ ├── document_augmentation.ipynb
│ ├── explainable_retrieval.ipynb
│ ├── fusion_retrieval.ipynb
│ ├── fusion_retrieval_with_llamaindex.ipynb
│ ├── graph_rag.ipynb
│ ├── graphrag_with_milvus_vectordb.ipynb
│ ├── hierarchical_indices.ipynb
│ ├── multi_model_rag_with_captioning.ipynb
│ ├── multi_model_rag_with_colpali.ipynb
│ ├── proposition_chunking.ipynb
│ ├── query_transformations.ipynb
│ ├── raptor.ipynb
│ ├── relevant_segment_extraction.ipynb
│ ├── reliable_rag.ipynb
│ ├── reranking.ipynb
│ ├── reranking_with_llamaindex.ipynb
│ ├── retrieval_with_feedback_loop.ipynb
│ ├── self_rag.ipynb
│ ├── semantic_chunking.ipynb
│ ├── simple_csv_rag.ipynb
│ ├── simple_csv_rag_with_llamaindex.ipynb
│ ├── simple_rag.ipynb
│ └── simple_rag_with_llamaindex.ipynb
├── data/
│ ├── customers-100.csv
│ ├── nike_2023_annual_report.txt
│ └── q_a.json
├── evaluation/
│ ├── define_evaluation_metrics.ipynb
│ ├── evaluation_deep_eval.ipynb
│ ├── evaluation_grouse.ipynb
│ └── evalute_rag.py
└── helper_functions.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
github: NirDiamant
================================================
FILE: .github/workflows/github-test.yml
================================================
name: GitHub PR Test
on:
pull_request:
types: [opened, synchronize, reopened]
branches:
- main
paths:
- "requirements.txt"
jobs:
test:
runs-on: ubuntu-latest
env:
OPENAI_API_KEY: "123"
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.12.6'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
pytest
================================================
FILE: .github/workflows/local-test.yml
================================================
name: Local Test with act
on:
workflow_dispatch:
jobs:
test:
container:
image: catthehacker/ubuntu:act-latest
env:
OPENAI_API_KEY: "123"
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.12.6'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
pytest
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to RAG Techniques
Welcome to the world's largest and most comprehensive repository of Retrieval-Augmented Generation (RAG) tutorials! 🌟 We're thrilled you're interested in contributing to this ever-growing knowledge base. Your expertise and creativity can help us maintain our position at the forefront of RAG technology.
## Join Our Community
We have a vibrant Discord community where contributors can discuss ideas, ask questions, and collaborate on RAG techniques. Join us at:
[RAG Techniques Discord Server](https://discord.gg/cA6Aa4uyDX)
Don't hesitate to introduce yourself and share your thoughts!
## Ways to Contribute
We welcome contributions of all kinds! Here are some ways you can help:
1. **Add New RAG Techniques:** Create new notebooks showcasing novel RAG methods.
2. **Improve Existing Notebooks:** Enhance, update, or expand our current tutorials.
3. **Fix Bugs:** Help us squash bugs in existing code or explanations.
4. **Enhance Documentation:** Improve clarity, add examples, or fix typos in our docs.
5. **Share Creative Ideas:** Have an innovative idea? We're all ears!
6. **Engage in Discussions:** Participate in our Discord community to help shape the future of RAG.
Remember, no contribution is too small. Every improvement helps make this repository an even better resource for the community.
## Reporting Issues
Found a problem or have a suggestion? Please create an issue on GitHub, providing as much detail as possible. You can also discuss issues in our Discord community.
## Contributing Code or Content
1. **Fork and Branch:** Fork the repository and create your branch from `main`.
2. **Make Your Changes:** Implement your contribution, following our best practices.
3. **Test:** Ensure your changes work as expected.
4. **Follow the Style:** Adhere to the coding and documentation conventions used throughout the project.
5. **Commit:** Make your git commits informative and concise.
6. **Stay Updated:** The main branch is frequently updated. Before opening a pull request, make sure your code is up-to-date with the current main branch and has no conflicts.
7. **Push and Pull Request:** Push to your fork and submit a pull request.
8. **Discuss:** Use the Discord community to discuss your contribution if you need feedback or have questions.
## Adding a New RAG Method
When adding a new RAG method to the repository, please follow these additional steps:
1. Create your notebook in the `all_rag_techniques` folder.
2. Update BOTH the list and table in README.md:
### A. Update the List of Techniques
- Add your new method to the list of techniques in the README
- Place it in the appropriate position based on complexity (methods are sorted from easiest to most complicated)
- Use the following format for the link:
```
### [Number]. [Your Method Name 🏷️](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/your_file_name.ipynb)
```
- Replace `[Number]` with the appropriate number, `[Your Method Name]` with your method's name, and `your_file_name.ipynb` with the actual name of your notebook file
- Choose an appropriate emoji that represents your method
### B. Update the Techniques Table
- Add a new row to the table with your technique
- Include all available implementations (LangChain, LlamaIndex, and/or Runnable Script)
- Use the following format:
```
| [Number] | [Category] | [LangChain](...) / [LlamaIndex](...) / [Runnable Script](...) | [Description] |
```
- Make sure to:
- Update the technique number to maintain sequential order
- Choose the appropriate category with emoji
- Include links to all available implementations
- Write a clear, concise description
### C. Important Note
- After inserting your new method, make sure to update the numbers of all subsequent techniques to maintain the correct order in BOTH the list and the table
- The numbers in the list and table must match exactly
- If you add a new technique as number 5, all techniques after it should be incremented by 1 in both places
For example, if you're adding a new technique between Simple RAG and Next Method:
In the list:
```
### 1. [Simple RAG 🌱](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_rag.ipynb)
### 2. [Your New Method 🆕](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/your_new_method.ipynb)
### 3. [Next Method 🔜](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/next_method.ipynb)
```
And in the table:
```
| 1 | Foundational 🌱 | [LangChain](...) / [LlamaIndex](...) / [Runnable Script](...) | Basic RAG implementation |
| 2 | Your Category 🆕 | [LangChain](...) / [LlamaIndex](...) / [Runnable Script](...) | Your new method description |
| 3 | Next Category 🔜 | [LangChain](...) / [LlamaIndex](...) / [Runnable Script](...) | Next method description |
```
Remember: Always update BOTH the list and table when adding new techniques, and ensure the numbers match exactly between them.
## Notebook Structure
For new notebooks or significant additions to existing ones, please follow this structure:
1. **Title and Overview:** Clear title and brief overview of the technique.
2. **Detailed Explanation:** Cover motivation, key components, method details, and benefits.
3. **Visual Representation:** Include a diagram to visualize the technique. We recommend using Mermaid syntax for creating these diagrams. Here's how to do it:
• Create a graph using Mermaid's graph TD (top-down) syntax<br>
• You can use Claude or other AI assistants to help you design the graph if needed<br>
• Paste your Mermaid code into [Mermaid Live Editor](https://mermaid.live/)<br>
• In the "Actions" tab of Mermaid Live Editor, download the SVG file of your diagram<br>
• Store the SVG file in the [images folder](https://github.com/NirDiamant/RAG_Techniques/tree/main/images) of the repository<br>
• Use an appropriate, descriptive name for the file<br>
• In your notebook, display the image using Markdown syntax:<br>
```markdown

```
This process ensures consistency in our visual representations and makes it easy for others to understand and potentially modify the diagrams in the future.
4. **Implementation:** Step-by-step Python implementation with clear comments and explanations.
5. **Usage Example:** Demonstrate the technique with a practical example.
6. **Comparison:** Compare with basic RAG, both qualitatively and quantitatively if possible.
7. **Additional Considerations:** Discuss limitations, potential improvements, or specific use cases.
8. **References:** Include relevant citations or resources if you have.
## Notebook Best Practices
To ensure consistency and readability across all notebooks:
1. **Code Cell Descriptions:** Each code cell should be preceded by a markdown cell with a clear, concise title describing the cell's content or purpose.
2. **Clear Unnecessary Outputs:** Before committing your notebook, clear all unnecessary cell outputs. This helps reduce file size and avoids confusion from outdated results.
3. **Consistent Formatting:** Maintain consistent formatting throughout the notebook, including regular use of markdown headers, code comments, and proper indentation.
## Code Quality and Readability
To ensure the highest quality and readability of our code:
1. **Write Clean Code:** Follow best practices for clean, readable code.
2. **Use Comments:** Add clear and concise comments to explain complex logic.
3. **Format Your Code:** Use consistent formatting throughout your contribution.
4. **Language Model Review:** After completing your code, consider passing it through a language model for additional formatting and readability improvements. This extra step can help make your code even more accessible and maintainable.
## Documentation
Clear documentation is crucial. Whether you're improving existing docs or adding new ones, follow the same process: fork, change, test, and submit a pull request.
## Final Notes
We're grateful for all our contributors and excited to see how you'll help expand the world's most comprehensive RAG resource. Don't hesitate to ask questions in our Discord community if you're unsure about anything.
Let's harness our collective knowledge and creativity to push the boundaries of RAG technology together!
Happy contributing! 🚀

================================================
FILE: LICENSE
================================================
Custom License Agreement
This License Agreement ("Agreement") is a legal agreement between Nir Diamant ("Licensor") and any individual or entity ("Licensee" or "Contributor") who accesses, uses, or contributes to this repository. By accessing, using, or contributing to the Repository, you agree to be bound by the terms of this Agreement.
1. Grant of License for Non-Commercial Use
1.1 Non-Commercial Use License: The Licensor grants the Licensee a worldwide, royalty-free, non-exclusive, non-transferable license to use, reproduce, modify, and distribute the content of the Repository ("Licensed Material") for non-commercial purposes only, subject to the terms and conditions of this Agreement.
1.2 Attribution Requirement: When using or distributing the Licensed Material, the Licensee must provide appropriate credit to the Licensor by:
- Citing the Licensor's name as specified.
- Including a link to the Repository.
- Indicating if changes were made to the Licensed Material.
1.3 No Commercial Use: Licensees are expressly prohibited from using the Licensed Material, in whole or in part, for any commercial purpose without prior written permission from the Licensor.
2. Reservation of Commercial Rights
2.1 Exclusive Commercial Rights: All commercial rights to the Licensed Material are exclusively reserved by the Licensor. The Licensor retains the sole right to use, reproduce, modify, distribute, and sublicense the Licensed Material for commercial purposes.
2.2 Requesting Commercial Permission: Parties interested in using the Licensed Material for commercial purposes must obtain explicit written consent from the Licensor. Requests should be directed to the contact information provided at the end of this Agreement.
3. Contributions
3.1 Contributor License Grant: By submitting any content ("Contribution") to the Repository, the Contributor grants the Licensor an exclusive, perpetual, irrevocable, worldwide, royalty-free license to use, reproduce, modify, distribute, sublicense, and create derivative works from the Contribution for any purpose, including commercial purposes.
3.2 Non-Commercial Use by Contributor: Contributors retain the right to use their own Contributions for non-commercial purposes under the same terms as this Agreement.
3.3 Warranty of Originality: Contributors represent and warrant that their Contributions are original works and do not infringe upon the intellectual property rights of any third party.
3.4 No Commercial Rights for Contributors: Contributors acknowledge that they have no rights to use the Licensed Material or their Contributions for commercial purposes.
4. Restrictions
4.1 Prohibition of Commercial Exploitation: Licensees and Contributors may not:
- Use the Licensed Material or any Contributions for commercial purposes.
- Distribute the Licensed Material or any Contributions as part of any commercial product or service.
- Sublicense the Licensed Material or any Contributions for commercial use.
4.2 No Endorsement: Licensees and Contributors may not imply endorsement or affiliation with the Licensor without explicit written permission.
5. Term and Termination
5.1 Term: This Agreement is effective upon acceptance and continues unless terminated as provided herein.
5.2 Termination for Breach: The Licensor may terminate this Agreement immediately if the Licensee or Contributor breaches any of its terms.
5.3 Effect of Termination: Upon termination, all rights granted under this Agreement cease, and the Licensee or Contributor must destroy all copies of the Licensed Material in their possession.
5.4 Survival: Sections 2, 3, 4, 6, and 7 survive termination of this Agreement.
6. Disclaimer of Warranties and Limitation of Liability
6.1 As-Is Basis: The Licensed Material and any Contributions are provided "AS IS," without warranties or conditions of any kind, either express or implied.
6.2 Disclaimer: The Licensor expressly disclaims all warranties, including but not limited to warranties of title, non-infringement, merchantability, and fitness for a particular purpose.
6.3 Limitation of Liability: In no event shall the Licensor be liable for any direct, indirect, incidental, special, exemplary, or consequential damages arising in any way out of the use of the Licensed Material or Contributions.
7. General Provisions
7.1 Entire Agreement: This Agreement constitutes the entire agreement between the parties concerning the subject matter hereof and supersedes all prior agreements and understandings.
7.2 Modification: The Licensor reserves the right to modify this Agreement at any time. Continued use of the Repository constitutes acceptance of the modified terms.
7.3 Severability: If any provision of this Agreement is found to be unenforceable, the remainder shall remain in full force and effect.
7.4 Waiver: Failure to enforce any provision of this Agreement shall not constitute a waiver of such provision.
7.5 Governing Law: This Agreement shall be governed by and construed in accordance with the laws of [Your Jurisdiction], without regard to its conflict of law principles.
7.6 Dispute Resolution: Any disputes arising under or in connection with this Agreement shall be subject to the exclusive jurisdiction of the courts located in [Your Jurisdiction].
8. Acceptance
By accessing, using, or contributing to the Repository, you acknowledge that you have read, understood, and agree to be bound by the terms and conditions of this Agreement.
Contact Information
For any questions or requests regarding this Agreement, please contact:
Name: Nir Diamant
Email: nirdiamant21@gmail.com
================================================
FILE: README.md
================================================
[](http://makeapullrequest.com)
[](https://www.linkedin.com/in/nir-diamant-759323134/)
[](https://twitter.com/NirDiamantAI)
[](https://www.reddit.com/r/EducationalAI/)
[](https://discord.gg/cA6Aa4uyDX)
[](https://github.com/sponsors/NirDiamant)
> 🌟 **Support This Project:** Your sponsorship fuels innovation in RAG technologies. **[Become a sponsor](https://www.diamant-ai.com/sponsorship)** to help maintain and expand this valuable resource!
## Sponsors ❤️
We gratefully acknowledge the organizations and individuals who have made significant contributions to this project.
**Company Sponsors**
<div align="center">
<table style="border: none; border-collapse: collapse; width: 100%; max-width: 840px; margin: 0 auto; background: transparent; table-layout: fixed;">
<tr>
<td style="border: none; text-align: center; padding: 16px 24px; width: 33.33%; vertical-align: top;">
<a href="https://app.contextual.ai?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook" target="_blank" style="text-decoration: none; display: inline-block; transition: transform 0.2s ease;">
<img src="images/trimmed_padded_contextual_white.png#gh-light-mode-only"
alt="Contextual AI"
style="height: 28px; width: auto; border-radius: 12px; vertical-align: middle; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<img src="images/trimmed_padded_contextual_black.png#gh-dark-mode-only"
alt="Contextual AI"
style="height: 28px; width: auto; border-radius: 12px; vertical-align: middle; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
</a>
</td>
<td style="border: none; text-align: center; padding: 16px 24px; width: 33.33%; vertical-align: middle;">
<a href="https://coderabbit.link/nir" target="_blank" style="text-decoration: none; display: inline-block; transition: transform 0.2s ease;">
<img src="images/coderabbit_Light_Type_Mark_Orange.png#gh-light-mode-only"
alt="CodeRabbit"
style="height: 28px; width: auto; border-radius: 12px; vertical-align: middle; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<img src="images/coderabbit_Dark_Type_Mark.png#gh-dark-mode-only"
alt="CodeRabbit"
style="height: 28px; width: auto; border-radius: 12px; vertical-align: middle; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
</a>
</td>
</tr>
</table>
</div>
**Individual Sponsors**
<a href="https://github.com/sponsors/Eisenh"><img src="https://github.com/Eisenh.png" style="border-radius: 50%;" width="64" height="64" alt=""></a>
# Advanced RAG Techniques: Elevating Your Retrieval-Augmented Generation Systems 🚀
Welcome to one of the most comprehensive and dynamic collections of Retrieval-Augmented Generation (RAG) tutorials available today. This repository serves as a hub for cutting-edge techniques aimed at enhancing the accuracy, efficiency, and contextual richness of RAG systems.
## 📫 Stay Updated!
<div align="center">
<table>
<tr>
<td align="center">🚀<br><b>Cutting-edge<br>Updates</b></td>
<td align="center">💡<br><b>Expert<br>Insights</b></td>
<td align="center">🎯<br><b>Top 0.1%<br>Content</b></td>
</tr>
</table>
[](https://diamantai.substack.com/?r=336pe4&utm_campaign=pub-share-checklist)
*Join over 50,000 AI enthusiasts getting unique cutting-edge insights and free tutorials!* ***Plus, subscribers get exclusive early access and special 33% discounts to my book and the upcoming RAG Techniques course!***
</div>
[](https://diamantai.substack.com/?r=336pe4&utm_campaign=pub-share-checklist)
## Introduction
Retrieval-Augmented Generation (RAG) is revolutionizing the way we combine information retrieval with generative AI. This repository showcases a curated collection of advanced techniques designed to supercharge your RAG systems, enabling them to deliver more accurate, contextually relevant, and comprehensive responses.
Our goal is to provide a valuable resource for researchers and practitioners looking to push the boundaries of what's possible with RAG. By fostering a collaborative environment, we aim to accelerate innovation in this exciting field.
## Related Projects
🚀 Level up with my **[Agents Towards Production](https://github.com/NirDiamant/agents-towards-production)** repository. It delivers horizontal, code-first tutorials that cover every tool and step in the lifecycle of building production-grade GenAI agents, guiding you from spark to scale with proven patterns and reusable blueprints for real-world launches, making it the smartest place to start if you're serious about shipping agents to production.
🤖 Explore my **[GenAI Agents Repository](https://github.com/NirDiamant/GenAI_Agents)** to discover a variety of AI agent implementations and tutorials, showcasing how different AI technologies can be combined to create powerful, interactive systems.
🖋️ Check out my **[Prompt Engineering Techniques guide](https://github.com/NirDiamant/Prompt_Engineering)** for a comprehensive collection of prompting strategies, from basic concepts to advanced techniques, enhancing your ability to interact effectively with AI language models.
## A Community-Driven Knowledge Hub
**This repository grows stronger with your contributions!** Join our vibrant communities - the central hubs for shaping and advancing this project together 🤝
**[Educational AI Subreddit](https://www.reddit.com/r/EducationalAI/)**
**[RAG Techniques Discord Community](https://discord.gg/cA6Aa4uyDX)**
Whether you're an expert or just starting out, your insights can shape the future of RAG. Join us to propose ideas, get feedback, and collaborate on innovative techniques. For contribution guidelines, please refer to our **[CONTRIBUTING.md](https://github.com/NirDiamant/RAG_Techniques/blob/main/CONTRIBUTING.md)** file. Let's advance RAG technology together!
🔗 For discussions on GenAI, RAG, or custom agents, or to explore knowledge-sharing opportunities, feel free to **[connect on LinkedIn](https://www.linkedin.com/in/nir-diamant-759323134/)**.
## Key Features
- 🧠 State-of-the-art RAG enhancements
- 📚 Comprehensive documentation for each technique
- 🛠️ Practical implementation guidelines
- 🌟 Regular updates with the latest advancements
## Advanced Techniques
Explore our extensive list of cutting-edge RAG techniques:
| # | Category | Technique | View |
|---|----------|-----------|------|
| 1 | ⭐ Key Collaboration | Agentic RAG with Contextual AI | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/Agentic_RAG.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/Agentic_RAG.ipynb) |
| 2 | Foundational 🌱 | Basic RAG | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/simple_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_rag.ipynb) |
| 3 | Foundational 🌱 | RAG with CSV Files | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/simple_csv_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_csv_rag.ipynb) |
| 4 | Foundational 🌱 | Reliable RAG | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/reliable_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reliable_rag.ipynb) |
| 5 | Foundational 🌱 | Optimizing Chunk Sizes | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/choose_chunk_size.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/choose_chunk_size.ipynb) |
| 6 | Foundational 🌱 | Proposition Chunking | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/proposition_chunking.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/proposition_chunking.ipynb) |
| 7 | Query Enhancement 🔍 | Query Transformations | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/query_transformations.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/query_transformations.ipynb) |
| 8 | Query Enhancement 🔍 | HyDE (Hypothetical Document Embedding) | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/HyDe_Hypothetical_Document_Embedding.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/HyDe_Hypothetical_Document_Embedding.ipynb) |
| 9 | Query Enhancement 🔍 | HyPE (Hypothetical Prompt Embedding) | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/HyPE_Hypothetical_Prompt_Embeddings.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/HyPE_Hypothetical_Prompt_Embeddings.ipynb) |
| 10 | Context Enrichment 📚 | Contextual Chunk Headers | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/contextual_chunk_headers.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/contextual_chunk_headers.ipynb) |
| 11 | Context Enrichment 📚 | Relevant Segment Extraction | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/relevant_segment_extraction.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/relevant_segment_extraction.ipynb) |
| 12 | Context Enrichment 📚 | Context Window Enhancement | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/context_enrichment_window_around_chunk.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/context_enrichment_window_around_chunk.ipynb) |
| 13 | Context Enrichment 📚 | Semantic Chunking | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/semantic_chunking.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/semantic_chunking.ipynb) |
| 14 | Context Enrichment 📚 | Contextual Compression | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/contextual_compression.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/contextual_compression.ipynb) |
| 15 | Context Enrichment 📚 | Document Augmentation | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/document_augmentation.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/document_augmentation.ipynb) |
| 16 | Advanced Retrieval 🚀 | Fusion Retrieval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/fusion_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/fusion_retrieval.ipynb) |
| 17 | Advanced Retrieval 🚀 | Reranking | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/reranking.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reranking.ipynb) |
| 18 | Advanced Retrieval 🚀 | Multi-faceted Filtering | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/multi_faceted_filtering.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/multi_faceted_filtering.ipynb) |
| 19 | Advanced Retrieval 🚀 | Hierarchical Indices | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/hierarchical_indices.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/hierarchical_indices.ipynb) |
| 20 | Advanced Retrieval 🚀 | Ensemble Retrieval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/ensemble_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/ensemble_retrieval.ipynb) |
| 21 | Advanced Retrieval 🚀 | Dartboard Retrieval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/dartboard.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/dartboard.ipynb) |
| 22 | Advanced Retrieval 🚀 | Multi-modal RAG with Captioning | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/multi_model_rag_with_captioning.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/multi_model_rag_with_captioning.ipynb) |
| 23 | Iterative Techniques 🔁 | Retrieval with Feedback Loop | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/retrieval_with_feedback_loop.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/retrieval_with_feedback_loop.ipynb) |
| 24 | Iterative Techniques 🔁 | Adaptive Retrieval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/adaptive_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/adaptive_retrieval.ipynb) |
| 25 | Iterative Retrieval 🔄 | Iterative Retrieval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/iterative_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/iterative_retrieval.ipynb) |
| 26 | Evaluation 📊 | DeepEval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/evaluation/evaluation_deep_eval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/evaluation/evaluation_deep_eval.ipynb) |
| 27 | Evaluation 📊 | GroUSE | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/evaluation/evaluation_grouse.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/evaluation/evaluation_grouse.ipynb) |
| 28 | Explainability 🔬 | Explainable Retrieval | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/explainable_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/explainable_retrieval.ipynb) |
| 29 | Advanced Architecture 🏗️ | Graph RAG with LangChain | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/graph_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/graph_rag.ipynb) |
| 30 | Advanced Architecture 🏗️ | Microsoft GraphRAG | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/Microsoft_GraphRag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/Microsoft_GraphRag.ipynb) |
| 31 | Advanced Architecture 🏗️ | RAPTOR | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/raptor.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/raptor.ipynb) |
| 32 | Advanced Architecture 🏗️ | Self-RAG | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/self_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/self_rag.ipynb) |
| 33 | Advanced Architecture 🏗️ | Corrective RAG (CRAG) | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/crag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/crag.ipynb) |
| 34 | Special Technique 🌟 | Sophisticated Controllable Agent | [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/Controllable-RAG-Agent) |
### 🌱 Foundational RAG Techniques
1. Simple RAG 🌱
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_rag.ipynb)
- **LlamaIndex**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_rag_with_llamaindex.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_rag_with_llamaindex.ipynb)
- **[Runnable Script](https://github.com/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques_runnable_scripts/simple_rag.py)**
#### Overview 🔎
Introducing basic RAG techniques ideal for newcomers.
#### Implementation 🛠️
Start with basic retrieval queries and integrate incremental learning mechanisms.
2. Simple RAG using a CSV file 🧩
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_csv_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_csv_rag.ipynb)
- **LlamaIndex**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_csv_rag_with_llamaindex.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/simple_csv_rag_with_llamaindex.ipynb)
#### Overview 🔎
Introducing basic RAG using CSV files.
#### Implementation 🛠️
This uses CSV files to create basic retrieval and integrates with openai to create question and answering system.
3. **Reliable RAG 🏷️**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reliable_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reliable_rag.ipynb)
#### Overview 🔎
Enhances the Simple RAG by adding validation and refinement to ensure the accuracy and relevance of retrieved information.
#### Implementation 🛠️
Check for retrieved document relevancy and highlight the segment of docs used for answering.
4. Choose Chunk Size 📏
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/choose_chunk_size.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/choose_chunk_size.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/choose_chunk_size.py)**
#### Overview 🔎
Selecting an appropriate fixed size for text chunks to balance context preservation and retrieval efficiency.
#### Implementation 🛠️
Experiment with different chunk sizes to find the optimal balance between preserving context and maintaining retrieval speed for your specific use case.
5. **Proposition Chunking ⛓️💥**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/proposition_chunking.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/proposition_chunking.ipynb)
#### Overview 🔎
Breaking down the text into concise, complete, meaningful sentences allowing for better control and handling of specific queries (especially extracting knowledge).
#### Implementation 🛠️
- 💪 **Proposition Generation:** The LLM is used in conjunction with a custom prompt to generate factual statements from the document chunks.
- ✅ **Quality Checking:** The generated propositions are passed through a grading system that evaluates accuracy, clarity, completeness, and conciseness.
#### Additional Resources 📚
- **[The Propositions Method: Enhancing Information Retrieval for AI Systems](https://open.substack.com/pub/diamantai/p/the-propositions-method-enhancing?r=336pe4&utm_campaign=post&utm_medium=web)** - A comprehensive blog post exploring the benefits and implementation of proposition chunking in RAG systems.
### 🔍 Query Enhancement
6. Query Transformations 🔄
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/query_transformations.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/query_transformations.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/query_transformations.py)**
#### Overview 🔎
Modifying and expanding queries to improve retrieval effectiveness.
#### Implementation 🛠️
- ✍️ **Query Rewriting:** Reformulate queries to improve retrieval.
- 🔙 **Step-back Prompting:** Generate broader queries for better context retrieval.
- 🧩 **Sub-query Decomposition:** Break complex queries into simpler sub-queries.
7. Hypothetical Questions (HyDE Approach) ❓
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/HyDe_Hypothetical_Document_Embedding.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/HyDe_Hypothetical_Document_Embedding.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/HyDe_Hypothetical_Document_Embedding.py)**
#### Overview 🔎
Generating hypothetical questions to improve alignment between queries and data.
#### Implementation 🛠️
Create hypothetical questions that point to relevant locations in the data, enhancing query-data matching.
#### Additional Resources 📚
- **[HyDE: Exploring Hypothetical Document Embeddings for AI Retrieval](https://open.substack.com/pub/diamantai/p/hyde-exploring-hypothetical-document?r=336pe4&utm_campaign=post&utm_medium=web)** - A short blog post explaining this method clearly.
### 📚 Context and Content Enrichment
8. Hypothetical Prompt Embeddings (HyPE) ❓🚀
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/HyPE_Hypothetical_Prompt_Embedding.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/HyPE_Hypothetical_Prompt_Embedding.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/HyPE_Hypothetical_Prompt_Embeddings.py)**
#### Overview 🔎
HyPE (Hypothetical Prompt Embeddings) is an enhancement to traditional RAG retrieval that **precomputes hypothetical prompts at the indexing stage**, but inseting the chunk in their place. This transforms retrieval into a **question-question matching task**. This avoids the need for runtime synthetic answer generation, reducing inference-time computational overhead while **improving retrieval alignment**.
#### Implementation 🛠️
- 📖 **Precomputed Questions:** Instead of embedding document chunks, HyPE **generates multiple hypothetical queries per chunk** at indexing time.
- 🔍 **Question-Question Matching:** User queries are matched against stored hypothetical questions, leading to **better retrieval alignment**.
- ⚡ **No Runtime Overhead:** Unlike HyDE, HyPE does **not require LLM calls at query time**, making retrieval **faster and cheaper**.
- 📈 **Higher Precision & Recall:** Improves retrieval **context precision by up to 42 percentage points** and **claim recall by up to 45 percentage points**.
#### Additional Resources 📚
- **[Preprint: Hypothetical Prompt Embeddings (HyPE)](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5139335)** - Research paper detailing the method, evaluation, and benchmarks.
9. **Contextual Chunk Headers :label:**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/contextual_chunk_headers.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/contextual_chunk_headers.ipynb)
#### Overview 🔎
Contextual chunk headers (CCH) is a method of creating document-level and section-level context, and prepending those chunk headers to the chunks prior to embedding them.
#### Implementation 🛠️
Create a chunk header that includes context about the document and/or section of the document, and prepend that to each chunk in order to improve the retrieval accuracy.
#### Additional Resources 📚
**[dsRAG](https://github.com/D-Star-AI/dsRAG)**: open-source retrieval engine that implements this technique (and a few other advanced RAG techniques)
10. **Relevant Segment Extraction 🧩**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/relevant_segment_extraction.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/relevant_segment_extraction.ipynb)
#### Overview 🔎
Relevant segment extraction (RSE) is a method of dynamically constructing multi-chunk segments of text that are relevant to a given query.
#### Implementation 🛠️
Perform a retrieval post-processing step that analyzes the most relevant chunks and identifies longer multi-chunk segments to provide more complete context to the LLM.
11. Context Enrichment Techniques 📝
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/context_enrichment_window_around_chunk.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/context_enrichment_window_around_chunk.ipynb)
- **LlamaIndex**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/context_enrichment_window_around_chunk_with_llamaindex.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/context_enrichment_window_around_chunk_with_llamaindex.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/context_enrichment_window_around_chunk.py)**
#### Overview 🔎
Enhancing retrieval accuracy by embedding individual sentences and extending context to neighboring sentences.
#### Implementation 🛠️
Retrieve the most relevant sentence while also accessing the sentences before and after it in the original text.
12. Semantic Chunking 🧠
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/semantic_chunking.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/semantic_chunking.ipynb)
- **[Runnable Script](https://github.com/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques_runnable_scripts/semantic_chunking.py)**
#### Overview 🔎
Dividing documents based on semantic coherence rather than fixed sizes.
#### Implementation 🛠️
Use NLP techniques to identify topic boundaries or coherent sections within documents for more meaningful retrieval units.
#### Additional Resources 📚
- **[Semantic Chunking: Improving AI Information Retrieval](https://open.substack.com/pub/diamantai/p/semantic-chunking-improving-ai-information?r=336pe4&utm_campaign=post&utm_medium=web)** - A comprehensive blog post exploring the benefits and implementation of semantic chunking in RAG systems.
13. Contextual Compression 🗜️
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/contextual_compression.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/contextual_compression.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/contextual_compression.py)**
#### Overview 🔎
Compressing retrieved information while preserving query-relevant content.
#### Implementation 🛠️
Use an LLM to compress or summarize retrieved chunks, preserving key information relevant to the query.
14. Document Augmentation through Question Generation for Enhanced Retrieval
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/document_augmentation.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/document_augmentation.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/document_augmentation.py)**
#### Overview 🔎
This implementation demonstrates a text augmentation technique that leverages additional question generation to improve document retrieval within a vector database. By generating and incorporating various questions related to each text fragment, the system enhances the standard retrieval process, thus increasing the likelihood of finding relevant documents that can be utilized as context for generative question answering.
#### Implementation 🛠️
Use an LLM to augment text dataset with all possible questions that can be asked to each document.
### 🚀 Advanced Retrieval Methods
15. Fusion Retrieval 🔗
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/fusion_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/fusion_retrieval.ipynb)
- **LlamaIndex**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/fusion_retrieval_with_llamaindex.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/fusion_retrieval_with_llamaindex.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/fusion_retrieval.py)**
#### Overview 🔎
Optimizing search results by combining different retrieval methods.
#### Implementation 🛠️
Combine keyword-based search with vector-based search for more comprehensive and accurate retrieval.
16. Intelligent Reranking 📈
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reranking.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reranking.ipynb)
- **LlamaIndex**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reranking_with_llamaindex.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/reranking_with_llamaindex.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/reranking.py)**
#### Overview 🔎
Applying advanced scoring mechanisms to improve the relevance ranking of retrieved results.
#### Implementation 🛠️
- 🧠 **LLM-based Scoring:** Use a language model to score the relevance of each retrieved chunk.
- 🔀 **Cross-Encoder Models:** Re-encode both the query and retrieved documents jointly for similarity scoring.
- 🏆 **Metadata-enhanced Ranking:** Incorporate metadata into the scoring process for more nuanced ranking.
#### Additional Resources 📚
- **[Relevance Revolution: How Re-ranking Transforms RAG Systems](https://open.substack.com/pub/diamantai/p/relevance-revolution-how-re-ranking?r=336pe4&utm_campaign=post&utm_medium=web)** - A comprehensive blog post exploring the power of re-ranking in enhancing RAG system performance.
17. Multi-faceted Filtering 🔍
#### Overview 🔎
Applying various filtering techniques to refine and improve the quality of retrieved results.
#### Implementation 🛠️
- 🏷️ **Metadata Filtering:** Apply filters based on attributes like date, source, author, or document type.
- 📊 **Similarity Thresholds:** Set thresholds for relevance scores to keep only the most pertinent results.
- 📄 **Content Filtering:** Remove results that don't match specific content criteria or essential keywords.
- 🌈 **Diversity Filtering:** Ensure result diversity by filtering out near-duplicate entries.
18. Hierarchical Indices 🗂️
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/hierarchical_indices.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/hierarchical_indices.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/hierarchical_indices.py)**
#### Overview 🔎
Creating a multi-tiered system for efficient information navigation and retrieval.
#### Implementation 🛠️
Implement a two-tiered system for document summaries and detailed chunks, both containing metadata pointing to the same location in the data.
#### Additional Resources 📚
- **[Hierarchical Indices: Enhancing RAG Systems](https://open.substack.com/pub/diamantai/p/hierarchical-indices-enhancing-rag?r=336pe4&utm_campaign=post&utm_medium=web)** - A comprehensive blog post exploring the power of hierarchical indices in enhancing RAG system performance.
19. Ensemble Retrieval 🎭
#### Overview 🔎
Combining multiple retrieval models or techniques for more robust and accurate results.
#### Implementation 🛠️
Apply different embedding models or retrieval algorithms and use voting or weighting mechanisms to determine the final set of retrieved documents.
20. Dartboard Retrieval 🎯
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/dartboard.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/dartboard.ipynb)
#### Overview 🔎
Optimizing over Relevant Information Gain in Retrieval
#### Implementation 🛠️
- Combine both relevance and diversity into a single scoring function and directly optimize for it.
- POC showing plain simple RAG underperforming when the database is dense, and the dartboard retrieval outperforming it.
21. Multi-modal Retrieval 📽️
#### Overview 🔎
Extending RAG capabilities to handle diverse data types for richer responses.
#### Implementation 🛠️
- **Multi-model RAG with Multimedia Captioning**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/multi_model_rag_with_captioning.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/multi_model_rag_with_captioning.ipynb) - Caption and store all the other multimedia data like pdfs, ppts, etc., with text data in vector store and retrieve them together.
- **Multi-model RAG with Colpali**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/multi_model_rag_with_colpali.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/multi_model_rag_with_colpali.ipynb) - Instead of captioning convert all the data into image, then find the most relevant images and pass them to a vision large language model.
### 🔁 Iterative and Adaptive Techniques
22. Retrieval with Feedback Loops 🔁
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/retrieval_with_feedback_loop.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/retrieval_with_feedback_loop.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/retrieval_with_feedback_loop.py)**
#### Overview 🔎
Implementing mechanisms to learn from user interactions and improve future retrievals.
#### Implementation 🛠️
Collect and utilize user feedback on the relevance and quality of retrieved documents and generated responses to fine-tune retrieval and ranking models.
23. Adaptive Retrieval 🎯
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/adaptive_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/adaptive_retrieval.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/adaptive_retrieval.py)**
#### Overview 🔎
Dynamically adjusting retrieval strategies based on query types and user contexts.
#### Implementation 🛠️
Classify queries into different categories and use tailored retrieval strategies for each, considering user context and preferences.
24. Iterative Retrieval 🔄
#### Overview 🔎
Performing multiple rounds of retrieval to refine and enhance result quality.
#### Implementation 🛠️
Use the LLM to analyze initial results and generate follow-up queries to fill in gaps or clarify information.
### 📊 Evaluation
25. **DeepEval Evaluation**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/evaluation/evaluation_deep_eval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/evaluation/evaluation_deep_eval.ipynb) | Comprehensive RAG system evaluation |
#### Overview 🔎
Performing evaluations Retrieval-Augmented Generation systems, by covering several metrics and creating test cases.
#### Implementation 🛠️
Use the `deepeval` library to conduct test cases on correctness, faithfulness and contextual relevancy of RAG systems.
26. **GroUSE Evaluation**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/evaluation/evaluation_grouse.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/evaluation/evaluation_grouse.ipynb) | Contextually-grounded LLM evaluation |
#### Overview 🔎
Evaluate the final stage of Retrieval-Augmented Generation using metrics of the GroUSE framework and meta-evaluate your custom LLM judge on GroUSE unit tests.
#### Implementation 🛠️
Use the `grouse` package to evaluate contextually-grounded LLM generations with GPT-4 on the 6 metrics of the GroUSE framework and use unit tests to evaluate a custom Llama 3.1 405B evaluator.
### 🔬 Explainability and Transparency
27. Explainable Retrieval 🔍
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/explainable_retrieval.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/explainable_retrieval.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/explainable_retrieval.py)**
#### Overview 🔎
Providing transparency in the retrieval process to enhance user trust and system refinement.
#### Implementation 🛠️
Explain why certain pieces of information were retrieved and how they relate to the query.
### 🏗️ Advanced Architectures
28. Agentic RAG with Contextual AI 🤖
- **Agentic RAG**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/Agentic_RAG.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/Agentic_RAG.ipynb)
#### Overview 🔎
Building production-ready agentic RAG pipelines for financial document analysis with Contextual AI's managed platform. This comprehensive tutorial demonstrates how to leverage agentic RAG to solve complex queries through intelligent query reformulation, document parsing, reranking, and grounded language models.
#### Implementation 🛠️
- **Document Parser**: Enterprise-grade parsing with vision models for complex tables, charts, and multi-page documents
- **Instruction-Following Reranker**: SOTA reranker with instruction-following capabilities for handling conflicting information
- **Grounded Language Model (GLM)**: World's most grounded LLM specifically engineered to minimize hallucinations for RAG use cases
- **LMUnit**: Natural language unit testing framework for evaluating and optimizing RAG system performance
29. Graph RAG with Milvus Vector Database 🔍
- **Graph RAG with Milvus**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/all_rag_techniques/graphrag_with_milvus_vectordb.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/graphrag_with_milvus_vectordb.ipynb)
#### Overview 🔎
A simple yet powerful approach to implement Graph RAG using Milvus vector databases. This technique significantly improves performance on complex multi-hop questions by combining relationship-based retrieval with vector search and reranking.
#### Implementation 🛠️
- Store both text passages and relationship triplets (subject-predicate-object) in separate Milvus collections
- Perform multi-way retrieval by querying both collections
- Use an LLM to rerank retrieved relationships based on their relevance to the query
- Retrieve the final passages based on the most relevant relationships
30. Knowledge Graph Integration (Graph RAG) 🕸️
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/graph_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/graph_rag.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/graph_rag.py)**
#### Overview 🔎
Incorporating structured data from knowledge graphs to enrich context and improve retrieval.
#### Implementation 🛠️
Retrieve entities and their relationships from a knowledge graph relevant to the query, combining this structured data with unstructured text for more informative responses.
31. GraphRag (Microsoft) 🎯
- **GraphRag**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/Microsoft_GraphRag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/Microsoft_GraphRag.ipynb)
#### Overview 🔎
Microsoft GraphRAG (Open Source) is an advanced RAG system that integrates knowledge graphs to improve the performance of LLMs
#### Implementation 🛠️
• Analyze an input corpus by extracting entities, relationships from text units. generates summaries of each community and its constituents from the bottom-up.
32. RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval 🌳
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/raptor.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/raptor.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/raptor.py)**
#### Overview 🔎
Implementing a recursive approach to process and organize retrieved information in a tree structure.
#### Implementation 🛠️
Use abstractive summarization to recursively process and summarize retrieved documents, organizing the information in a tree structure for hierarchical context.
33. Self RAG 🔁
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/self_rag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/self_rag.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/self_rag.py)**
#### Overview 🔎
A dynamic approach that combines retrieval-based and generation-based methods, adaptively deciding whether to use retrieved information and how to best utilize it in generating responses.
#### Implementation 🛠️
• Implement a multi-step process including retrieval decision, document retrieval, relevance evaluation, response generation, support assessment, and utility evaluation to produce accurate, relevant, and useful outputs.
34. Corrective RAG 🔧
- **LangChain**: [<img src="https://img.shields.io/badge/GitHub-View-blue" height="20">](https://github.com/NirDiamant/RAG_TECHNIQUES/blob/main/https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/crag.ipynb) [<img src="https://colab.research.google.com/assets/colab-badge.svg" height="20">](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/crag.ipynb)
- **[Runnable Script](all_rag_techniques_runnable_scripts/crag.py)**
#### Overview 🔎
A sophisticated RAG approach that dynamically evaluates and corrects the retrieval process, combining vector databases, web search, and language models for highly accurate and context-aware responses.
#### Implementation 🛠️
• Integrate Retrieval Evaluator, Knowledge Refinement, Web Search Query Rewriter, and Response Generator components to create a system that adapts its information sourcing strategy based on relevance scores and combines multiple sources when necessary.
## 🌟 Special Advanced Technique 🌟
35. **[Sophisticated Controllable Agent for Complex RAG Tasks 🤖](https://github.com/NirDiamant/Controllable-RAG-Agent)**
#### Overview 🔎
An advanced RAG solution designed to tackle complex questions that simple semantic similarity-based retrieval cannot solve. This approach uses a sophisticated deterministic graph as the "brain" 🧠 of a highly controllable autonomous agent, capable of answering non-trivial questions from your own data.
#### Implementation 🛠️
• Implement a multi-step process involving question anonymization, high-level planning, task breakdown, adaptive information retrieval and question answering, continuous re-planning, and rigorous answer verification to ensure grounded and accurate responses.
## Getting Started
To begin implementing these advanced RAG techniques in your projects:
1. Clone this repository:
```
git clone https://github.com/NirDiamant/RAG_Techniques.git
```
2. Navigate to the technique you're interested in:
```
cd all_rag_techniques/technique-name
```
3. Follow the detailed implementation guide in each technique's directory.
## Contributing
We welcome contributions from the community! If you have a new technique or improvement to suggest:
1. Fork the repository
2. Create your feature branch: `git checkout -b feature/AmazingFeature`
3. Commit your changes: `git commit -m 'Add some AmazingFeature'`
4. Push to the branch: `git push origin feature/AmazingFeature`
5. Open a pull request
## Contributors
[](https://github.com/NirDiamant/RAG_Techniques/graphs/contributors)
## License
This project is licensed under a custom non-commercial license - see the [LICENSE](LICENSE) file for details.
---
⭐️ If you find this repository helpful, please consider giving it a star!

Keywords: RAG, Retrieval-Augmented Generation, NLP, AI, Machine Learning, Information Retrieval, Natural Language Processing, LLM, Embeddings, Semantic Search
================================================
FILE: all_rag_techniques/Agentic_RAG.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "3V5XZVHek6xk"
},
"source": [
"<img src=\"https://github.com/ContextualAI/examples/blob/main/images/Contextual_AI_Lockup_Dark.png?raw=true\" alt=\"Image description\" width=\"160\" />\n",
"\n",
"\n",
" # Building Agentic RAG Pipelines for Financial Document Analysis with Contextual AI 🚀\n",
" [](https://colab.research.google.com/github/NirDiamant/RAG_Techniques/blob/main/all_rag_techniques/Agentic_RAG.ipynb)\n",
"\n",
" Building Retrieval-Augmented Generation (RAG) pipelines can seem daunting, with lots of moving parts and custom logic. In this tutorial, you'll learn how to quickly set up RAG agents using **Contextual AI’s managed platform**. You'll also get hands-on with several of the agent's core components—like the Parser, Reranker, Grounded Language Model, and LMUnit—so you can see how each part works in practice.\n",
"\n",
" ## 🎯 What You'll Build\n",
"\n",
" In this hands-on tutorial, you'll explore **core RAG techniques** with Contextual AI while creating an agent for **financial document analysis and quantitative reasoning** from scratch.\n",
"\n",
"\n",
" ### Learning Outcomes\n",
" By completing this tutorial, you'll learn how to **leverage agentic RAG to solve more complex queries**. The agentic nature lies in the system's ability to autonomously analyze incoming queries, determine what reformulation strategy is needed, and execute that strategy without explicit user instruction.\n",
"\n",
" Traditional RAG systems take queries as-is, often leading to poor retrievals for ambiguous, context-lacking, or complex queries. Agentic RAG intelligently preprocesses queries to bridge this gap. In the query path, the primary agentic step is query reformulation, comprising multi-turn, query expansion, or query decomposition. This query reformulation step is critical to obtaining the most robust RAG results, and is one component of a system engineered to generate the most accurate query responses.\n",
"\n",
" In query reformulation, context is added or queries are restructured from the original input: for multi-turn, adding iterative dialogue context; for query expansion, adding additional context to help a short query return optimal results; for query decomposition, taking complex multi-faceted queries that require reasoning across several unrelated documents, and breaking them down into several sub-queries that help obtain the most relevant retrievals. This agentic component handles all of this reformulation autonomously, augmenting the user's query to help obtain the response they need.\n",
" <div align=\"center\">\n",
" <img src=\"https://github.com/ContextualAI/examples/blob/main/images/architecture.png?raw=true\" alt=\"Contextual Architecture\" width=\"1000\"/>\n",
" </div>\n",
"\n",
"\n",
" You will set up your Agentic RAG system by learning to:\n",
" - **Configure document datastores** with indexing tuned for RAG performance \n",
" - **Deploy production-ready agents** with robust instructions and safeguards \n",
" - **Query the system interactively** using natural language while maintaining strict grounding \n",
" - **Continuously validate and improve** your pipeline with automated testing and performance metrics \n",
"\n",
" You’ll also gain practical experience with **four fundamental RAG components in Contextual AI**:\n",
" 1. **Parser** – Ingest and structure heterogeneous documents (reports, tables, figures) for retrieval. \n",
" 2. **Reranker** – Dynamically select the most relevant evidence to ensure precise grounding. \n",
" 3. **Grounded Language Model (GLM)** – Generate factual, source-backed responses using the retrieved context. \n",
" 4. **Language Model Unit Tests (LMUnits)** – Automatically evaluate and optimize the accuracy, grounding, and reliability of your agent. \n",
"\n",
" ⏱️ This tutorial runs end-to-end in under **15 minutes**. Every step can also be done via GUI for a **no-code RAG workflow**.\n",
"\n",
" ---"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "clV0jqJl0K96"
},
"source": [
"# Building a RAG Agent from Scratch\n",
"\n",
"Before diving into individual RAG techniques, let’s **build a complete RAG agent end-to-end** from scratch. \n",
"\n",
"## 🛠️ Environment Setup\n",
"\n",
"First, we'll install the required dependencies and set up our development environment. The `contextual-client` library provides Python bindings for the Contextual AI platform, while the additional packages support data visualization and progress tracking."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "XkSHhUakic9Y"
},
"outputs": [],
"source": [
"# Install required packages for Contextual AI integration and data visualization\n",
"%pip install contextual-client matplotlib tqdm requests pandas dotenv"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6f6q2NaCN66d"
},
"source": [
"Next, we'll import the necessary libraries that we'll use throughout this tutorial:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "GJh1fBBWic9Y"
},
"outputs": [],
"source": [
"import os\n",
"import json\n",
"import requests\n",
"from pathlib import Path\n",
"from typing import List, Optional, Dict\n",
"from IPython.display import display, JSON\n",
"import pandas as pd\n",
"from contextual import ContextualAI\n",
"import ast\n",
"from IPython.display import display, Markdown\n",
"from tqdm import tqdm\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Db9S8YTKijVt"
},
"source": [
"---\n",
"\n",
"## 🔑 Step 1: API Authentication Setup\n",
"\n",
"### Getting Your Contextual AI API Key\n",
"\n",
"Before we can start building our RAG agent, you'll need access to the Contextual AI platform.\n",
"\n",
"If you do not have an account yet, you can create a workspace with a **30-day free trial** of an agent and datastore.\n",
"\n",
"### Step-by-Step API Key Setup:\n",
"\n",
"1. **Create Your Account**: Visit [app.contextual.ai](https://app.contextual.ai?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook) and click the **\"Start Free\"** button\n",
"2. **Navigate to API Keys**: Once logged in, find **\"API Keys\"** in the sidebar\n",
"3. **Generate New Key**: Click **\"Create API Key\"** and follow the setup steps\n",
"4. **Store Securely**: Copy your API key and store it safely (you won't be able to see it again)\n",
"\n",
"<div align=\"center\">\n",
"<img src=\"https://github.com/ContextualAI/examples/blob/main/images/API_Keys.png?raw=true\" alt=\"API\" width=\"800\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8s-th42PN66e"
},
"source": [
"### Configuring Your API Key\n",
"\n",
"To run this tutorial, you can store your API key in a `.env` file. This keeps your keys separate from your code. After setting up your .env file, you can load the API key from `.env` to initialize the Contextual AI client."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "CUbmJvzoNzIV"
},
"outputs": [],
"source": [
"# Load API key from .env\n",
"from dotenv import load_dotenv\n",
"import os\n",
"load_dotenv()\n",
"\n",
"# Initialize with your API key\n",
"API_KEY = os.getenv(\"CONTEXTUAL_API_KEY\")\n",
"client = ContextualAI(\n",
" api_key=API_KEY\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lcqh_-j1MzCn"
},
"source": [
"---\n",
"\n",
"## 📊 Step 2: Create Your Document Datastore\n",
"\n",
"### Understanding Datastores\n",
"\n",
"A **datastore** in Contextual AI is a secure, isolated container for your documents and their processed representations. Each datastore provides:\n",
"\n",
"- **Isolated Storage**: Documents are kept separate and secure for each use case\n",
"- **Intelligent Processing**: Automatic parsing, chunking, and indexing of uploaded documents\n",
"- **Optimized Retrieval**: High-performance search and ranking capabilities\n",
"\n",
"Let's create a datastore for our financial document analysis agent:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "wlulbIvjdbZA",
"outputId": "350eda1d-b1c6-408e-dc80-262c144fa311"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Created new datastore with ID: 1335c317-61a1-4aad-8a97-ac6a6cdedc8b\n"
]
}
],
"source": [
"datastore_name = 'Financial_Demo_RAG'\n",
"\n",
"# Check if datastore exists\n",
"datastores = client.datastores.list()\n",
"existing_datastore = next((ds for ds in datastores if ds.name == datastore_name), None)\n",
"\n",
"if existing_datastore:\n",
" datastore_id = existing_datastore.id\n",
" print(f\"Using existing datastore with ID: {datastore_id}\")\n",
"else:\n",
" result = client.datastores.create(name=datastore_name)\n",
" datastore_id = result.id\n",
" print(f\"Created new datastore with ID: {datastore_id}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_IkAep8Vf29_"
},
"source": [
"---\n",
"\n",
"## 📄 Step 3: Document Ingestion and Processing\n",
"\n",
"Now that your agent's datastore is set up, let's add some financial documents to it. Contextual AI's document processing engine provides **enterprise-grade parsing** that expertly handles:\n",
"\n",
"- **Complex Tables**: Financial data, spreadsheets, and structured information\n",
"- **Charts and Graphs**: Visual data extraction and interpretation\n",
"- **Multi-page Documents**: Long reports with hierarchical structure\n",
"\n",
"For this tutorial, we'll use sample financial documents that demonstrate various challenging scenarios:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3AbgklrUCEYB"
},
"outputs": [],
"source": [
"import os\n",
"import requests\n",
"\n",
"# Create data directory if it doesn't exist\n",
"if not os.path.exists('data'):\n",
" os.makedirs('data')\n",
"\n",
"# File list with corresponding GitHub URLs\n",
"files_to_upload = [\n",
" # NVIDIA quarterly revnue 24/25\n",
" (\"A_Rev_by_Mkt_Qtrly_Trend_Q425.pdf\", \"https://raw.githubusercontent.com/ContextualAI/examples/refs/heads/main/08-ai-workshop/data/A_Rev_by_Mkt_Qtrly_Trend_Q425.pdf\"),\n",
" # NVIDIA quarterly revenue 22/23\n",
" (\"B_Q423-Qtrly-Revenue-by-Market-slide.pdf\", \"https://raw.githubusercontent.com/ContextualAI/examples/refs/heads/main/08-ai-workshop/data/B_Q423-Qtrly-Revenue-by-Market-slide.pdf\"),\n",
" # Spurious correlations report - fun example of graphs and statistical analysis\n",
" (\"C_Neptune.pdf\", \"https://raw.githubusercontent.com/ContextualAI/examples/refs/heads/main/08-ai-workshop/data/C_Neptune.pdf\"),\n",
" # Another spurious correlations report - fun example of graphs and statistical analysis\n",
" (\"D_Unilever.pdf\", \"https://raw.githubusercontent.com/ContextualAI/examples/refs/heads/main/08-ai-workshop/data/D_Unilever.pdf\")\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xLYsG5B0P1Dk"
},
"source": [
"### Document Download and Ingestion Process\n",
"The following cell downloads example documents locally from the GitHub links above, uploads them to Contextual AI, and tracks their processing status and IDs."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Ct8LHuvgPkyR",
"outputId": "042cb0b1-1a23-4d5b-8dad-2fb0742039a7"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fetching data/A_Rev_by_Mkt_Qtrly_Trend_Q425.pdf\n",
"Successfully uploaded A_Rev_by_Mkt_Qtrly_Trend_Q425.pdf to datastore 1335c317-61a1-4aad-8a97-ac6a6cdedc8b\n",
"Fetching data/B_Q423-Qtrly-Revenue-by-Market-slide.pdf\n",
"Successfully uploaded B_Q423-Qtrly-Revenue-by-Market-slide.pdf to datastore 1335c317-61a1-4aad-8a97-ac6a6cdedc8b\n",
"Fetching data/C_Neptune.pdf\n",
"Successfully uploaded C_Neptune.pdf to datastore 1335c317-61a1-4aad-8a97-ac6a6cdedc8b\n",
"Fetching data/D_Unilever.pdf\n",
"Successfully uploaded D_Unilever.pdf to datastore 1335c317-61a1-4aad-8a97-ac6a6cdedc8b\n",
"Successfully uploaded 4 files to datastore\n",
"Document IDs: ['c75ff84c-0a01-49d4-91e4-2692d2627f39', 'e8c132e7-297f-4dd3-9682-d6bdacc64912', 'd43223be-ade5-4802-9ecc-3463e38853c1', '5002f4aa-d5ca-4e9b-b005-4ac156ac4bf0']\n"
]
}
],
"source": [
"# Download and ingest all files\n",
"document_ids = []\n",
"for filename, url in files_to_upload:\n",
" file_path = f'data/{filename}'\n",
"\n",
" # Download file if it doesn't exist\n",
" if not os.path.exists(file_path):\n",
" print(f\"Fetching {file_path}\")\n",
" try:\n",
" response = requests.get(url)\n",
" response.raise_for_status() # Raise an exception for bad status codes\n",
" with open(file_path, 'wb') as f:\n",
" f.write(response.content)\n",
" except Exception as e:\n",
" print(f\"Error downloading {filename}: {str(e)}\")\n",
" continue\n",
"\n",
" # Upload to datastore\n",
" try:\n",
" with open(file_path, 'rb') as f:\n",
" ingestion_result = client.datastores.documents.ingest(datastore_id, file=f)\n",
" document_id = ingestion_result.id\n",
" document_ids.append(document_id)\n",
" print(f\"Successfully uploaded {filename} to datastore {datastore_id}\")\n",
" except Exception as e:\n",
" print(f\"Error uploading {filename}: {str(e)}\")\n",
"\n",
"print(f\"Successfully uploaded {len(document_ids)} files to datastore\")\n",
"print(f\"Document IDs: {document_ids}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vKOhbEqON66g"
},
"source": [
"### Optional: Inspect Documents\n",
"\n",
"If you'd like to take a look at the ingested documents, you can do so via GUI at [https://app.contextual.ai](https://app.contextual.ai?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook)\n",
"\n",
"1. Navigate to your workspace \n",
"2. Select **Datastores** on the left menu \n",
"3. Select **Documents** \n",
"4. Click on **Inspect** (once documents load)\n",
"\n",
"You will see your documents uploading in progress:"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YXCAGHuwN66g"
},
"source": [
"Once ingested, you can view the list of documents, see their metadata, and also delete documents via API.\n",
"\n",
"**Note:** It may take a few minutes for the document to be ingested and processed. If the documents are still being ingested, you will see `status='processing'`. Once ingestion is complete, the status will show as `status='completed'`.\n",
"\n",
"You can learn more about the metadata [here](https://docs.contextual.ai/api-reference/datastores-documents/get-document-metadata?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QW9saxkGN66g",
"outputId": "80d8ebca-ec77-4b1d-c0d7-68dbd6029ce6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Document metadata: DocumentMetadata(id='c75ff84c-0a01-49d4-91e4-2692d2627f39', created_at='2025-09-02T16:12:09.990120', name='A_Rev_by_Mkt_Qtrly_Trend_Q425.pdf', status='completed', custom_metadata={}, custom_metadata_config={}, has_access=True, ingestion_config={'parsing': {'figure_captioning_prompt': None, 'figure_caption_mode': 'default', 'enable_split_tables': True, 'max_split_table_cells': 100, 'ocr_level': 'auto', 'use_hyperlink_extraction': False, 'enable_vlm_hierarchy_inference': True, 'layout_model': 'dit', 'vlm_captioning_model': None, 'vlm_hierarchy_model': None, 'vlm_doc_name_model': None, 'vlm_markdown_reviser_model': None}, 'chunking': {'chunking_mode': 'hierarchy_depth', 'max_chunk_length_tokens': 768, 'min_chunk_length_tokens': 384, 'enable_hierarchy_based_contextualization': True, 'enable_contextualization': None, 'enable_section_based_contextualization': None}, 'html_config': {'max_recursive_depth': 5, 'markdown_links_mode': 'EXTERNAL', 'precise_image_attribution': True, 'enable_section_extraction': True, 'enable_table_links_addition': True, 'max_chunk_length_tokens': 768, 'enable_v2_extraction_pipeline': True}, 'ingestion_types': None, 'enable_v2_extraction_pipeline': True, 'extraction': None}, updated_at=None)\n"
]
}
],
"source": [
"metadata = client.datastores.documents.metadata(datastore_id = datastore_id, document_id = document_ids[0])\n",
"print(\"Document metadata:\", metadata)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9a_xaq-K4TuP"
},
"source": [
"---\n",
"\n",
"## 🤖 Step 4: Agent Creation and Configuration\n",
"\n",
"Now you'll create our RAG agent that will interact with the documents you just ingested.\n",
"\n",
"You can customize the Agent using additional parameters such as:\n",
"\n",
"- **`system_prompt`** is used for the instructions that your RAG system references when generating responses. Note that this is the default prompt as of 9.02.25.\n",
"- **`suggested_queries`** is a user experience feature, to prepopulate queries for the agent so a new user can see interesting examples. \n",
"\n",
"💡 Pro Tip: You can also configure or edit your agent in the UI at [app.contextual.ai](https://app.contextual.ai?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook), try changing the generation model to another LLM! \n",
"\n",
"You can find all the additional parameters [here](https://docs.contextual.ai/api-reference/agents/create-agent?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "DvU_PEFnJhDr",
"outputId": "53e42cc7-126a-45d6-b707-2e610242a5bd"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating new agent\n",
"Agent ID created: 296dc525-3bfc-4ed8-8513-658b9219b93d\n"
]
}
],
"source": [
"system_prompt = '''\n",
"You are a helpful AI assistant created by Contextual AI to answer questions about relevant documentation provided to you. Your responses should be precise, accurate, and sourced exclusively from the provided information. Please follow these guidelines:\n",
"* Only use information from the provided documentation. Avoid opinions, speculation, or assumptions.\n",
"* Use the exact terminology and descriptions found in the provided content.\n",
"* Keep answers concise and relevant to the user's question.\n",
"* Use acronyms and abbreviations exactly as they appear in the documentation or query.\n",
"* Apply markdown if your response includes lists, tables, or code.\n",
"* Directly answer the question, then STOP. Avoid additional explanations unless specifically relevant.\n",
"* If the information is irrelevant, simply respond that you don't have relevant documentation and do not provide additional comments or suggestions. Ignore anything that cannot be used to directly answer this query.\n",
"'''\n",
"\n",
"agent_name = \"Demo\"\n",
"\n",
"# Get list of existing agents\n",
"agents = client.agents.list()\n",
"\n",
"# Check if agent already exists\n",
"existing_agent = next((agent for agent in agents if agent.name == agent_name), None)\n",
"\n",
"if existing_agent:\n",
" agent_id = existing_agent.id\n",
" print(f\"Using existing agent with ID: {agent_id}\")\n",
"else:\n",
" print(\"Creating new agent\")\n",
" app_response = client.agents.create(\n",
" name=agent_name,\n",
" description=\"Helpful Grounded AI Assistant\",\n",
" datastore_ids=[datastore_id],\n",
" agent_configs={\n",
" \"global_config\": {\n",
" \"enable_multi_turn\": False # Turning this off for deterministic responses for this demo\n",
" }\n",
" },\n",
" suggested_queries=[\n",
" \"What was NVIDIA's annual revenue by fiscal year 2022 to 2025?\",\n",
" \"When did NVIDIA's data center revenue overtake gaming revenue?\",\n",
" \"What's the correlation between the distance between Neptune and the Sun and Burglary rates in the US?\",\n",
" \"What's the correlation between Global revenue generated by Unilever Group and Google searches for 'lost my wallet'?\",\n",
" \"Does this imply that Unilever Group's revenue is derived from lost wallets?\",\n",
" \"What's the correlation between the distance between Neptune and the Sun and Global revenue generated by Unilever Group?\"\n",
" ]\n",
" )\n",
" agent_id = app_response.id\n",
" print(f\"Agent ID created: {agent_id}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MkdUUIrQN66g"
},
"source": [
"### Optional: Let's look at our Agent in the Platform\n",
"Your agent is now available via GUI as well, if you'd like to try querying it there.\n",
"\n",
"Visit: [https://app.contextual.ai](https://app.contextual.ai?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook)\n",
"\n",
"1. Navigate to your workspace \n",
"2. Select **Agents** from the left menu \n",
"3. Select your Agent \n",
"4. Try a suggested query or type your question \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5F3p2pU6Wfkz"
},
"source": [
"---\n",
"\n",
"## 💬 Step 5: Query the Agent\n",
"\n",
"### Testing Your RAG Agent\n",
"\n",
"Now that our agent is configured and connected to our financial documents, let's test its capabilities with various types of queries.\n",
"\n",
"The required fields are:\n",
"\n",
"- **`agent_id`**: The unique identifier of your Agent \n",
"- **`messages`**: A list of message(s) forming the user query \n",
"\n",
"Optional information includes parameters for `stream` and `conversation_id`. You can refer [here](https://docs.contextual.ai/api-reference/agents-query/query?utm_campaign=rag-techniques&utm_source=diamantai&utm_medium=github&utm_content=notebook) for more information.\n",
"\n",
"Let's try this query: **\"What was NVIDIA's annual revenue by fiscal year 2022 to 2025?\"**:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BWnjE43cN66h",
"outputId": "624086d0-4762-4d82-f5ce-71a68534cc67"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Based on the provided documentation, I can present NVIDIA's annual revenue for fiscal years 2022 through 2025. Here are the total annual figures derived from the quarterly data:\n",
"\n",
"For Fiscal Year 2022, the total annual revenue was $26,614 million, calculated from quarterly figures of $7,643 million in Q4, $7,103 million in Q3, $6,507 million in Q2, and $5,661 million in Q1.[2]()()\n",
"\n",
"For Fiscal Year 2023, the total annual revenue was $24,974 million, comprising quarterly revenues of $6,051 million in Q4, $5,931 million in Q3, $6,704 million in Q2, and $8,288 million in Q1.[2]()()\n",
"\n",
"For Fiscal Year 2024, the total annual revenue was $65,922 million, derived from quarterly figures of $22,103 million in Q4, $18,120 million in Q3, $13,507 million in Q2, and $7,192 million in Q1.[1]()()\n",
"\n",
"For Fiscal Year 2025, the total annual revenue was $130,497 million, calculated from quarterly revenues of $39,331 million in Q4, $35,082 million in Q3, $30,040 million in Q2, and $26,044 million in Q1.[1]()()\n",
"\n",
"These figures demonstrate a clear upward trend in NVIDIA's annual revenue across the specified fiscal years.\n"
]
}
],
"source": [
"query_result = client.agents.query.create(\n",
" agent_id=agent_id,\n",
" messages=[{\n",
" \"content\": \"What was NVIDIA's annual revenue by fiscal year 2022 to 2025?\",\n",
" \"role\": \"user\"\n",
" }]\n",
")\n",
"print(query_result.message.content)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pEetPdUcN66h"
},
"source": [
"There is lots more information you can access from the query result. You can display the retrieved documents, for example. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "pZxp5LMmA4Zr",
"outputId": "075c8a83-6389-4ef0-f630-41d99e5f33f4"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"--- Processing Document 1 ---\n",
"Retrieval Info for Document 1:\n"
]
},
{
"data": {
"image/png": "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oScff5y+//5799xW/frRPvvuS02bNaXx74+jZ555hlasWEHFiJYtW9L+BxxAvXr3ouXLl9Nrr75Go99+m8rKypxTveOgHWmP4cOpUaNG9N6779Fzzz5Lq1atcs9CQtu2aUMDBg6k1159lYoVoMOuQ4bQkKFDnI6eOHEiPf3kU7RkyZJcGvDRyFGjaNXKlfTcc8/l6TE8A131zjvv0NKlS6mY4H2sbj260QEHHUSdO3em7779jp566kmaNvUzd2+vvfemrfr2pYpK9T33uzl01113OboedPDBTpctXbaMXnzhBXr/vfecXSwm362iooJat25NBxx0IPXs2ZOWLVtGr778iuOHsvJyatKkCe2z3740cOBA+n7h904vT5o0Kfc8fN/dhg2jli1a0KOPPuroo8JaIUlRv9qid+oVDXQ+CsWn/y7fn8Gv+T+ZNv9e+FzfEPBc+/btaffdd3cE94Og0CpHu3btqFWrVu47T1OsM1MR6wfad+hA2++wA838/HOaOnkKTZ0yxRl3GPXvFy1yjg4UzZrVa2iXXXel1atWU+NGjemMs86ijh060MsvvewU1emnn+6MV7Hzctt27eiss39NW/buldOivs2DdhpMJ596CjVv3tzphV/+8pe0+eZb0EsvvkjNmzWns885xznYxYq2bdvSlMmT6Y3XX6fdhu5Gx594IpWUlual6dS5s6NDj002yV3r2rUrXXrZZdS6VStauHAhFStgJ5o0bkwrV6ygF55/nlo0b04XXnSho1ubtm3p0MN/RtOmTXMO8uDBg+n4k050NmzjjTem35x3Hi2YP4/efP1152QfjMmBInJ8PNCmHXfckQYMGECvvfIqzZg+g351xhk0YOAAd2/TzTajX51xJk377DM3yDj88MNp5513zj2/cbeN6fyLLqRddt2leGeinRx1okN+8hP6ZNIkevONN2n48BF0+JFH5HwR6J8TTjyRDjzwQJo1a1aenmrRogUde9xxdPyJJ1Cjxo2o2OBfc3DwwYc4Ojz/3HPUuFEjuuCCC5ysAf222srZPmfzJk+hz2fOdM9hsqhp06b08ksv0Zxvv6Vzf/Mb6t2nd9HxUiaTcXLTt09fN8D4YtYXdNavf019+vZ1TT34Jz+hvfbam958/Q369ttv6Zxzz3V6CABtD/vZz+jYY45xk0Jhm48BQ6nqu4f+0qat9RUNSSTte9J9GWK1Nop60003dQYSo2U/A+eJ40d3/p0emHnBoOTjjz+mqVOn5t2Hc7ZmzRp7RBgRUYeABCxdsoSefvppN6vhB77g4zv++a9cur333ps222JzevONN6h3797UvVs3Oufss2nu3Ln01Vdf0eWXX06dOnVy34sVmOU55ZRTqOeWW9L4Dz5w1zytMEuPezBSICr0Qt+ttqIrfvtbmjhhIo3/YDz94Y9/dOn4TH4x4Y033sibLRsxcgQ1atiQVq5c6a7Bwfn5z39O3bt3z6XDrOvJp5xC8+fPp7/85S+0ePHionSgPbCidccdd7jvWAm8+fe3UOcNNqBPP/mEfnvpZW4FCHRp06atox8cpW23246WLVtKd/7nTreKsWrlKjryqKPo0UcecZMCxQS0/fXXX6fRo0e7mXbYzl2H7OrkZtz742jDDTekNWtW0zNPP+Nm73feeSfqVslPGJycVDnQh04rXlTQt998S5defHFuxQu+yIAB/Z2jDBoOGTrUrXhcf+219Mknn+T8Hkx2YtCKic+GDRpSMcL7YP/4xz/cas6q1atp1sxZdNPNNzkbhdVm4LOpU+nxxx/Pm+zFBNu/77jD/R7zzju008470RZb9HQrRsWGl156iV577TVn92HbsMK1+eabO7oMGbIrPfnE424lDDzVt08fN/kBX3fbbbel/fbbj2677TZ67733UpXlVbofIMjQq/CzyW8Or7UVDf+HRieNjixUr1jNZl9hHGEsoejQMf6FgviOzvL1GzJkiLvWq1cvtxyMZahhw4a5wQXCKkaMGOE6bNSoUc4x0esYEVG3AG/+8le/oosuvtgNiF24FPjQHX6dnQFD2IZfmt+yVy/69ptvcgob38vLyqhjx45Fyb9+puunhx7qaPHxRx/l3YcsY0XnjdffyDl+DRs1crooG95S4QwejBhChIqRRhxwZhCSN2XKlFxoKRzmo48+2v2eMnVKLu3W22zjQmSefeYZ50S2aNmS6gNgQzbbbDNaMH8Bffftt07OsHJYURmigdlDDEpALwxeERpUtqbMyeXipUvczCzkttiAtqOtGGRASlq1bu34afbsL909rLhiYu7IY46m/gMHUOcNN3ShiuAxyN4fbr6F3n1nLBUzMhUZqiivcPwCfoCvgVC82V9+6XQMBlo/+clP3KQQBvnwLfhLj5984gm6/fbbqbyiiCc3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IiIiIiLqEpXvq8voKxWhQ53W9v0ZBQ80QoOD0Nu/geDKRxxzRERERERERERERNQiKn3vimwUkTwtNvQSbu13TRcJavQeDW2PhbWbPfxm8IiICIeK/HjK7LdKecnYy5xJv+sr8uhg6cZ6RCZt0kceU1if+SaPPup7ZZP3J9ZXhPiovvNVNV6qx6RIE06f9B62eoeK6he8l6AxE+6qE/t4ys/ti8GCtgdD+vMyfaHvwavRQCPN4CFvH4ZyraqitFZo0KCBOxt4zZo1ubceAv68YA8+KELZ/A2JWl39b+TTsGFDKisrc3/WK9p9XkgLoD5aZ/lnmzZtSqtWrXLp6qUAReSQk6WSEtpu2+1o0qRJtHTpUsd7O+ywAw3eaScqLSmhDz/6iF5/7TVauXJljqcaNWpEu+22Gy1ZsoRGjx5dL3kJOmDIkCG07Xbb0eLFi+nFF16gzz77jNq0aUMHHXRQTiY9Zs+eTc8880y9CeH0/NWhQwfae++9acMuXWjWrFn0zNNP08KFC929bbbZhnYdMoQalJbSmDFjHC9B39UXfkI7mzdvTocccgg1adIk7963331LTz7xJHXq3Jn22msv6tixI02bNo2efeYZJ3f1DV4v7bTzzrR61Sp67bXX6OOPP3Z8BlnbZZddaLvtt6clixfTc889RzNmzKD6hi233JKGDh1a7fo7Y8fS5zNm0H777UddN9qIvvn6a0ejb775huobwC/gpb59+zp6Pf74484f8oCPtMfw4fTFrFn04YcfUn2zaQcedBC1a9s27/qSpUvpvXffdbwldTNkEHq7OjJUksnSOpOpbvP44CLNG8Br8rLtfG88AO09GKElFzjylvOev8O9ZobMMygE9sADD6SRI0fShhtu6O7Bwdhnn33cPf83aNAgd69du3a04447VhI944zG9ttvX62euId8hg8fTvvvv78z0EhrDaAaN27slO8BBxzg6gPnr3Xr1rmjgdu3b59zeJDvvvvu6z7riyGP0OF5DQOGAw88iH515hnUtHkzd2+jjTai4048gebNn0ezvviCjj7mGMdffFB7/PHH0+FHHOEc7PqKPffck4474QRnkHBW+AUXXkgbbbyxk/FWrVpRq9b4a00dOnWkvffbl1q1aV1vBhke4JUzzzqLem65JX366ae0884704knneT4CEb+nHPPpe+//57mzZ9PZ5x5Jg0YMKBe6Sbv9FTxSytq16E97bnP3tShY0en388991zq2qULTZk8mUaOGkVHHHkk1UfAfv7qjDNo7ty5tGjxYvr12WdTnz593D3Q5cijjnLONGTuwosucgPc+iZv0Odc9/TYbFOne8rLypzdb9e+vZtQ2rJ3b0ejli1b1isaebuHwSran33NQ1X7Mdj/+S9+4fw48Fh9O6E0k8lQixYtHO+Ah1q3bUO77bE7bbHFFm523l/HX9eNN6J9D9i/2uS6yJBKSjLOF0U6/sd9efnbX9Ou+3rW6ooGXy3g0AYT6ZdOUWGqEUDwrbfemj766CNnIHv27OlGeU8//bQbDcKxnzhxYs4B8zNPGCxsttlmNGHCBHetW7du7u+DDz5wKwy8rsgfDI8ZG8x2oS3oKD7q9gZqu+22o4033tjlg/v9+/d3s6yYrUBdULennnrK1Qd5YLSO5/DdD8r4ygi/nkexyk62+iNi/QL6slmzZs6523TzzahJ06Z5M++XXXwJfffdd+53h44daOA2W9NDDz3k+n/IbrvRsD12pxuuv8Hxc31cXoYDPXzECHrhuefovvvuc3KzUbeNadddd6V777mH/vjHP+bSwqhtuumm9MJzz9crWvnZ+k023YRuu/VWGv32aFpTtob223c/5xBtsskmtHTZUrr/vvuc7oLeg46ELqsvAI2gm2+77bbctYFbb029evWip598ilq2akldN+pKd9x+u5M16O9tt93W8RtWfuoTnTD59v7779N/77zTXcOsK2Tw888/p/0P2J/uu/deeumllxzP3fL7W2jrbbah5597juoTMLuMPwDvLzj11NNo+ZKl9MknnzgZu/VPf3I66NNPPqHrrr+eNthgA1q0aBHVJ2Ai7ZRTTqFnn32WHnv00Zwcgcf22XdfGjBwIF11xRU0fdo0qm9YvXo1/fuOO/JotVXfrejhhx92Ex03T56cu/ezn/2MmjZp6mTSArd0crJcfg8d9CRR628G5+FSac7VDRnx/IEIFQwMJHr37u0Um1+yxewKZnt79OhBX331lbuG8IA5c+bkOfFw+mEkINhY0kUHQiHC2cNAgwNGBIMRH16AwcIrr7xCCxYscI6ebwdGnnBg3nvvPZoyZYora/ny5blVFswYIn88jzKxTOrDFTCQgYHDs1A0qMvAgQPdLNCyZcvcQOrbb791AxesxsAxAF6r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2Yc23WQTWrFiBb1WKW8ou0PHDjR06G7UqXMn+nL2l07ewC98xrhJkya08y67OBl4/733gmV12agrDR0ylFq1auX4dcyYMbR69eq8NJ6HwVdvvP66uy9XivputRWtXrWKJk+eXOc0Qg+2bNmCdt9jDydvmdISeumFF2nSpEm59g/aaTD17tWblixZ4vQI73vQd+jQIdSqVWuaAZ311pu0ZPGScIFUQS1atKBtt9vOyW9ZJV9mSjK01Vb9aMcddqSKinIaPWYMfTrpE1cWeLBP3z6Obg1KG9DHEz6m9999rxp964RGFRVOprbZblvaZ999qF///tSocWMnB5D3qnYRtWrdigZuPZDefOPNrB9AFdSoUWMaNGgQ9e3bh5YtX05vv/UWfTb1M3vGvZJGTv8OHEjz58+nL2bNytIok6GeW/aknXba2cnWJ59+QmPHvON4G4qnQcMGtO2229LAgVs7ff7GG2/S5zNmZPV5HWumDbt0ob332Zt69+5Dy5cvd7L2zTff5DWrYcMGNHjwTvTBuHGOn4CmTZvSoMGDacteW9KSxYudPpo2bZpJHwyGhw4d6vjFY/q06fTuu++677B9g3faiXr16uVsxKuvvUrffv2N05nDhw93+kmSYuw7Yx3//lBA3cA30Offfvut47e33nrL9StscJ8+fbIJWb2/+uprp0NUVPJQy1ataOtttqE333gjx4+gD/ind+9etHDh9/TGm2/Q7FlZG5qBbejb1/kOoL2Ts/fez+optSDnnVQODsK+e9IExjoJnZKFWmETaeDThQwnBB8GQQIMjo6GoW7fvr0j8PTp053SB4PC2Ermh6KEkUda5AuGh6ABrVu3pu23357Gjh3rjNX6NsqOqB2g3zFLf+U1VzvFCgV86KGH0oL58+mll15yigazGVC24J199tvPKYibrr+B1qxZ4/jxwosvdoOGFe7+vvSPv/+dnn7yKVUhb7b55vTzX/yC5s2fRx06dKD99t+frrriSvroww+dgTrp5JOp8wadHe/uf8AB1Oupp+iv//fn3CAZjusuQ3al008/nf7+t7+vk4EG2oByzzjjTNpx8CAndzCaGHh8+sknrm6Qr+OPP56+m/MddenalUbtOYouuvAi+vqrr5w8H33M0VRWXk6LFy2iTAXRZ599Rq+++mq1gQbKgsL91Rln0Hbbb0czps+gYbsPc6sDV1z+WzfAg9I/8aQT6auvv3aO0d57702XXnwJffrpp65e5194IS1a9L1z1vc/8AB64P776a47/7tOJhWGjxhBp//i5zTnuznUrHlzOv6EE2jChAk0Z84c6tixI/3qzDNp+bJl1LxlC9r/wAPpT3/8o3MgATiVp/38dDdAadqsmWvX766+hsaPH6+WNXLUSDr5lFPoiy++oBbNs3S4+qqr6OOPP3b3fXvhaFxwwQX00ccfu4EGeBqzm3vutZfTq7iPASRoCB1bl0CdunXrRlddczU1btLElXfoYYfR3LlzHY2gly+97DLqvMEGNOfb72jUyFE0bNgwuuzSS13f+4HrL375S9pll13o0UcecQN77xTLsrr36EGXX/FbZ4y/X7jQ0ejBBx+ku++6K2/WEDx34kkn0YD+/emdMWOcbHMabtGzJ1140YX08EP/oylTptQpjVx9GjWiM846i3bYYQfnrMFWtWjenD755BMnI0cfc4zTNeCVtm3b0gEHHEBXXXklffjhh9S1a1e68uqrqXGjhm4QiYEK8rn+uuuqHHBBp+wArxOdetqprn/GvPOOowGuDxkylH51xq/cQBR02muffej6311L7733nhuc/eJXv6KSTMbprwMOPID+fccd9NCDD9U5jVC3kXuOolNPO43mfPcdtWjZwumgCR9/nDcwhT49/ee/oPbt2zlnGbyC64f85BA64sgjaTZo2KYN7bnnnnTRBRfS559/rpYHZxB6cMhuu9Fpp51Kf/6//3MDDZSzVb9+dMlll9KyZcto1cqVtN8B+9Pjjz5G//zHP9yzBxx4EB151JE08/PPXX+N3HNP+u1ll7mBTV2OMzbYcEO68qqrqFWrlvTV11/RIYccQt8vWkTPPvNMjrehQw89/Ge015570llnnJkbaPTt2zdH2w023ID23Xc/uvSSS0z+B9+dcMIJtGDhQmcP4VTD4YbfhYmpE048kYaPHOF0DtLutvswp3MWff89jRgxgrp3756lhZvUakHla8rok0mf0A+JYbvvTr8841eOn5o0buz0+cSJE53ewiDjJz/5iaszKAnZgA/x4EMP2QONDFGnzhvQaaef7gZmmCTDJBR08lFHH00HHnSQk2kMRGBDofdg4wcPGkTn/OZcWjB/geNE2LW7/vtfeuC++826u+7NvbTPRqG+b1o7WvBAQ2aetiAtvEq7zvNFh0JYYZQ33HBDN4MDhYfBApbakQbX4LzAqUAHQTHAQcRABaNlCAqMLxQKnt1ggw1os802c2m8kIApwOzasn1E/QH4CbNxnTt1ossuu4w+Gv8hdezUySk/3AMP/etf/3IzmStWrqCLL7nEzUjDWMA52ne//aisbA1dfOFFNH/BfLr44kvowAMOpFdffoWWLl1arTzMUF944YX05Zdf0lb9tqKrrr7aOQEYaMAJuO3WWx3/ouyrfneNm8G489//cTNKMAhQUEN2G+pmNNclIIs7DtqRnnv2WfrnP/5JzZs2o6bNmuYGQJjlwaAfqw9wYOEI9u3Txw00vLZ4/LHH6H8PPURUjs1oWdnUjPl2229Pu+66q3PCX37pJdp5113ovPPPpx123JFeefllNxM/Z+5cOv+889xM/TXXXEP9+vdz5X8xezY99MAD9MyzWUN63Q03uLwevP8BN1CsywkFzHaNHDnCGebfnHsurVi+wukezHyiXBgnOBdff/ONu37zLTfTzjvtTC+/+JJzsBFGBD644frrqUXLlnTTTTfRgQcfRB999FG1AVm79u2dk/T+++/TLTfeRK3btKEbb77ZGSoYQr/ZD3ryzLPOpE023TQ3AOnZs6dzPkGT+++/360AXf27a2iP4cPpnrvvproGeBr6/ZJLLqEJH31MnTp1cg4xgD565eVXaOKECc4pQxsP+9lh1GOTTejjjz5yOv7wIw53fXr7v/5FTz7xBJWtKVOdNdgGPAun/fxzz6O5c+fQWWef7Wa/wccY2Ph0cBjgaPKZXs77Z599tqvnulgWA99u2GVD2nGHHejpp5+mO/51u1vha9qkSc72jh//Ac2YMZ3efP0NNwi69vrr3OwzeAUTZ889+wy98cYbNG/uXDrr1792s9UdOnakr778slp54BPooJNPO9WFavlZegD8c9QxR7sBzu+uucY5UjfceCMdfMjBbgCMsq695nc0d84cp59uvuUW2nlnDAAfVeW7NmnUsFEjGjFipOuzC35zHq1csdI5b5A3366dd9mZTjzpZOrStQtN++yz3HXI6qBBg52fcN5vfkP9+/V3+h/OI2bQNT2BQRUmEbByK/XvN19/TY88/DA99+xztGr1Krr66qvd5Mg999xDrVu3okMPO9Styv7lz3+hDTfcwMkqbMcff/+HuqMRdOm221LXrl3oyiuvdCtNkDsM2D0fQX9iUqd33z7O4eX0xaD1gvPOczwDWl148UVukk0baLj8MkTlFRX017/8hd57913n6K4pW+Pu9e7Vi/bca0+6+6676X//+1/W9l11lZtEePCBBxy90Ceo
gitextract_uht8b4vm/ ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── github-test.yml │ └── local-test.yml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── all_rag_techniques/ │ ├── Agentic_RAG.ipynb │ ├── HyDe_Hypothetical_Document_Embedding.ipynb │ ├── HyPE_Hypothetical_Prompt_Embeddings.ipynb │ ├── Microsoft_GraphRag.ipynb │ ├── adaptive_retrieval.ipynb │ ├── choose_chunk_size.ipynb │ ├── context_enrichment_window_around_chunk.ipynb │ ├── context_enrichment_window_around_chunk_with_llamaindex.ipynb │ ├── contextual_chunk_headers.ipynb │ ├── contextual_compression.ipynb │ ├── crag.ipynb │ ├── dartboard.ipynb │ ├── document_augmentation.ipynb │ ├── explainable_retrieval.ipynb │ ├── fusion_retrieval.ipynb │ ├── fusion_retrieval_with_llamaindex.ipynb │ ├── graph_rag.ipynb │ ├── graphrag_with_milvus_vectordb.ipynb │ ├── hierarchical_indices.ipynb │ ├── multi_model_rag_with_captioning.ipynb │ ├── multi_model_rag_with_colpali.ipynb │ ├── proposition_chunking.ipynb │ ├── query_transformations.ipynb │ ├── raptor.ipynb │ ├── relevant_segment_extraction.ipynb │ ├── reliable_rag.ipynb │ ├── reranking.ipynb │ ├── reranking_with_llamaindex.ipynb │ ├── retrieval_with_feedback_loop.ipynb │ ├── self_rag.ipynb │ ├── semantic_chunking.ipynb │ ├── simple_csv_rag.ipynb │ ├── simple_csv_rag_with_llamaindex.ipynb │ ├── simple_rag.ipynb │ └── simple_rag_with_llamaindex.ipynb ├── data/ │ ├── customers-100.csv │ ├── nike_2023_annual_report.txt │ └── q_a.json ├── evaluation/ │ ├── define_evaluation_metrics.ipynb │ ├── evaluation_deep_eval.ipynb │ ├── evaluation_grouse.ipynb │ └── evalute_rag.py └── helper_functions.py
SYMBOL INDEX (19 symbols across 2 files) FILE: evaluation/evalute_rag.py function create_deep_eval_test_cases (line 40) | def create_deep_eval_test_cases( function evaluate_rag (line 95) | def evaluate_rag(retriever, num_questions: int = 5) -> Dict[str, Any]: function calculate_average_scores (line 160) | def calculate_average_scores(results: List[Dict]) -> Dict[str, float]: FILE: helper_functions.py function replace_t_with_space (line 18) | def replace_t_with_space(list_of_documents): function text_wrap (line 34) | def text_wrap(text, width=120): function encode_pdf (line 48) | def encode_pdf(path, chunk_size=1000, chunk_overlap=200): function encode_from_string (line 79) | def encode_from_string(content, chunk_size=1000, chunk_overlap=200): function retrieve_context_per_question (line 129) | def retrieve_context_per_question(question, chunks_query_retriever): class QuestionAnswerFromContext (line 152) | class QuestionAnswerFromContext(BaseModel): function create_question_answer_from_context_chain (line 162) | def create_question_answer_from_context_chain(llm): function answer_question_from_context (line 186) | def answer_question_from_context(question, context, question_answer_from... function show_context (line 208) | def show_context(context): function read_pdf_to_string (line 223) | def read_pdf_to_string(path): function bm25_retrieval (line 248) | def bm25_retrieval(bm25: BM25Okapi, cleaned_texts: List[str], query: str... function exponential_backoff (line 276) | async def exponential_backoff(attempt): function retry_with_exponential_backoff (line 294) | async def retry_with_exponential_backoff(coroutine, max_retries=5): class EmbeddingProvider (line 325) | class EmbeddingProvider(Enum): class ModelProvider (line 331) | class ModelProvider(Enum): function get_langchain_embedding_provider (line 338) | def get_langchain_embedding_provider(provider: EmbeddingProvider, model_...
Condensed preview — 49 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,808K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 18,
"preview": "github: NirDiamant"
},
{
"path": ".github/workflows/github-test.yml",
"chars": 644,
"preview": "name: GitHub PR Test\n\non:\n pull_request:\n types: [opened, synchronize, reopened]\n branches:\n - main\n path"
},
{
"path": ".github/workflows/local-test.yml",
"chars": 553,
"preview": "name: Local Test with act\n\non:\n workflow_dispatch:\n\njobs:\n test:\n container:\n image: catthehacker/ubuntu:act-l"
},
{
"path": "CONTRIBUTING.md",
"chars": 8682,
"preview": "# Contributing to RAG Techniques\n\nWelcome to the world's largest and most comprehensive repository of Retrieval-Augmente"
},
{
"path": "LICENSE",
"chars": 5644,
"preview": "Custom License Agreement\n\nThis License Agreement (\"Agreement\") is a legal agreement between Nir Diamant (\"Licensor\") and"
},
{
"path": "README.md",
"chars": 59714,
"preview": "[](http://makeapullrequest.com"
},
{
"path": "all_rag_techniques/Agentic_RAG.ipynb",
"chars": 558119,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {\n \"id\": \"3V5XZVHek6xk\"\n },\n \"sou"
},
{
"path": "all_rag_techniques/HyDe_Hypothetical_Document_Embedding.ipynb",
"chars": 11517,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Hypothetical Docu"
},
{
"path": "all_rag_techniques/HyPE_Hypothetical_Prompt_Embeddings.ipynb",
"chars": 30111,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Hypothetical Prom"
},
{
"path": "all_rag_techniques/Microsoft_GraphRag.ipynb",
"chars": 18588,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"raw\",\n \"metadata\": {\n \"vscode\": {\n \"languageId\": \"raw\"\n "
},
{
"path": "all_rag_techniques/adaptive_retrieval.ipynb",
"chars": 26142,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"<!--  system\nusing "
},
{
"path": "helper_functions.py",
"chars": 11847,
"preview": "from langchain_community.document_loaders import PyPDFLoader\nfrom langchain_text_splitters import RecursiveCharacterText"
}
]
About this extraction
This page contains the full source code of the NirDiamant/RAG_Techniques GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 49 files (3.5 MB), approximately 928.5k tokens, and a symbol index with 19 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.