Large language models (LLMs) have evolved; now, we have increasingly sophisticated, highly efficient and multimodal LLMs.
We all know that whatever these LLMs generate as a response sometimes may not be as accurate as intended or desired, generally referred to as an LLM hallucination. These LLMs often hallucinate and generate inaccurate responses. LLM hallucination is a comprehensive topic by itself — and in this article, we will look at one approach to mitigate it.
Three approaches help LLMs mitigate their hallucinations: Retrieval Augmented Generation (RAG), fine-tuning and prompt engineering. RAG is considered the more sophisticated solution of all these approaches, and lately, there have been many advancements in it. One approach is using knowledge graphs while building RAG applications. This article will try to understand how this knowledge graph approach helps RAG applications.
Introduction to knowledge graphs
Knowledge graphs are a powerful tool for organizing and retrieving complex information. They are beneficial in RAG, which can significantly enhance the performance of LLMs. A knowledge graph is a graph structure that represents relationships between entities, which can be documents, concepts, or other data types.
By storing information in a graph format, knowledge graphs provide a more intuitive and flexible way to model complex, real-world scenarios. This structured approach allows for a deeper understanding of the connections and context within the data, making it easier to retrieve and utilize relevant information effectively.
What is RAG?
RAG is an approach that leverages external data stored in a database to respond to the user’s query. This enhances the quality of response generation with more context. RAG utilizes both retrieval techniques and generative models to produce contextually relevant responses. RAG improves the performance of LLMs for various natural language processing tasks, including information extraction and sentiment analysis.
Consider a scenario where you would like to get custom responses from your AI application. First, the organization’s relevant documents are converted into embeddings through an embedding model and stored in a vector database. When a query is sent to the AI application, it gets converted into a vector query embedding. It goes through the vector database to find the most similar object by vector similarity search. This way, your LLM-powered application doesn’t hallucinate since you have already instructed it to ground its responses with the custom data.
One simple use case would be the customer support application, where the custom data is fed to the application stored in a vector database. When a user query comes in, the application generates the most appropriate response related to your products or services — not some generic answer.
The RAG pipeline involves three critical components: Retrieval, augmentation and generation.
- Retrieval. This component helps fetch relevant information from an external knowledge base, like a vector database, for any user query. It is crucial as this is the first step in curating meaningful and contextually correct responses.
- Augmentation. This part involves enhancing and adding more relevant context to the retrieved response for the user query.
- Generation. Lastly, a final output is presented to the user with the help of an LLM. The LLM uses its knowledge and the provided context to provide an apt response to the user’s query.
These three components are the basis of a RAG pipeline, which helps users get the contextually rich and accurate responses they seek. That is why RAG is helpful in building chatbots, question-answering systems, etc.
What are knowledge graphs in RAG?
Knowledge graphs are structured ways to organize information, showing how entities are connected. They are used to understand relationships and context among different data points effectively. Let’s look at a simple example:
Paragraph: “Cows and dogs are good examples of animals. Cows eat herbs, which are plants! Both plants and animals count as living things.”
- From this unstructured text data, we can extract the following entities: cows, dogs, animals, herbs, plants and living things.
Relationships:
- Cows and dogs are animals
- Cows eat herbs
- Herbs are plants
- Plants and animals are living things
With this information, we can build the following knowledge graph:
Knowledge graphs significantly augment RAG systems by providing a structured semantic context that improves data retrieval accuracy and efficiency. They enable the system to understand and utilize the relationships and attributes of entities within the graph, leading to more nuanced and detailed responses. This integration enhances the functionality of RAG systems and applications and ensures the responses remain relevant over time.
Building a knowledge graph involves integrating data from various sources to create a structured representation of knowledge. Tools and techniques like RDF, OWL and graph databases are commonly used. Vector databases can also enhance the RAG process by capturing semantic meanings and relationships.
LLMs can create knowledge graphs — fundamentally, this is what an LLM is built to do. LLMs are constructed to understand the text and determine the important things in that text. So, it knows what entities are present and what their semantic meanings are. It also knows the relationship between those entities.
Once you have a knowledge graph, you can use it to perform RAG. You can do the RAG without even having vectors or vector embeddings. This approach of having knowledge graphs is suitable for handling questions about things like aggregations and multi-hop relationships. We now see a trend of new specialty databases claiming they help store the graph data and do a better RAG. But is that true? What if we tell you that your SQL databases can store and query graphs, too (using the capabilities of JOINS, Recursive CTEs, etc.)? We are going to show exactly that in this article.
How knowledge graphs enhance RAG
As mentioned, knowledge graphs can enhance RAG by providing a structured and relevant context for LLMs to generate responses. LLMs can produce more accurate and contextually informed responses by retrieving relevant information from a knowledge graph. Knowledge graphs can also filter out irrelevant or misleading results, improving the overall quality of outputs.
Additionally, knowledge graphs can connect data from structured and unstructured sources, making them ideal for enhancing the output of LLMs. This integration ensures that the responses generated are accurate and rich in context, addressing the user’s query more comprehensively.
Building a knowledge graph for RAG
To build a knowledge graph for a RAG system, one needs to gather domain-specific data, which can be extracted from structured databases, semi-structured data or unstructured text.
Frameworks and tools
The integration of GraphRAG with LLMs leverages frameworks like LangChain, simplifying knowledge graph construction by automating entity recognition and relationship mapping. Databases that support knowledge graphs enable efficient data handling and large-scale RAG systems.
Integration with LLMs
LLMs play a crucial role by enhancing the retrieval capabilities of knowledge graph RAG through advanced natural language understanding. The implementation of sophisticated LLMs from OpenAI, Meta, Google, Anthropic, Microsoft, etc., supports more accurate and context-aware responses from the RAG system.
Here's a breakdown of how knowledge graph RAG works
- Data acquisition. Identify and collect relevant data sets
- Data modeling. Define a schema for the knowledge graph that includes types of nodes (entities) and edges (relationships) pertinent to the domain
- Graph construction. Use the SingleStore database to create entities and relationships Clean and normalize data to ensure consistency and accuracy
- Data ingestion. Use SQL commands to ingest data into the database
- Indexing and retrieval. Implement indexing and retrieval strategies from SingleStore — like hybrid search — to enhance RAG performance
Vector similarity search for efficient retrieval
Vector similarity search is a technique used to retrieve relevant information from a vector database efficiently. By representing text data as vectors, vector similarity search can identify chunks of text that contain data similar to a user’s question.
This technique is particularly useful in RAG, where it can retrieve relevant information from a vector database and send it to an LLM for summarization. The use of vector similarity search enhances the efficiency and accuracy of the retrieval process, ensuring that the most relevant information is provided to the LLM for generating responses.
Applications and benefits of knowledge graph RAG
The benefits of implementing knowledge graphs include improved data integration, enhanced decision making and better insights.
- Knowledge graphs significantly elevate the relevancy of search results within RAG systems by organizing data semantically. This structured data approach allows for more precise query understanding and response generation, enhancing user experience by providing more accurate and contextually relevant answers. Knowledge graphs improve the performance of RAG systems for various natural language processing tasks, like information extraction and sentiment analysis.
- Knowledge graphs enable diverse new applications such as hierarchical retrieval systems, which organize information categorically, and personalized recommendation engines, which tailor responses based on user history and preferences. These capabilities extend the utility of RAG systems across various domains, from eCommerce to customer support.
- A compelling example is a veterinary healthcare startup that utilized a knowledge graph to align animal breed data with specific diseases and treatments, significantly improving the accuracy and relevance of information retrieval. This case illustrates how domain-specific implementations of knowledge graphs can transform the effectiveness of RAG systems in specialized fields.
- Knowledge graphs are especially relevant for applications in healthcare for patient data integration, in finance for fraud detection, and in eCommerce for personalized recommendations, enhancing efficiency and decision-making processes across various industries.
Best practices for building and using knowledge graphs
There are several best practices to remember when building and using knowledge graphs. First, defining an explicit schema for the knowledge graph is essential; including the entities and relationships represented is critical. Second, it’s crucial to populate the knowledge graph with high-quality data, ensuring the information is relevant and accurate. Third, if you're using a graph database, learning and using a robust query language (like Cypher) to retrieve information from the knowledge graph is essential.
Finally, it’s vital to continuously update and refine the knowledge graph to ensure that it remains accurate and relevant. By following these best practices, you can create a precise knowledge graph that effectively supports the RAG applications that leverage it.
Common challenges and solutions
When working with knowledge graphs and RAG, several common challenges can arise. One common challenge is context poisoning, which occurs when the prompt is not accurately reflected in the results. To mitigate this challenge, it’s essential to use a knowledge graph to filter out irrelevant or misleading results. Another common challenge is the difficulty of answering multi-part questions that involve connecting the dots between associated pieces of information. To address this challenge, using a knowledge graph to store data as a network of nodes and relationships is essential, making it easier to traverse and navigate through interconnected documents. By leveraging the structured nature of knowledge graphs, you can overcome these challenges and enhance the effectiveness of your RAG applications.
RAG with a vector database vs. RAG with a knowledge graph
RAG can be implemented using either a database that supports vectors and semantic search or a knowledge graph. In particular, vector databases facilitate efficient search and similarity functions, enhancing the RAG process by enabling quick setup for applications involving unstructured and structured data.
Each offers distinct advantages and methodologies for information retrieval and response generation. The goal of both approaches remains the same: to retrieve contextually relevant data/information for the user’s query.
RAG with a vector database involves converting input queries into vector representations/embeddings, and performing vector searches to retrieve relevant data based on their semantic similarity. The retrieved documents go through an LLM to generate the responses. This approach efficiently handles large-scale unstructured data and excels in contexts where the relationships between data points are not explicitly defined. In contrast, RAG with a knowledge graph uses structured relationships and entities within the graph to retrieve relevant information. The input query searches within the knowledge graph, extracting relevant entities and their relationships.
This structured data is then utilized to generate a response. Knowledge graphs are handy for applications requiring a deep understanding of the interconnections between data points, making them ideal for domains where the relationships between entities are crucial. Both approaches can be integrated with a SingleStore database; you can use it as a vector database and also for knowledge graphs.
Knowledge graph RAG with SingleStore
Let’s look at a sample application we built that shows the setup, schema and queries used to extract and query knowledge graphs in SingleStore using a Super Mario Brothers text/dataset example.
The sample app architecture
The architecture involves ingesting text data to create a knowledge graph, querying it using SingleStore’s full-text search and providing context to the LLM for generating responses.
Sign up for a free trial on SingleStore where the workspace is automatically created for you once you sign up. Next, create a database under your workspace to store the entity and relationship table.
Next, go to the ‘Develop’ tab on your SingleStore dashboard and click ‘Open SQL Editor’
You will land on the SQL editor dashboard where you can run your SQL commands/queries. Make sure to select the respective workspace and database.
Add the following code in your SQL editor. Basically we are creating tables named ‘entity’ and ‘relationship’ in our database.
create table entity(id int,name varchar(255),type varchar(50),fulltext (name));create table relationship(id int,from_entity_id int,to_entity_id int,type varchar(50),fulltext (type));
See the following image for reference (adding the same preceding code into the SQL editor).
Next, we will insert the entities and relationships shown in the ‘Demo Schema and Queries’ image. Add the code in the SQL editor and make sure to run it using the ‘Run’ button at the far right of the dashboard.
INSERT INTO `entity` (`id`, `name`, `type`) VALUES(1, 'Super Mario Bros.', 'game'),(2, 'Nintendo', 'company'),(3, 'Famicom', 'console'),(4, 'Nintendo Entertainment System', 'console'),(5, 'Mario Bros.', 'game'),(6, 'Super Mario series', 'series'),(7, 'Mushroom Kingdom', 'location'),(8, 'Princess Toadstool', 'character'),(9, 'King Koopa', 'character'),(10, 'Bowser', 'character'),(11, 'Super Mushroom', 'item');INSERT INTO `relationship` (`id`, `from_entity_id`, `to_entity_id`, `type`)VALUES(1, 1, 2, 'developed_by'),(2, 1, 2, 'published_by'),(3, 1, 3, 'released_on'),(4, 1, 4, 'released_on'),(5, 1, 5, 'successor_to'),(6, 1, 7, 'part_of'),(7, 1, 8, 'set_in'),(8, 1, 9, 'features'),(9, 1, 9, 'features'),(10, 1, 10, 'same_as'),(11, 1, 11, 'contains');
Let’s run the query that shows the correlation between entity and relationship data:
SELECT relationship.*,entity_from.name AS from_entity_name,entity_to.name AS to_entity_name,0.5 * IFNULL(MATCH(entity_from.name) AGAINST(’Princess Toadstool’), 0) +0.5 * IFNULL(MATCH(entity_to.name) AGAINST(’Princess Toadstool’), 0) AS scoreFROM relationshipJOIN entity AS entity_from ON relationship.from_entity_id = entity_from.idJOIN entity AS entity_to ON relationship.to_entity_id = entity_to.idWHEREMATCH(entity_from.name) AGAINST(’Princess Toadstool’) ORMATCH(entity_to.name) AGAINST(’Princess Toadstool’)ORDER BY score DESC;
This is the output you will see.
Let’s do a full-text search for the keyword ‘princess.’ You can use any other word present in the dataset also.
This is the output you will see.
You can significantly enhance your RAG applications by building graph data with entities and relationships and efficiently storing and retrieving relevant information from SingleStore. As the world of AI continues to expand, many databases will claim to excel in specific tasks. However, enterprises need a robust, versatile database that supports all types of data and can handle tasks such as semantic caching, vector search, hybrid search, building full-stack AI apps, vector data storage, integration for AI frameworks, etc.
SingleStore is a data platform that meets diverse requirements, making it the ideal choice for enterprises seeking a reliable, all-encompassing platform to build any modern app.