はじめに
人の夢は!!!終わらねェ!!!! nikkieです。
Prompt flowはAzure発なのでGeminiはサポートしていないのですが、触っている中で「私が知ってる範囲の情報を組み合わせたらできるよな?」と思っちゃったので手を動かしました。
内容が内容なので、後日Microsoftさんから校舎裏へ呼び出されるかもしれません(そのときはGoogleさんも一緒に来てください🙏)
目次
- はじめに
- 目次
- Prompt flow
- GeminiのOpenAI互換API
- Prompt flowでOpenAI互換のGeminiを使うぞ!!
- 終わりに
- P.S. GeminiのOpenAI互換APIのbase_urlって?
Prompt flow
Azureの機械学習機能の1つとして始まり、OSSとなりました。
Pythonがあれば動かせ、プロンプトやPythonスクリプトを組合せてLLMアプリを作れるツールと理解しました(プロンプトを変えた時の検証もできるようですが、私の手が回っていません)
サポートしているLLMは、Azure OpenAIやOpenAI。
https://microsoft.github.io/promptflow/concepts/concept-connections.html
過去の記事では、OpenAIのGPTを使いました。
GeminiのOpenAI互換API
実はGeminiもOpenAIの互換エンドポイントをベータで提供しています
ライブラリopenaiからGeminiが叩けるんです!
from openai import OpenAI client = OpenAI( api_key="gemini_api_key", base_url="https://generativelanguage.googleapis.com/v1beta/" ) response = client.chat.completions.create( model="gemini-1.5-flash", # gemini-2.0-flash-exp もいけます! # 省略 )
これらから導き出される結論は...
Prompt flowでOpenAI互換のGeminiを使うぞ!!
環境構築
promptflow-toolsをPyPIからではなく、promptflowのGitHubリポジトリからインストールする必要があります(差分の内容については後述)。
私は(前回同様)uvを使いましたが、pip installする場合は以下になります
% pip install promptflow 'promptflow-tools @ git+https://github.com/microsoft/promptflow.git@promptflow_1.17.1#subdirectory=src/promptflow-tools'
Connectionの作成
$schema: https://azuremlschemas.azureedge.net/promptflow/latest/OpenAIConnection.schema.json name: gemini_connection type: open_ai api_key: "<user-input>" base_url: https://generativelanguage.googleapis.com/v1beta/
% uv run pf connection create --file connections/gemini_compatible_openai.yml --set api_key=$GOOGLE_API_KEY
ここでGOOGLE_API_KEYに設定しているのは、無料枠のあるGoogle AIのGemini APIです。
本番利用に向くVertex AIではありません。
ref: https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/overview?hl=ja#how-gemini-vertex-different-gemini-aistudio
できました🙌
type: code
path: llm_node.jinja2
inputs:
- model: gpt-4o-mini
+ model: gemini-2.0-flash-exp
max_tokens: 20
question: ${inputs.text}
- connection: open_ai_connection
+ connection: gemini_connection
api: chat
% uv run pf flow test --flow my-first-flow --inputs text='Prompt flowで川柳を詠んで'
Prompt flow service has started...
2025-01-12 14:05:22 +0900 80199 execution.flow INFO Start executing nodes in thread pool mode.
2025-01-12 14:05:22 +0900 80199 execution.flow INFO Start to run 1 nodes with concurrency level 16.
2025-01-12 14:05:22 +0900 80199 execution.flow INFO Executing node llm_node. node run id: 9ef3edd8-c23a-4601-93d8-48ad2b0e02f5_llm_node_0
2025-01-12 14:05:23 +0900 80199 execution.flow INFO Node llm_node completes.
{
"response": "はい、承知いたしました。Prompt flowを使って川柳を詠みます。\n\nどのようなテーマの川"
}
OpenAI互換のGeminiが叩けるようになる差分
リポジトリからインストールした点についてです。
実は、OpenAI互換を謳うGeminiのエンドポイントはOpenAI互換ではありません。
ベータ版ではいくつかのパラメタをサポートしていないのだと思われます。
PyPIからインストールするpromptflow-toolsと、リポジトリの最新のpromptflow-toolsの差分が結果的にこの点を吸収していました。
PyPIのpromptflow-tools (1.4.0) からOpenAIのAPIに送られるリクエスト
https://github.com/microsoft/promptflow/blob/v1.4.0-tools/src/promptflow-tools/promptflow/tools/openai.py#L118-L129
params = {
"model": model,
"messages": messages,
"temperature": float(temperature),
"top_p": float(top_p),
"n": int(n),
"stream": stream,
"max_tokens": int(max_tokens) if max_tokens is not None and str(max_tokens).lower() != "inf" else None,
"presence_penalty": float(presence_penalty),
"frequency_penalty": float(frequency_penalty),
"user": user,
}
リポジトリの最新のpromptflow-tools (タグ promptflow_1.17.1)からOpenAIのAPIに送られるリクエスト
https://github.com/microsoft/promptflow/blob/promptflow_1.17.1/src/promptflow-tools/promptflow/tools/openai.py#L118-L124
params = {
"model": model,
"messages": messages,
"temperature": temperature,
"top_p": top_p,
"stream": stream,
}
PyPI版のpromptflow-toolsのリクエストをGeminiに送ると、400 Bad Requestが返ってきました
Unknown name "frequency_penalty"
Unknown name "presence_penalty"
Unknown name "user"
リポジトリからpromptflow-toolsをインストールすると、この3つはデフォルトでは入ってこないようです。
OpenAIのGPTたちのAPIリファレンスにはこれらは記載されています。
https://platform.openai.com/docs/api-reference/chat/create
GoogleのGeminiのAPIリファレンスには制限の記載がありました。
https://ai.google.dev/gemini-api/docs/openai?hl=ja#current-limitations
OpenAI互換エンドポイントのベータが外れる(=GA)を期待しています!
終わりに
Prompt flowで、Geminiは叩けます!
Geminiが解放されたので、これはPrompt flowを使った開発が捗っちゃいますね、むふふ。
Microsoftさん、現行の最新コードでpromptflow-toolsをリリースしてほしいな〜
Geminiを動かしてみたい方は、以下のコミットのソースコードを取得し、Connectionだけ設定していただければと思います!
(記事執筆に当たり、以下のハックは不要と分かりました)
GeminiはOpenAI互換のAPIをベータサポートしているので、MicrosoftのPrompt flowでGeminiを叩いてやったぜ〜(ほうぼうに喧嘩を売るやんちゃ✌️)
— nikkie(にっきー) / にっP (@ftnext) 2025年1月11日
ベータサポートで以下のパラメタは非対応(指定すると400 Bad Request)だから、除くパッチを当てたぜ
presence_penalty, frequency_penalty, user https://t.co/ImMYsObG7z
P.S. GeminiのOpenAI互換APIのbase_urlって?
指定の仕方が2通りある、みたいです。
Connectionを作り直して、どちらでも動きました
(1) ref: Gemini is now accessible from the OpenAI Library - Google Developers Blog
base_url="https://generativelanguage.googleapis.com/v1beta/"
(2) ref: OpenAI の互換性 | Gemini API | Google AI for Developers
base_url="https://generativelanguage.googleapis.com/v1beta/openai/"
2通りあると知ったなら、個人的には(2)にしたいかもです