Back to Blog
1 min read

GraphRAG Implementation: Combining Graphs with Retrieval

Microsoft’s GraphRAG combines knowledge graphs with retrieval for superior question answering. Let’s implement it.

GraphRAG Architecture

from graphrag import GraphRAGIndexer, GraphRAGQueryEngine
from azure.ai.openai import AzureOpenAI

class GraphRAGSystem:
    def __init__(self, openai_client: AzureOpenAI):
        self.openai = openai_client
        self.indexer = GraphRAGIndexer(
            llm=openai_client,
            chunk_size=1200,
            overlap=100
        )

    async def build_index(self, documents: list[str]):
        """Build GraphRAG index from documents."""
        # Extract entities and relationships
        for doc in documents:
            entities = await self.indexer.extract_entities(doc)
            self.indexer.add_to_graph(entities)

        # Build community summaries
        communities = self.indexer.detect_communities()
        for community in communities:
            summary = await self.summarize_community(community)
            self.indexer.store_summary(community.id, summary)

        return self.indexer.build()

    async def summarize_community(self, community) -> str:
        """Create summary for entity community."""
        entities_text = "\n".join([e.description for e in community.entities])
        response = await self.openai.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": "Summarize the key themes and relationships in these entities."
            }, {
                "role": "user",
                "content": entities_text
            }]
        )
        return response.choices[0].message.content

    async def query(self, question: str, mode: str = "global") -> str:
        """Query using local or global search."""
        if mode == "global":
            # Use community summaries for broad questions
            summaries = self.indexer.get_relevant_summaries(question)
            context = "\n\n".join(summaries)
        else:
            # Use entity relationships for specific questions
            entities = self.indexer.search_entities(question)
            context = self.build_entity_context(entities)

        return await self.generate_answer(question, context)

GraphRAG excels at complex questions requiring synthesis across multiple documents.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.