Introduction
Retrieval-Augmented Generation systems are innovative models within the fields of natural language processing since they integrate the components of both retrieval and generation models. In this respect, RAG systems prove to be versatile when the size and variety of tasks that are being executed by LLMs increase, LLMs provide more efficient solutions to fine-tune by use case. Hence, when the RAG systems re-iterate an externally indexed information during the generation process, it is capable of generating more accurate contextual and relevant fresh information response. Nevertheless, real-world applications of RAG systems offer some difficulties, which might affect their performances, although the potentials are evident. This article focuses on these key challenges and discusses measures which can be taken to improve performance of RAG systems. This is based on a recent talk given by Dipanjan (DJ) on Improving Real-World RAG Systems: Key Challenges & Practical Solutions, in the DataHack Summit 2024.
Understanding RAG Systems
RAG systems combine retrieval mechanisms with large language models to generate responses leveraging external data.
![Understanding RAG Systems](https://technicalterrence.com/wp-content/uploads/2024/08/Improving-Real-World-RAG-Systems.png)
The core components of a RAG system include:
- Retrieval: This component involves use of one or several queries to search for documents, or pieces of information in a database, or any other source of knowledge outside the system. Retrieval is the process by which an appropriate amount of relevant information is fetched so as to help in the formulation of a more accurate and contextually relevant response.
- LLM Response Generation: Once the relevant documents are retrieved, they are fed into a large language model (LLM). The LLM then uses this information to generate a response that is not only coherent but also informed by the retrieved data. This external information integration allows the LLM to provide answers grounded in real-time data, rather than relying solely on pre-existing knowledge.
- Fusion Mechanism: In some advanced RAG systems, a fusion mechanism may be used to combine multiple retrieved documents before generating a response. This mechanism ensures that the LLM has access to a more comprehensive context, enabling it to produce more accurate and nuanced answers.
- Feedback Loop: Modern RAG systems often include a feedback loop where the quality of the generated responses is assessed and used to improve the system over time. This iterative process can involve fine-tuning the retriever, adjusting the LLM, or refining the retrieval and generation strategies.
Benefits of RAG Systems
RAG systems offer several advantages over traditional methods like fine-tuning language models. Fine-tuning involves adjusting a model’s parameters based on a specific dataset, which can be resource-intensive and limit the model’s ability to adapt to new information without additional retraining. In contrast, RAG systems offer:
- Dynamic Adaptation: RAG systems allow models to dynamically access and incorporate up-to-date information from external sources, avoiding the need for frequent retraining. This means that the model can remain relevant and accurate even as new information emerges.
- Broad Knowledge Access: By retrieving information from a wide array of sources, RAG systems can handle a broader range of topics and questions without requiring extensive modifications to the model itself.
- Efficiency: Leveraging external retrieval mechanisms can be more efficient than fine-tuning because it reduces the need for large-scale model updates and retraining, focusing instead on integrating current and relevant information into the response generation process.
Typical Workflow of a RAG System
A typical RAG system operates through the following workflow:
![Typical Workflow of a RAG System](https://technicalterrence.com/wp-content/uploads/2024/08/1725026674_650_Improving-Real-World-RAG-Systems.png)
- Query Generation: The process begins with the generation of a query based on the user’s input or context. This query is crafted to elicit relevant information that will aid in crafting a response.
- Retrieval: The generated query is then used to search external databases or knowledge sources. The retrieval component identifies and fetches documents or data that are most relevant to the query.
- Context Generation: The retrieved documents are processed to create a coherent context. This context provides the necessary background and details that will inform the language model’s response.
- LLM Response: Finally, the language model uses the context generated from the retrieved documents to produce a response. This response is expected to be well-informed, relevant, and accurate, leveraging the latest information retrieved.
![Typical Workflow of a RAG System](https://technicalterrence.com/wp-content/uploads/2024/08/1725026674_27_Improving-Real-World-RAG-Systems.png)
Key Challenges in Real-World RAG Systems
Let us now look into the key challenges in real-world systems. This is inspired by the famous paper “Seven Failure Points When Engineering a Retrieval Augmented Generation System” by Barnett et al. as depicted in the following figure. We will dive into each of these problems in more detail in the following section with practical solutions to tackle these challenges.
Missing Content
One significant challenge in RAG systems is dealing with missing content. This problem arises when the retrieved documents do not contain sufficient or relevant information to adequately address the user’s query. When relevant information is absent from the retrieved documents, it can lead to several issues like Impact on Accuracy and Relevance.
![Missing Content](https://technicalterrence.com/wp-content/uploads/2024/08/1725026674_111_Improving-Real-World-RAG-Systems.png)
The absence of crucial content can severely impact the accuracy and relevance of the language model’s response. Without the necessary information, the model may generate answers that are incomplete, incorrect, or lack depth. This not only affects the quality of the responses but also diminishes the overall reliability of the RAG system.
Solutions for Missing Content
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_775_Improving-Real-World-RAG-Systems.png)
These are the approaches we can take to tackle challenges with missing content.
- Regularly updating and maintaining the knowledge base ensures that it contains accurate and comprehensive information. This can reduce the likelihood of missing content by providing the retrieval component with a richer set of documents.
- Crafting specific and assertive prompts with clear constraints can guide the language model to generate more precise and relevant responses. This helps in narrowing down the focus and improving the response’s accuracy.
- Implementing RAG systems with agentic capabilities allows the system to actively search and incorporate external sources of information. This approach helps address missing content by expanding the range of sources and improving the relevance of the retrieved data.
You can check out this notebook for more details with hands-on examples!
Missed Top Ranked
When documents that should be top-ranked fail to appear in the retrieval results, the system struggles to provide accurate responses. This problem, known as “Missed Top Ranked,” occurs when important context documents are not prioritized in the retrieval process. As a result, the model may not have access to crucial information needed to answer the question effectively.
Despite the presence of relevant documents, poor retrieval strategies can prevent these documents from being retrieved. Consequently, the model may generate responses that are incomplete or inaccurate due to the lack of critical context. Addressing this issue involves improving the retrieval strategy to ensure that the most relevant documents are identified and included in the context.
![Missed Top Ranked](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_325_Improving-Real-World-RAG-Systems.png)
Not in Context
The “Not in Context” issue arises when documents containing the answer are present during the initial retrieval but do not make it into the final context used for generating a response. This problem often results from ineffective retrieval, reranking, or consolidation strategies. Despite the presence of relevant documents, flaws in these processes can prevent the documents from being included in the final context.
Consequently, the model may lack the necessary information to generate a precise and accurate answer. Improving retrieval algorithms, reranking methods, and consolidation techniques is essential to ensure that all pertinent documents are properly integrated into the context, thereby enhancing the quality of the generated responses.
![Not in Context](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_257_Improving-Real-World-RAG-Systems.png)
The “Not Extracted” issue occurs when the LLM struggles to extract the correct answer from the provided context, even though the answer is present. This problem arises when the context contains too much unnecessary information, noise, or contradictory details. The abundance of irrelevant or conflicting information can overwhelm the model, making it difficult to pinpoint the accurate answer.
To address this issue, it’s crucial to improve context management by reducing noise and ensuring that the information provided is relevant and consistent. This will help the LLM focus on extracting precise answers from the context.
![Not Extracted](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_992_Improving-Real-World-RAG-Systems.png)
Incorrect Specificity
When the output response is too vague and lacks detail or specificity, it often results from vague or generic queries that fail to retrieve the right context. Additionally, issues with chunking or poor retrieval strategies can exacerbate this problem. Vague queries might not provide enough direction for the retrieval system to fetch the most relevant documents, while improper chunking can dilute the context, making it challenging for the LLM to generate a detailed response. To address this, refine queries to be more specific and improve chunking and retrieval methods to ensure that the context provided is both relevant and comprehensive.
![Incorrect Specificity](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_638_Improving-Real-World-RAG-Systems.png)
Solutions for Missed Top Ranked, Not in Context, Not Extracted and Incorrect Specificity
- Use Better Chunking Strategies
- Hyperparameter Tuning – Chunking & Retrieval
- Use Better Embedder Models
- Use Advanced Retrieval Strategies
- Use Context Compression Strategies
- Use Better Reranker Models
You can check out this notebook for more details with hands-on examples!
Experiment with various Chunking Strategies
You can explore and experiment with various chunking strategies in the given table:
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_547_Improving-Real-World-RAG-Systems.png)
Hyperparameter Tuning – Chunking & Retrieval
Hyperparameter tuning plays a critical role in optimizing RAG systems for better performance. Two key areas where hyperparameter tuning can make a significant impact are chunking and retrieval.
![Hyperparameter Tuning - Chunking & Retrieval](https://technicalterrence.com/wp-content/uploads/2024/08/1725026675_752_Improving-Real-World-RAG-Systems.png)
Chunking
In the context of RAG systems, chunking refers to the process of dividing large documents into smaller, more manageable segments. This allows the retriever to focus on more relevant sections of the document, improving the quality of the retrieved context. However, determining the optimal chunk size is a delicate balance—chunks that are too small might miss important context, while chunks that are too large might dilute relevance. Hyperparameter tuning helps in finding the right chunk size that maximizes retrieval accuracy without overwhelming the LLM.
Retrieval
The retrieval component involves several hyperparameters that can influence the effectiveness of the retrieval process. For instance, you can fine-tune the number of retrieved documents, the threshold for relevance scoring, and the embedding model used to improve the quality of the context provided to the LLM. Hyperparameter tuning in retrieval ensures that the system is consistently fetching the most relevant documents, thus enhancing the overall performance of the RAG system.
Better Embedder Models
Embedder models help in converting your text into vectors which are using during retrieval and search. Do not ignore embedder models as using the wrong one can cost your RAG System’s performance dearly.
<img decoding="async" src="data:image/png;base64,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” alt=””/>
Newer Embedder Models will be trained on more data and often better. Don’t just go by benchmarks, use and experiment on your data. Do not use commercial models if data privacy is important. There are a variety of embedder models available, do check out the Massive Text Embedding Benchmark (MTEB) leaderboard to get an idea of the potentially good and current embedder models out there.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026676_34_Improving-Real-World-RAG-Systems.png)
Better Reranker Models
Rerankers are fine-tuned cross-encoder transformer models. These models take in a pair of documents (Query, Document) and return back a relevance score.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026676_28_Improving-Real-World-RAG-Systems.gif)
Models fine-tuned on more pairs and released recently will usually be better so do check out for the latest reranker models and experiment with them.
Advanced Retrieval Strategies
To address the limitations and pain points in traditional RAG systems, researchers and developers are increasingly implementing advanced retrieval strategies. These strategies aim to enhance the accuracy and relevance of the retrieved documents, thereby improving the overall system performance.
Semantic Similarity Thresholding
This technique involves setting a threshold for the semantic similarity score during the retrieval process. Consider only documents that exceed this threshold as relevant, including them in the context for LLM processing. Prioritize the most semantically relevant documents, reducing noise in the retrieved context.
Multi-query Retrieval
Instead of relying on a single query to retrieve documents, multi-query retrieval generates multiple variations of the query. Each variation targets different aspects of the information need, thereby increasing the likelihood of retrieving all relevant documents. This strategy helps mitigate the risk of missing critical information.
Hybrid Search (Keyword + Semantic)
A hybrid search approach combines keyword-based retrieval with semantic search. Keyword-based search retrieves documents containing specific terms, while semantic search captures documents contextually related to the query. This dual approach maximizes the chances of retrieving all relevant information.
Reranking
After retrieving the initial set of documents, apply reranking techniques to reorder them based on their relevance to the query. Use more sophisticated models or additional features to refine the order, ensuring that the most relevant documents receive higher priority.
Chained Retrieval
Chained retrieval breaks down the retrieval process into multiple stages, with each stage further refining the results. The initial retrieval fetches a broad set of documents. Then, subsequent stages refine these documents based on additional criteria, such as relevance or specificity. This method allows for more targeted and accurate document retrieval.
Context Compression Techniques
Context compression is a crucial technique for refining RAG systems. It ensures that the most relevant information is prioritized, leading to accurate and concise responses. In this section, we’ll explore two primary methods of context compression: prompt-based compression and filtering. We will also examine their impact on enhancing the performance of real-world RAG systems.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026676_350_Improving-Real-World-RAG-Systems.png)
Prompt-Based Compression
Prompt-based compression involves using language models to identify and summarize the most relevant parts of retrieved documents. This technique aims to distill the essential information and present it in a concise format that is most useful for generating a response. Benefits of this approach include:
- Improved Relevance: By focusing on the most pertinent information, prompt-based compression enhances the relevance of the generated response.
- Limitations: However, this method may also have limitations, such as the risk of oversimplifying complex information or losing important nuances during summarization.
Filtering
Filtering involves removing entire documents from the context based on their relevance scores or other criteria. This technique helps manage the volume of information and ensure that only the most relevant documents are considered. Potential trade-offs include:
- Reduced Context Volume: Filtering can lead to a reduction in the amount of context available, which might affect the model’s ability to generate detailed responses.
- Increased Focus: On the other hand, filtering helps maintain focus on the most relevant information, improving the overall quality and relevance of the response.
Wrong Format
The “Wrong Format” problem occurs when an LLM fails to return a response in the specified format, such as JSON. This issue arises when the model deviates from the required structure, producing output that is improperly formatted or unusable. For instance, if you expect a JSON format but the LLM provides plain text or another format, it disrupts downstream processing and integration. This problem highlights the need for careful instruction and validation to ensure that the LLM’s output meets the specified formatting requirements.
![Wrong Format](https://technicalterrence.com/wp-content/uploads/2024/08/1725026676_437_Improving-Real-World-RAG-Systems.png)
Solutions for Wrong Format
- Powerful LLMs have native support for response formats e.g OpenAI supports JSON outputs.
- Better Prompting and Output Parsers
- Structured Output Frameworks
You can check out this notebook for more details with hands-on examples!
For example models like GPT-4o have native output parsing support like JSON which you can enable as shown in the following code snapshot.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026676_728_Improving-Real-World-RAG-Systems.png)
Incomplete
The “Incomplete” problem arises when the generated response lacks critical information, making it incomplete. This issue often results from poorly worded questions that do not clearly convey the required information, inadequate context retrieved for the response, or ineffective reasoning by the model.
Incomplete responses can stem from a variety of sources, including ambiguous queries that fail to specify the necessary details, retrieval mechanisms that do not fetch comprehensive information, or reasoning processes that miss key elements. Addressing this problem involves refining question formulation, improving context retrieval strategies, and enhancing the model’s reasoning capabilities to ensure that responses are both complete and informative.
![Incomplete](https://technicalterrence.com/wp-content/uploads/2024/08/1725026677_188_Improving-Real-World-RAG-Systems.png)
Solution for Incomplete
- Use Better LLMs like GPT-4o, Claude 3.5 or Gemini 1.5
- Use Advanced Prompting Techniques like Chain-of-Thought, Self-Consistency
- Build Agentic Systems with Tool Use if necessary
- Rewrite User Query and Improve Retrieval – HyDE
HyDE is an interesting approach where the idea is to generate a Hypothetical answer to the given question which may not be factually totally correct but would have relevant text elements which can help retrieve the more relevant documents from the vector database as compared to retrieving using just the question as depicted in the following workflow.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026677_882_Improving-Real-World-RAG-Systems.gif)
Other Enhancements from Recent Research Papers
Let us now look onto few enhancements from recent research papers which have actually worked.
RAG vs. Long Context LLMs
Long-context LLMs often deliver superior performance compared to Retrieval-Augmented Generation (RAG) systems due to their ability to handle really long documents and generate detailed responses without worrying about all the data pre-processing needed for RAG systems. However, they come with high computing and cost demands, making them less practical for some applications. A hybrid approach offers a solution by leveraging the strengths of both models. In this strategy, you first use a RAG system to provide a response based on the retrieved context. Then, you can employ a long-context LLM to review and refine the RAG-generated answer if needed. This method allows you to balance efficiency and cost while ensuring high-quality, detailed responses when necessary as mentioned in the paper, Retrieval Augmented Generation or Long-Context LLMs? A Comprehensive Study and Hybrid Approach, Zhuowan Li et al.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026677_93_Improving-Real-World-RAG-Systems.png)
RAG vs Long Context LLMs – Self-Router RAG
Let’s look at a practical workflow of how to implement the solution proposed in the above paper. In a standard RAG flow, the process begins with retrieving context documents from a vector database based on a user query. The RAG system then uses these documents to generate an answer while adhering to the provided information. If the answerability of the query is uncertain, an LLM judge prompt determines if the query is answerable or unanswerable based on the context. For cases where the query cannot be answered satisfactorily with the retrieved context, the system employs a long-context LLM. This LLM uses the complete context documents to provide a detailed response, ensuring that the answer is based solely on the provided information.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026677_855_Improving-Real-World-RAG-Systems.gif)
Agentic Corrective RAG
Agentic Corrective RAG draws inspiration from the paper, Corrective Retrieval Augmented Generation, Shi-Qi Yan et al. where the idea is to first do a normal retrieval from a vector database for your context documents based on a user query. Then instead of the standard RAG flow, we assess how relevant are the retrieved documents to answer the user query using an LLM-as-Judge flow and if there are some irrelevant documents or no relevant documents, we do a web search to get live information from the web for the user query before following the normal RAG flow as depicted in the following figure.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026678_250_Improving-Real-World-RAG-Systems.png)
First, retrieve context documents from the vector database based on the input query. Then, use an LLM to assess the relevance of these documents to the question. If all documents are relevant, proceed without further action. If some documents are ambiguous or incorrect, rephrase the query and search the web for better context. Finally, send the rephrased query along with the updated context to the LLM for generating the response. This is shown in detail in the following practical workflow illustration.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026678_55_Improving-Real-World-RAG-Systems.gif)
Agentic Self-Reflection RAG
Agentic Self-Reflection RAG (SELF-RAG) introduces a novel approach that enhances large language models (LLMs) by integrating retrieval with self-reflection. This framework allows LLMs to dynamically retrieve relevant passages and reflect on their own responses using special reflection tokens, improving accuracy and adaptability. Experiments demonstrate that SELF-RAG surpasses traditional models like ChatGPT and Llama2-chat in tasks such as open-domain QA and fact verification, significantly boosting factuality and citation precision. This was proposed in the paper Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection, Akari Asai et al.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026678_95_Improving-Real-World-RAG-Systems.png)
A practical implementation of this workflow is depicted in the following illustration where we do a normal RAG retrieval, then use an LLM-as-Judge grader to assess document relevant, do web searches or query rewriting and retrieval if needed to get more relevant context documents. The next step involves generating the response and again using LLM-as-Judge to reflect on the generated answer and make sure it answers the question and is not having any hallucinations.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026678_886_Improving-Real-World-RAG-Systems.png)
Conclusion
Improving real-world RAG systems requires addressing several key challenges, including missing content, retrieval problems, and response generation issues. Implementing practical solutions, such as enriching the knowledge base and employing advanced retrieval techniques, can significantly enhance the performance of RAG systems. Additionally, refining context compression methods further contributes to improving system effectiveness. Continuous improvement and adaptation are crucial as these systems evolve to meet the growing demands of various applications. Key takeaways from the talk can be summarized in the following figure.
![](https://technicalterrence.com/wp-content/uploads/2024/08/1725026678_583_Improving-Real-World-RAG-Systems.png)
Future research and development efforts should focus on improving retrieval systems, explore the above mentioned methodologies. Additionally, exploring new approaches like Agentic ai can help optimize RAG systems for even greater efficiency and accuracy.
You can also refer to the GitHub link to know more.
Frequently Asked Questions
A. RAG systems combine retrieval mechanisms with large language models to generate responses based on external data.
A. They allow models to dynamically incorporate up-to-date information from external sources without frequent retraining.
A. Common challenges include missing content, retrieval problems, response specificity, context overload, and system latency.
A. Solutions include better data cleaning, assertive prompting, and leveraging agentic RAG systems for live information.
A. Strategies include semantic similarity thresholding, multi-query retrieval, hybrid search, reranking, and chained retrieval.