From e036c88fa5d853e40c5feb837447cdeb5cf8a687 Mon Sep 17 00:00:00 2001 From: jiazeng Date: Mon, 23 Oct 2023 11:21:26 +0800 Subject: [PATCH] add prompt template tool and flow update update --- .../add-prompt-template-for-tool.md | 51 ++++++++++++++++++ .../create-and-use-tool-package.md | 3 +- docs/how-to-guides/develop-a-tool/index.md | 1 + .../use_prompt_template_in_flow.png | Bin 0 -> 71989 bytes .../flow.dag.yaml | 18 +++++++ .../prompt_template.jinja2 | 1 + .../requirements.txt | 3 ++ .../tools/tool_with_prompt_template_input.py | 14 +++++ .../tool_with_prompt_template_input.yaml | 10 ++++ .../test_tool_with_prompt_template_input.py | 28 ++++++++++ 10 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 docs/how-to-guides/develop-a-tool/add-prompt-template-for-tool.md create mode 100644 docs/media/how-to-guides/develop-a-tool/use_prompt_template_in_flow.png create mode 100644 examples/flows/standard/prompt-template-input-tool-showcase/flow.dag.yaml create mode 100644 examples/flows/standard/prompt-template-input-tool-showcase/prompt_template.jinja2 create mode 100644 examples/flows/standard/prompt-template-input-tool-showcase/requirements.txt create mode 100644 examples/tools/tool-package-quickstart/my_tool_package/tools/tool_with_prompt_template_input.py create mode 100644 examples/tools/tool-package-quickstart/my_tool_package/yamls/tool_with_prompt_template_input.yaml create mode 100644 examples/tools/tool-package-quickstart/tests/test_tool_with_prompt_template_input.py diff --git a/docs/how-to-guides/develop-a-tool/add-prompt-template-for-tool.md b/docs/how-to-guides/develop-a-tool/add-prompt-template-for-tool.md new file mode 100644 index 000000000000..e7ddcd3d6040 --- /dev/null +++ b/docs/how-to-guides/develop-a-tool/add-prompt-template-for-tool.md @@ -0,0 +1,51 @@ +# Add prompt template for tool +Users sometimes need to use prompt template within their tools. To simplify this, we've introduced the `PromptTemplate` feature. +In this guide, we will provide a detailed walkthrough on how to use `PromptTemplate` as a tool input. We will also demonstrate the user experience when utilizing this type of tool within a flow. + +## Prerequisites +- Follow the [steps](create-and-use-tool-package.md#Prerequisites) to prepare prerequisites. +- The tool's type must be `custom_llm` + +## How to create a tool with prompt template +Here we use [an existing tool package](../../../examples/tools/tool-package-quickstart/my_tool_package) as an example. If you want to create your own tool, please refer to create and use tool package. + +1. Add a `PromptTemplate` input for your tool, such as in [this example](../../../examples/tools/tool-package-quickstart/my_tool_package/tools/tool_with_prompt_template_input.py) + + ```python + from jinja2 import Template + from promptflow import tool + from promptflow.connections import CustomConnection + # 1. import the PromptTemplate type + from promptflow.contracts.types import PromptTemplate + + + # 2. add a PromptTemplate input for your tool method + @tool + def my_tool(connection: CustomConnection, prompt: PromptTemplate, **kwargs) -> str: + # 3. customise your own code to handle and use the prompt here + message = Template(prompt, trim_blocks=True, keep_trailing_newline=True).render(**kwargs) + return message + ``` + +2. Configure the tool YAML, Note that the `PromptTemplate` input should not be included in the YAML, like in [this example](../../../examples/tools/tool-package-quickstart/my_tool_package/yamls/tool_with_prompt_template_input.yaml) + + ```yaml + my_tool_package.tools.tool_with_prompt_template_input.my_tool: + name: Tool with PromptTemplate + description: This is a tool to demonstrate the usage of PromptTemplate + type: custom_llm + module: my_tool_package.tools.tool_with_prompt_template_input + function: my_tool + inputs: + connection: + type: + - CustomConnection + ``` + +## Use tool with a prompt template input in VS Code extension +Follow steps to [build and install your tool package](create-and-use-tool-package.md#build-and-share-the-tool-package) and [use your tool from VS Code extension](create-and-use-tool-package.md#use-your-tool-from-vscode-extension). + +Here we use an existing flow to demonstrate the experience, open [this flow](../../../examples/flows/standard/prompt-template-input-tool-showcase/flow.dag.yaml) in VS Code extension +- There is a node named "tool_with_prompt_template" with prompt template file, and the inputs of this node contains the input for the prompt template.. + +![use_prompt_template_in_flow](../../media/how-to-guides/develop-a-tool/use_prompt_template_in_flow.png) \ No newline at end of file diff --git a/docs/how-to-guides/develop-a-tool/create-and-use-tool-package.md b/docs/how-to-guides/develop-a-tool/create-and-use-tool-package.md index 70581bd2198e..f11bba72882c 100644 --- a/docs/how-to-guides/develop-a-tool/create-and-use-tool-package.md +++ b/docs/how-to-guides/develop-a-tool/create-and-use-tool-package.md @@ -163,4 +163,5 @@ Alternatively, you can test your tool package using the script below to ensure t ## Advanced features [Customize your tool icon](add-a-tool-icon.md) -[Add category and tags for tool](add-category-and-tags-for-tool.md) \ No newline at end of file +[Add category and tags for tool](add-category-and-tags-for-tool.md) +[Add Prompt Template for Custom LLM Tool](add-prompt-template-for-tool.md) \ No newline at end of file diff --git a/docs/how-to-guides/develop-a-tool/index.md b/docs/how-to-guides/develop-a-tool/index.md index 83ea80ab778d..729936a6e527 100644 --- a/docs/how-to-guides/develop-a-tool/index.md +++ b/docs/how-to-guides/develop-a-tool/index.md @@ -8,4 +8,5 @@ We provide guides on how to develop a tool and use it. create-and-use-tool-package add-a-tool-icon add-category-and-tags-for-tool +add-prompt-template-for-tool ``` \ No newline at end of file diff --git a/docs/media/how-to-guides/develop-a-tool/use_prompt_template_in_flow.png b/docs/media/how-to-guides/develop-a-tool/use_prompt_template_in_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebd1afed417e5ab70de1caba8a46566db4a2114 GIT binary patch literal 71989 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 literal 0 HcmV?d00001 diff --git a/examples/flows/standard/prompt-template-input-tool-showcase/flow.dag.yaml b/examples/flows/standard/prompt-template-input-tool-showcase/flow.dag.yaml new file mode 100644 index 000000000000..da1d7ae7f5b3 --- /dev/null +++ b/examples/flows/standard/prompt-template-input-tool-showcase/flow.dag.yaml @@ -0,0 +1,18 @@ +inputs: + text: + type: string + default: Microsoft +outputs: + output: + type: string + reference: ${tool_with_prompt_template.output} +nodes: +- name: tool_with_prompt_template + type: custom_llm + source: + type: package_with_prompt + tool: my_tool_package.tools.tool_with_prompt_template_input.my_tool + path: prompt_template.jinja2 + inputs: + connection: open_ai_connection + text: ${inputs.text} diff --git a/examples/flows/standard/prompt-template-input-tool-showcase/prompt_template.jinja2 b/examples/flows/standard/prompt-template-input-tool-showcase/prompt_template.jinja2 new file mode 100644 index 000000000000..b8ec99b1a892 --- /dev/null +++ b/examples/flows/standard/prompt-template-input-tool-showcase/prompt_template.jinja2 @@ -0,0 +1 @@ +Hello {{text}}. \ No newline at end of file diff --git a/examples/flows/standard/prompt-template-input-tool-showcase/requirements.txt b/examples/flows/standard/prompt-template-input-tool-showcase/requirements.txt new file mode 100644 index 000000000000..0310b74813b7 --- /dev/null +++ b/examples/flows/standard/prompt-template-input-tool-showcase/requirements.txt @@ -0,0 +1,3 @@ +promptflow +promptflow-tools +my-tools-package \ No newline at end of file diff --git a/examples/tools/tool-package-quickstart/my_tool_package/tools/tool_with_prompt_template_input.py b/examples/tools/tool-package-quickstart/my_tool_package/tools/tool_with_prompt_template_input.py new file mode 100644 index 000000000000..2d6d0c8e592c --- /dev/null +++ b/examples/tools/tool-package-quickstart/my_tool_package/tools/tool_with_prompt_template_input.py @@ -0,0 +1,14 @@ +from jinja2 import Template +from promptflow import tool +from promptflow.connections import CustomConnection +from promptflow.contracts.types import PromptTemplate + + +@tool +def my_tool(connection: CustomConnection, prompt: PromptTemplate, **kwargs) -> str: + # Replace with your tool code. + # Usually connection contains configs to connect to an API. + # Use CustomConnection is a dict. You can use it like: connection.api_key, connection.api_base + # Not all tools need a connection. You can remove it if you don't need it. + message = Template(prompt, trim_blocks=True, keep_trailing_newline=True).render(**kwargs) + return message diff --git a/examples/tools/tool-package-quickstart/my_tool_package/yamls/tool_with_prompt_template_input.yaml b/examples/tools/tool-package-quickstart/my_tool_package/yamls/tool_with_prompt_template_input.yaml new file mode 100644 index 000000000000..daaa42674cd3 --- /dev/null +++ b/examples/tools/tool-package-quickstart/my_tool_package/yamls/tool_with_prompt_template_input.yaml @@ -0,0 +1,10 @@ +my_tool_package.tools.tool_with_prompt_template_input.my_tool: + name: Tool with PromptTemplate + description: This is a tool to demonstrate the usage of PromptTemplate + type: custom_llm + module: my_tool_package.tools.tool_with_prompt_template_input + function: my_tool + inputs: + connection: + type: + - CustomConnection diff --git a/examples/tools/tool-package-quickstart/tests/test_tool_with_prompt_template_input.py b/examples/tools/tool-package-quickstart/tests/test_tool_with_prompt_template_input.py new file mode 100644 index 000000000000..d015a8a6fbfc --- /dev/null +++ b/examples/tools/tool-package-quickstart/tests/test_tool_with_prompt_template_input.py @@ -0,0 +1,28 @@ +import pytest +import unittest + +from promptflow.connections import CustomConnection +from my_tool_package.tools.tool_with_prompt_template_input import my_tool + + +@pytest.fixture +def my_custom_connection() -> CustomConnection: + my_custom_connection = CustomConnection( + { + "api-key" : "my-api-key", + "api-secret" : "my-api-secret", + "api-url" : "my-api-url" + } + ) + return my_custom_connection + + +class TestToolWithPromptTemplateInput: + def test_tool_with_prompt_template_input(self, my_custom_connection): + result = my_tool(my_custom_connection, "Hello {{text}}", text="Microsoft") + assert result == "Hello Microsoft" + + +# Run the unit tests +if __name__ == "__main__": + unittest.main()