ULC Lab · implementação reproduzível
Laboratório: Pipeline de Busca Semântica e QA com Haystack, Elasticsearch e FAISS
Você implementa um pipeline de busca semântica e perguntas e respostas usando Haystack, Elasticsearch e FAISS em ambiente local. Em cerca de 2 horas, terá um endpoint funcional para consultas em linguagem natural sobre documentos próprios.

- Duração estimada
- 120 min
- Passos
- 11
- Validações
- 4
- Versões da documentação consultada
- Haystack a versão estável atual · Elasticsearch 8.x · FAISS a versão estável atual · Docker a versão estável atual · Python 3.10 ou superior
O objetivo é construir um pipeline robusto de busca semântica e perguntas e respostas (QA) utilizando Haystack, com backend de armazenamento vetorial FAISS e Elasticsearch para indexação. Você vai entender como conectar todos os componentes, indexar documentos e testar respostas automáticas em linguagem natural, simulando um cenário corporativo real.
Topologia
O usuário acessa o pipeline Haystack via REST API (localhost:8000). O Haystack conecta-se ao Elasticsearch (localhost:9200) para indexação textual e ao FAISS (em disco local) para busca vetorial. Todos os serviços rodam em uma única máquina (exemplo: 192.168.56.10).
Usuário HTTP
|
v
Haystack API (localhost:8000)
|
+--+-------------+
| |
v v
Elasticsearch FAISS (local)
(localhost:9200) (em disco)
Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM ou PC | 2 vCPU, 4 GB RAM, 20 GB disco, porta 8000 e 9200 liberadas, Ubuntu 22.04 ou superior |
| Haystack | Apache 2.0 · a versão estável atual |
| Elasticsearch | Elastic License 2.0 (com partes Apache 2.0) · 8.x |
| FAISS | MIT · a versão estável atual |
| Docker | Apache 2.0 · a versão estável atual |
| Python | PSF · 3.10 ou superior |
Roteiro
- Preparar ambiente e dependências
Garanta um sistema limpo, atualizado e com Docker, Python 3.10+ e pip instalados. Isso evita conflitos e facilita o gerenciamento dos serviços.
sudo apt update && sudo apt install -y docker.io docker-compose python3 python3-pipO que você deve ver: Docker, Docker Compose e Python instalados sem erros.
- Subir Elasticsearch via Docker
Elasticsearch é necessário para indexação e busca textual. Usar Docker simplifica a instalação e isolamento.
docker run -d --name elasticsearch -e "discovery.type=single-node" -p 9200:9200 docker.elastic.co/elasticsearch/elasticsearch:8.13.4O que você deve ver: Container 'elasticsearch' rodando. Porta 9200 aberta.
- Testar Elasticsearch
Confirme que o Elasticsearch está acessível e pronto.
curl -X GET 'localhost:9200/'O que você deve ver: Resposta JSON com 'cluster_name' e 'tagline'.
- Instalar Haystack e FAISS
Haystack orquestra todo o pipeline. FAISS é o backend vetorial para busca semântica. Instale ambos no Python.
pip3 install farm-haystack[faiss]O que você deve ver: Pacotes instalados sem erros.
- Baixar modelo de embeddings
O modelo de embeddings converte texto em vetores. Usar um modelo aberto garante reprodutibilidade.
python3 -c "from haystack.utils import fetch_archive_from_http; fetch_archive_from_http(url='https://public.ukp.informatik.tu-darmstadt.de/reimers/sentence-transformers/v0.2/all-MiniLM-L6-v2.zip', output_dir='.')"O que você deve ver: Arquivo do modelo baixado e descompactado.
- Criar script de pipeline Haystack
Monte um pipeline simples com DocumentStore FAISS, Retriever e Reader. O script conecta ao Elasticsearch e FAISS.
cat > haystack_lab.py <<'EOF' from haystack.document_stores import FAISSDocumentStore from haystack.nodes import EmbeddingRetriever, FARMReader from haystack.pipelines import ExtractiveQAPipeline from haystack.utils import clean_wiki_text, convert_files_to_docs, fetch_archive_from_http doc_store = FAISSDocumentStore(faiss_index_factory_str="Flat", sql_url="sqlite:///faiss_lab.db") retriever = EmbeddingRetriever(document_store=doc_store, embedding_model="sentence-transformers/all-MiniLM-L6-v2") reader = FARMReader(model_name_or_path="deepset/roberta-base-squad2") pipeline = ExtractiveQAPipeline(reader, retriever) # Indexar documentos de exemplo docs = [{"content": "A rede de fibra dedicada da Upnetix cobre toda a zona industrial de Manaus."}, {"content": "Haystack permite implementar pipelines de perguntas e respostas com modelos abertos."}] doc_store.write_documents(docs) doc_store.update_embeddings(retriever) # Testar pipeline prediction = pipeline.run(query="Quem cobre a zona industrial de Manaus?", params={"Retriever": {"top_k": 2}, "Reader": {"top_k": 1}}) print(prediction) EOFO que você deve ver: Arquivo haystack_lab.py criado com pipeline funcional.
- Executar pipeline localmente
Rode o script para garantir que o pipeline está funcionando e retornando respostas.
python3 haystack_lab.pyO que você deve ver: Saída JSON com resposta à pergunta e contexto do documento.
- Subir API REST do Haystack
Haystack oferece API REST para integração. Use o comando oficial para expor o pipeline.
pip3 install uvicorn fastapi haystack server startO que você deve ver: Servidor iniciado em http://localhost:8000.
- Testar API REST com curl
Valide o endpoint enviando uma pergunta para o pipeline via HTTP.
curl -X POST 'http://localhost:8000/query' -H 'Content-Type: application/json' -d '{"query": "O que é Haystack?"}'O que você deve ver: Resposta JSON com resposta extraída dos documentos.
- Indexar novos documentos via API
Garanta que é possível adicionar documentos dinamicamente pelo endpoint.
curl -X POST 'http://localhost:8000/documents' -H 'Content-Type: application/json' -d '{"documents": [{"content": "FAISS é uma biblioteca eficiente para busca vetorial."}]}'O que você deve ver: Confirmação de indexação sem erro.
- Consultar novamente após indexação
Teste se o novo conteúdo é recuperado pelo pipeline.
curl -X POST 'http://localhost:8000/query' -H 'Content-Type: application/json' -d '{"query": "O que é FAISS?"}'O que você deve ver: Resposta contendo 'FAISS é uma biblioteca eficiente para busca vetorial.'
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Acesso ao Elasticsearch | curl -X GET 'localhost:9200/' | Resposta JSON com 'cluster_name' e 'tagline'. |
| Execução local do pipeline | python3 haystack_lab.py | Resposta JSON com campo 'answers' não vazio. |
| API REST funcional | curl -X POST 'http://localhost:8000/query' -H 'Content-Type: application/json' -d '{"query": "Quem cobre a zona industrial de Manaus?"}' | Resposta JSON com texto relevante. |
| Indexação dinâmica via API | curl -X POST 'http://localhost:8000/documents' -H 'Content-Type: application/json' -d '{"documents": [{"content": "FAISS é uma biblioteca eficiente para busca vetorial."}]}' | Confirmação de indexação e recuperação posterior. |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Erro de conexão ao Elasticsearch | Elasticsearch não está rodando ou porta 9200 bloqueada | Verifique status do container e firewall. Use 'docker ps' e 'sudo ufw status'. |
| Erro ao instalar farm-haystack[faiss] | Dependências de compilação ausentes | Instale build-essential e tente novamente: 'sudo apt install build-essential' |
| API REST não inicia | Porta 8000 já em uso ou dependências faltando | Libere a porta ou instale dependências: 'pip3 install fastapi uvicorn' |
| Respostas vazias no pipeline | Documentos não indexados ou embeddings não atualizados | Reindexe documentos e execute 'doc_store.update_embeddings(retriever)' |
Segurança e hardening
- Nunca exponha Elasticsearch ou API Haystack sem autenticação em redes públicas.
- Utilize firewall para restringir acesso às portas 9200 e 8000.
- Remova documentos sensíveis após testes.
- Atualize todos os componentes antes de uso produtivo.
Checklist final
Referências
- FAISS Documentation · Faiss.ai (faiss.ai)
- Publicado
- 09/09/2026
- Última revisão
- 09/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 1 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
