From c475d6220b4bd78103c182a8d8a326fff51df8df Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Fri, 15 Sep 2023 23:47:25 +0800 Subject: [PATCH 01/12] Add example for conditional flow --- .../README.md | 43 ++++++++++++++++++ .../content_safety_check.py | 7 +++ .../data.jsonl | 2 + .../default_result.py | 6 +++ .../flow.dag.yaml | 44 +++++++++++++++++++ .../generate_result.py | 9 ++++ .../llm_result.py | 9 ++++ .../requirements.txt | 2 + 8 files changed, 122 insertions(+) create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/README.md create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/content_safety_check.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/data.jsonl create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/default_result.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/flow.dag.yaml create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/generate_result.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/llm_result.py create mode 100644 examples/flows/standard/conditional-flow-for-if-else-scenario/requirements.txt diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/README.md b/examples/flows/standard/conditional-flow-for-if-else-scenario/README.md new file mode 100644 index 00000000000..f3afea22066 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/README.md @@ -0,0 +1,43 @@ +# Conditional flow for if-else scenario + +This example is a conditonal flow for if-else scenario. + +In this flow, it checks if an input query passes content safety check. If it's denied, we'll return a default response; otherwise, we'll call LLM to get a response and then summarize the final results. + +By following this example, you will learn how to create a conditional flow using the `activate config`. + +## Prerequisites + +Install promptflow sdk and other dependencies: +```bash +pip install -r requirements.txt +``` + +## Run flow + +- Test flow/node +```bash +# test with default input value in flow.dag.yaml +pf flow test --flow . + +# test with flow inputs +pf flow test --flow . --inputs query="What is Prompt flow?" +``` + +- List and show run meta +```bash +# list created run +pf run list + +# get a sample run name +name=$(pf run list -r 10 | jq '.[] | select(.name | contains("basic_default")) | .name'| head -n 1 | tr -d '"') + +# show specific run detail +pf run show --name $name + +# show output +pf run show-details --name $name + +# visualize run in browser +pf run visualize --name $name +``` diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/content_safety_check.py b/examples/flows/standard/conditional-flow-for-if-else-scenario/content_safety_check.py new file mode 100644 index 00000000000..e413d0d892c --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/content_safety_check.py @@ -0,0 +1,7 @@ +from promptflow import tool +import random + + +@tool +def content_safety_check(text: str) -> str: + return random.choice([True, False]) diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/data.jsonl b/examples/flows/standard/conditional-flow-for-if-else-scenario/data.jsonl new file mode 100644 index 00000000000..2863f167e8a --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/data.jsonl @@ -0,0 +1,2 @@ +{"query": "What is Prompt flow?"} +{"query": "What is ChatGPT?"} \ No newline at end of file diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/default_result.py b/examples/flows/standard/conditional-flow-for-if-else-scenario/default_result.py new file mode 100644 index 00000000000..ed78c1fc780 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/default_result.py @@ -0,0 +1,6 @@ +from promptflow import tool + + +@tool +def default_result(request: str) -> str: + return f"I'm not familiar with your query: {request}." diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/flow.dag.yaml b/examples/flows/standard/conditional-flow-for-if-else-scenario/flow.dag.yaml new file mode 100644 index 00000000000..817cb491253 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/flow.dag.yaml @@ -0,0 +1,44 @@ +inputs: + query: + type: string + default: What is Prompt flow? +outputs: + answer: + type: string + reference: ${generate_result.output} +nodes: +- name: content_safety_check + type: python + source: + type: code + path: content_safety_check.py + inputs: + text: ${inputs.query} +- name: llm_result + type: python + source: + type: code + path: llm_result.py + inputs: + request: ${inputs.query} + activate: + when: ${content_safety_check.output} + is: true +- name: default_result + type: python + source: + type: code + path: default_result.py + inputs: + request: ${inputs.query} + activate: + when: ${content_safety_check.output} + is: false +- name: generate_result + type: python + source: + type: code + path: generate_result.py + inputs: + llm_result: ${llm_result.output} + default_result: ${default_result.output} diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/generate_result.py b/examples/flows/standard/conditional-flow-for-if-else-scenario/generate_result.py new file mode 100644 index 00000000000..c238605bc22 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/generate_result.py @@ -0,0 +1,9 @@ +from promptflow import tool + + +@tool +def generate_result(llm_result="", default_result="") -> str: + if llm_result: + return llm_result + else: + return default_result diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/llm_result.py b/examples/flows/standard/conditional-flow-for-if-else-scenario/llm_result.py new file mode 100644 index 00000000000..f302790cc22 --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/llm_result.py @@ -0,0 +1,9 @@ +from promptflow import tool + + +@tool +def llm_result(request: str) -> str: + return ( + "Prompt flow is a suite of development tools designed to streamline " + "the end-to-end development cycle of LLM-based AI applications." + ) diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/requirements.txt b/examples/flows/standard/conditional-flow-for-if-else-scenario/requirements.txt new file mode 100644 index 00000000000..34d068f5f1c --- /dev/null +++ b/examples/flows/standard/conditional-flow-for-if-else-scenario/requirements.txt @@ -0,0 +1,2 @@ +promptflow +promptflow-tools \ No newline at end of file From 20ccd80fb048fb8ea52ea9626d774ffeff1ea0cd Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 10:59:19 +0800 Subject: [PATCH 02/12] Update doc --- .../README.md | 4 ++++ .../content_safety_check.py | 0 .../data.jsonl | 0 .../default_result.py | 0 .../flow.dag.yaml | 0 .../generate_result.py | 0 .../llm_result.py | 0 .../requirements.txt | 0 8 files changed, 4 insertions(+) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/README.md (78%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/content_safety_check.py (100%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/data.jsonl (100%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/default_result.py (100%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/flow.dag.yaml (100%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/generate_result.py (100%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/llm_result.py (100%) rename examples/flows/standard/{conditional-flow-for-if-else-scenario => conditional-flow-for-if-else}/requirements.txt (100%) diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md similarity index 78% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/README.md rename to examples/flows/standard/conditional-flow-for-if-else/README.md index f3afea22066..cacde3f3c60 100644 --- a/examples/flows/standard/conditional-flow-for-if-else-scenario/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -4,6 +4,10 @@ This example is a conditonal flow for if-else scenario. In this flow, it checks if an input query passes content safety check. If it's denied, we'll return a default response; otherwise, we'll call LLM to get a response and then summarize the final results. +:::{admonition} Notice +The 'content_safety_check' and 'llm_result' node in this flow are dummy nodes that do not actually use connections of `Azure Content Safty` and `Azure Open AI`. You can replace them with the real ones. Learn more: [Manage connections](../../../connections/connection.ipynb) +::: + By following this example, you will learn how to create a conditional flow using the `activate config`. ## Prerequisites diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/content_safety_check.py b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/content_safety_check.py rename to examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/data.jsonl b/examples/flows/standard/conditional-flow-for-if-else/data.jsonl similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/data.jsonl rename to examples/flows/standard/conditional-flow-for-if-else/data.jsonl diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/default_result.py b/examples/flows/standard/conditional-flow-for-if-else/default_result.py similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/default_result.py rename to examples/flows/standard/conditional-flow-for-if-else/default_result.py diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/flow.dag.yaml b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/flow.dag.yaml rename to examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/generate_result.py b/examples/flows/standard/conditional-flow-for-if-else/generate_result.py similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/generate_result.py rename to examples/flows/standard/conditional-flow-for-if-else/generate_result.py diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/llm_result.py b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/llm_result.py rename to examples/flows/standard/conditional-flow-for-if-else/llm_result.py diff --git a/examples/flows/standard/conditional-flow-for-if-else-scenario/requirements.txt b/examples/flows/standard/conditional-flow-for-if-else/requirements.txt similarity index 100% rename from examples/flows/standard/conditional-flow-for-if-else-scenario/requirements.txt rename to examples/flows/standard/conditional-flow-for-if-else/requirements.txt From 1f905dcf090913262f464bb6ab3e8cfca310fa24 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 11:37:04 +0800 Subject: [PATCH 03/12] Update doc --- examples/flows/standard/conditional-flow-for-if-else/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index cacde3f3c60..0b8fb004c80 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -34,7 +34,7 @@ pf flow test --flow . --inputs query="What is Prompt flow?" pf run list # get a sample run name -name=$(pf run list -r 10 | jq '.[] | select(.name | contains("basic_default")) | .name'| head -n 1 | tr -d '"') +name=$(pf run list -r 10 | jq '.[] | select(.name | contains("conditional_flow_for_if_else")) | .name'| head -n 1 | tr -d '"') # show specific run detail pf run show --name $name From c8b231e7f50606b1acb6217bc23c5027bb437ef0 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 11:44:25 +0800 Subject: [PATCH 04/12] Update query to question --- .../flows/standard/conditional-flow-for-if-else/README.md | 2 +- .../standard/conditional-flow-for-if-else/data.jsonl | 4 ++-- .../conditional-flow-for-if-else/default_result.py | 4 ++-- .../standard/conditional-flow-for-if-else/flow.dag.yaml | 8 ++++---- .../standard/conditional-flow-for-if-else/llm_result.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index 0b8fb004c80..fc540ae040f 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -25,7 +25,7 @@ pip install -r requirements.txt pf flow test --flow . # test with flow inputs -pf flow test --flow . --inputs query="What is Prompt flow?" +pf flow test --flow . --inputs question="What is Prompt flow?" ``` - List and show run meta diff --git a/examples/flows/standard/conditional-flow-for-if-else/data.jsonl b/examples/flows/standard/conditional-flow-for-if-else/data.jsonl index 2863f167e8a..9409a94d303 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/data.jsonl +++ b/examples/flows/standard/conditional-flow-for-if-else/data.jsonl @@ -1,2 +1,2 @@ -{"query": "What is Prompt flow?"} -{"query": "What is ChatGPT?"} \ No newline at end of file +{"question": "What is Prompt flow?"} +{"question": "What is ChatGPT?"} \ No newline at end of file diff --git a/examples/flows/standard/conditional-flow-for-if-else/default_result.py b/examples/flows/standard/conditional-flow-for-if-else/default_result.py index ed78c1fc780..a4b547f337b 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/default_result.py +++ b/examples/flows/standard/conditional-flow-for-if-else/default_result.py @@ -2,5 +2,5 @@ @tool -def default_result(request: str) -> str: - return f"I'm not familiar with your query: {request}." +def default_result(question: str) -> str: + return f"I'm not familiar with your query: {question}." diff --git a/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml index 817cb491253..43f9e1d5b38 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml +++ b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml @@ -1,5 +1,5 @@ inputs: - query: + question: type: string default: What is Prompt flow? outputs: @@ -13,14 +13,14 @@ nodes: type: code path: content_safety_check.py inputs: - text: ${inputs.query} + text: ${inputs.question} - name: llm_result type: python source: type: code path: llm_result.py inputs: - request: ${inputs.query} + question: ${inputs.question} activate: when: ${content_safety_check.output} is: true @@ -30,7 +30,7 @@ nodes: type: code path: default_result.py inputs: - request: ${inputs.query} + question: ${inputs.question} activate: when: ${content_safety_check.output} is: false diff --git a/examples/flows/standard/conditional-flow-for-if-else/llm_result.py b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py index f302790cc22..3c57991ff7b 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/llm_result.py +++ b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py @@ -2,7 +2,7 @@ @tool -def llm_result(request: str) -> str: +def llm_result(question: str) -> str: return ( "Prompt flow is a suite of development tools designed to streamline " "the end-to-end development cycle of LLM-based AI applications." From aaf39b2cabc37dc1ac6e6358c073ccb73c6c4687 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 11:45:49 +0800 Subject: [PATCH 05/12] Add comments --- .../conditional-flow-for-if-else/content_safety_check.py | 1 + .../flows/standard/conditional-flow-for-if-else/llm_result.py | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py index e413d0d892c..79516e69fab 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py +++ b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check.py @@ -4,4 +4,5 @@ @tool def content_safety_check(text: str) -> str: + # You can use a content safety node to replace this tool. return random.choice([True, False]) diff --git a/examples/flows/standard/conditional-flow-for-if-else/llm_result.py b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py index 3c57991ff7b..82b1910cc9e 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/llm_result.py +++ b/examples/flows/standard/conditional-flow-for-if-else/llm_result.py @@ -3,6 +3,7 @@ @tool def llm_result(question: str) -> str: + # You can use an LLM node to replace this tool. return ( "Prompt flow is a suite of development tools designed to streamline " "the end-to-end development cycle of LLM-based AI applications." From f492f1e8c6223cd490b8f2aa448f7d468267e583 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 11:47:39 +0800 Subject: [PATCH 06/12] Update comments --- examples/flows/standard/conditional-flow-for-if-else/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index fc540ae040f..0c7610cc44e 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -5,7 +5,7 @@ This example is a conditonal flow for if-else scenario. In this flow, it checks if an input query passes content safety check. If it's denied, we'll return a default response; otherwise, we'll call LLM to get a response and then summarize the final results. :::{admonition} Notice -The 'content_safety_check' and 'llm_result' node in this flow are dummy nodes that do not actually use connections of `Azure Content Safty` and `Azure Open AI`. You can replace them with the real ones. Learn more: [Manage connections](../../../connections/connection.ipynb) +The 'content_safety_check' and 'llm_result' node in this flow are dummy nodes that do not actually use the conten safety tool and LLM tool. You can replace them with the real ones. Learn more: [LLM Tool](https://microsoft.github.io/promptflow/reference/tools-reference/llm-tool.html) ::: By following this example, you will learn how to create a conditional flow using the `activate config`. From a9ad743b1663022f358ec29136add8049ecd8522 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 13:10:40 +0800 Subject: [PATCH 07/12] Update yaml and doc --- examples/README.md | 1 + .../flows/standard/conditional-flow-for-if-else/flow.dag.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/examples/README.md b/examples/README.md index 2b6928d41b0..d8603475862 100644 --- a/examples/README.md +++ b/examples/README.md @@ -48,6 +48,7 @@ | [maths-to-code](flows/standard/maths-to-code/README.md) | [![samples_flows_standard_maths_to_code](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_maths_to_code.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_maths_to_code.yml) | Math to Code is a project that utilizes the power of the chatGPT model to generate code that models math questions and then executes the generated code to obtain the final numerical answer | | [named-entity-recognition](flows/standard/named-entity-recognition/README.md) | [![samples_flows_standard_named_entity_recognition](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_named_entity_recognition.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_named_entity_recognition.yml) | A flow that perform named entity recognition task | | [web-classification](flows/standard/web-classification/README.md) | [![samples_flows_standard_web_classification](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_web_classification.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_web_classification.yml) | This is a flow demonstrating multi-class classification with LLM | +| [conditional-flow-for-if-else](flows/standard/conditional-flow-for-if-else/README.md) | [!samples_flows_standard_conditional_flow_for_if_else](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml) | This example is a conditonal flow for if-else scenario. #### [Evaluation flows](flows/evaluation/) diff --git a/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml index 43f9e1d5b38..909bb8234a9 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml +++ b/examples/flows/standard/conditional-flow-for-if-else/flow.dag.yaml @@ -1,3 +1,4 @@ +$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json inputs: question: type: string @@ -42,3 +43,5 @@ nodes: inputs: llm_result: ${llm_result.output} default_result: ${default_result.output} +environment: + python_requirements_txt: requirements.txt From fe6660f336420e5791420dfddf1f5a60a4fae32d Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 13:15:19 +0800 Subject: [PATCH 08/12] Update ci --- ..._standard_conditional_flow_for_if_else.yml | 89 +++++++++++++++++++ examples/README.md | 2 +- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml diff --git a/.github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml b/.github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml new file mode 100644 index 00000000000..de28a68a527 --- /dev/null +++ b/.github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml @@ -0,0 +1,89 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: samples_flows_standard_conditional_flow_for_if_else +on: + schedule: + - cron: "8 21 * * *" # Every day starting at 5:8 BJT + pull_request: + branches: [ main ] + paths: [ examples/flows/standard/conditional-flow-for-if-else/**, examples/*requirements.txt, .github/workflows/samples_flows_standard_conditional_flow_for_if_else.yml ] + workflow_dispatch: + +jobs: + samples_readme_ci: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Python 3.9 environment + uses: actions/setup-python@v4 + with: + python-version: "3.9" + - name: Generate config.json + run: echo ${{ secrets.TEST_WORKSPACE_CONFIG_JSON }} > ${{ github.workspace }}/examples/config.json + - name: Prepare requirements + working-directory: examples + run: | + if [[ -e requirements.txt ]]; then + python -m pip install --upgrade pip + pip install -r requirements.txt + fi + - name: Prepare dev requirements + working-directory: examples + run: | + python -m pip install --upgrade pip + pip install -r dev_requirements.txt + - name: Refine .env file + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + AOAI_API_KEY=${{ secrets.AOAI_API_KEY_TEST }} + AOAI_API_ENDPOINT=${{ secrets.AOAI_API_ENDPOINT_TEST }} + AOAI_API_ENDPOINT=$(echo ${AOAI_API_ENDPOINT//\//\\/}) + if [[ -e .env.example ]]; then + echo "env replacement" + sed -i -e "s//$AOAI_API_KEY/g" -e "s//$AOAI_API_ENDPOINT/g" .env.example + mv .env.example .env + fi + - name: Create run.yml + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + gpt_base=${{ secrets.AOAI_API_ENDPOINT_TEST }} + gpt_base=$(echo ${gpt_base//\//\\/}) + if [[ -e run.yml ]]; then + sed -i -e "s/\${azure_open_ai_connection.api_key}/${{ secrets.AOAI_API_KEY_TEST }}/g" -e "s/\${azure_open_ai_connection.api_base}/$gpt_base/g" run.yml + fi + - name: Azure Login + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + - name: Extract Steps examples/flows/standard/conditional-flow-for-if-else/README.md + working-directory: ${{ github.workspace }} + run: | + python scripts/readme/extract_steps_from_readme.py -f examples/flows/standard/conditional-flow-for-if-else/README.md -o examples/flows/standard/conditional-flow-for-if-else + - name: Cat script + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + cat bash_script.sh + - name: Run scripts + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + export aoai_api_key=${{secrets.AOAI_API_KEY_TEST }} + export aoai_api_endpoint=${{ secrets.AOAI_API_ENDPOINT_TEST }} + export test_workspace_sub_id=${{ secrets.TEST_WORKSPACE_SUB_ID }} + export test_workspace_rg=${{ secrets.TEST_WORKSPACE_RG }} + export test_workspace_name=${{ secrets.TEST_WORKSPACE_NAME }} + bash bash_script.sh + - name: Pip List for Debug + if : ${{ always() }} + working-directory: examples/flows/standard/conditional-flow-for-if-else + run: | + pip list + - name: Upload artifact + if: ${{ always() }} + uses: actions/upload-artifact@v3 + with: + name: artifact + path: examples/flows/standard/conditional-flow-for-if-else/bash_script.sh \ No newline at end of file diff --git a/examples/README.md b/examples/README.md index d8603475862..1f7332277c3 100644 --- a/examples/README.md +++ b/examples/README.md @@ -41,6 +41,7 @@ | [basic](flows/standard/basic/README.md) | [![samples_flows_standard_basic](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic.yml) | A basic standard flow using custom python tool that calls Azure OpenAI with connection info stored in environment variables | | [basic-with-builtin-llm](flows/standard/basic-with-builtin-llm/README.md) | [![samples_flows_standard_basic_with_builtin_llm](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_builtin_llm.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_builtin_llm.yml) | A basic standard flow that calls Azure OpenAI with builtin llm tool | | [basic-with-connection](flows/standard/basic-with-connection/README.md) | [![samples_flows_standard_basic_with_connection](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_connection.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_basic_with_connection.yml) | A basic standard flow that using custom python tool calls Azure OpenAI with connection info stored in custom connection | +| [conditional-flow-for-if-else](flows/standard/conditional-flow-for-if-else/README.md) | [![samples_flows_standard_conditional_flow_for_if_else](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml) | This example is a conditonal flow for if-else scenario | | [customer-intent-extraction](flows/standard/customer-intent-extraction/README.md) | [![samples_flows_standard_customer_intent_extraction](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_customer_intent_extraction.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_customer_intent_extraction.yml) | This sample is using OpenAI chat model(ChatGPT/GPT4) to identify customer intent from customer's question | | [flow-with-additional-includes](flows/standard/flow-with-additional-includes/README.md) | [![samples_flows_standard_flow_with_additional_includes](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_additional_includes.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_additional_includes.yml) | User sometimes need to reference some common files or folders, this sample demos how to solve the problem using additional_includes | | [flow-with-symlinks](flows/standard/flow-with-symlinks/README.md) | [![samples_flows_standard_flow_with_symlinks](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_symlinks.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_flow_with_symlinks.yml) | User sometimes need to reference some common files or folders, this sample demos how to solve the problem using symlinks | @@ -48,7 +49,6 @@ | [maths-to-code](flows/standard/maths-to-code/README.md) | [![samples_flows_standard_maths_to_code](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_maths_to_code.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_maths_to_code.yml) | Math to Code is a project that utilizes the power of the chatGPT model to generate code that models math questions and then executes the generated code to obtain the final numerical answer | | [named-entity-recognition](flows/standard/named-entity-recognition/README.md) | [![samples_flows_standard_named_entity_recognition](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_named_entity_recognition.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_named_entity_recognition.yml) | A flow that perform named entity recognition task | | [web-classification](flows/standard/web-classification/README.md) | [![samples_flows_standard_web_classification](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_web_classification.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_web_classification.yml) | This is a flow demonstrating multi-class classification with LLM | -| [conditional-flow-for-if-else](flows/standard/conditional-flow-for-if-else/README.md) | [!samples_flows_standard_conditional_flow_for_if_else](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml/badge.svg?branch=main)](https://github.com/microsoft/promptflow/actions/workflows/samples_flows_standard_conditional_flow_for_if_else.yml) | This example is a conditonal flow for if-else scenario. #### [Evaluation flows](flows/evaluation/) From eb8b261a7ddbfaefe68b575901892a7034fcf806 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 13:27:51 +0800 Subject: [PATCH 09/12] Fix CI --- .../flows/standard/conditional-flow-for-if-else/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index 0c7610cc44e..706e62d3c66 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -19,7 +19,7 @@ pip install -r requirements.txt ## Run flow -- Test flow/node +- Test flow ```bash # test with default input value in flow.dag.yaml pf flow test --flow . @@ -28,6 +28,11 @@ pf flow test --flow . pf flow test --flow . --inputs question="What is Prompt flow?" ``` +- Create run with multiple lines data +```bash +pf run create --flow . --data ./data.jsonl --stream +``` + - List and show run meta ```bash # list created run From 15c468971205425ebba9a1db93870df8e501f2ea Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 14:49:04 +0800 Subject: [PATCH 10/12] Update doc --- .../flows/standard/conditional-flow-for-if-else/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index 706e62d3c66..06f4901d48b 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -28,12 +28,12 @@ pf flow test --flow . pf flow test --flow . --inputs question="What is Prompt flow?" ``` -- Create run with multiple lines data +- Create run with multiple lines of data ```bash pf run create --flow . --data ./data.jsonl --stream ``` -- List and show run meta +- List and show run metadata ```bash # list created run pf run list From 8c1da36e3a71b7d74cc9be93b86154aa15226ba2 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 14:58:45 +0800 Subject: [PATCH 11/12] update doc --- .../conditional-flow-for-if-else/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index 06f4901d48b..3d417cd93a8 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -30,7 +30,11 @@ pf flow test --flow . --inputs question="What is Prompt flow?" - Create run with multiple lines of data ```bash -pf run create --flow . --data ./data.jsonl --stream +# create a random run name +run_name="conditional_flow_for_if_else_"$(openssl rand -hex 12) + +# create run +pf run create --flow . --data ./data.jsonl --stream --name $run_name ``` - List and show run metadata @@ -38,15 +42,12 @@ pf run create --flow . --data ./data.jsonl --stream # list created run pf run list -# get a sample run name -name=$(pf run list -r 10 | jq '.[] | select(.name | contains("conditional_flow_for_if_else")) | .name'| head -n 1 | tr -d '"') - # show specific run detail -pf run show --name $name +pf run show --name $run_name # show output -pf run show-details --name $name +pf run show-details --name $run_name # visualize run in browser -pf run visualize --name $name +pf run visualize --name $run_name ``` From e65ac7f22aeffb8af1418f7e5998614e59945164 Mon Sep 17 00:00:00 2001 From: Peiwen Gao Date: Mon, 18 Sep 2023 16:21:04 +0800 Subject: [PATCH 12/12] Update doc --- .../conditional-flow-for-if-else/README.md | 10 +++++++--- .../content_safety_check_failed.png | Bin 0 -> 39587 bytes .../content_safety_check_passed.png | Bin 0 -> 39590 bytes 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 examples/flows/standard/conditional-flow-for-if-else/content_safety_check_failed.png create mode 100644 examples/flows/standard/conditional-flow-for-if-else/content_safety_check_passed.png diff --git a/examples/flows/standard/conditional-flow-for-if-else/README.md b/examples/flows/standard/conditional-flow-for-if-else/README.md index 3d417cd93a8..da887fbe644 100644 --- a/examples/flows/standard/conditional-flow-for-if-else/README.md +++ b/examples/flows/standard/conditional-flow-for-if-else/README.md @@ -4,9 +4,13 @@ This example is a conditonal flow for if-else scenario. In this flow, it checks if an input query passes content safety check. If it's denied, we'll return a default response; otherwise, we'll call LLM to get a response and then summarize the final results. -:::{admonition} Notice -The 'content_safety_check' and 'llm_result' node in this flow are dummy nodes that do not actually use the conten safety tool and LLM tool. You can replace them with the real ones. Learn more: [LLM Tool](https://microsoft.github.io/promptflow/reference/tools-reference/llm-tool.html) -::: +The following are two execution situations of this flow: +- if input query passes content safety check: + ![content_safety_check_passed](content_safety_check_passed.png) +- else: + ![content_safety_check_failed](content_safety_check_failed.png) + +**Notice**: The `content_safety_check` and `llm_result` node in this flow are dummy nodes that do not actually use the conten safety tool and LLM tool. You can replace them with the real ones. Learn more: [LLM Tool](https://microsoft.github.io/promptflow/reference/tools-reference/llm-tool.html) By following this example, you will learn how to create a conditional flow using the `activate config`. diff --git a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_failed.png b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_failed.png new file mode 100644 index 0000000000000000000000000000000000000000..7195bf8e2e33310caf65fb6905b8128f816352fe GIT binary patch literal 39587 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 literal 0 HcmV?d00001 diff --git a/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_passed.png b/examples/flows/standard/conditional-flow-for-if-else/content_safety_check_passed.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ab31854f5ce8515c4f566d3a005493e5db95eb GIT binary patch literal 39590 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