e768098d0e
tools_continuous_delivery / Private PyPI non-main branch release (push) Has been skipped
tools_continuous_delivery / Private PyPI main branch release (push) Failing after 2m42s
Publish Promptflow Doc / Build (push) Has been cancelled
Publish Promptflow Doc / Deploy (push) Has been cancelled
Flake8 Lint / flake8 (push) Has been cancelled
Spell check CI / Spell_Check (push) Has been cancelled
156 lines
3.8 KiB
Markdown
156 lines
3.8 KiB
Markdown
# Function based flow
|
|
|
|
:::{admonition} Experimental feature
|
|
This is an experimental feature, and may change at any time. Learn [more](../faq.md#stable-vs-experimental).
|
|
:::
|
|
|
|
User can directly use a function as flow entry.
|
|
|
|
## Function as a flow
|
|
|
|
Assume we have a file `flow_entry.py`:
|
|
|
|
```python
|
|
from promptflow.tracing import trace
|
|
|
|
class Reply(TypedDict):
|
|
output: str
|
|
|
|
@trace
|
|
def my_flow(question: str) -> Reply:
|
|
# flow logic goes here
|
|
pass
|
|
```
|
|
|
|
**Note** function decorated with `@trace` will emit trace can be viewed in UI provided by PromptFlow. Check [here](../tracing/index.md) for more information.
|
|
|
|
## Flow test
|
|
|
|
### Test via function call
|
|
|
|
Since flow's definition is normal python function/callable class. We recommend user directly run it like running other scripts:
|
|
|
|
```python
|
|
from flow_entry import my_flow
|
|
|
|
if __name__ == "__main__":
|
|
output = my_flow(question="What's the capital of France?")
|
|
print(output)
|
|
```
|
|
|
|
### Convert to a flow and test
|
|
|
|
It's also supported to convert your function entry to a flow and test with prompt flow's ability.
|
|
|
|
You can test with the following CLI:
|
|
|
|
```bash
|
|
# flow entry syntax: path.to.module:function_name
|
|
pf flow test --flow flow_entry:my_flow --inputs question="What's the capital of France?"
|
|
```
|
|
|
|
**Note**: currently this command will generate a flow.flex.yaml in your working directory. Which will become the flow's entry.
|
|
|
|
Check out a full example here: [basic](https://github.com/microsoft/promptflow/tree/main/examples/flex-flows/basic)
|
|
|
|
### Chat with a flow
|
|
|
|
Start a UI to chat with a flow:
|
|
|
|
```bash
|
|
pf flow test --flow flow_entry:my_flow --inputs question="What's the capital of France?" --ui
|
|
```
|
|
|
|
Check [here](../chat-with-a-flow/index.md) for more information.
|
|
|
|
## Batch run
|
|
|
|
User can also batch run a flow.
|
|
|
|
::::{tab-set}
|
|
:::{tab-item} CLI
|
|
:sync: CLI
|
|
|
|
```bash
|
|
pf run create --flow "path.to.module:function_name" --data "./data.jsonl"
|
|
```
|
|
|
|
:::
|
|
|
|
:::{tab-item} SDK
|
|
:sync: SDK
|
|
```python
|
|
|
|
from path.to.module import my_flow
|
|
# Note directly run function in `pf.run` is only supported in local PFClient for now
|
|
pf.run(flow=my_flow, data="./data.jsonl")
|
|
|
|
# user can also directly use entry in `flow` param for batch run
|
|
pf.run(flow="path.to.module:function_name", data="./data.jsonl")
|
|
```
|
|
:::
|
|
::::
|
|
|
|
Learn more on this topic on [Run and evaluate a flow](../run-and-evaluate-a-flow/index.md)
|
|
|
|
## Define a flow yaml
|
|
|
|
User can write a YAML file with name `flow.flex.yaml` manually or save a function/callable entry to YAML file.
|
|
This is required for advanced scenario like deployment or run in cloud.
|
|
A flow YAML may look like this:
|
|
|
|
```yaml
|
|
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json
|
|
entry: path.to.module:function_name
|
|
sample:
|
|
inputs:
|
|
question: "what's the capital of France?"
|
|
```
|
|
|
|
## Batch run with YAML
|
|
|
|
User can batch run a flow with YAML.
|
|
|
|
::::{tab-set}
|
|
:::{tab-item} CLI
|
|
:sync: CLI
|
|
|
|
```bash
|
|
# against flow file
|
|
pf run create --flow "path/to/flow/flow.flex.yaml" --data "./data.jsonl"
|
|
# against a folder if it has a flow.flex.yaml file
|
|
pf run create --flow "path/to/flow" --data "./data.jsonl"
|
|
```
|
|
|
|
:::
|
|
|
|
:::{tab-item} SDK
|
|
:sync: SDK
|
|
|
|
```python
|
|
pf = PFClient()
|
|
pf.run(flow="./flow.flex.yaml", data="./data.jsonl")
|
|
```
|
|
|
|
:::
|
|
::::
|
|
|
|
## Deploy a flow
|
|
|
|
User can serve a flow as a http endpoint locally or deploy it to multiple platforms.
|
|
|
|
```bash
|
|
# serve locally from a folder if it has a flow.flex.yaml file
|
|
pf flow serve --source "path/to/flow/dir" --port 8088 --host localhost
|
|
|
|
# serve locally from certain file
|
|
pf flow serve --source "./flow.flex.yaml" --port 8088 --host localhost
|
|
```
|
|
Learn more: [Deploy a flow](../deploy-a-flow/index.md).
|
|
|
|
## Next steps
|
|
|
|
- [Class based flow](./class-based-flow.md)
|
|
- [Input output format](./input-output-format.md)
|
|
- [Function based flow sample](https://github.com/microsoft/promptflow/blob/main/examples/flex-flows/basic/README.md)
|