Haystack 2 compose des composants dont les entrées et sorties sont vérifiées lors de la connexion. Nous séparons indexation et requête pour pouvoir les exécuter et les tester indépendamment.
Installer
~~~bash pip install -U haystack-ai sentence-transformers ~~~
Indexer les documents
~~~python from haystack import Document from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.embedders import SentenceTransformersDocumentEmbedder
store = InMemoryDocumentStore(embedding_similarity_function='cosine') documents = [ Document(content='Paris est la capitale de la France.', meta={'source':'geo.md'}), Document(content='Lyon est située au confluent du Rhône et de la Saône.', meta={'source':'geo.md'}), ] embedder = SentenceTransformersDocumentEmbedder( model='sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2' ) embedder.warm_up() embedded = embedder.run(documents=documents)['documents'] store.write_documents(embedded) ~~~
Construire la requête
~~~python from haystack import Pipeline from haystack.components.embedders import SentenceTransformersTextEmbedder from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
pipe = Pipeline() pipe.add_component('embedder', SentenceTransformersTextEmbedder( model='sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')) pipe.add_component('retriever', InMemoryEmbeddingRetriever(document_store=store)) pipe.connect('embedder.embedding', 'retriever.query_embedding')
result = pipe.run({'embedder': {'text': 'Quelle est la capitale française ?'}}) for doc in result['retriever']['documents']: print(doc.score, doc.content, doc.meta) ~~~
Utilisez exactement le même modèle d’embeddings pour documents et requêtes.
Ajouter prompt et générateur
Ajoutez PromptBuilder puis le Generator de votre fournisseur. Le template reçoit documents et question, demande une réponse limitée au contexte et impose les citations. Connectez retriever.documents à prompt_builder.documents, puis prompt_builder.prompt au générateur.
Évaluer
Testez d’abord le retrieval avec des sources attendues. Mesurez recall@k, puis fidélité et correction de la réponse. Une mauvaise source ne se répare pas avec un prompt plus long.
Production
Remplacez le store mémoire par une intégration persistante, versionnez le pipeline avec sa sérialisation et ajoutez filtres d’accès, observabilité et limites. Réindexez dans une nouvelle collection lors d’un changement de modèle.
FAQ
Pourquoi deux embedders ?
Ils traitent des objets différents, mais partagent les mêmes poids et espace vectoriel.
Peut-on visualiser le pipeline ?
Oui, Haystack peut produire une représentation du graphe utile pour vérifier les connexions.