The README feature list and the overview stopped at the analysis capability. Both examples and the app backend composed agents without the capabilities the documentation recommends alongside an evidence capability. custom_agent.py ran each input as an independent agent run, so it needed a state dict and a carried history before compaction could mean anything there: without state the evidence record is empty, and earlier evidence would reduce to receipts retaining nothing.
159 lines
7.3 KiB
Markdown
159 lines
7.3 KiB
Markdown
# Haiku RAG
|
|
|
|
[](https://github.com/ggozad/haiku.rag/actions/workflows/test.yml)
|
|
[](https://codecov.io/gh/ggozad/haiku.rag)
|
|
|
|
Agentic RAG built on [LanceDB](https://lancedb.com/), [Pydantic AI](https://ai.pydantic.dev/), and [Docling](https://docling-project.github.io/docling/).
|
|
|
|
> **New: vision and multimodal search.** Picture-aware ingestion captures embedded figure bytes; vision-capable QA models receive them alongside text. Multimodal embedders put picture vectors in the same space as text, enabling text-as-query → figure hits and image-as-query retrieval.
|
|
|
|
## Features
|
|
|
|
- **Hybrid search** — Vector + full-text with Reciprocal Rank Fusion
|
|
- **Multimodal & cross-modal search** — Multimodal embedders (vLLM, VoyageAI, Cohere) put picture vectors in the same space as text; supports text-as-query → figure hits and image-as-query
|
|
- **Question answering** — RAG capability with citations (page numbers, section headings)
|
|
- **Vision QA** — Vision-capable models receive figure bytes alongside chunk text; attach your own images to questions in `ask`, `analyze`, MCP, and the chat TUI
|
|
- **Reranking** — local cross-encoders, Cohere, Zero Entropy, or vLLM
|
|
- **Analysis capability** — Complex analytical tasks via sandboxed Python code execution (aggregation, computation, multi-document analysis)
|
|
- **Evidence compaction** — Optional capability that replaces earlier questions' search results on the request with the evidence they cited, so long conversations stop resending everything they retrieved
|
|
- **Citation policy** — Optional capability that requires every answer to declare what grounds it, including declaring that nothing does
|
|
- **Conversational RAG** — Chat TUI and web application for multi-turn conversations with session memory
|
|
- **Document structure** — Stores full [DoclingDocument](https://docling-project.github.io/docling/concepts/docling_document/), enabling structure-aware context expansion
|
|
- **Multiple providers** — Embeddings: Ollama, OpenAI, VoyageAI, Cohere, LM Studio, vLLM (multimodal via `multimodal: true` on vLLM/VoyageAI/Cohere). QA: any model supported by Pydantic AI
|
|
- **Local-first** — Embedded LanceDB, no servers required. Also supports S3, GCS, Azure, and LanceDB Cloud
|
|
- **CLI & Python API** — Full functionality from command line or code
|
|
- **MCP server** — Expose as tools for AI assistants (Claude Desktop, etc.)
|
|
- **Visual grounding** — View chunks highlighted on original page images
|
|
- **Production ingester** — Long-lived `haiku-ingester` service with persistent SQLite queue, async worker pool with retries and a dead-letter queue, FS / HTTP / S3 / WebDAV source adapters, FastAPI control plane, and a browser dashboard for operators. See [docs/ingester.md](docs/ingester.md).
|
|
- **Tags** — Name database states with `haiku-rag tag` and roll back to them
|
|
- **Inspector** — TUI for browsing documents, chunks, and search results
|
|
|
|
## Installation
|
|
|
|
**Python 3.12 or newer required**
|
|
|
|
### Full Package (Recommended)
|
|
|
|
```bash
|
|
pip install haiku.rag
|
|
```
|
|
|
|
Includes all features: document processing, all embedding providers, and rerankers.
|
|
|
|
Using [uv](https://docs.astral.sh/uv/)? `uv pip install haiku.rag`
|
|
|
|
### Slim Package (Minimal Dependencies)
|
|
|
|
```bash
|
|
pip install haiku.rag-slim
|
|
```
|
|
|
|
Install only the extras you need. See the [Installation](https://ggozad.github.io/haiku.rag/installation/) documentation for available options.
|
|
|
|
## Quick Start
|
|
|
|
> **Note**: Requires an embedding provider (Ollama, OpenAI, etc.). See the [Tutorial](https://ggozad.github.io/haiku.rag/tutorial/) for setup instructions.
|
|
|
|
```bash
|
|
# Index a PDF
|
|
haiku-rag add-src paper.pdf
|
|
|
|
# Search
|
|
haiku-rag search "attention mechanism"
|
|
|
|
# Ask questions with citations
|
|
haiku-rag ask "What datasets were used for evaluation?"
|
|
|
|
# Ask about an image (vision-capable model)
|
|
haiku-rag ask "Does this figure match the spec in the design doc?" --image figure.png
|
|
|
|
# Analyze — complex analytical tasks via code execution
|
|
haiku-rag analyze "How many documents mention transformers?"
|
|
|
|
# Interactive chat — multi-turn conversations with memory
|
|
haiku-rag chat
|
|
|
|
# Continuously ingest from configured sources (FS, HTTP, S3, WebDAV)
|
|
haiku-ingester serve
|
|
```
|
|
|
|
See [Configuration](https://ggozad.github.io/haiku.rag/configuration/) for customization options.
|
|
|
|
## Python API
|
|
|
|
```python
|
|
from haiku.rag.client import HaikuRAG
|
|
|
|
async with HaikuRAG("knowledge.lancedb", create=True) as rag:
|
|
# Index documents
|
|
await rag.create_document_from_source("paper.pdf")
|
|
await rag.create_document_from_source("https://arxiv.org/pdf/1706.03762")
|
|
|
|
# Search — returns chunks with provenance
|
|
results = await rag.search("self-attention")
|
|
for result in results:
|
|
print(f"{result.score:.2f} | p.{result.page_numbers} | {result.content[:100]}")
|
|
|
|
# QA with citations
|
|
answer, citations = await rag.ask("What is the complexity of self-attention?")
|
|
print(answer)
|
|
for cite in citations:
|
|
print(f" [{cite.chunk_id}] p.{cite.page_numbers}: {cite.content[:80]}")
|
|
```
|
|
|
|
For direct agent composition, see the [capabilities documentation](https://ggozad.github.io/haiku.rag/capabilities/).
|
|
|
|
## MCP Server
|
|
|
|
Use with AI assistants like Claude Desktop:
|
|
|
|
```bash
|
|
haiku-rag mcp --stdio
|
|
```
|
|
|
|
Add to your Claude Desktop configuration:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"haiku-rag": {
|
|
"command": "haiku-rag",
|
|
"args": ["mcp", "--stdio"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Provides tools for document management, search, QA, and analysis directly in your AI assistant.
|
|
|
|
## Examples
|
|
|
|
See the [examples directory](examples/) for working examples:
|
|
|
|
- **[Docker Setup](examples/docker/)** - Complete Docker deployment with continuous ingestion (`haiku-ingester`) and MCP server
|
|
- **[Web Application](app/)** - Full-stack conversational RAG with CopilotKit frontend
|
|
|
|
## Documentation
|
|
|
|
Full documentation at: https://ggozad.github.io/haiku.rag/
|
|
|
|
- [Quickstart](https://ggozad.github.io/haiku.rag/tutorial/) - Provider setup and first ingestion
|
|
- [Installation](https://ggozad.github.io/haiku.rag/installation/) - Packages and extras
|
|
- [Configuration](https://ggozad.github.io/haiku.rag/configuration/) - YAML reference
|
|
- [CLI](https://ggozad.github.io/haiku.rag/cli/) - Command reference
|
|
- [Python API](https://ggozad.github.io/haiku.rag/python/) - Complete API docs
|
|
- [Capabilities](https://ggozad.github.io/haiku.rag/capabilities/) - Native Pydantic AI RAG and analysis capabilities
|
|
- [Tuning](https://ggozad.github.io/haiku.rag/tuning/) - Retrieval and answer-quality tuning
|
|
- [Ingester](https://ggozad.github.io/haiku.rag/ingester/) - Production ingester for continuous indexing from FS, HTTP, S3, and WebDAV
|
|
- [MCP](https://ggozad.github.io/haiku.rag/mcp/) - Model Context Protocol integration
|
|
- [Remote processing](https://ggozad.github.io/haiku.rag/remote-processing/) - Offload conversion to docling-serve
|
|
- [Applications](https://ggozad.github.io/haiku.rag/apps/) - Chat TUI, web app, and inspector
|
|
- [Benchmarks](https://ggozad.github.io/haiku.rag/benchmarks/) - Performance benchmarks
|
|
- [Changelog](https://ggozad.github.io/haiku.rag/changelog/) - Version history
|
|
|
|
## License
|
|
|
|
This project is licensed under the [MIT License](LICENSE).
|
|
|
|
<!-- mcp-name is used by the MCP registry to identify this server -->
|
|
mcp-name: io.github.ggozad/haiku-rag
|