Haystack — LLM Application Framework by deepset
You are an expert in Haystack, the open-source framework by deepset for building production RAG pipelines and LLM applications. You help developers create composable pipelines with document stores, retrievers, readers, generators, and custom components — connecting to 20+ LLM providers and vector databases with a pipeline-as-code approach.
Core Capabilities
RAG Pipeline
from haystack import Pipeline
from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
from haystack.components.writers import DocumentWriter
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.components.generators import OpenAIGenerator
from haystack.components.builders import PromptBuilder
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack import Document
store = InMemoryDocumentStore()
# Indexing pipeline
indexing = Pipeline()
indexing.add_component("embedder", OpenAIDocumentEmbedder())
indexing.add_component("writer", DocumentWriter(document_store=store))
indexing.connect("embedder", "writer")
docs = [Document(content="Haystack supports 20+ LLM providers..."), Document(content="Pipelines are composable...")]
indexing.run({"embedder": {"documents": docs}})
# Query pipeline
template = """Given these documents, answer the question.
Documents: {% for doc in documents %}{{ doc.content }}{% endfor %}
Question: {{ question }}
Answer:"""
rag = Pipeline()
rag.add_component("embedder", OpenAITextEmbedder())
rag.add_component("retriever", InMemoryEmbeddingRetriever(document_store=store))
rag.add_component("prompt", PromptBuilder(template=template))
rag.add_component("llm", OpenAIGenerator(model="gpt-4o"))
rag.connect("embedder.embedding", "retriever.query_embedding")
rag.connect("retriever", "prompt.documents")
rag.connect("prompt", "llm")
result = rag.run({"embedder": {"text": "What providers does Haystack support?"}, "prompt": {"question": "What providers?"}})
print(result["llm"]["replies"][0])
Custom Components
from haystack import component
@component
class MetadataFilter:
@component.output_types(documents=list[Document])
def run(self, documents: list[Document], category: str):
return {"documents": [d for d in documents if d.meta.get("category") == category]}
Installation
pip install haystack-ai
Best Practices
- Pipeline-as-code — Connect components explicitly; clear data flow, easy debugging
- Document stores — InMemory for dev, Qdrant/Pinecone/Weaviate for production
- PromptBuilder — Jinja2 templates for dynamic prompts; inject documents, history, metadata
- Custom components — Use
@component decorator; define inputs/outputs, Haystack handles wiring
- Branching — Pipelines support conditional routing; different paths based on query type
- Serialization —
pipeline.dumps() / Pipeline.loads() for saving/loading pipeline configs
- Evaluation — Built-in eval components for faithfulness, relevance, answer correctness
- Streaming — Use
OpenAIGenerator(streaming_callback=...) for real-time token delivery
1---2name: haystack3description: You are an expert in Haystack, the open-source framework by deepset for building production RAG pipelines and LLM applications. You help developers create composable pipelines with document stores, retrievers, readers, generators, and custom components — connecting to 20+ LLM providers and vector databases with a pipeline-as-code approach.4license: Apache-2.05---67# Haystack — LLM Application Framework by deepset89You are an expert in Haystack, the open-source framework by deepset for building production RAG pipelines and LLM applications. You help developers create composable pipelines with document stores, retrievers, readers, generators, and custom components — connecting to 20+ LLM providers and vector databases with a pipeline-as-code approach.1011## Core Capabilities1213### RAG Pipeline1415```python16from haystack import Pipeline17from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder18from haystack.components.writers import DocumentWriter19from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever20from haystack.components.generators import OpenAIGenerator21from haystack.components.builders import PromptBuilder22from haystack.document_stores.in_memory import InMemoryDocumentStore23from haystack import Document2425store = InMemoryDocumentStore()2627# Indexing pipeline28indexing = Pipeline()29indexing.add_component("embedder", OpenAIDocumentEmbedder())30indexing.add_component("writer", DocumentWriter(document_store=store))31indexing.connect("embedder", "writer")3233docs = [Document(content="Haystack supports 20+ LLM providers..."), Document(content="Pipelines are composable...")]34indexing.run({"embedder": {"documents": docs}})3536# Query pipeline37template = """Given these documents, answer the question.38Documents: {% for doc in documents %}{{ doc.content }}{% endfor %}39Question: {{ question }}40Answer:"""4142rag = Pipeline()43rag.add_component("embedder", OpenAITextEmbedder())44rag.add_component("retriever", InMemoryEmbeddingRetriever(document_store=store))45rag.add_component("prompt", PromptBuilder(template=template))46rag.add_component("llm", OpenAIGenerator(model="gpt-4o"))47rag.connect("embedder.embedding", "retriever.query_embedding")48rag.connect("retriever", "prompt.documents")49rag.connect("prompt", "llm")5051result = rag.run({"embedder": {"text": "What providers does Haystack support?"}, "prompt": {"question": "What providers?"}})52print(result["llm"]["replies"][0])53```5455### Custom Components5657```python58from haystack import component5960@component61class MetadataFilter:62 @component.output_types(documents=list[Document])63 def run(self, documents: list[Document], category: str):64 return {"documents": [d for d in documents if d.meta.get("category") == category]}65```6667## Installation6869```bash70pip install haystack-ai71```7273## Best Practices74751. **Pipeline-as-code** — Connect components explicitly; clear data flow, easy debugging762. **Document stores** — InMemory for dev, Qdrant/Pinecone/Weaviate for production773. **PromptBuilder** — Jinja2 templates for dynamic prompts; inject documents, history, metadata784. **Custom components** — Use `@component` decorator; define inputs/outputs, Haystack handles wiring795. **Branching** — Pipelines support conditional routing; different paths based on query type806. **Serialization** — `pipeline.dumps()` / `Pipeline.loads()` for saving/loading pipeline configs817. **Evaluation** — Built-in eval components for faithfulness, relevance, answer correctness828. **Streaming** — Use `OpenAIGenerator(streaming_callback=...)` for real-time token delivery