Skip to main content
The knowledge system lets agents retrieve relevant information from PDFs, documents, and URLs before answering, grounding responses in your own sources.
from praisonaiagents import Agent

agent = Agent(
    name="Research Assistant",
    instructions="Answer questions using the knowledge base.",
    knowledge=["research_paper.pdf", "data.txt"],
)

agent.start("What are the key findings?")
The user asks about their documents; the agent embeds, searches, and answers from your PDFs and URLs.

Key Features

Process PDFs, documents, spreadsheets, images, and web content

Multiple strategies for optimal text segmentation

Vector-based search with optional reranking

User, agent, and run-specific knowledge scoping

Optional relationship extraction and storage

Automatic quality assessment for stored knowledge

Quick Start

1

Level 1 — List of sources (simplest)

Pass a list of files or URLs and the agent answers from them.
from praisonaiagents import Agent

agent = Agent(
    name="Research Assistant",
    instructions="Answer questions using the knowledge base.",
    knowledge=["research_paper.pdf", "data.txt"],
)

agent.start("What are the key findings?")
2

Level 2 — Dict (inline config)

Use a dict to pick a vector store while still passing sources inline.
from praisonaiagents import Agent

agent = Agent(
    name="Research Assistant",
    instructions="Answer questions using the knowledge base.",
    knowledge={
        "sources": ["research_paper.pdf", "data.txt"],
        "vector_store": {
            "provider": "chroma",
            "config": {"collection_name": "research_docs", "path": ".praison"},
        },
    },
)

agent.start("What are the key findings?")
3

Level 3 — Config class (full control)

Use KnowledgeConfig for typed control over chunking, retrieval, and reranking.
from praisonaiagents import Agent, KnowledgeConfig

agent = Agent(
    name="Research Assistant",
    instructions="Answer questions using the knowledge base.",
    knowledge=KnowledgeConfig(
        sources=["research_paper.pdf", "data.txt"],
        chunking_strategy="semantic",
        retrieval_k=5,
        rerank=True,
    ),
)

agent.start("What are the key findings?")

How It Works

PhaseWhat happens
1. AddDocuments are chunked, embedded, and stored in the vector store via knowledge.add()
2. Searchknowledge.search(query) embeds the query and returns top-k similar chunks
3. RetrieveAgent injects the chunks as context before calling the LLM
4. GenerateLLM answers using the retrieved knowledge; responses are grounded in your data

Configuration Options

KnowledgeConfig SDK Reference

Full parameter reference for KnowledgeConfig
The most common options at a glance:
OptionTypeDefaultDescription
sourceslist[str][]Files, directories, or URLs to index
embedderstr"openai"Embedder to use for vector encoding
chunking_strategystr"semantic""fixed" / "semantic" / "sentence" / "paragraph"
retrieval_kint5Number of chunks to retrieve per query
rerankboolFalseApply reranking to improve result order

Basic Configuration

knowledge_config = {
    "vector_store": {
        "provider": "chroma",
        "config": {
            "collection_name": "knowledge_base",
            "path": ".praison",
            "distance_metric": "cosine"
        }
    },
    "embedder": {
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    }
}

Advanced Configuration with Graph Store

knowledge_config = {
    "vector_store": {
        "provider": "chroma",
        "config": {
            "collection_name": "knowledge_base",
            "path": ".praison"
        }
    },
    "graph_store": {
        "provider": "neo4j",
        "config": {
            "url": "bolt://localhost:7687",
            "username": "neo4j",
            "password": "password"
        }
    },
    "llm": {
        "provider": "openai",
        "config": {
            "model": "gpt-4o-mini",
            "temperature": 0
        }
    },
    "reranker": {
        "enabled": True,
        "default_rerank": False
    }
}

Choosing Sources and Chunking

Pick a source type, then a chunking strategy that matches your content.

Chunking Strategies

kb = Knowledge({
    "chunker": {
        "name": "token",
        "chunk_size": 500,
        "chunk_overlap": 50
    }
})
Best for: Consistent chunk sizes, token-limited models
kb = Knowledge({
    "chunker": {
        "name": "sentence",
        "chunk_size": 10,  # sentences per chunk
        "min_chunk_size": 3
    }
})
Best for: Natural text boundaries, Q&A systems
kb = Knowledge({
    "chunker": {
        "name": "semantic",
        "threshold": 0.7,
        "min_chunk_size": 100
    }
})
Best for: Topic-based segmentation, research papers
kb = Knowledge({
    "chunker": {
        "name": "sdpm",
        "max_chunk_size": 1000
    }
})
Best for: Document structure preservation

