iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
生成式 AI

Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用系列 第 21

【Day21】Dify 工作流 (4):用「模板轉換」和「代碼執行」來操作 object

  • 分享至 

  • xImage
  •  

前言

昨天的水果例子用到「迭代」「條件判斷」和「參數提取器」,但我們沒有好好處理輸出,而是直接將迭代的「一坨輸出」秀在使用者面前,感覺挺糟的,接下來就看看在 Dify 中可以怎麼處理這種問題吧~

模板轉換與 Jinja2

在介紹模板轉換之前,要先認識 Jinja2

Jinja2

如果你有用 flask 寫過後端程式碼,那一定會知道 render_template 這個函式

Jinja2 由奧地利的軟體工程師 Armin Ronacher 開發,他就是 Flask 這個 Web 框架的創建者,大佬等級的人物,Jinja2 就是一款「模板引擎」,很適合拿來開發網頁,因為他還支援 if/else, for loop 等功能,但 HTML 本身沒有這樣的功能。

你可以用 pip install Jinja2 來試玩看看

from jinja2 import Template

template = Template("Hello, {{ name }}!")
rendered = template.render(name="World")
print(rendered)  # 輸出: Hello, World!

直觀的條件判斷和 for loop

from jinja2 import Template

template = Template("""
{% if users %}
<ul>
  {% for user in users %}
  <li>{{ user }}</li>
  {% endfor %}
  </ul>
{% else %}
<p>No users found.</p>
{% endif %}
""")

rendered = template.render(users=["Alice", "Bob", "Charlie"])
print(rendered)  
rendered2 = 

輸出

<ul>

  <li>Alice</li>

  <li>Bob</li>

  <li>Charlie</li>

  </ul>


<p>No users found.</p>

還可以用過濾器等功能

from jinja2 import Template

template = Template("Name: {{ name | upper }}")
rendered = template.render(name="john")
print(rendered)  # 輸出: Name: JOHN

Jinja2 是個很強大的工具,但今天不會 focus 在這一塊,有興趣的可以參考官方文件

模板轉換

雖然昨天介紹水果的效果已經很好了,不過他只是將兩個字串拼接在一起

觀察日誌迭代的結果就會知道

在迭代中轉換

但我比較希望可以讓使用者知道接下來介紹的是什麼水果,並且他的介紹文章是什麼,分開這兩個東東。在昨天的工作流中,接上一個建立一個模板轉換節點

用 Jinja2 語法,將水果名稱 (item) 和 LLM 的摘要同時顯示在一個字串中

記得一定要修改迭代的輸出

一樣用海狸大師吃水果來測試

在迭代之外轉換

我們也可以善用 jinja2 語法在迭代之外來做到一樣的事情

然後撰寫語法,這邊 loop.index0 表示從索引 0 開始計算

{% for summary in fruit_summaries %}

{{fruits_name[loop.index0]}}-{{ summary }}

{% endfor %}

代碼執行

如果你不熟 Jinja2 或者想要用 Python 和 Javascript 來做也可以歐。這邊我們設想一個情境:希望輸出的結果是 JSON 格式,以水果名稱為 key;水果介紹為 value

先新增一個代碼執行節點,接在迭代之後

設定輸入變數

寫程式

def main(summaries: str, names: str) -> dict:
	output_dict = dict(zip(names, summaries))
	return {
		"result": output_dict,
	}

指定輸出格式

注意:Dify 的代碼執行環境為了安全考量,不允許使用者作出可能消耗系統大量資源或者引發安全問題的操作,相對不彈性一點,如果真的有需要,就用 Day16 的方法自行撰寫 API,然後用「HTTP 請求」節點吧~

測試結果

小結

只剩下「HTTP 請求」「變量聚合器」和「變量分配器」沒有被我們用到,不過如果你有跟著做到現在,應該也自行研究過這些東東了吧XD

明天應該會是 Chatflow 介紹的最後一天,Chatflow 跟 Workflow 真的蠻像的,只不過 Workflow 可以被當做一個節點使用。當專案大起來時,多人協作分配不同的人去處理不同的 case 十分方便~

明天我們來使用「HTTP 請求」串接一些好玩的 API 網站,搭配還沒用過的節點,期待一下吧!


上一篇
【Day20】Dify 工作流 (3):利用「參數提取」、「迭代」和「條件判斷」來解決更複雜的問題
下一篇
【Day22】Dify 工作流 (5):在 Dify 中使用「HTTP 請求」,並且把流程變成「工作流 (workflow)」!(貓貓狗勾猜測機器人)
系列文
Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言