Get Started
Have a look at this page to learn how to quickly get up and running with Haystack. It contains instructions for installing, building a basic pipeline, preparing your files, and running a search.
Quick Installation via Pip
To install Haystack via Pip, run:
pip install farm-haystack
Installation
For a complete guide on how to install Haystack, see Installation.
Demo
You can effortlessly try out a running Haystack system by going to our hosted Explore the World demo.
The Building Blocks of Haystack
Here’s a sample of Haystack code showing a question-answering also system using a Retriever and a Reader. For a working code example, check out our starter tutorial.
# DocumentStore: holds all your data
document_store = ElasticsearchDocumentStore()
# Clean & load your documents into the DocumentStore
dicts = convert_files_to_dicts(doc_dir, clean_func=clean_wiki_text)
document_store.write_documents(dicts)
# Retriever: A Fast and simple algo to identify the most promising candidate documents
retriever = BM25Retriever(document_store)
# Reader: Powerful but slower neural network trained for QA
model_name = "deepset/roberta-base-squad2"
reader = FARMReader(model_name)
# Pipeline: Combines all the components
pipe = ExtractiveQAPipeline(reader, retriever)
# Voilà! Ask a question!
question = "Who is the father of Sansa Stark?"
prediction = pipe.run(query=question)
print_answers(prediction)
Loading Documents into the DocumentStore
In Haystack, DocumentStores expect Documents in a dictionary format. They are loaded as follows:
document_store = ElasticsearchDocumentStore()
dicts = [
{
'content': DOCUMENT_TEXT_HERE,
'meta': {'name': DOCUMENT_NAME, ...}
}, ...
]
document_store.write_documents(dicts)
When we talk about Documents in Haystack, we are referring specifically to the individual blocks of text held in the DocumentStore. You might want to use all the text in one file as a Document or split it into multiple Documents. This splitting can have a significant impact on speed and performance.
Tip
If Haystack runs very slowly, you might want to try splitting your text into smaller Documents. If you want to improve performance, you might want to try concatenating text to make more significant Documents. See Optimization for more details.
Running Search Queries
There are many different flavors of search that can be created using Haystack. But to give just one example of what can be achieved, let's look more closely at an open domain question answering (ODQA) Pipeline.
Querying in an ODQA system involves searching for an answer to a given question within the entire document store. This process will:
- Make the Retriever filter for a small set of relevant candidate documents.
- Get the Reader to process this set of candidate documents.
- Return potential answers to the given question.
Usually, there are tight time constraints on querying, so it needs to be a lightweight operation. When documents are loaded, Haystack will precompute any .results that might be useful at query time.
In Haystack, querying is performed with a Pipeline
object which connects the Reader to the Retriever.
# Pipeline: Combines all the components
pipe = ExtractiveQAPipeline(reader, retriever)
# Voilà! Ask a question!
question = "Who is the father of Sansa Stark?"
prediction = pipe.run(query=question)
print_answers(prediction)
When the query is complete, you can expect to see results that look something like this:
[
{ 'answer': 'Eddard',
'context': 's Nymeria after a legendary warrior queen. She travels '
"with her father, Eddard, to King's Landing when he is made "
'Hand of the King. Before she leaves,'
}, ...
]
Custom Search Pipelines
Haystack provides many different building blocks for you to mix and match. They include:
- Readers
- Retrievers (sparse and dense)
- DocumentStores
- Summarizers
- Generators
- Translators
These can all be combined in the configuration that you want. Look at our Pipelines page to see what's possible!
Updated almost 2 years ago