Document Processing

Supported File Types

  • PDF (.pdf)
  • Word (.doc, .docx)
  • Text (.txt)
  • Markdown (.md)
  • RTF (.rtf)

  • Excel (.xls, .xlsx)
  • CSV (.csv)
  • JSON (.json)
  • XML (.xml)

  • Images (OCR)
  • HTML pages
  • Web URLs
  • YouTube videos

Processing Options

# Add with metadata
kb.add(
    "research.pdf",
    user_id="user123",
    metadata={
        "category": "AI Research",
        "year": 2024,
        "author": "Dr. Smith"
    }
)

# Batch processing
documents = ["doc1.pdf", "doc2.txt", "doc3.md"]
for doc in documents:
    kb.add(doc, user_id="user123")

# URL processing
kb.add("https://arxiv.org/pdf/2301.00000.pdf", user_id="user123")

Search Features

# Simple search
results = kb.search("artificial intelligence", limit=5)

# User-scoped search
results = kb.search(
    query="machine learning",
    user_id="user123",
    limit=10
)

Advanced Search Options

# Enable Mem0 reranking for better relevance
results = kb.search(
    query="neural networks",
    user_id="user123",
    rerank=True,
    top_k=20  # Retrieve more before reranking
)
# Combine keyword and semantic search
results = kb.search(
    query="transformer architecture",
    user_id="user123",
    keyword_search=True,  # Better recall
    filter_memories=True  # Better precision
)
# Filter by metadata
results = kb.search(
    query="implementation details",
    user_id="user123",
    filters={
        "category": "technical",
        "year": {"$gte": 2023}
    }
)

Memory Integration

When used with agents, knowledge automatically integrates with memory:
agent = Agent(
    name="Research Assistant",
    knowledge={
        "sources": ["papers/"],
        "vector_store": {
            "provider": "chroma",
            "config": {"collection_name": "research_docs"}
        }
    },
    memory=True  # Enable memory integration
)

# Knowledge is automatically searched during conversations
response = agent.start("What does the research say about transformers?")

Graph Store Features

Graph stores add relationship extraction and connection queries on top of semantic search.

Configuration

knowledge_config = {
    "graph_store": {
        "provider": "neo4j",  # or "memgraph"
        "config": {
            "url": "bolt://localhost:7687",
            "username": "neo4j",
            "password": "password"
        }
    },
    "extract_relationships": True
}

Relationship Queries

# Find related concepts
results = kb.search_graph(
    "What concepts are related to transformers?",
    user_id="user123"
)

# Explore connections
results = kb.search_graph(
    "How is attention mechanism connected to BERT?",
    user_id="user123"
)

Best Practices

Use smaller chunks (100-200 tokens) for precise fact retrieval. Use larger chunks (500-1000 tokens) when answers need more context. Semantic chunking works best for research papers and long-form documents.
Use a different collection_name per knowledge domain (e.g., product_docs, legal_contracts). This prevents cross-contamination and allows targeted filtering by domain.
Add metadata when indexing documents to enable filters= in searches. Filter by category, year, or author to narrow results without changing query text.
Set rerank=True in kb.search() when you need top-quality results. Reranking retrieves more candidates then scores them for relevance — best for Q&A and research assistants.

Example: Research Assistant

from praisonaiagents import Agent
from praisonaiagents import Knowledge

# Configure knowledge base
knowledge_config = {
    "vector_store": {
        "provider": "chroma",
        "config": {
            "collection_name": "research_papers",
            "path": "./knowledge_db"
        }
    },
    "chunker": {
        "name": "semantic",
        "threshold": 0.7
    },
    "embedder": {
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    },
    "reranker": {
        "enabled": True
    }
}

# Create research assistant
research_agent = Agent(
    name="Research Assistant",
    instructions="""You are an expert research assistant.
    Use the knowledge base to provide accurate, well-sourced answers.
    Always cite the specific documents you reference.""",
    knowledge={
        "sources": ["research_papers"],
        **knowledge_config
    }
)

# Use the assistant
response = research_agent.start(
    "What are the main approaches to AI alignment?"
)

# Direct knowledge queries
kb = research_agent.knowledge
papers = kb.search("alignment techniques", limit=5)
for paper in papers:
    print(f"- {paper['text'][:100]}...")
    print(f"  Source: {paper.get('metadata', {}).get('source')}")

RAG

Build retrieval-augmented generation pipelines

Vector Store

Store and query embeddings with a pluggable, namespace-aware backend