nikkie-ftnextの日記

イベントレポートや読書メモを発信

Prompt flowをローカルで動かす 〜OpenAIのGPTにリクエスト〜

はじめに

スタロー1〜3幕リリイベ、ありがとうございました! nikkieです。

世はまさに大LLM時代!
日々新しいツールがどんどん登場しています。
その中から(最近出てきたツールではないですが)MicrosoftによるPrompt flowを触りました。

目次

Prompt flow

Azureの機械学習機能の1つとして始まり、1年くらい前からOSSになったようです。

ドキュメント

ソースコード

Pythonライブラリ(SDK)

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の力も借りて)他の方の手元でも動かせるんじゃないかと思います


  1. ドキュメントでは「Connections are for storing information about how to access external services like LLMs: endpoint, api keys etc.」
  2. 環境変数を参照するようにも書けるようでした。ref: https://microsoft.github.io/promptflow/how-to-guides/manage-connections.html#load-from-environment-variables
  3. standard flowを今回触っています
  4. なお私は未設定なので、YAMLのmodelをo1に変えるとエラーが返ります。「The model o1 does not exist or you do not have access to it.」