From 43ddfae5de732e2271fdbb0415500639446bb685 Mon Sep 17 00:00:00 2001 From: owaiskazi19 Date: Tue, 2 Apr 2024 18:31:00 +0000 Subject: [PATCH 1/9] Added blogpost for Flow Framework Signed-off-by: owaiskazi19 --- _community_members/amitgalitz.md | 2 +- _community_members/jpalis.md | 23 ++++ ...-Automation-for-OpenSearch-ML-Use-Cases.md | 129 ++++++++++++++++++ assets/media/community/members/jpalis.jpg | Bin 0 -> 27142 bytes 4 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 _community_members/jpalis.md create mode 100644 _posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md create mode 100644 assets/media/community/members/jpalis.jpg diff --git a/_community_members/amitgalitz.md b/_community_members/amitgalitz.md index 6748ea7114..5aa829a492 100644 --- a/_community_members/amitgalitz.md +++ b/_community_members/amitgalitz.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/amit-galitzky.html' --- -**Amit Galitzky** is a software engineer at Amazon Web Services. He focuses mostly on the Anomaly Detection plugin for OpenSearch. \ No newline at end of file +**Amit Galitzky** is a software engineer at Amazon Web Services. He focuses mostly on the Anomaly Detection and Flow Framework plugins for OpenSearch. \ No newline at end of file diff --git a/_community_members/jpalis.md b/_community_members/jpalis.md new file mode 100644 index 0000000000..a32143e74f --- /dev/null +++ b/_community_members/jpalis.md @@ -0,0 +1,23 @@ +--- +name: Josh Palis +short_name: jpalis +photo: '/assets/media/community/members/jpalis.jpg' +title: 'OpenSearch Community Member: Josh Palis' +primary_title: Josh Palis +breadcrumbs: + icon: community + items: + - title: Community + url: /community/index.html + - title: Members + url: /community/members/index.html + - title: 'Josh Palis's Profile' + url: '/community/members/josh-palis.html' +github: joshpalis +job_title_and_company: 'Software engineer at Amazon Web Services' +personas: + - author +permalink: '/community/members/josh-palis.html' +--- + +**Josh Palis** is a software engineer at Amazon Web Services. He focuses mostly on the Flow Framework plugin for OpenSearch. \ No newline at end of file diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md new file mode 100644 index 0000000000..a0554a9544 --- /dev/null +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -0,0 +1,129 @@ +--- +layout: post +title: "Configurable Automation for OpenSearch ML Use Cases" +authors: + - kazabdu + - amitgalitz + - dwiddis + - jpalis +date: 2024-04-05 +categories: + - technical-posts +meta_keywords: Flow Framework, OpenSearch plugins, Machine Learning +meta_description: Explore the simplicity of integrating Machine Learning capabilities within OpenSearch through an innovative and groundbreaking framework designed to simplify complex setup tasks. +--- + +The current process of utilizing ML offerings in OpenSearch, such as Semantic Search, Hybrid Search, and Multimodal Search, often involves users grappling with complex setup and preprocessing tasks. Additionally, users must contend with verbose user queries, both of which can consume time and introduce errors. + +In this blog post, we introduce the OpenSearch Flow Framework plugin, released in version 2.13, designed to streamline this cumbersome process. By leveraging this plugin, users can simplify complex setups with just one click. Automated templates are provided, enabling users to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the need for users to navigate the complexities of calling multiple APIs and waiting for their responses. + +## Before Flow Framework + +Traditionally, setting up Semantic Search involved the following steps as outlined [here](https://opensearch.org/docs/latest/search-plugins/semantic-search/): + +a) Create a connector for a remote model with pre and post functions. +b) Register an embedding model using the connectorID obtained from the previous step. +c) Configure an ingest pipeline to generate vector embeddings using the modelID of the registered model. +d) Create a k-NN index and add the pipeline created above. + +The aforementioned complex setup would typically demand users to acquire familiarity with the ML-Commons APIs of OpenSearch. However, we are simplifying this experience through the Flow Framework. Allow us to demonstrate this using the same example mentioned above, but this time leveraging the capabilities of the Flow Framework. + +## With Flow Framework + +In this example, we will configure the `semantic_search_with_cohere_embedding_query_enricher` workflow template. The workflow created using this template performs the following configuration steps: + +* Deploys an externally hosted Cohere model +* Creates an ingest pipeline using the model +* Creates a sample k-NN index and configures a search pipeline to define the default model ID for that index + +### Step 1: Create and Provision the workflow + +Using the `semantic_search_with_cohere_embedding_query_enricher` workflow template, we provision the workflow with just one required field - the API key for the Cohere Embed model. + +``` +POST /_plugins/_flow_framework/workflow?use_case=semantic_search_with_cohere_embedding_query_enricher&provision=true +{ + "create_connector.credential.key" : "" +} +``` + +OpenSearch responds with a unique workflow ID, simplifying the tracking and management of the setup process: + +``` +{ + "workflow_id" : "8xL8bowB8y25Tqfenm50" +} +``` + +Note: The workflow in the previous step creates a default k-NN index. The default index name is `my-nlp-index`: + +``` +{ + "create_index.name": "my-nlp-index" +} +``` + + +However, these defaults can be customized according to the values provided in the request body. For a comprehensive list of default parameter values for this workflow template, see [Cohere Embed semantic search defaults](https://github.com/opensearch-project/flow-framework/blob/2.13/src/main/resources/defaults/cohere-embedding-semantic-search-defaults.json). + +### Step 2: Ingest documents into the index + +Once the workflow is provisioned, documents can be ingested into the index created by the workflow: + +``` +PUT /my-nlp-index/_doc/1 +{ + "passage_text": "Hello world", + "id": "s1" +} +``` + +### Step 3: Perform vector search + +Performing a vector search on the index is equally straightforward. Using a neural query clause, users can easily retrieve relevant results. + +``` +GET /my-nlp-index/_search +{ + "_source": { + "excludes": [ + "passage_embedding" + ] + }, + "query": { + "neural": { + "passage_embedding": { + "query_text": "Hi world", + "k": 100 + } + } + } +} +``` + +With Flow Framework, we've simplified such complex setup process, enabling users to focus on their tasks without the burden of navigating complex APIs. Our goal is to empower users to leverage the power of OpenSearch seamlessly, unlocking new possibilities in their projects + +## Viewing workflow resources + +The workflow you created provisioned all the necessary resources for semantic search. To view the provisioned resources, call the Get Workflow Status API and provide the `workflowID` for your workflow: + +``` +GET /_plugins/_flow_framework/workflow/8xL8bowB8y25Tqfenm50/_status +``` + +## Additional Default Use Cases + +Explore more default use cases at [here](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/substitutionTemplates), with their corresponding defaults stored [here](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/defaults). + +## Creating Custom Use Cases + +Tailor templates according to your requirements. Sample templates are available [here](https://github.com/opensearch-project/flow-framework/tree/main/sample-templates), and refer to our documentation [here](https://opensearch.org/docs/latest/automating-configurations/index/) for further guidance. + +## Next Steps + +In our ongoing efforts to enhance user experience and streamline the process of provisioning the ML offerings of OpenSearch, we have an exciting plan in the pipeline. We aim to develop a user-friendly drag-and-drop frontend interface. This interface will simplify complex steps involved in provisioning ML capabilities, thereby allowing users to seamlessly configure and deploy their workflows with ease. Stay tuned for updates on this exciting development! +If you have any comments or suggestions please comment on the RFCs: + +1. Backend: https://github.com/opensearch-project/OpenSearch/issues/9213 +2. Frontend: https://github.com/opensearch-project/OpenSearch-Dashboards/issues/4755 +3. Github Repository: https://github.com/opensearch-project/flow-framework and https://github.com/opensearch-project/dashboards-flow-framework diff --git a/assets/media/community/members/jpalis.jpg b/assets/media/community/members/jpalis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28d0cb055d4848944259f3f4c1984b0c1baf5cc1 GIT binary patch literal 27142 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 Date: Wed, 3 Apr 2024 11:54:47 -0400 Subject: [PATCH 2/9] Blog rewrites Signed-off-by: Fanit Kolchina --- ...-Automation-for-OpenSearch-ML-Use-Cases.md | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index a0554a9544..8e7107ba57 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -1,6 +1,6 @@ --- layout: post -title: "Configurable Automation for OpenSearch ML Use Cases" +title: "Configurable automation for OpenSearch ML use cases" authors: - kazabdu - amitgalitz @@ -13,34 +13,34 @@ meta_keywords: Flow Framework, OpenSearch plugins, Machine Learning meta_description: Explore the simplicity of integrating Machine Learning capabilities within OpenSearch through an innovative and groundbreaking framework designed to simplify complex setup tasks. --- -The current process of utilizing ML offerings in OpenSearch, such as Semantic Search, Hybrid Search, and Multimodal Search, often involves users grappling with complex setup and preprocessing tasks. Additionally, users must contend with verbose user queries, both of which can consume time and introduce errors. +In OpenSearch, to use ML offerings, such as semantic, hybrid, and multimodal search, you often have to grapple with complex setup and preprocessing tasks. Additionally, you must write verbose queries, which can be time-consuming and error-prone. -In this blog post, we introduce the OpenSearch Flow Framework plugin, released in version 2.13, designed to streamline this cumbersome process. By leveraging this plugin, users can simplify complex setups with just one click. Automated templates are provided, enabling users to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the need for users to navigate the complexities of calling multiple APIs and waiting for their responses. +In this blog post, we introduce the OpenSearch Flow Framework plugin, released in version 2.13, designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one click. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. ## Before Flow Framework -Traditionally, setting up Semantic Search involved the following steps as outlined [here](https://opensearch.org/docs/latest/search-plugins/semantic-search/): +In the past, setting up semantic search involved the steps outlined in the [Semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): -a) Create a connector for a remote model with pre and post functions. -b) Register an embedding model using the connectorID obtained from the previous step. -c) Configure an ingest pipeline to generate vector embeddings using the modelID of the registered model. -d) Create a k-NN index and add the pipeline created above. +1. Create a connector for a remote model, specifying pre- and post-processing functions. +1. Register an embedding model using the connector ID obtained from the previous step. +1. Configure an ingest pipeline to generate vector embeddings using the model ID of the registered model. +1. Create a k-NN index and add the pipeline created in the previous step. -The aforementioned complex setup would typically demand users to acquire familiarity with the ML-Commons APIs of OpenSearch. However, we are simplifying this experience through the Flow Framework. Allow us to demonstrate this using the same example mentioned above, but this time leveraging the capabilities of the Flow Framework. +This complex setup typically required you to be familiar with the OpenSearch ML Commons APIs. However, we are simplifying this experience through the Flow Framework. Let's demonstrate how the Flow Framework simplifies this process using the preceding semantic search example. ## With Flow Framework -In this example, we will configure the `semantic_search_with_cohere_embedding_query_enricher` workflow template. The workflow created using this template performs the following configuration steps: +In this example, you will configure the `semantic_search_with_cohere_embedding_query_enricher` workflow template. The workflow created using this template performs the following configuration steps: * Deploys an externally hosted Cohere model * Creates an ingest pipeline using the model * Creates a sample k-NN index and configures a search pipeline to define the default model ID for that index -### Step 1: Create and Provision the workflow +### Step 1: Create and provision the workflow -Using the `semantic_search_with_cohere_embedding_query_enricher` workflow template, we provision the workflow with just one required field - the API key for the Cohere Embed model. +Using the `semantic_search_with_cohere_embedding_query_enricher` workflow template, you provision the workflow with just one required field---the API key for the Cohere Embed model: -``` +```json POST /_plugins/_flow_framework/workflow?use_case=semantic_search_with_cohere_embedding_query_enricher&provision=true { "create_connector.credential.key" : "" @@ -49,7 +49,7 @@ POST /_plugins/_flow_framework/workflow?use_case=semantic_search_with_cohere_emb OpenSearch responds with a unique workflow ID, simplifying the tracking and management of the setup process: -``` +```json { "workflow_id" : "8xL8bowB8y25Tqfenm50" } @@ -57,20 +57,19 @@ OpenSearch responds with a unique workflow ID, simplifying the tracking and mana Note: The workflow in the previous step creates a default k-NN index. The default index name is `my-nlp-index`: -``` +```json { "create_index.name": "my-nlp-index" } ``` - -However, these defaults can be customized according to the values provided in the request body. For a comprehensive list of default parameter values for this workflow template, see [Cohere Embed semantic search defaults](https://github.com/opensearch-project/flow-framework/blob/2.13/src/main/resources/defaults/cohere-embedding-semantic-search-defaults.json). +You can customize the template default values by providing the new values in the request body. For a comprehensive list of default parameter values for this workflow template, see [Cohere Embed semantic search defaults](https://github.com/opensearch-project/flow-framework/blob/2.13/src/main/resources/defaults/cohere-embedding-semantic-search-defaults.json). ### Step 2: Ingest documents into the index -Once the workflow is provisioned, documents can be ingested into the index created by the workflow: +Once the workflow is provisioned, you can ingest documents into the index created by the workflow: -``` +```json PUT /my-nlp-index/_doc/1 { "passage_text": "Hello world", @@ -80,9 +79,9 @@ PUT /my-nlp-index/_doc/1 ### Step 3: Perform vector search -Performing a vector search on the index is equally straightforward. Using a neural query clause, users can easily retrieve relevant results. +Performing a vector search on the index is equally straightforward. Using a neural query clause, you can easily retrieve relevant results: -``` +```json GET /my-nlp-index/_search { "_source": { @@ -101,7 +100,7 @@ GET /my-nlp-index/_search } ``` -With Flow Framework, we've simplified such complex setup process, enabling users to focus on their tasks without the burden of navigating complex APIs. Our goal is to empower users to leverage the power of OpenSearch seamlessly, unlocking new possibilities in their projects +With Flow Framework, we've simplified this complex setup process, enabling you to focus on your tasks without the burden of navigating complex APIs. Our goal is for you to use OpenSearch seamlessly, unlocking new possibilities in your projects. ## Viewing workflow resources @@ -111,19 +110,21 @@ The workflow you created provisioned all the necessary resources for semantic se GET /_plugins/_flow_framework/workflow/8xL8bowB8y25Tqfenm50/_status ``` -## Additional Default Use Cases +## Additional default use cases + +You can explore more default use cases by viewing [substitution templates](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/substitutionTemplates) with their corresponding [defaults](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/defaults). -Explore more default use cases at [here](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/substitutionTemplates), with their corresponding defaults stored [here](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/defaults). +## Creating custom use cases -## Creating Custom Use Cases +You can tailor templates according to your requirements. For more information, see [sample templates](https://github.com/opensearch-project/flow-framework/tree/main/sample-templates) and the [documentation](https://opensearch.org/docs/latest/automating-configurations/index/). -Tailor templates according to your requirements. Sample templates are available [here](https://github.com/opensearch-project/flow-framework/tree/main/sample-templates), and refer to our documentation [here](https://opensearch.org/docs/latest/automating-configurations/index/) for further guidance. +## Next steps -## Next Steps +In our ongoing efforts to enhance user experience and streamline the process of provisioning the ML offerings of OpenSearch, we have an exciting plan in the pipeline. We aim to develop a user-friendly drag-and-drop frontend interface. This interface will simplify complex steps involved in provisioning ML features, thereby allowing you to seamlessly configure and deploy your workflows. Stay tuned for updates on this exciting development! -In our ongoing efforts to enhance user experience and streamline the process of provisioning the ML offerings of OpenSearch, we have an exciting plan in the pipeline. We aim to develop a user-friendly drag-and-drop frontend interface. This interface will simplify complex steps involved in provisioning ML capabilities, thereby allowing users to seamlessly configure and deploy their workflows with ease. Stay tuned for updates on this exciting development! -If you have any comments or suggestions please comment on the RFCs: +If you have any comments or suggestions, please comment on the RFCs: -1. Backend: https://github.com/opensearch-project/OpenSearch/issues/9213 -2. Frontend: https://github.com/opensearch-project/OpenSearch-Dashboards/issues/4755 -3. Github Repository: https://github.com/opensearch-project/flow-framework and https://github.com/opensearch-project/dashboards-flow-framework +- [Backend RFC](https://github.com/opensearch-project/OpenSearch/issues/9213) +- [Frontend RFC](https://github.com/opensearch-project/OpenSearch-Dashboards/issues/4755) +- [Flow Framework GitHub repository](https://github.com/opensearch-project/flow-framework) +- [Flow Framework Dashboards GitHub repository](https://github.com/opensearch-project/dashboards-flow-framework) From 8c9810ab5b850cc79c154c8ac13155973fe9e61b Mon Sep 17 00:00:00 2001 From: owaiskazi19 Date: Wed, 3 Apr 2024 16:11:16 +0000 Subject: [PATCH 3/9] Added additional team members Signed-off-by: owaiskazi19 --- _community_members/hnyng.md | 2 +- _community_members/ohltyler.md | 2 +- ...4-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/_community_members/hnyng.md b/_community_members/hnyng.md index cd88dd2877..487793051a 100644 --- a/_community_members/hnyng.md +++ b/_community_members/hnyng.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/jackie-han.html' --- -Jackie Han is a software engineer at AWS. focusing mostly on anomaly detection in OpenSearch. \ No newline at end of file +Jackie Han is a software engineer at AWS. focusing mostly on anomaly detection and flow framework in OpenSearch. \ No newline at end of file diff --git a/_community_members/ohltyler.md b/_community_members/ohltyler.md index 02235ee89e..44a0c0ed9c 100644 --- a/_community_members/ohltyler.md +++ b/_community_members/ohltyler.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/tyler-ohlsen.html' --- -**Tyler Ohlsen** is a Software Engineer at AWS, focusing on anomaly detection in OpenSearch. \ No newline at end of file +**Tyler Ohlsen** is a Software Engineer at AWS, focusing on anomaly detection and flow framework in OpenSearch. \ No newline at end of file diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index 8e7107ba57..d7982c2b19 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -6,6 +6,9 @@ authors: - amitgalitz - dwiddis - jpalis + - hnyng + - ohltyler + - minalsha date: 2024-04-05 categories: - technical-posts From ed4c93d0cb9dc0b4b441c25b989a0e373abfbf54 Mon Sep 17 00:00:00 2001 From: owaiskazi19 Date: Wed, 3 Apr 2024 16:50:06 +0000 Subject: [PATCH 4/9] Added release link Signed-off-by: owaiskazi19 --- ...04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index d7982c2b19..42f83508cc 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -18,7 +18,7 @@ meta_description: Explore the simplicity of integrating Machine Learning capabil In OpenSearch, to use ML offerings, such as semantic, hybrid, and multimodal search, you often have to grapple with complex setup and preprocessing tasks. Additionally, you must write verbose queries, which can be time-consuming and error-prone. -In this blog post, we introduce the OpenSearch Flow Framework plugin, released in version 2.13, designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one click. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. +In this blog post, we introduce the OpenSearch Flow Framework plugin, [released in version 2.13](https://opensearch.org/blog/2.13-is-ready-for-download/), designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one click. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. ## Before Flow Framework From f935dd9165429a76a79d42d4fa817b70dea34a95 Mon Sep 17 00:00:00 2001 From: kolchfa-aws <105444904+kolchfa-aws@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:33:18 -0400 Subject: [PATCH 5/9] Apply suggestions from code review Co-authored-by: Nathan Bower Signed-off-by: kolchfa-aws <105444904+kolchfa-aws@users.noreply.github.com> --- _community_members/amitgalitz.md | 2 +- _community_members/hnyng.md | 2 +- _community_members/jpalis.md | 2 +- _community_members/ohltyler.md | 2 +- ...-Automation-for-OpenSearch-ML-Use-Cases.md | 24 +++++++++---------- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/_community_members/amitgalitz.md b/_community_members/amitgalitz.md index 5aa829a492..67f210cfb1 100644 --- a/_community_members/amitgalitz.md +++ b/_community_members/amitgalitz.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/amit-galitzky.html' --- -**Amit Galitzky** is a software engineer at Amazon Web Services. He focuses mostly on the Anomaly Detection and Flow Framework plugins for OpenSearch. \ No newline at end of file +**Amit Galitzky** is a software engineer at Amazon Web Services focusing mostly on the OpenSearch Anomaly Detection and Flow Framework plugins. \ No newline at end of file diff --git a/_community_members/hnyng.md b/_community_members/hnyng.md index 487793051a..0d43b7d25d 100644 --- a/_community_members/hnyng.md +++ b/_community_members/hnyng.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/jackie-han.html' --- -Jackie Han is a software engineer at AWS. focusing mostly on anomaly detection and flow framework in OpenSearch. \ No newline at end of file +Jackie Han is a software engineer at Amazon Web Services focusing mostly on the OpenSearch Anomaly Detection and Flow Framework plugins. \ No newline at end of file diff --git a/_community_members/jpalis.md b/_community_members/jpalis.md index a32143e74f..5fe69fd81e 100644 --- a/_community_members/jpalis.md +++ b/_community_members/jpalis.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/josh-palis.html' --- -**Josh Palis** is a software engineer at Amazon Web Services. He focuses mostly on the Flow Framework plugin for OpenSearch. \ No newline at end of file +**Josh Palis** is a software engineer at Amazon Web Services focusing mostly on the OpenSearch Flow Framework plugin. \ No newline at end of file diff --git a/_community_members/ohltyler.md b/_community_members/ohltyler.md index 44a0c0ed9c..9fb46655b5 100644 --- a/_community_members/ohltyler.md +++ b/_community_members/ohltyler.md @@ -20,4 +20,4 @@ personas: permalink: '/community/members/tyler-ohlsen.html' --- -**Tyler Ohlsen** is a Software Engineer at AWS, focusing on anomaly detection and flow framework in OpenSearch. \ No newline at end of file +**Tyler Ohlsen** is a software engineer at Amazon Web Services focusing mostly on the OpenSearch Anomaly Detection and Flow Framework plugins. \ No newline at end of file diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index 42f83508cc..84a6cd57f4 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -16,22 +16,22 @@ meta_keywords: Flow Framework, OpenSearch plugins, Machine Learning meta_description: Explore the simplicity of integrating Machine Learning capabilities within OpenSearch through an innovative and groundbreaking framework designed to simplify complex setup tasks. --- -In OpenSearch, to use ML offerings, such as semantic, hybrid, and multimodal search, you often have to grapple with complex setup and preprocessing tasks. Additionally, you must write verbose queries, which can be time-consuming and error-prone. +In OpenSearch, to use machine learning (ML) offerings, such as semantic, hybrid, and multimodal search, you often have to grapple with complex setup and preprocessing tasks. Additionally, you must write verbose queries, which can be a time-consuming and error-prone process. -In this blog post, we introduce the OpenSearch Flow Framework plugin, [released in version 2.13](https://opensearch.org/blog/2.13-is-ready-for-download/), designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one click. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. +In this blog post, we introduce the OpenSearch Flow Framework plugin, [released in version 2.13](https://opensearch.org/blog/2.13-is-ready-for-download/) and designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one click. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. -## Before Flow Framework +## Before the Flow Framework plugin -In the past, setting up semantic search involved the steps outlined in the [Semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): +Previously, setting up semantic search involved the steps outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): 1. Create a connector for a remote model, specifying pre- and post-processing functions. -1. Register an embedding model using the connector ID obtained from the previous step. +1. Register an embedding model using the connector ID obtained in the previous step. 1. Configure an ingest pipeline to generate vector embeddings using the model ID of the registered model. 1. Create a k-NN index and add the pipeline created in the previous step. -This complex setup typically required you to be familiar with the OpenSearch ML Commons APIs. However, we are simplifying this experience through the Flow Framework. Let's demonstrate how the Flow Framework simplifies this process using the preceding semantic search example. +This complex setup typically required you to be familiar with the OpenSearch ML Commons APIs. However, we are simplifying this experience through the Flow Framework plugin. Let's demonstrate how the plugin simplifies this process using the preceding semantic search example. -## With Flow Framework +## With the Flow Framework plugin In this example, you will configure the `semantic_search_with_cohere_embedding_query_enricher` workflow template. The workflow created using this template performs the following configuration steps: @@ -103,7 +103,7 @@ GET /my-nlp-index/_search } ``` -With Flow Framework, we've simplified this complex setup process, enabling you to focus on your tasks without the burden of navigating complex APIs. Our goal is for you to use OpenSearch seamlessly, unlocking new possibilities in your projects. +With the Flow Framework plugin, we've simplified this complex setup process, enabling you to focus on your tasks without the burden of navigating complex APIs. Our goal is for you to use OpenSearch seamlessly, uncovering new possibilities in your projects. ## Viewing workflow resources @@ -115,17 +115,17 @@ GET /_plugins/_flow_framework/workflow/8xL8bowB8y25Tqfenm50/_status ## Additional default use cases -You can explore more default use cases by viewing [substitution templates](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/substitutionTemplates) with their corresponding [defaults](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/defaults). +You can explore more default use cases by viewing [substitution templates](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/substitutionTemplates) and their corresponding [defaults](https://github.com/opensearch-project/flow-framework/tree/2.13/src/main/resources/defaults). ## Creating custom use cases -You can tailor templates according to your requirements. For more information, see [sample templates](https://github.com/opensearch-project/flow-framework/tree/main/sample-templates) and the [documentation](https://opensearch.org/docs/latest/automating-configurations/index/). +You can tailor templates according to your requirements. For more information, see [these sample templates](https://github.com/opensearch-project/flow-framework/tree/main/sample-templates) and the [Automating configurations](https://opensearch.org/docs/latest/automating-configurations/index/) documentation. ## Next steps -In our ongoing efforts to enhance user experience and streamline the process of provisioning the ML offerings of OpenSearch, we have an exciting plan in the pipeline. We aim to develop a user-friendly drag-and-drop frontend interface. This interface will simplify complex steps involved in provisioning ML features, thereby allowing you to seamlessly configure and deploy your workflows. Stay tuned for updates on this exciting development! +In our ongoing efforts to enhance the user experience and streamline the process of provisioning OpenSearch ML offerings, we have some exciting plans on our roadmap. We aim to develop a user-friendly drag-and-drop frontend interface. This interface will simplify the complex steps involved in provisioning ML features, thereby allowing you to seamlessly configure and deploy your workflows. Stay tuned for updates on this exciting development! -If you have any comments or suggestions, please comment on the RFCs: +If you have any comments or suggestions, you can comment on the following RFCs: - [Backend RFC](https://github.com/opensearch-project/OpenSearch/issues/9213) - [Frontend RFC](https://github.com/opensearch-project/OpenSearch-Dashboards/issues/4755) From cae73239de749434aa74fb6c687f1ba2a84c8822 Mon Sep 17 00:00:00 2001 From: owaiskazi19 Date: Fri, 5 Apr 2024 17:42:36 +0000 Subject: [PATCH 6/9] Addressed PR comments Signed-off-by: owaiskazi19 --- ...-Automation-for-OpenSearch-ML-Use-Cases.md | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index 84a6cd57f4..dc63baa2d7 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -22,14 +22,14 @@ In this blog post, we introduce the OpenSearch Flow Framework plugin, [released ## Before the Flow Framework plugin -Previously, setting up semantic search involved the steps outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): +Previously, setting up semantic search involves *4 separate API* calls outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): 1. Create a connector for a remote model, specifying pre- and post-processing functions. -1. Register an embedding model using the connector ID obtained in the previous step. -1. Configure an ingest pipeline to generate vector embeddings using the model ID of the registered model. -1. Create a k-NN index and add the pipeline created in the previous step. +2. Register an embedding model using the connector ID obtained in the previous step. +3. Configure an ingest pipeline to generate vector embeddings using the model ID of the registered model. +4. Create a k-NN index and add the pipeline created in the previous step. -This complex setup typically required you to be familiar with the OpenSearch ML Commons APIs. However, we are simplifying this experience through the Flow Framework plugin. Let's demonstrate how the plugin simplifies this process using the preceding semantic search example. +This complex setup required you to be familiar with the OpenSearch ML Commons APIs. However, we are simplifying this experience through the Flow Framework plugin. Let's demonstrate how the plugin simplifies this process using the preceding semantic search example. ## With the Flow Framework plugin @@ -58,13 +58,7 @@ OpenSearch responds with a unique workflow ID, simplifying the tracking and mana } ``` -Note: The workflow in the previous step creates a default k-NN index. The default index name is `my-nlp-index`: - -```json -{ - "create_index.name": "my-nlp-index" -} -``` +Note: The workflow in the previous step creates a default k-NN index. The default index name is `my-nlp-index` You can customize the template default values by providing the new values in the request body. For a comprehensive list of default parameter values for this workflow template, see [Cohere Embed semantic search defaults](https://github.com/opensearch-project/flow-framework/blob/2.13/src/main/resources/defaults/cohere-embedding-semantic-search-defaults.json). @@ -73,7 +67,7 @@ You can customize the template default values by providing the new values in the Once the workflow is provisioned, you can ingest documents into the index created by the workflow: ```json -PUT /my-nlp-index/_doc/1 +POST /my-nlp-index/_doc { "passage_text": "Hello world", "id": "s1" From 296bc92e8e1e7c92507c2cccb8ffafc56d0b8269 Mon Sep 17 00:00:00 2001 From: owaiskazi19 Date: Fri, 5 Apr 2024 18:16:01 +0000 Subject: [PATCH 7/9] Minor comments Signed-off-by: owaiskazi19 --- ...5-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index dc63baa2d7..6aebdbaff0 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -18,11 +18,11 @@ meta_description: Explore the simplicity of integrating Machine Learning capabil In OpenSearch, to use machine learning (ML) offerings, such as semantic, hybrid, and multimodal search, you often have to grapple with complex setup and preprocessing tasks. Additionally, you must write verbose queries, which can be a time-consuming and error-prone process. -In this blog post, we introduce the OpenSearch Flow Framework plugin, [released in version 2.13](https://opensearch.org/blog/2.13-is-ready-for-download/) and designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one click. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. +In this blog post, we introduce the OpenSearch Flow Framework plugin, [released in version 2.13](https://opensearch.org/blog/2.13-is-ready-for-download/) and designed to streamline this cumbersome process. By using this plugin, you can simplify complex setups with just one simple API call. We've provided automated templates, enabling you to create connectors, register models, deploy them, and register agents and tools through a single API call. This eliminates the complexity of calling multiple APIs and orchestrating setups based on the responses. ## Before the Flow Framework plugin -Previously, setting up semantic search involves *4 separate API* calls outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): +Previously, setting up semantic search involves *4 separate API calls* outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): 1. Create a connector for a remote model, specifying pre- and post-processing functions. 2. Register an embedding model using the connector ID obtained in the previous step. @@ -90,7 +90,7 @@ GET /my-nlp-index/_search "neural": { "passage_embedding": { "query_text": "Hi world", - "k": 100 + "k": 10 } } } From 5dad66026a2b99f1a5b2bb04490e4eb921051042 Mon Sep 17 00:00:00 2001 From: Fanit Kolchina Date: Mon, 8 Apr 2024 09:12:16 -0400 Subject: [PATCH 8/9] Final editorial comments Signed-off-by: Fanit Kolchina --- ...-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index 6aebdbaff0..b4ece6cf00 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -22,7 +22,7 @@ In this blog post, we introduce the OpenSearch Flow Framework plugin, [released ## Before the Flow Framework plugin -Previously, setting up semantic search involves *4 separate API calls* outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): +Previously, setting up semantic search involves *four separate API calls*, outlined in the [semantic search documentation](https://opensearch.org/docs/latest/search-plugins/semantic-search/): 1. Create a connector for a remote model, specifying pre- and post-processing functions. 2. Register an embedding model using the connector ID obtained in the previous step. @@ -58,7 +58,7 @@ OpenSearch responds with a unique workflow ID, simplifying the tracking and mana } ``` -Note: The workflow in the previous step creates a default k-NN index. The default index name is `my-nlp-index` +Note: The workflow in the previous step creates a default k-NN index. The default index name is `my-nlp-index`. You can customize the template default values by providing the new values in the request body. For a comprehensive list of default parameter values for this workflow template, see [Cohere Embed semantic search defaults](https://github.com/opensearch-project/flow-framework/blob/2.13/src/main/resources/defaults/cohere-embedding-semantic-search-defaults.json). From bcd469be1d3347b2c4394f703b25c4b82f6f196c Mon Sep 17 00:00:00 2001 From: Fanit Kolchina Date: Mon, 8 Apr 2024 13:28:56 -0400 Subject: [PATCH 9/9] Change date Signed-off-by: Fanit Kolchina --- ...04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md index b4ece6cf00..5229f3d4a7 100644 --- a/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md +++ b/_posts/2024-04-05-Configurable-Automation-for-OpenSearch-ML-Use-Cases.md @@ -9,7 +9,7 @@ authors: - hnyng - ohltyler - minalsha -date: 2024-04-05 +date: 2024-04-08 categories: - technical-posts meta_keywords: Flow Framework, OpenSearch plugins, Machine Learning