こんにちは。リーデックス小川です。
今回は、オープンソースのRAG「Dify」とプリザンターのデータを自動連携するサーバスクリプトを実装しましたのでご紹介いたします。
今回の記事は、前後半に分けています。前半部はRAGやDifyについての概要、Difyの設定について、後半は、プリザンターまわりの設定とサーバスクリプトについてご紹介いたします。
前半部分はQiitaOSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2024の記事としてご紹介していますので、まずは下記を先にご覧ください。
RAGを利用することで、プリザンターのデータを有効活用することができます。Difyへの登録も、APIで簡単に連携することが可能ですので、ぜひご参考ください。
プリザンターの準備
テーブルの作成
それでは、プリザンター側の準備を始めます。まずは、プリザンターのテーブルを作成します。
新規テーブルを作成し、下記の項目を「テーブルの管理」→「エディタ」の「現在の設定」に設定します。
・タイトル
・質問(内容)
・回答(説明A)
・Dify登録(説明B)
Difyのナレッジへ登録する時にタイトルが必要になるため、タイトルには00001から連番が入るように設定しています。なお、プリザンターでは連番は自動採番で実現することができます。自動採番については、下記ブログにまとめられていますのでご参考ください。
また、Difyの登録APIで連携したときのレスポンス情報を保存するDify登録(説明B)も併せて作成しておきます。

サーバスクリプトの作成
では、実際にAPIで連携するプログラムを作成します。プリザンターにレコードが登録されたときに、Difyの登録用APIを呼び出してナレッジに登録します。また、今回はプリザンターのテーブル1レコードと、ナレッジの1データ(ドキュメント)が対応する仕様としています。
サーバスクリプトを使用して、プリザンターで新規でデータを登録した時にDifyのナレッジ登録するよう、サーバスクリプトの条件を「作成前」にスクリプトを登録しました。

具体的なプログラムは、下記となります。
// 必要な情報を設定 let datasetId = DATASET_ID; // DifyのデータセットID let apiKey = APIKEY; // DifyのAPIキー let apiUrl = "http://difyのURL/v1/datasets/" + datasetId + "/document/create_by_text"; let name = model.Title; let body = model.Body; let descriptionA = model.DescriptionA; let text = body + "\n\n" + descriptionA; // POSTリクエストの内容 let postData = JSON.stringify({ name: body, text: text, indexing_technique: "high_quality", process_rule: { mode: "automatic" } }); try { // HTTPリクエストを送信 httpClient.RequestUri = apiUrl; httpClient.Content = postData; httpClient.RequestHeaders.Add("Authorization", "Bearer " + apiKey); let response = httpClient.Post(); // レスポンスの確認 if (httpClient.IsSuccess) { context.Log("Document created successfully: " + response); model.DescriptionB = response; } else { context.Error('Error: (' + httpClient.StatusCode + ')' + response); } } catch (e) { context.Error(e.stack); }
簡単にソースコードの説明すると、データセットIDを含む登録用APIのエンドポイントを使用し、httpリクエストを送信します。リクエストの内容については、Difyの登録で使用するフォーマットに従い、質問とその答えをJSON形式で設定します。DifyのAPIについては「APIによるデータセットの維持 | Dify」をご覧ください。
プリザンターでhttpリクエストを実行したい場合は、httpClientモジュールを使用します。Difyのデータ登録のメソッドはPOSTを利用するため、URLやheaderを設定し、httpClient.Post()メソッドにてリクエストを送信します。
CSVファイルのインポート
では、CSVファイルをインポートしてみましょう。今回は、プリザンターの質問と回答のサンプル(ダミーデータ)をChatGPTで作成し、インポートできるようにCSVファイルとして用意しました。

プリザンターのサーバスクリプトの条件「作成時」は、画面からの新規作成だけではなく、インポートでデータが新規作成された場合でも、レコード1行に対して1回スクリプトが実行されます。
では、プリザンターのテーブルにQAサンプルデータをインポートしてみましょう。CSVデータを選択し、先ほどのファイルを選択し、インポートを実行します。

インポート処理が完了すると、テーブルにデータが登録されます。

Difyのナレッジを確認
次に、Dify側のデータを見てみましょう。最初に作ったの空のナレッジにはデータが入っていませんでしたが、

先ほどのインポート処理で、サーバスクリプトのAPI送信処理が実行され、QAデータが無事にDifyのナレッジに登録されました。

応用編
今回ご紹介したサーバスクリプトは登録処理だけでしたが、プリザンターのレコードを更新、削除したタイミングで、Difyのナレッジのデータを更新、削除するサーバスクリプトを実装することも可能です。
また、DifyではほかのWebページにDifyで設定したチャットボット機能を簡単に追加することができます。プリザンターの「テーブルの管理」→「HTML」に、Difyから提供されるJavascriptのコードを登録するだけで、下記のようにページ右下にチャットボット機能を埋め込むことが可能です。

アイコンをクリックすると、チャットボットが表示され、実際に使用することができます。

また、チャットボットで質問した内容を、別のナレッジに登録したり、プリザンターに新しい質問用テーブルを作成し、APIを使用してDify側からプリザンターに登録することも可能です。
まとめ
今回は、オープンソースのRAG「Dify」にプリザンターのデータをサーバスクリプトで連携させてみました。生成AIを使ったソリューションが比較的簡単に利用できますので、ぜひチャレンジしてみてください。
弊社では、スクリプトやスタイルを利用したカスタマイズについてご支援させていただいております。スクリプトについて相談したい、業務を改善のために実現したい機能がある、や、本記事や過去の記事のスクリプトを応用したい、などありましたら、お気軽にお問合せください。
それでは、今回はこの辺で。
最後までご覧いただき、ありがとうございました。