隨著大語言模型LLM和相關應用的流行,在本地部署并構建知識庫,結合企業的行業經驗或個人的知識積累進行定制化開發,是LLM的一個重點發展方向,在此方向上也涌現出了眾多軟件框架和工具集,Dify就是其中廣受關注的一款,今天我們就來近距離了解下它。
Dify介紹
簡單說,Dify 是一款開源的大語言模型(LLM)應用開發平臺,融合了后端即服務(Backend as Service)和LLM運維服務(LLMOps)的理念,旨在簡化和加速生成式 AI 應用的創建和部署。
Dify 的名稱來源于 “Define + Modify”。“Define” 代表著對 AI 應用進行定義,包括明確其功能、目標、應用場景等方面;“Modify” 則表示持續改進,體現了 Dify 平臺支持開發者根據實際需求和反饋,不斷優化和調整 AI 應用的特點。這兩個詞結合起來,傳達出了 Dify 平臺的核心理念,即幫助開發者定義并不斷完善自己的 AI 應用。
Dify安裝
我們先把Dify在本地安裝運行起來。
安裝Dify的最簡單方式是借助Docker。官方已經做好了編排文件,只要將Dify源碼下載下來,然后運行Docker編排命令就可以了。關于基礎的linux系統環境和軟件工具,如Git,Docker等,可以自行上網查詢其安裝方式,也可以參考我之前的文章:
Docker+Ollama+RAGFlow本地部署DeepSeek R1并構建本地知識庫
這里就不再贅述。
在linux命令行中,先進入自己創建好的本地工作目錄,執行如下命令下載Dify源碼:
$ git clone https://gitee.com/dify_ai/dify.git
然后進到dify/docker目錄,執行如下命令:
$ docker compose up -d
命令運行過程中顯示了如下三段信息:
第一段
WARN[0000] The "DB_USERNAME" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_DATABASE" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_PASSWORD" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_USERNAME" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_PASSWORD" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_DATABASE" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_PASSWORD" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_DATABASE" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_USERNAME" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_USERNAME" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_DATABASE" variable is not set. Defaulting to a blank string.
WARN[0000] The "DB_PASSWORD" variable is not set. Defaulting to a blank string.
WARN[0000] The "CERTBOT_EMAIL" variable is not set. Defaulting to a blank string.
WARN[0000] The "CERTBOT_DOMAIN" variable is not set. Defaulting to a blank string.
這顯然是一段告警,表示初始的數據庫字段未設置。注意到docker目錄下有個readme.md文件,打開它,情況就一目了然。Dify已將所有的環境變量設置都集中到了配置文件.env中,并提供了一個樣板文件.env.example,里面已經有了必要的初始化參數配置,我們只需復制樣板文件就行,復制后也可以根據實際情況略加修訂。
第二段
[+] Running 79/79? plugin_daemon Pulled 123.2s? web Pulled 216.7s? weaviate Pulled 98.6s? sandbox Pulled 208.7s? db Pulled 146.3s? redis Pulled 209.9s? nginx Pulled 180.0s? api Pulled 198.8s? ssrf_proxy Pulled 42.6s? worker Pulled 198.8s
這是在拉取Dify依賴的軟件包,顯示了其中的幾大關鍵組件及其所消耗的時間。
第三段
[+] Running 12/12? Network docker_default Created 0.1s? Network docker_ssrf_proxy_network Created 0.0s? Container docker-ssrf_proxy-1 Started 10.6s? Container docker-web-1 Started 10.4s? Container docker-weaviate-1 Started 10.6s? Container docker-db-1 Healthy 16.0s? Container docker-sandbox-1 Started 10.4s? Container docker-redis-1 Started 10.4s? Container docker-plugin_daemon-1 Started 7.7s? Container docker-worker-1 Started 7.6s? Container docker-api-1 Started 7.7s? Container docker-nginx-1 Started 8.4s
這是把幾大組件直接啟動起來了,也就是說,這一個命令就完成了Dify的部署和運行,是不是太簡單?!
總結一下,安裝和運行Dify只需要執行下面的幾條命令:
$ git clone https://gitee.com/dify_ai/dify.git
$ cd dify/docker
$ cp .env.example .env
$ docker compose up -d
完成以上步驟之后,打開瀏覽器,輸入本地服務器地址(如http://192.168.1.229,默認端口號是80),就會出現Dify平臺的登錄界面。首次運行時需要設置管理員賬號,輸入賬號名、郵箱地址和密碼,提交完成后再以該賬號登錄(跟前面參考文章中的Open-WebUI的配置機制一樣),出現的首頁就長這個樣:
Dify的配置
首頁顯示“工作室”的內容,從首頁界面就能發現:Dify主要是用來創建和管理LLM應用的。應用分為五大類型,分別是:聊天助手(chat)、智能體(agent-chat)、文本生成(completion)、對話流(advanced-chat)、工作流(workflow)。可以按五大類型分類,分別羅列已經創建的應用。當然,我的實際環境中一個都還沒有,在創建應用之前,需要先配置一下LLM模型!
點擊頁面頂端右側的賬號圖標,出現一個下拉菜單,點擊“設置”按鈕,出現如下設置界面:
默認顯示的是成員配置,點擊左側“模型供應商”菜單,出現模型供應商安裝界面:
第一次進入時,會提示“尚未安裝模型供應商”、“系統模型尚未完全配置”等信息。下面的待安裝模型供應商列表顯示了國內外各大知名供應商,包括OpenAI、Gemini、深度求索、通義千問、硅基流動等等。安裝模型供應商的作用,實際上是安裝訪問各個供應商的模型API接口的插件(這里的模型供應商就是插件)。在安裝插件之后,還要進一步配置我們在各供應商服務平臺上注冊的賬號和API Key,這一步的目的就是建立起訪問LLM模型的通道。
對于本地部署LLM模型的情況,根據運行LLM模型的方式提供相應的本地API接口即可。典型地,對于以Ollama方式運行的LLM模型,我們首先就要安裝Ollama模型供應商(插件)。在待安裝模型供應商列表中找到Ollama,點擊“安裝”按鈕,
在出現的確認界面上繼續點擊“安裝”按鈕,等待安裝過程完成。
安裝需要一定的時間,在安裝的過程中,可以點擊瀏覽器的刷新按鈕,或者也可以先瀏覽下其他的頁面,直到頁面頂端右側(“插件”菜單的左邊)的下載圖標消失,就表示安裝完成。
再次回到模型供應商的設置界面,可以看到Ollama已經出現在模型列表中(如果還是沒有,可以再重新安裝一遍,有時會出現安裝失敗的情況)。
點擊Ollama組合框右下角的“添加模型”按鈕,添加我們將要調用的LLM模型。因為Ollama可以同時部署多種不同類型和規模的LLM模型(關于用Ollama部署LLM模型的方法步驟,也可以參考我上面鏈接的文章),所以這里需要告訴Dify我們會使用哪些模型。在“添加模型”的界面上,按實際情況填寫模型參數,如果有不清楚的地方,可以在命令行執行“ollama show model-name”命令(注意將其中的model-name改成實際的模型名稱),然后將對應字段填入。下面是我的實例參數值:
填好參數以后,點擊“保存”按鈕,這個模型就會被設置生效并保存,然后出現在模型列表中。
添加了至少一個LLM模型之后,就可以繼續設置系統模型了。點擊“系統模型設置”按鈕,彈出如下的標簽頁:
由于我目前只添加了一個deepseek-r1:1.5b模型,它只能用于推理,所以目前也只能設置“系統推理模型”,點擊該配置項的下拉框,剛添加的deepseek-r1:1.5b就出現在下拉列表中了,選中它,然后點擊“保存”按鈕。完成之后,刷新頁面,再次進入模型供應商設置頁面就不會再有“尚未安裝模型供應商”、“系統模型尚未完全配置”等提示了,已經添加的模型會顯示在模型列表中,可以點擊“配置”按鈕對這些已經添加的LLM模型調整參數。
除了模型配置外,也可以在配置界面上設置Dify平臺的默認語言和系統時區參數:
也可以添加其他成員賬號,供團隊成員訪問:
至此,最基礎的Dify配置就完成了。至于“數據來源”和“API擴展"兩項,暫且可以不管它,等后續需要更豐富的功能時再來研究。
創建應用
下面我就來嘗試創建第一個應用。
回到首頁,點擊左上角的“創建空白應用”菜單,彈出創建應用界面:
首先選擇五大類型中的某一種,右邊會展示該類型應用的基本樣式。
也可以在首頁點擊左上角的“從應用模板創建”菜單,就會彈出各種應用模板的列表:
模板按“用途”進行了分類,每個模板的下面以文字標明了其所屬的類型。
我就選擇創建一個“聊天助手”類型的空白應用,填入應用名稱和簡要描述,然后點擊“創建”按鈕,出現了如下的應用“定義”界面:
這里我們就很容易理解“定義”這個詞在Dify平臺中的含義了。開發LLM應用確實就是個定義過程,定義的對象包括模型(前面已經演示,模型也是定義出來)、提示詞、變量、知識庫、元數據過濾規則等。定義界面上可以方便地進行即時的調試和預覽。
來嘗試一把。先選定LLM模型,并設定模型參數。我們目前只添加了一個deepseek-r1模型,所以就選定它了。對于模型參數,如果不清楚它有什么作用,可以點擊參數旁邊的小問號查看參數解釋,如果還不清楚就上網搜索或者直接問AI助手。
然后填入提示詞,其他字段暫且留空。完成這兩步之后,就可以在“和機器人聊天”的輸入框中輸入問題,點擊箭頭符號確認輸入,我們指定的deepseek模型就開始推理思考了(速度取決于咱們的硬件資源),最后給出了很詳細的回答。
以上推理過程都是在本地完成的。如果對這個“定義”和回答還滿意,我們就可以發布這個應用了。可以當它是AI應用,也可以當它是個機器人,它就是基于LLM大模型,在我們的明確定義之下,形成的一個有特定功能,面向特定方面提供服務的應用程序。點擊“發布”按鈕,然后點擊“發布更新”,發布過程就完成了。再點擊“運行”菜單,彈出一個新的應用界面:
點擊“嵌入網站”菜單(“發布”按鈕下的子菜單),彈出一段HTML代碼,直接復制,可以將它粘貼到咱們自己的網站中,咱們的網站就有了AI聊天助手功能。
還可以通過API的方式來訪問這個應用,點擊“訪問API”菜單(“發布”按鈕下的子菜單),就會彈出一個頁面,顯示詳細的使用指南,教你如何在程序中編碼來調用API,以及如何處理輸入和輸出信息等,指導信息很具體很詳細。
保存應用
創建了第一個AI應用之后,在Dify首頁的應用列表中就可以看到它了。
進一步思考一個問題:我們定義(開發)的這些AI應用,它們的本體到底是什么呢? 我們怎么保存它,怎么傳輸給別人并和別人交流,怎么記錄我們對應用的改進歷史?像我們平常開發的其他軟件一樣,這個程序的“代碼”在哪里呢?對于這個問題,我們需要理解一個新概念——DSL。Dify是一個AI應用定義平臺,它對AI應用的具體定義,存儲在一個DSL文件中。把鼠標放到上圖的“測試應用”圖標上,圖標右下角出現一個省略符號,點擊它,出現一個操作菜單,其中有一個“導出DSL”的子菜單,點擊它,瀏覽器就會自動下載(由Dify生成)一個名為“測試應用.yml”的文件。
所以DSL文件的格式其實是yml,用文本編輯器打開它,看看它的內容:
app:description: 第一個dify機器人icon: 🤖icon_background: '#FFEAD5'mode: chatname: 測試應用use_icon_as_answer_icon: false
dependencies:
- current_identifier: nulltype: marketplacevalue:marketplace_plugin_unique_identifier: langgenius/ollama:0.0.6@7d66a960a68cafdcdf5589fdf5d01a995533f956853c69c54eddcf797006fa37
kind: app
model_config:agent_mode:enabled: falsemax_iteration: 5strategy: function_calltools: []annotation_reply:enabled: falsechat_prompt_config: {}completion_prompt_config: {}dataset_configs:datasets:datasets: []reranking_enable: falseretrieval_model: multipletop_k: 4dataset_query_variable: ''external_data_tools: []file_upload:allowed_file_extensions:- .JPG- .JPEG- .PNG- .GIF- .WEBP- .SVG- .MP4- .MOV- .MPEG- .WEBMallowed_file_types: []allowed_file_upload_methods:- remote_url- local_fileenabled: falseimage:detail: highenabled: falsenumber_limits: 3transfer_methods:- remote_url- local_filenumber_limits: 3model:completion_params:stop: []mode: chatname: deepseek-r1:1.5bprovider: langgenius/ollama/ollamamore_like_this:enabled: falseopening_statement: ''pre_prompt: '#角色:你是一位經驗豐富的出國留學顧問#功能:1)你通曉出國留學相關的各種知識,包括全世界各個國家的排名前10的大學和全世界排名前100名的大學的情況,包括它們的歷史、突出專業、師資隊伍、學術地位、招生政策、教學制度、留學費用、申請流程等等;2)你熟悉國內有留學需求群體的特點,了解改革開放依賴國內留學政策及其變遷,了解實際留學人員的學習過程情況和畢業后工作發展情況,熟悉當前留學市場客戶的心理特征和期望,熟悉留學市場的當前狀況和未來趨勢;3)你能結合留學需求人員和留學市場的國際國內行情,為客戶提供最合適的留學方案,并耐心回答客戶問題,完成留學申請過程的輔導以及后續跟蹤服務。#限制:1)要求實事求是,基于確定的事實、歷史記錄和數據來回答客戶問題;對于趨勢分析、未來預測等要求基于有科學依據且廣受認可的分析方法來進行,對其結果要明確標定,方便客戶識別你的回答內容是客觀事實還是分析判斷;2)要求友好理性,對客戶的任何問題,要友善地回答,以幫助客戶充分理解具體情況并能進一步作出最優決策為宗旨,對客戶問題及相關背景進行理性分析,然后組織語言,簡明清晰地回答問題;不允許出現任何沒有根據或者不友好的回答;3)要求合理合法,回答內容必須合乎相關國家的法律法規以及社會風俗習慣。'prompt_type: simpleretriever_resource:enabled: truesensitive_word_avoidance:configs: []enabled: falsetype: ''speech_to_text:enabled: falsesuggested_questions: []suggested_questions_after_answer:enabled: falsetext_to_speech:enabled: falselanguage: ''voice: ''user_input_form: []
version: 0.3.0
這就是我們前面所有定義的內容。一個AI應用,是以Dify平臺服務為基礎的一系列屬性值的組合,Dify根據這些屬性來修飾和調用LLM模型,并為用戶呈現LLM推理的結果,對外表現為獨立的AI應用。基于用戶的各種定義,同一個Dify平臺,可以同時為用戶呈現多種不同的AI應用服務。
有了上面的DSL文件,我們就可以在不同的地方傳遞、共享、重現我們定義的AI應用,也可以用Git等配置管理軟件進行歷史版本記錄和團隊合作開發。在Dify首頁上創建AI應用時,有個“導入DSL文件”的子菜單,其中的DSL文件就來源于此。
確實是好方便啊!
總結
至此,我們就簡單但完整地體驗了一下Dify的安裝部署和使用。這個過程讓我想起了之前使用字節跳動的“扣子”平臺的經歷,可以回顧我之前寫的系列文章。相比較而言,Dify已經是一個成熟產品,一個軟件平臺,一個可在本地部署的AI應用定制開發平臺,更準確地說,Dify是一款開發AI應用的工具軟件。它也支持工作流的定義,支持知識庫的應用,功能已經很強大。“扣子”平臺還在開發和完善之中,它的功能跟Dify有很多重疊,但它的目標可能更遠大,背景實力更強。“扣子”是一個在線平臺,是字節跳動公司的一種生意模式,它將開發者聚集到這個網絡平臺上,支持在線開發AI應用的功能,同時與其他在線資源,比如各大LLM模型服務器、AI應用市場、抖音發布平臺、豆包APP等結合起來,成為字節跳動公司搶占AI軟件市場的一把利器!