Update document_2_dify_workflow.ipynb
Browse files- document_2_dify_workflow.ipynb +122 -108
document_2_dify_workflow.ipynb
CHANGED
@@ -22,7 +22,8 @@
|
|
22 |
},
|
23 |
"outputs": [],
|
24 |
"source": [
|
25 |
-
"!pip install gradio unstructured[pdf] langchain-community"
|
|
|
26 |
]
|
27 |
},
|
28 |
{
|
@@ -40,84 +41,45 @@
|
|
40 |
"execution_count": null,
|
41 |
"outputs": []
|
42 |
},
|
43 |
-
{
|
44 |
-
"cell_type": "code",
|
45 |
-
"source": [
|
46 |
-
"import requests\n",
|
47 |
-
"import json\n",
|
48 |
-
"url = DIFY_BASE_URL + \"/workflows/run\"\n",
|
49 |
-
"\n",
|
50 |
-
"headers = {\n",
|
51 |
-
" \"Content-Type\": \"application/json\",\n",
|
52 |
-
" \"Authorization\": f\"Bearer {DIFY_API_KEY_MYWORKFLOW}\"\n",
|
53 |
-
"}\n",
|
54 |
-
"\n",
|
55 |
-
"data = {\n",
|
56 |
-
" \"inputs\": {\n",
|
57 |
-
" \"knowledge\":\"\"\"\n",
|
58 |
-
" 本作の悪役。千年以上前に生まれた最初の鬼。鬼達の絶対的支配者で、自身の血を人間に与え大量の鬼を作り出した。炭治郎の家族を殺し、禰󠄀豆子を鬼に変えた仇である。\n",
|
59 |
-
"鬼達を血に仕込んだ呪いで支配し、「あの方」と呼ばれ恐れられている。外見や攻撃は自由自在で、不死身の鬼を殺すことができる。性格は冷酷非情かつ支配的で、自らの意志に沿わない者は決して許さず、忠実に従っていた下弦の鬼達を些細なことで何ら躊躇なく惨殺したり、報告に来た猗窩座に理不尽な叱責を与えるなどしている。珠世からはその人物像を「いつも何かに怯えている臆病者」と皮肉られている。癇癪で暴力を振るったり、自分を棚に上げた言動をすることも多い。\n",
|
60 |
-
"\n",
|
61 |
-
" \"\"\",\n",
|
62 |
-
" },\n",
|
63 |
-
" \"query\": \"\", # クエリ(オプション)\n",
|
64 |
-
" \"response_mode\": \"streaming\", # ストリーミング応答\n",
|
65 |
-
" \"user\": \"abc_123\", # ユーザーID\n",
|
66 |
-
"}\n",
|
67 |
-
"\n",
|
68 |
-
"response = requests.post(url, headers=headers, json=data, stream=True)\n",
|
69 |
-
"\n",
|
70 |
-
"response.raise_for_status() # エラーチェック\n",
|
71 |
-
"\n",
|
72 |
-
"response = requests.post(url, headers=headers, json=data, stream=True)\n",
|
73 |
-
"response.raise_for_status()\n",
|
74 |
-
"\n",
|
75 |
-
"assistant_message = \"\"\n",
|
76 |
-
"outputs = {}\n",
|
77 |
-
"\n",
|
78 |
-
"# APIレスポンスのチャンク処理\n",
|
79 |
-
"for chunk in response.iter_lines(delimiter=b\"\\n\\n\"):\n",
|
80 |
-
" if chunk:\n",
|
81 |
-
" chunk_data = chunk.decode(\"utf-8\").strip()\n",
|
82 |
-
" if chunk_data.startswith(\"data:\"):\n",
|
83 |
-
" json_data = chunk_data[6:] # \"data: \"を取り除く\n",
|
84 |
-
" if json_data:\n",
|
85 |
-
" result = json.loads(json_data)\n",
|
86 |
-
" if result.get(\"event\") == \"text_chunk\":\n",
|
87 |
-
" answer = result.get(\"data\", \"\").get(\"text\", \"\")\n",
|
88 |
-
" assistant_message += str(answer)\n",
|
89 |
-
" print(str(answer), end=\"\", flush=True)\n",
|
90 |
-
" elif result.get(\"event\") == \"workflow_finished\":\n",
|
91 |
-
" outputs = result.get('data', \"\")\n",
|
92 |
-
" print(assistant_message, outputs)"
|
93 |
-
],
|
94 |
-
"metadata": {
|
95 |
-
"id": "_1LzsFX7rve1"
|
96 |
-
},
|
97 |
-
"execution_count": null,
|
98 |
-
"outputs": []
|
99 |
-
},
|
100 |
{
|
101 |
"cell_type": "code",
|
102 |
"source": [
|
103 |
"import gradio as gr\n",
|
104 |
"import requests\n",
|
105 |
-
"from langchain_community.document_loaders import UnstructuredPDFLoader\n",
|
|
|
106 |
"import json\n",
|
107 |
"\n",
|
108 |
-
"def run_workflow(message):\n",
|
109 |
" try:\n",
|
110 |
-
"
|
111 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
112 |
"\n",
|
113 |
-
" # PDFファイルが選択されているかチェック\n",
|
114 |
-
" if not file:\n",
|
115 |
-
" return \"PDFファイルを選択してください。\", \"\"\n",
|
116 |
-
"\n",
|
117 |
-
" # PDFファイルをロードしてテキストを抽出\n",
|
118 |
-
" loader = UnstructuredPDFLoader(file)\n",
|
119 |
-
" data = loader.load()\n",
|
120 |
-
" raw_text = data[0].page_content\n",
|
121 |
"\n",
|
122 |
" # APIリクエストのための入力データを準備\n",
|
123 |
" inputs = {\n",
|
@@ -174,53 +136,57 @@
|
|
174 |
"# Gradioインターフェイスの設定\n",
|
175 |
"iface = gr.Interface(\n",
|
176 |
" fn=run_workflow,\n",
|
177 |
-
" inputs=[gr.MultimodalTextbox(label=\"PDFファイルをアップロード\", file_types=[\".pdf\"], interactive=True)
|
|
|
178 |
" outputs=[\n",
|
179 |
" gr.Textbox(label=\"生テキスト\", show_copy_button=True, max_lines=5),\n",
|
180 |
" gr.Markdown(),\n",
|
181 |
" gr.JSON()\n",
|
182 |
" ],\n",
|
183 |
-
" title=\"
|
184 |
-
" description=\"PDF
|
185 |
" article=\"\"\"\n",
|
186 |
"\n",
|
187 |
" © 2024 @tregu0458. All rights reserved.\n",
|
188 |
"\n",
|
189 |
-
"
|
190 |
-
"
|
191 |
-
"
|
192 |
-
"
|
193 |
-
"
|
194 |
-
"
|
195 |
-
"
|
196 |
-
"
|
197 |
-
"
|
198 |
-
"
|
199 |
-
"
|
200 |
-
"
|
201 |
-
"
|
202 |
-
"
|
203 |
-
"
|
204 |
-
"
|
205 |
-
"
|
206 |
-
"
|
207 |
-
"
|
208 |
-
"
|
209 |
-
"
|
210 |
-
"
|
211 |
-
"
|
212 |
-
"
|
213 |
-
"
|
214 |
-
"
|
215 |
-
"
|
216 |
-
"
|
217 |
-
"
|
218 |
-
"
|
219 |
-
"
|
220 |
-
"
|
221 |
-
"
|
222 |
-
"
|
223 |
-
"
|
|
|
|
|
|
|
224 |
" \"\"\"\n",
|
225 |
")\n",
|
226 |
"\n",
|
@@ -232,6 +198,54 @@
|
|
232 |
},
|
233 |
"execution_count": null,
|
234 |
"outputs": []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
235 |
}
|
236 |
]
|
237 |
}
|
|
|
22 |
},
|
23 |
"outputs": [],
|
24 |
"source": [
|
25 |
+
"!pip install gradio unstructured[pdf] langchain-community\n",
|
26 |
+
"!pip install youtube-transcript-api pytube"
|
27 |
]
|
28 |
},
|
29 |
{
|
|
|
41 |
"execution_count": null,
|
42 |
"outputs": []
|
43 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
{
|
45 |
"cell_type": "code",
|
46 |
"source": [
|
47 |
"import gradio as gr\n",
|
48 |
"import requests\n",
|
49 |
+
"from langchain_community.document_loaders import YoutubeLoader, UnstructuredPDFLoader, WebBaseLoader\n",
|
50 |
+
"from langchain_community.document_loaders import OnlinePDFLoader\n",
|
51 |
"import json\n",
|
52 |
"\n",
|
53 |
+
"def run_workflow(message,language='en'):\n",
|
54 |
" try:\n",
|
55 |
+
" if not message.get('text',''):\n",
|
56 |
+
" file = message['files'][0]\n",
|
57 |
+
" # PDFファイルをロードしてテキストを抽出\n",
|
58 |
+
" loader = UnstructuredPDFLoader(file)\n",
|
59 |
+
" data = loader.load()\n",
|
60 |
+
" raw_text = data[0].page_content\n",
|
61 |
+
" else:\n",
|
62 |
+
" text_message = message.get('text','')\n",
|
63 |
+
" if \"youtube.com\" in text_message or \"youtu.be\" in text_message:\n",
|
64 |
+
" # YouTubeの場合\n",
|
65 |
+
" loader = YoutubeLoader.from_youtube_url(\n",
|
66 |
+
" youtube_url=text_message,\n",
|
67 |
+
" add_video_info=True,\n",
|
68 |
+
" language=[language],\n",
|
69 |
+
" )\n",
|
70 |
+
" docs = loader.load()\n",
|
71 |
+
" raw_text = str(docs)\n",
|
72 |
+
" elif text_message.endswith(\".pdf\"):\n",
|
73 |
+
" # PDFの場合\n",
|
74 |
+
" loader = OnlinePDFLoader(text_message)\n",
|
75 |
+
" docs = loader.load()\n",
|
76 |
+
" raw_text = docs[0].page_content\n",
|
77 |
+
" else:\n",
|
78 |
+
" # それ以外の場合\n",
|
79 |
+
" loader = WebBaseLoader(text_message)\n",
|
80 |
+
" docs = loader.load()\n",
|
81 |
+
" raw_text = docs[0].page_content\n",
|
82 |
"\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
"\n",
|
84 |
" # APIリクエストのための入力データを準備\n",
|
85 |
" inputs = {\n",
|
|
|
136 |
"# Gradioインターフェイスの設定\n",
|
137 |
"iface = gr.Interface(\n",
|
138 |
" fn=run_workflow,\n",
|
139 |
+
" inputs=[gr.MultimodalTextbox(label=\"PDFファイルをアップロード\", file_types=[\".pdf\"], interactive=True),\n",
|
140 |
+
" gr.Dropdown(label=\"Language\",value=\"ja\",choices=[\"en\",\"en-US\", \"ja\", \"fr\",\"de\",\"it\"],allow_custom_value=True)],\n",
|
141 |
" outputs=[\n",
|
142 |
" gr.Textbox(label=\"生テキスト\", show_copy_button=True, max_lines=5),\n",
|
143 |
" gr.Markdown(),\n",
|
144 |
" gr.JSON()\n",
|
145 |
" ],\n",
|
146 |
+
" title=\"Documnet to Dify Workflow\",\n",
|
147 |
+
" description=\"このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。\",\n",
|
148 |
" article=\"\"\"\n",
|
149 |
"\n",
|
150 |
" © 2024 @tregu0458. All rights reserved.\n",
|
151 |
"\n",
|
152 |
+
"# PDF、YouTube、Web URLを入力としたDifyワークフロー\n",
|
153 |
+
"\n",
|
154 |
+
"このGradioインターフェイスでは、PDFファイル、YouTube動画、Webページを入力として受け取り、Dify APIワークフローを使用して処理することができます。PDFファイルをアップロードす��か、YouTube URLを提供するか、Web URLを入力するだけで、ワークフローがテキストコンテンツを抽出し、Dify APIを使用して処理します。\n",
|
155 |
+
"\n",
|
156 |
+
"## 特徴\n",
|
157 |
+
"- PDFファイル、YouTube動画、Webページを入力として対応\n",
|
158 |
+
"- `langchain_community.document_loaders`の`UnstructuredPDFLoader`と`OnlinePDFLoader`を使用してPDFファイルからテキストを抽出\n",
|
159 |
+
"- `langchain_community.document_loaders`の`YoutubeLoader`を使用してYouTube動画からテキストを抽出\n",
|
160 |
+
"- `langchain_community.document_loaders`の`WebBaseLoader`を使用してWebページからテキストを抽出\n",
|
161 |
+
"- 抽出されたテキストをDify APIワークフローで処理\n",
|
162 |
+
"- リアルタイム更新のためのストリーミングレスポンス処理\n",
|
163 |
+
"- 生テキスト、処理されたテキスト、JSON出力の表示\n",
|
164 |
+
"\n",
|
165 |
+
"## 使用方法\n",
|
166 |
+
"1. 入力フィールドにPDFファイルをアップロードするか、YouTube URLを提供するか、Web URLを入力します。\n",
|
167 |
+
"2. ドロップダウンから希望の言語を選択します(デフォルトは \"ja\")。\n",
|
168 |
+
"3. \"Submit\"ボタンをクリックして処理を開始します。\n",
|
169 |
+
"4. インターフェイスには、入力から抽出された生テキスト、Dify APIから処理されたテキスト、JSON出力が表示されます。\n",
|
170 |
+
"\n",
|
171 |
+
"## 使用コンポーネント\n",
|
172 |
+
"- Dify API\n",
|
173 |
+
"- Gradio\n",
|
174 |
+
"- langchain_community.document_loaders\n",
|
175 |
+
"\n",
|
176 |
+
"## ワークフローの仕様\n",
|
177 |
+
"### 入力\n",
|
178 |
+
"- Knowledge\n",
|
179 |
+
"### 出力\n",
|
180 |
+
"- Result\n",
|
181 |
+
"- Raw Content\n",
|
182 |
+
"### LLM\n",
|
183 |
+
"- gemini-1.5-flash-latest\n",
|
184 |
+
"\n",
|
185 |
+
"## 注意事項\n",
|
186 |
+
"- 処理は非同期的に実行され、ワークフローの進行に合わせてリアルタイムで結果が表示されます。\n",
|
187 |
+
"- `yield`文を使用して、処理の途中経過を表示しながら、最終的な結果を返します。\n",
|
188 |
+
"- エラー処理は、処理中に発生する可能性のある例外をキャッチして表示するように実装されています。\n",
|
189 |
+
"`run_workflow`関数は、入力メッセージを受け取り、指定された言語でDify APIワークフローを使用して処理を実行します。関数内では、入力タイプ(PDFファイル、YouTube URL、Web URL)に応じて適切なローダーを使用してテキストを抽出し、Dify APIにリクエストを送信して処理を行います。処理の進行状況に応じて、`yield`文を使用して中間結果を表示し、最終的な結果を返します。エラーが発生した場合は、例外をキャッチして適切なエラーメッセージを表示します。\n",
|
190 |
" \"\"\"\n",
|
191 |
")\n",
|
192 |
"\n",
|
|
|
198 |
},
|
199 |
"execution_count": null,
|
200 |
"outputs": []
|
201 |
+
},
|
202 |
+
{
|
203 |
+
"cell_type": "markdown",
|
204 |
+
"source": [
|
205 |
+
"# 利用規約\n",
|
206 |
+
"\n",
|
207 |
+
"本利用規約(以下、「本規約」といいます。)は、@tregu0458(以下、「私」といいます。)が提供するWebアプリケーション「tregu0458/document_2_dify_workflow」(以下、「本スクリプト」といいます。)の利用に関する条件を定めるものです。ユーザーは、本スクリプトを利用することにより、本規約に同意したものとみなされます。\n",
|
208 |
+
"\n",
|
209 |
+
"## 1. ライセンス\n",
|
210 |
+
"\n",
|
211 |
+
"1.1 本スクリプトは、商用・非商用を問わず利用することができます。\n",
|
212 |
+
"\n",
|
213 |
+
"1.2 本スクリプトは、複製、継承、改変することができます。\n",
|
214 |
+
"\n",
|
215 |
+
"1.3 本スクリプト、および複製、継承、改変したものを有償で再配布もしくは販売を行う場合は、事前に私にご相談ください。[X @ tregu0458](https://twitter.com/tregu0458)\n",
|
216 |
+
"\n",
|
217 |
+
"1.4 本スクリプトの利用にあたり、クレジットの表示は必須ではありません。ただし、\"@tregu0458\"の表示は、私の励みになります。\n",
|
218 |
+
"\n",
|
219 |
+
"## 2. 免責事項\n",
|
220 |
+
"\n",
|
221 |
+
"2.1 私は、本スクリプトの内容、情報の正確性、完全性、有用性、最新性、信頼性、安全性等について、いかなる保証も行いません。\n",
|
222 |
+
"\n",
|
223 |
+
"2.2 私は、ユーザーが本スクリプトを利用したことに起因して生じた損害について、一切の責任を負いません。\n",
|
224 |
+
"\n",
|
225 |
+
"## 3. 利用規約の変更\n",
|
226 |
+
"\n",
|
227 |
+
"私は、必要に応じて、本規約を変更することがあります。変更後の本規約は、���スクリプト上に表示された時点から効力を生じるものとします。\n",
|
228 |
+
"\n",
|
229 |
+
"## 4. 準拠法と管轄裁判所\n",
|
230 |
+
"\n",
|
231 |
+
"本規約は、日本法に準拠するものとします。本スクリプトに関して紛争が生じた場合は、[管轄裁判所]を第一審の専属的合意管轄裁判所とします。\n",
|
232 |
+
"\n",
|
233 |
+
"以上\n",
|
234 |
+
"\n",
|
235 |
+
"---\n",
|
236 |
+
"## OK例(相談不要)\n",
|
237 |
+
"1. 個人の勉強用に利用\n",
|
238 |
+
" - 学生が本スクリプトを参考に、youtube要約ワークフロー作成。\n",
|
239 |
+
"\n",
|
240 |
+
"2. 改変して無償公開\n",
|
241 |
+
" - エンジニアが本スクリプトを改変し、新機能を追加。Huggingface Spaceにデプロイし、MITラインセンスにて公開。\n",
|
242 |
+
"\n",
|
243 |
+
"3. 社内ツールとして利用\n",
|
244 |
+
" - 企業が業務効率化のため、本スクリプトを社内ツールに組み込んで使用。\n"
|
245 |
+
],
|
246 |
+
"metadata": {
|
247 |
+
"id": "8bbAxlNBMn4d"
|
248 |
+
}
|
249 |
}
|
250 |
]
|
251 |
}
|