はじめに
スタロー1〜3幕リリイベ、ありがとうございました! nikkieです。
世はまさに大LLM時代!
日々新しいツールがどんどん登場しています。
その中から(最近出てきたツールではないですが)MicrosoftによるPrompt flowを触りました。
目次
Prompt flow
Azureの機械学習機能の1つとして始まり、1年くらい前からOSSになったようです。
Prompt flowって元々Azure MLの1機能だったけど、今はMITライセンスのOSSなので、Azure使わなくても利用が可能です。VSCode拡張でGUIでローカル開発しながらDockerコンテナにしてAPIとして外部のサーバへデプロイすることも可能。
— Hirosato Gamo | AI Cloud Solution Architect (@hiro_gamo) 2024年1月31日
OSSとしてのPrompt flowのドキュメントは↓https://t.co/F1xYn7qPqO pic.twitter.com/OxLqwjEXdw
ドキュメント
https://pypi.org/project/promptflow/
Prompt flowをローカルで動かす
フューチャー技術ブログを参考にしました(執筆に感謝🫶)
環境構築
- uv 0.5.17 (Homebrew 2025-01-10)
- Python 3.11.8
- promptflow 1.17.1
- promptflow-tools 1.4.0
- VS Code拡張「Prompt flow for VS Code」をインストール
依存ライブラリの詳細なバージョンはuv.lock
を参照ください。
https://github.com/ftnext/ml-playground/blob/9634078896ee7772ec4f34ae04a06e5a87cdc5e9/promptflow/uv.lock
環境構築後にpf
コマンドが使えるようになっています。
% uv run pf --help usage: pf [-h] [-v] {config,connection,flow,run,tool,trace,service,upgrade} ... pf: manage prompt flow assets. Learn more: https://microsoft.github.io/promptflow.
Connectionの作成
Connectionとは、LLMのような外部サービスにアクセスするための情報を保存するもの1。
https://microsoft.github.io/promptflow/concepts/concept-connections.html
今回はOpenAIのLLM(GPT)を使うためのAPIキーなどです。
ConnectionはYAMLから読み込むようで、以下をパクったファイルを作ります。
https://github.com/microsoft/promptflow/blob/promptflow_1.17.1/examples/connections/openai.yml
. ├── .venv/ ├── connections/ │ └── openai.yml # パクって作成 ├── pyproject.toml └── uv.lock
Connection作成コマンド
(環境変数OPENAI_API_KEY
を設定済みです2)
% uv run pf connection create --file connections/openai.yml --set api_key=$OPENAI_API_KEY
uv run pf connection list
で「open_ai_connection」があることが確認できます
Flowの作成
Flowとは、(Prompt flowを体験した感想が混ざりますが、)LLMを使ったアプリケーションの表現という理解です。
DAG(有向非巡回グラフ)で表現されたワークフローのような感じでした3。
ref: https://microsoft.github.io/promptflow/concepts/concept-flows.html#dag-flow
実体はディレクトリに置かれたファイル一式と捉えています。
Flow作成コマンド
% uv run pf flow init --flow my-first-flow
my-first-flow
ディレクトリ以下がスキャフォールディングされました
. ├── .venv/ ├── connections/ │ └── openai.yml ├── my-first-flow/ │ ├── .promptflow/ │ │ └── flow.tools.json │ ├── .gitignore │ ├── data.jsonl │ ├── flow.dag.yaml │ ├── hello.jinja2 │ ├── hello.py │ └── requirements.txt ├── pyproject.toml └── uv.lock
Prompt flowは、プロンプト(テンプレートエンジン Jinja2をサポート)やPythonコード(スクリプト)をつないでFlowを構成できるようです。
こんなことできるんだ〜となった例がこちら:
https://github.com/microsoft/promptflow/tree/promptflow_1.17.1/examples/flows/standard/web-classification
FlowにURLが渡されると、スクリプトでHTMLを取得して、LLMにプロンプトを送って要約や分類をさせています
今回はこぢんまりと、LLMを呼び出すだけとしました。
スキャフォールドされたファイルのうち使わないものを削除して
. ├── .venv/ ├── connections/ │ └── openai.yml ├── my-first-flow/ │ ├── .promptflow/ │ │ └── flow.tools.json │ ├── .gitignore │ ├── flow.dag.yaml │ └── llm_node.jinja2 # 新規作成(LLMに送るプロンプト) ├── pyproject.toml └── uv.lock
flow.dag.yaml
はVS Code拡張により、Visual editorでも開けます。
今回は構成要素が少ないフローなので、YAMLを直で書きました
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Flow.schema.json inputs: text: type: string default: こんにちは!あなたのことをなんと呼べばいいですか? outputs: response: type: string reference: ${llm_node.output} nodes: - name: llm_node type: llm source: type: code path: llm_node.jinja2 inputs: model: gpt-4o-mini max_tokens: 20 question: ${inputs.text} connection: open_ai_connection api: chat
Flow実行!
Flow my-first-flow
をテスト実行します。
デフォルト値が使われています(--inputs
引数で与えられもします)
% uv run pf flow test --flow my-first-flow Starting prompt flow service... Start prompt flow service on 127.0.0.1:23334, version: 1.17.1. You can stop the prompt flow service with the following command:'pf service stop'. 2025-01-12 12:15:16 +0900 55641 execution.flow INFO Start executing nodes in thread pool mode. 2025-01-12 12:15:16 +0900 55641 execution.flow INFO Start to run 1 nodes with concurrency level 16. 2025-01-12 12:15:16 +0900 55641 execution.flow INFO Executing node llm_node. node run id: ca010d9c-b109-4868-bef2-541d48b4b953_llm_node_0 2025-01-12 12:15:16 +0900 55641 execution.flow INFO Node llm_node completes. { "response": "こんにちは!私はAIアシスタントですので、「アシスタント」と呼んでもら" }
% uv run pf flow test --flow my-first-flow --inputs text='Prompt flowで川柳を詠んで' { "response": "もちろんです!川柳を詠みますね。\n\n春の風 \n桜舞い" }
OpenAIのLLM(GPT-4o-mini)に、プロンプトを送ることができました!4
終わりに
Prompt flowをローカルで動かしました。
LLM関係のツールはどちらかというと追えていない身なので、「Prompt flow知ってたら、これまでのLLMアプリの開発、少しは楽できたかもな」という感想です。
LangChainでバリバリ書いてもよいと思いますが、Prompt flowはプロンプトやスクリプトをつないでピタゴラスイッチ的にLLMアプリを組み上げるというアプローチだと思っています。
開発者向けDify的な?
今回は疎通確認で、触ったのはごくごく一部の機能です。
多量のデータで実行もできますし、プロンプトを変更した時の評価もできるみたいでした
リポジトリをクローンしてConnectionだけ設定したら、(uvの力も借りて)他の方の手元でも動かせるんじゃないかと思います
- ドキュメントでは「Connections are for storing information about how to access external services like LLMs: endpoint, api keys etc.」↩
- 環境変数を参照するようにも書けるようでした。ref: https://microsoft.github.io/promptflow/how-to-guides/manage-connections.html#load-from-environment-variables↩
- standard flowを今回触っています↩
-
なお私は未設定なので、YAMLのmodelを
o1
に変えるとエラーが返ります。「The modelo1
does not exist or you do not have access to it.」↩