:::

用爬蟲作為Dify的知識庫:Firecrawl / Using a Web Crawler as Dify's Knowledge Base: Firecrawl

1月 13, 2025 , , 0 Comments Edit Copy Download

2024-1222-001315.png

Dify的知識庫能夠取自網路資料,再搭配我們自架的Coolcrawl來取代公開服務Firecrawl,就能夠抓取內部區域網路裡面的網路資料。接下來就讓我們來看看這要怎麼實作吧。

Dify's knowledge base can draw from online data, and by combining it with our self-hosted Coolcrawl (instead of the public service Firecrawl), it can also crawl data within the intranet. Let's take a look at how to implement this.


Firecrawl 大型語言模型專用爬蟲 / Firecrawl: A Web Crawler for Large Language Models

2024-1221-225757.png

https://www.firecrawl.dev/ 

Firecrawl 是一款專為大型語言模型(LLM)設計的網路爬蟲工具,它能將整個網站轉換成適合 LLM 使用的 Markdown 格式或結構化資料。與傳統爬蟲不同,Firecrawl 不需要網站地圖,就能自動抓取網站及其所有可存取的子頁面。這項功能讓使用者可以輕鬆地從任何網站擷取內容,進而將這些資料用於訓練大型語言模型或建立檢索增強生成(RAG)系統。Firecrawl 特別擅長處理使用 JavaScript 動態產生內容的網站,並能將這些內容轉換成 LLM 可以理解的格式,這在處理現代複雜網站時非常重要。

2024-1221-225834.png

Firecrawl 提供多種使用方式,包括 API 介面和 SDK (軟體開發套件),方便使用者將其整合到不同的專案中。它不僅支援抓取網頁內容,還能進行資料清理和擷取,確保產出的資料品質。Firecrawl 就像一個智慧機器人,從使用者提供的網頁開始,自動找到並存取網站上的所有其他頁面,擷取主要內容、並去除廣告等不必要的元素,然後將這些資訊整理好,方便使用者使用。

https://github.com/sugarforever/coolcrawl/blob/main/README.md

https://github.com/sugarforever/coolcrawl/blob/main/README.md 

Firecrawl雖然有在GitHub上開放部分程式碼,但本身還是需要仰賴它的雲端服務才能運作。對此,sugarforever為Firecrawl開創了分支,並命名為coolcrawl。它雖然沒有Firecrawl持續發展的特別功能,例如LLM Extract,但卻是一個可以自行架設的爬蟲服務。以下我們就將coolcrawl架設在自己的伺服器上,然後看看怎麽能在Dify上運作吧。


用Docker Compose架設Coolcrawl / Setting Up Coolcrawl with Docker Compose

2024-1221-230602.png

Coolcrawl的架設只需要「docker-compose.yml」這份文件,內容如下:

version: '3.1'
services:
  redis:
    image: redis:latest
    restart: always
    volumes:
      - redis_data:/data

  worker:
    environment:
      - REDIS_URL=redis://redis:6379
      - USE_DB_AUTHENTICATION=false
    image: 0001coder/coolcrawl-worker:latest
    pull_policy: always
    restart: always

  server:
    environment:
      - REDIS_URL=redis://redis:6379
      - USE_DB_AUTHENTICATION=false
      - HOST=0.0.0.0
    image: 0001coder/coolcrawl-server:latest
    pull_policy: always
    ports:
      - "3002:3002"
    restart: always
    
volumes:
  redis_data:

其中紅字的 3002 為對外的接口,請根據你自己的需求來調整。

設定好這樣就能用「docker compose up -d」指令,讓Coolcrawl運作。

如果你的網站IP是192.168.100.100,那你就能用以下網址來使用Coolcrawl: http://192.168.100.100:3002 


設定Coolcrawl作為知識庫 / Setting Up Coolcrawl in Dify's Knowledge Base

接下來我們在Dify裡面設定Coolcrawl。以下我用Dify 0.14.0作為示範。

2024-1221-231512.png

登入Dify後,在右上角的選單裡面進入Settings。

2024-1221-231542.png

進入左邊的(1) Data Source,然後在Website with Firecrawl右邊進入Configuration。

2024-1221-231837.png

在(1) API Key跟(2)Base URL都輸入Coolcrawl的網址,然後(3)按Save即可。API Key隨意填寫即可,但不可以是空值。

2024-1221-232008.png

看到Firecrawl顯示綠色的ACTIVE,就表示設定完成了。


使用爬蟲抓取資料 / Using Crawlers to Extract Data

2024-1221-232124.png

接下來我們就能在Knowledge (知識庫)裡面使用Firecrawl (實際上背後運作的是Coolcrawl)來抓取資料了。做法是在Dify裡面,進入(1) Knowledge,然後(2)點選Create Knowledge。

2024-1221-232248.png

在Choose data source的頁面裡,(1) 選擇Sync from website,然後Select a provider裡面(2) 選擇Firecrawl,在(3)網址裡面輸入你要抓取的網站,例如「 https://blog.pulipuli.info 」,然後(4)按Run執行。

2024-1221-232411.png

