From 33c26ed9e7c4746b439f68126a935700c2ec9018 Mon Sep 17 00:00:00 2001 From: Joan Fontanals Date: Tue, 12 Dec 2023 13:34:00 +0100 Subject: [PATCH] docs: add jina integration documentation (#82) --- integrations/jina.md | 65 +++++++++++++++++++++++++++++++++++++++++++ logos/jina.png | Bin 0 -> 29318 bytes 2 files changed, 65 insertions(+) create mode 100644 integrations/jina.md create mode 100644 logos/jina.png diff --git a/integrations/jina.md b/integrations/jina.md new file mode 100644 index 00000000..9822dacc --- /dev/null +++ b/integrations/jina.md @@ -0,0 +1,65 @@ +--- +layout: integration +name: Jina +description: Use Jina embedding models with Haystack +authors: + - name: deepset + socials: + github: deepset-ai + twitter: deepset_ai + linkedin: deepset-ai +pypi: https://pypi.org/project/jina-haystack/ +repo: https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/jina +type: Model Provider +report_issue: https://github.com/deepset-ai/haystack-core-integrations/issues +logo: /logos/jina.png +version: Haystack 2.0 +toc: true +--- + +### **Table of Contents** + +- [Haystack 2.0](#haystack-20) + - [Installation](#installation) + - [Usage](#usage) + +## Haystack 2.0 + +You can use [Jina embedding Models](https://jina.ai/embeddings) in your Haystack 2.0 pipelines with the Jina [Embedders](https://docs.haystack.deepset.ai/v2.0/docs/embedders). + +### Installation + +```bash +pip install jina-haystack +``` + +### Usage + +You can use Jina Embedding models with two components: [JinaTextEmbedder](https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/jina/src/jina_haystack/text_embedder.py) and [JinaDocumentEmbedder](https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/jina/src/jina_haystack/document_embedder.py). + +To create semantic embeddings for documents, use `JinaDocumentEmbedder` in your indexing pipeline. For generating embeddings for queries, use `JinaTextEmbedder`. Once you've selected the suitable component for your specific use case, initialize the component with the model name and Jina API key. You can also +set the environment variable JINA_API_KEY instead of passing the api key as an argument. + +Below is the example indexing pipeline with `InMemoryDocumentStore`, `JinaDocumentEmbedder` and `DocumentWriter`: + +```python +from haystack import Document, Pipeline +from haystack.document_stores import InMemoryDocumentStore +from haystack.components.writers import DocumentWriter +from jina_haystack import JinaDocumentEmbedder + +document_store = InMemoryDocumentStore(embedding_similarity_function="cosine") + +documents = [Document(content="I enjoy programming in Python"), + Document(content="My city does not get snow in winter"), + Document(content="Japanese diet is well known for being good for your health"), + Document(content="Thomas is injured and can't play sports")] + +indexing_pipeline = Pipeline() +indexing_pipeline.add_component("embedder", JinaDocumentEmbedder(api_key="JINA_API_KEY", model_name="jina-embeddings-v2-base-en")) +indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store)) +indexing_pipeline.connect("embedder", "writer") + +indexing_pipeline.run({"embedder": {"documents": documents}}) +``` + diff --git a/logos/jina.png b/logos/jina.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e0d228a6d4de6fa3fdce26bea7567c31414769 GIT binary patch literal 29318 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