Skip to content

Knowledge Base Example

Build an enterprise knowledge base with GraphMem.

Complete Implementation

from graphmem import GraphMem, MemoryConfig, MemoryImportance
from datetime import datetime
import os

class KnowledgeBase:
    """Enterprise knowledge base with policies, procedures, and employees."""

    def __init__(self, org_id: str):
        self.config = MemoryConfig(
            # Azure OpenAI for enterprise
            llm_provider="azure",
            llm_api_key=os.getenv("AZURE_OPENAI_KEY"),
            azure_endpoint=os.getenv("AZURE_ENDPOINT"),
            azure_deployment="gpt-4",
            llm_model="gpt-4",

            embedding_provider="azure",
            embedding_api_key=os.getenv("AZURE_OPENAI_KEY"),
            azure_embedding_deployment="text-embedding-ada-002",
            embedding_model="text-embedding-ada-002",

            # Production storage
            neo4j_uri=os.getenv("NEO4J_URI"),
            neo4j_password=os.getenv("NEO4J_PASSWORD"),
            redis_url=os.getenv("REDIS_URL"),

            # Evolution
            evolution_enabled=True,
        )
        self.memory = GraphMem(self.config, memory_id=f"kb_{org_id}", user_id=org_id)
        self.org_id = org_id

    def add_policy(
        self,
        name: str,
        content: str,
        effective_date: str,
        department: str = "All",
    ):
        """Add or update a policy document."""
        enriched = f"""
        POLICY DOCUMENT
        ===============
        Name: {name}
        Department: {department}
        Effective Date: {effective_date}
        Last Updated: {datetime.now().isoformat()}

        POLICY CONTENT:
        {content}
        """

        self.memory.ingest(
            enriched,
            metadata={
                "type": "policy",
                "name": name,
                "department": department,
                "effective_date": effective_date,
            },
            importance=MemoryImportance.CRITICAL,
        )

        # Resolve conflicts with old versions
        self.memory.evolve()

    def add_procedure(self, name: str, steps: list[str], department: str):
        """Add a procedure with step-by-step instructions."""
        content = f"""
        PROCEDURE: {name}
        Department: {department}
        Last Updated: {datetime.now().isoformat()}

        STEPS:
        """
        for i, step in enumerate(steps, 1):
            content += f"\n{i}. {step}"

        self.memory.ingest(
            content,
            metadata={"type": "procedure", "name": name, "department": department},
            importance=MemoryImportance.HIGH,
        )

    def add_employee(self, data: dict):
        """Add employee information."""
        content = f"""
        EMPLOYEE PROFILE
        ================
        Name: {data['name']}
        Title: {data['title']}
        Department: {data['department']}
        Email: {data['email']}
        Phone: {data.get('phone', 'N/A')}
        Manager: {data.get('manager', 'N/A')}
        Start Date: {data.get('start_date', 'N/A')}
        Location: {data.get('location', 'N/A')}
        Skills: {', '.join(data.get('skills', []))}
        """

        self.memory.ingest(
            content,
            metadata={"type": "employee", **data},
            importance=MemoryImportance.MEDIUM,
        )

    def add_faq(self, question: str, answer: str, category: str):
        """Add a FAQ entry."""
        content = f"""
        FAQ: {question}
        Category: {category}

        Answer: {answer}
        """

        self.memory.ingest(
            content,
            metadata={"type": "faq", "category": category},
            importance=MemoryImportance.HIGH,
        )

    def search(self, query: str, department: str = None) -> dict:
        """Search the knowledge base."""
        if department:
            query = f"[Department: {department}] {query}"

        response = self.memory.query(query)

        return {
            "answer": response.answer,
            "confidence": response.confidence,
            "sources": [
                {"name": n.name, "type": n.entity_type}
                for n in response.nodes[:5]
            ],
            "needs_escalation": response.confidence < 0.5,
        }

    def bulk_import(self, documents: list[dict]):
        """Bulk import documents from various sources."""
        self.memory.ingest_batch(
            documents,
            max_workers=20,
            aggressive=True,
            show_progress=True,
        )
        self.memory.evolve()

    def get_stats(self) -> dict:
        """Get knowledge base statistics."""
        return self.memory.get_stats()

# Usage Example
if __name__ == "__main__":
    kb = KnowledgeBase("acme_corp")

    # Add policies
    kb.add_policy(
        name="Remote Work Policy",
        content="""
        Employees may work remotely up to 3 days per week.
        Remote work requires manager approval.
        Employees must be available during core hours (10am-4pm).
        """,
        effective_date="2024-01-01",
        department="All",
    )

    # Add procedures
    kb.add_procedure(
        name="Expense Reimbursement",
        steps=[
            "Submit expense report within 30 days of expense",
            "Include receipts for all items over $25",
            "Get manager approval for items over $500",
            "Finance will process within 5 business days",
        ],
        department="Finance",
    )

    # Add employees
    kb.add_employee({
        "name": "Jane Smith",
        "title": "CEO",
        "department": "Executive",
        "email": "jane@acme.com",
        "skills": ["Leadership", "Strategy", "Finance"],
    })

    # Add FAQ
    kb.add_faq(
        question="What are the office hours?",
        answer="Office hours are 9am to 6pm, Monday through Friday.",
        category="General",
    )

    # Search
    result = kb.search("Can I work from home?")
    print(result["answer"])
    # → "Yes, employees may work remotely up to 3 days per week 
    #    with manager approval..."

    result = kb.search("How do I submit expenses?")
    print(result["answer"])
    # → "Submit expense report within 30 days, include receipts 
    #    for items over $25..."

FastAPI Integration

from fastapi import FastAPI, Depends, Header

app = FastAPI()

# Singleton KB per org
kbs = {}

def get_kb(org_id: str = Header(..., alias="X-Org-ID")) -> KnowledgeBase:
    if org_id not in kbs:
        kbs[org_id] = KnowledgeBase(org_id)
    return kbs[org_id]

@app.post("/policy")
async def add_policy(
    name: str,
    content: str,
    effective_date: str,
    kb: KnowledgeBase = Depends(get_kb),
):
    kb.add_policy(name, content, effective_date)
    return {"status": "added"}

@app.post("/search")
async def search(
    query: str,
    department: str = None,
    kb: KnowledgeBase = Depends(get_kb),
):
    return kb.search(query, department)

@app.get("/stats")
async def stats(kb: KnowledgeBase = Depends(get_kb)):
    return kb.get_stats()