爬蟲便能從你提供的網址裡抓取網站底下的子網頁。這裡的例子是抓取「布丁布丁吃什麼?」部落格裡面的內容,你可以注意到爬蟲略過了首頁跟其他不重要的頁面,只選擇了各篇文章作為抓取對象。

2024-1221-232727.png

被爬蟲抓取的網頁會被轉換成Markdown格式,然後你可以進一步設定分段的規則。從圖片上可以看到,原本是以HTML標籤包裹的「<h1>布丁布丁吃什麼?</h1>」,被轉換成對應的Markdown語法。而下面也可以看到網頁內容被切分成多個分段來保存。

2024-1221-233332.png

如果繼續處理下去,後面完成後就能看到其他分段,即裡面包含了部落格文章的主要內容。


使用Firecrawl或Coolcrawl的小技巧 / Tips for Using Firecrawl or Coolcrawl

最後我們來聊一下使用Firecrawl到目前為止需要注意的技巧。

資料同步的問題 / Problems with Data Synchronization

2024-1221-233525.png

雖然Dify使用Firecrawl或Coolcrawl作為爬蟲,但它並不會自動更新知識庫的內容。一般情況下,我們必須要按Sync來請爬蟲重新抓取網頁內容與建立索引。但如果你抓取的網頁非常多的話,一個一個去按Sync顯然不是一件明智的做法。

https://docs.dify.ai/zh-hans/guides/knowledge-base/maintain-dataset-via-api

https://docs.dify.ai/zh-hans/guides/knowledge-base/maintain-dataset-via-api 

Dify的API是有討論到如何管理Knowledge的部分,但他的做法並非是單純地啟動爬蟲的Sync,而是要你自行用爬蟲取得Markdown資料後,用上傳檔案的方式更新Knowledge。而這也不是很容易實作的功能。

因此,在Dify更新知識庫仍然困難重重。這是使用Dify需要注意的事情。

抓取子頁面 / Crawl sub-pages

2024-1221-234343.png

爬蟲預設開啟了抓取子頁面的功能,不過在大多時候,它的表現可能跟你的預期會有很大的落差。

2024-1221-234918.png

我們以Dify首頁的「 https://dify.ai/ 」為例,雖然網站裡面的頁面很豐富,但爬蟲只看得到首頁。為什麼「布丁布丁吃什麼?」能夠找到文章的子頁面,但是Dify網站卻找不到呢?老實說至今為止我還是沒能找到合理的解答,取而代之的是,我發現可以用sitemap.xml來讓爬蟲找到子頁面。

2024-1221-235020.png

Dify網站的網站地圖 sitemap.xml 可以用以下網址找到: https://dify.ai/sitemap.xml 

直接將sitemap.xml的網址輸入到爬蟲內,你就可以看到爬蟲會沿著sitemap.xml裡面的資料抓取子網頁。

2024-1221-235151.png

那這個sitemap.xml又是什麼呢?sitemap.xml是網站地圖的一種格式,這是專門給搜尋引擎抓取網頁的目錄。現在大多數內容管理平臺都有自動產生sitemap.xml的功能,但如果你是自行撰寫網頁、或是用的是功能不足的框架,那大概就得自己想辦法產生 sitemap.xml 才行。

不論如何,儘管我還是未能瞭解Firecrawl跟Coolcrawl為何不能自行抓到Dify的sitemap.xml,但直接指定sitemap.xml網址的確能讓Dify的爬蟲順利抓到子頁面。這是一個很重要的小技巧,希望對你使用Dify有所幫助。


結語 / Conclusion

2024-1222-000057.png

比起自己手動上傳檔案到Dify,使用Firecrawl或Coolcrawl等爬蟲抓取網頁上的資料,以此更新知識庫的內容,這可能是更有效率的做法。本篇介紹了使用Coolcrawl自架爬蟲來取代Firecrawl的做法,不僅可以擺脫Firecrawl免費帳號下的有限額度,更重要的是能夠抓取外網連不到的區域網路資料。

https://docs.dify.ai/guides/knowledge-base/external-knowledge-api-documentation

https://docs.dify.ai/guides/knowledge-base/external-knowledge-api-documentation 

然而,目前Dify仍然不能讓我們自動或排程來啟用爬蟲,而且Dify的開發方向也不太著重在知識庫的改進,反而是傾向鼓勵使用者結合其他外部工具作為知識庫。為此,Dify最近的版本推出了External Knowledge API的功能,這可以讓Dify使用AWS Bedrock或是RAGFlow作為知識庫。然而這兩者都跟我理想的知識庫應有的功能,有段不小的差異。如果大家有什麼建議,歡迎在下面留言跟我分享吧。


那這篇關於Dify爬蟲的文章就到此為止了。文章的最後要來問大家的是:你對於Dify的什麼其他功能感興趣呢?

  • 1. 文件抽取功能:聽說現在可以直接上傳檔案給LLM分析了?怎麽做的?
  • 2. 網頁嵌入功能:聽說做好的AI可以結合到其他網頁裡面?怎麽做的?
  • 3. 儲存功能:如果我要將詢問AI得到的答案保存在某些地方?要怎麼實作?
  • 4. 其他:歡迎在下面留言,分享你的想法吧!