Power Platformとは全く関係ないですが、たまには他のツールも触ってみようということで生成AIを用いたワークフローが簡単に作れるDifyと、神タスク管理ツールであるNotionを連携させてレシピ管理システムを一日で作成したので備忘的に内容を説明します。
前回の概要&セットアップ編に続いて、今回はレシピ管理システムの核心部分であるレシピ登録機能について解説します。
実行結果
こんな感じでURLを入力するだけで自動でレシピDBが完成します。便利です。

レシピ登録機能の概要
最初の質問分類で、レシピを含むURLかレシピのテキストが入力された場合に実行される処理を説明します。

クラス1としてURLが入力された場合はURL内のテキストを、クラス2としてレシピが入力された場合はそのテキストを解析してNotionのAPIで登録できる形式に整形します。

ちなみにこの機能だけならiPhoneアプリのRecipinというアプリでもできます。
買うものリスト機能はないのでDifyで作りました。
「Recipin シンプルなお料理レシピ保存・管理アプリ」をApp Storeで
レシピ登録プロセス
ユーザー入力・質問分類
先述の通りユーザー入力をクラス1~4に分類して条件分岐します。

クラス2としてレシピのテキストが入力された場合は中間処理をスキップして変数集約器にぶち込みます。

URL解析
再度質問分類器を使用してYouTubeのURLかどうかで分岐しています。
Transcripts APIがあまり正常に動作しないので、空の場合はJinaReaderで処理されるようにフローを組んでいます。

JinaReaderはURLの中のテキストを読み取ってくれるAPIで、無料で使えます。クオリティもいいです。
Reader API
パラメータ抽出

YouTube Transcript, Jinaまたはユーザー入力を変数集約器でまとめ、そのうち有効なものをレシピ抽出LLMでレシピを抽出します。


HTTPリクエストのボディは文字エスケープが面倒なのでLLMで成形してから入力します。
いくらプロンプトを工夫しても頭に'''jsonとついてしまうので、正しい形式になっていない場合は修正されるようにしています。現状エラー処理はIf/Elseで対応するしかなさそう。

Notion APIでレシピ登録
ここまででJSONを整形できたので、Notion APIでNotionにレシピを登録します。

POST | https://api.notion.com/v1/pages/ |
Authorization | Bearer [NOTION_API_KEY] |
Content-Type | application/json |
Notion-Version | 2022-06-28 |
ボディ | 以下に記載 |
{
"parent": { "database_id": "NOTION_DATABASE_ID" },
"properties": {
"名前": {
"title": [
{
"text": {
"content": "レシピ名"
}
}
]
},
"手順": {
"rich_text": [
{
"text": {
"content": "手順の詳細"
}
}
]
},
"材料": {
"rich_text": [
{
"text": {
"content": "材料の詳細"
}
}
]
},
"タグ": {
"multi_select": [
{ "name": "タグ1" },
{ "name": "タグ2" }
]
},
"時間": {
"number": 30
},
"URL": {
"url": "https://example.com/recipe"
}
}
}
プロパティ別の記法は以下を参考にしました。
Notion APIからDBアイテムを追加するときのプロパティごとの書き方 | ブログ | 静岡県のホームページ制作 | 6666666 セブンシックス
その他Notion APIを使用するにあたって参考にさせていただいた記事です。
Notion APIでWeb API操作を勉強してみた #Python - Qiita
Notion API を使用してデータベースを操作する
コメント