發佈日期:

Dify:開源大語言模型應用開發平台

在人工智能快速發展的今天,大語言模型(LLM)已成為推動創新的核心力量。然而,如何有效地將這些強大的模型轉化為實用的AI應用,仍然是許多開發者和企業面臨的挑戰。這就是Dify發揮作用的地方,它作為一個開源的LLM應用開發平台,為我們提供了一個便捷的解決方案。

Dify:打造AI應用的全能工具箱

Dify不僅僅是一個開發平台,它更像是一個為LLM應用量身打造的全能工具箱。通過Dify,開發者可以輕鬆設計對話式AI、優化提示詞工程、管理知識庫,並實現無縫的API集成。這些功能的組合使得從概念到部署的整個AI應用開發過程變得更加流暢和高效。

對話式AI設計:打造個性化交互體驗

Dify的核心優勢之一是其強大的對話式AI設計功能。通過直觀的界面,開發者可以輕鬆定制AI助手的個性、知識範圍和回應方式。這使得創建符合特定需求的AI應用變得前所未有的簡單,無論是客戶服務機器人還是專業領域的智能顧問。

提示詞工程:釋放LLM的潛力

在LLM應用開發中,提示詞工程扮演著關鍵角色。Dify提供了先進的提示詞管理和優化工具,幫助開發者精確控制AI的輸出。通過細緻調整提示詞,我們可以顯著提升AI應用的性能和準確性,確保它能夠準確理解用戶意圖並提供恰當的回應。

知識庫管理:為AI注入專業知識

Dify的知識庫管理功能允許開發者輕鬆導入和組織大量專業資料。這意味著我們可以為AI應用注入特定領域的知識,使其能夠處理更複雜、更專業的查詢。無論是法律諮詢、醫療診斷還是技術支持,Dify都能幫助我們構建具有深度專業知識的AI系統。

API集成:無縫連接各種服務

為了確保開發的AI應用能夠與現有系統和服務無縫協作,Dify提供了強大的API集成能力。這使得將AI功能嵌入到各種應用程序和平台中變得異常簡單,大大擴展了LLM應用的可能性和實用性。

Dify介面介紹

Dify 的關鍵特性

Dify 內建了建立 LLM 應用所需的關鍵技術棧,包括:

  • 支援數百個模型:提供多樣的模型選擇,滿足不同應用需求。
  • 直覺的 Prompt 編排介面:簡單易用,讓你輕鬆設計和調整提示語。
  • 高品質的 RAG 引擎:確保數據處理的準確性和效率。
  • 穩健的 Agent 框架:靈活配置和管理代理機器人。
  • 靈活的流程編排:支援複雜流程的設計和自動化。

這些特性使得開發者可以節省大量重複造輪子的時間,專注於創新和業務需求。

支持模型類型

在Dify 中,我們依照模型的使用情境將模型分為以下4 類:

  1. 系統推理模型。 在創建的應用中,用的是該類型的模型。智聊、對話名稱產生、下一步問題建議用的也是推理模型。已支援的系統推理模型供應商:OpenAIAzure OpenAI ServiceAnthropic、Hugging Face Hub、Replicate、Xinference、OpenLLM、訊飛星火文心一言通義千問Minimax、ZHIPU(ChatGLM)
  2. Embedding 模型。在資料集中,將分段過的文件做Embedding 用的是該類型的模型。在使用了資料集的應用程式中,將使用者的提問做Embedding 處理也是用的該類型的模型。已支援的Embedding 模型供應商:OpenAI、ZHIPU(ChatGLM)、JinaAI
  3. Rerank 模型 Rerank 模型用於增強檢索能力,改善LLM 的搜尋結果。已支援的Rerank 模型供應商:Cohere、JinaAI
  4. 語音轉文字模型。將對話型應用中,將語音轉文字用的是該類型的模型。已支援的語音轉文字模型供應商:OpenAI

為什麼選擇 Dify?

你可以將 Dify 與 LangChain 這類的開發庫做比較。LangChain 是一個提供鐵鎚和釘子的工具箱,而 Dify 則是一套經過精良工程設計和軟體測試的完整腳手架方案。

以下是選擇 Dify 的幾個主要理由:

  • 開源:由專業全職團隊和社群共同打造,提供靈活和安全的解決方案,同時保持對資料的完全控制。
  • 快速迭代:產品簡單、克制且迭代迅速,滿足用戶需求。
  • 生產級方案:提供接近生產需求的完整方案,節省開發時間和資源。

使用 Dify 的優勢

Dify 讓你基於任何模型自部署類似 Assistants API 和 GPTs 的能力,確保在靈活和安全的基礎上,對資料保持完全控制。這對於那些希望快速開發和部署生成式 AI 應用的團隊和個人來說,是一個理想選擇。

創業者的理想工具

Dify 可以幫助創業者快速將 AI 應用創意變成現實,無論是成功還是失敗,都需要加速推進。在真實世界中,已有數十個團隊透過 Dify 建立 MVP(最小可用產品)獲得投資,或透過 POC(概念驗證)贏得了客戶的訂單。

整合 LLM 至現有業務

Dify 使得將 LLM 增強現有應用變得簡單。透過 Dify 的 RESTful API,可以實現 Prompt 與業務程式碼的解耦。此外,Dify 的管理介面可以追蹤資料、成本和用量,持續改進應用效果,從而提升業務能力。

企業級 LLM 基礎設施

一些銀行和大型網路公司正在將 Dify 部署為企業內的 LLM 網關,加速 GenAI 技術在企業內的推廣,並實現中心化的監管。這使得 Dify 成為企業級應用的理想選擇,提供穩定、安全的 LLM 基礎設施。

探索 LLM 的能力邊界

即使你是技術愛好者,Dify 也能幫助你輕鬆實踐 Prompt 工程和 Agent 技術。在 GPTs 推出以前,已有超過 60,000 名開發者在 Dify 上創建了自己的第一個應用,展示了其在技術探索中的強大潛力。

Dify 開源許可證

Dify 專案在Apache License 2.0 授權下開源,同時包含以下附加條件:

Dify 允許被用於商業化,例如作為其他應用的「後端即服務」使用,或作為應用程式開發平台提供給企業。然而,當滿足以下條件時,必須聯繫生產者以獲得商業許可:

  • 多租戶SaaS 服務:除非獲得Dify 的明確書面授權,否則不得使用Dify.AI 的源碼來運作與Dify.AI 服務版類似的多租戶SaaS 服務。
  • LOGO 及版權資訊:在使用Dify 的過程中,不得移除或修改Dify 控制台內的LOGO 或版權資訊。

更多教學資源

官方的教學文件非常完整

https://docs.dify.ai/v/zh-hans/guides/model-configuration

對於擴充以及API支持非常的完整

https://docs.dify.ai/v/zh-hans/guides/application-publishing/developing-with-apis

發佈日期:

RagFlow深度文檔理解的新境界

RAGFlow的核心優勢在於其強大的深度文檔理解能力。通過結合先進的自然語言處理技術和大型語言模型,RAGFlow能夠深入解析各種複雜格式的文檔,包括PDF、Word和PowerPoint等。這種深度理解使得AI系統能夠更準確地回答用戶查詢,大大提升了問答系統的性能。

特性介紹

基於深度文檔理解,我們的系統能夠從各類複雜格式的非結構化資料中提取真知灼見,在無限上下文的場景下快速完成大海撈針測試。通過模板的文字切片技術,不僅智能而且可控可解釋,提供多種範本選擇並可視化調整。系統支援多種文件類型,包括Word、PPT、Excel、TXT、圖片、PDF、影印件等,全面優化的RAG工作流程能夠滿足從個人應用到超大型企業的需求,並提供易用的API,方便整合各類企業系統,最大程度降低幻覺風險,確保答案有理有據。

系統架構

畫面介紹

以下為登入畫面

模型設定介紹

在這邊設定要使用的模型的Token或者連線至本地端的Ollama,在這邊要注意的是,如果你的Ragflow是用docker起的,那麼就一定也要把ollama起在docker裡面,彼此才連線的到,不然就是要透過公開網址

知識庫設定介紹

接著可以來新增知識庫

在設定知識庫的解析方式時,設定正確的選項非常重要,如果你上傳的文件屬於純文字PDF,則要記得把layout recognize關掉

以下為純文字檔案卻打開layout recognize的解析狀況

沒有打開則可以正常解析全部的純文字內容

如果要解析的是圖檔、POWERPOINT這種需要先解析layout的,則應打開layout recognize,以下為需要打開layout recognize的一個範例,這個PDF的檔案皆為圖像,是使用OCR去判斷上面的文字的

聊天功能介紹

這邊有點類似GPT Plus的功能,可以設定很多不同的聊天助理,並且可以附註搜尋到的檔案的文本,也可以針對每一個聊天助理設定要搜尋的知識庫

圖功能介紹

我們可以在這邊客製化聊天的流程,做更進一步的機器人的進階設定,預設有下面這些不同的流程

可設定的元件包括知識檢索、生成回答、人機交互、問題分類、靜態訊息、是否相關、問題最佳化,並且可以直接運行來測試

每一個元件都可以設定使用的模型和相關提示

這是預設的客服的流程,有點可怕,如果知識庫裡面沒有相關的文件,就會無限迴圈耶:D

文件管理介紹

從這邊可以看到我們上傳的所有文件的檔案夾

發佈日期:

RAGFlow: 檢索增強生成的開源引擎

在人工智能和自然語言處理領域,檢索增強生成(RAG)技術正在迅速崛起。RAGFlow作為一個開源的RAG引擎,為開發者和企業提供了一個強大的工具,以提升AI應用的問答能力和資訊檢索精準度。本文將深入探討RAGFlow的核心功能和應用場景,幫助您了解如何利用這一創新技術打造先進的NLP解決方案。

RAGFlow: 深度文檔理解的新境界

RAGFlow的核心優勢在於其強大的深度文檔理解能力。通過結合先進的自然語言處理技術和大型語言模型,RAGFlow能夠深入解析各種複雜文檔,提取關鍵信息,並建立語義連接。這使得AI系統能夠更準確地理解和回答用戶查詢,大大提升了問答系統的性能。

知識庫管理: 智能化的資訊組織

RAGFlow提供了全面的知識庫管理功能,使得組織和更新大量資訊變得簡單高效。通過智能分類和索引技術,RAGFlow能夠自動組織和關聯不同來源的資料,建立一個結構化的知識網絡。這不僅提高了資訊檢索的效率,還為AI應用提供了豐富的背景知識,使其能夠生成更加準確和相關的回答。

大型語言模型集成: 釋放AI的潛力

RAGFlow無縫集成了多種大型語言模型,如GPT系列,使得開發者可以輕鬆利用這些強大的AI模型來增強自己的應用。通過結合RAG技術和大型語言模型,RAGFlow能夠生成更加準確、相關和富有洞察力的回答,大大提升了AI系統的表現。

RAGFlow的應用場景

RAGFlow的靈活性使其適用於多種場景:

  1. 智能客服系統: 利用RAGFlow的深度文檔理解能力,企業可以構建更智能的客服機器人,能夠準確回答複雜的產品和服務相關問題。
  2. 研究輔助工具: 研究人員可以使用RAGFlow快速分析大量學術文獻,提取關鍵信息,並生成研究摘要。
  3. 法律文檔分析: 法律專業人士可以利用RAGFlow深入解析複雜的法律文件,快速找到相關案例和條款。
  4. 個人知識管理: 個人用戶可以使用RAGFlow建立自己的知識庫,實現高效的個人信息管理和學習。

線上測試RAGFlow

RAGFlow是一款基於深度文件理解所建構的開源RAG(Retrieval-Augmented Generation)引擎。 RAGFlow 可以為各種規模的企業及個人提供一套精簡的RAG 工作流程,結合大語言模型(LLM)針對用戶各類不同的複雜格式數據提供可靠的問答以及有理有據的引用。

線上DEMO網址: https://demo.ragflow.io.

安裝方式

如需確認vm.max_map_count的大小:

sysctl vm.max_map_count

如果vm.max_map_count的值小於262144,可以進行重設:

# 設為 262144:
sudo sysctl -w vm.max_map_count=262144

你的改動會在下次系統重新啟動時被重置。如果希望做永久改動,還需要在/etc/sysctl.conf檔案裡把vm.max_map_count的值再相應更新一次:

vm.max_map_count=262144

下載程式

git clone https://github.com/infiniflow/ragflow.git
cd ragflow/docker
chmod +x ./entrypoint.sh

直接啟動會顯示不支持MACOS,且無法設定環境變數include:env_file: ./.env因此對於內容有稍作修改,改成如下

以下為docker-compose-CN.yml

services:
   ragflow:
    depends_on:
      mysql:
        condition: service_healthy
      es01:
        condition: service_healthy
    image: swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow:${RAGFLOW_VERSION}
    container_name: ragflow-server
    ports:
      - ${SVR_HTTP_PORT}:9380
      - 80:80
      - 443:443
    volumes:
      - ./service_conf.yaml:/ragflow/conf/service_conf.yaml
      - ./ragflow-logs:/ragflow/logs
      - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
      - ./nginx/proxy.conf:/etc/nginx/proxy.conf
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    environment:
      - MINIO_CONSOLE_PORT=9001
      - MINIO_PORT=9000
      - MINIO_USER=rag_flow
      - MINIO_PASSWORD=infini_rag_flow
      - REDIS_PORT=6379
      - REDIS_PASSWORD=infini_rag_flow
      - SVR_HTTP_PORT=9380
      - RAGFLOW_VERSION=dev
      - MEM_LIMIT=8073741824
      - KIBANA_PORT=6601
      - ELASTIC_PASSWORD=infini_rag_flow
      - STACK_VERSION=8.11.3
      - ES_PORT=1200
      - MYSQL_PASSWORD=infini_rag_flow
      - MYSQL_PORT=5455
      - TZ='Asia/Shanghai'
      - HF_ENDPOINT=https://hf-mirror.com
    networks:
      - ragflow
    network_mode: host
    restart: always

以下為docker-compose-base.yml

services:
  es01:
    container_name: ragflow-es-01
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - MINIO_CONSOLE_PORT=9001
      - MINIO_PORT=9000
      - MINIO_USER=rag_flow
      - MINIO_PASSWORD=infini_rag_flow
      - REDIS_PORT=6378
      - REDIS_PASSWORD=infini_rag_flow
      - SVR_HTTP_PORT=9380
      - RAGFLOW_VERSION=dev
      - TIMEZONE=Asia/Shanghai
      - MEM_LIMIT=8073741824
      - KIBANA_PORT=6601
      - ELASTIC_PASSWORD=infini_rag_flow
      - STACK_VERSION=8.11.3
      - ES_PORT=1200
      - MYSQL_PASSWORD=infini_rag_flow
      - MYSQL_PORT=5455
      - node.name=es01
      - bootstrap.memory_lock=false
      - discovery.type=single-node
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
      - TZ=${TIMEZONE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test: ["CMD-SHELL", "curl http://localhost:9200"]
      interval: 10s
      timeout: 10s
      retries: 120
    networks:
      - ragflow
    network_mode: host
    restart: always

  mysql:
    image: mysql:5.7.18
    container_name: ragflow-mysql
    environment:
      - MINIO_CONSOLE_PORT=9001
      - MINIO_PORT=9000
      - MINIO_USER=rag_flow
      - MINIO_PASSWORD=infini_rag_flow
      - REDIS_PORT=6378
      - REDIS_PASSWORD=infini_rag_flow
      - SVR_HTTP_PORT=9380
      - RAGFLOW_VERSION=dev
      - TIMEZONE=Asia/Shanghai
      - MEM_LIMIT=8073741824
      - KIBANA_PORT=6601
      - ELASTIC_PASSWORD=infini_rag_flow
      - STACK_VERSION=8.11.3
      - ES_PORT=1200
      - MYSQL_PASSWORD=infini_rag_flow
      - MYSQL_PORT=5455
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - TZ=${TIMEZONE}
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
      --init-file /data/application/init.sql
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/data/application/init.sql
    networks:
      - ragflow
    network_mode: host
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-p${MYSQL_PASSWORD}"]
      interval: 10s
      timeout: 10s
      retries: 3
    restart: always

  minio:
    image: quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
    container_name: ragflow-minio
    command: server --console-address ":9001" /data
    ports:
      - ${MINIO_PORT}:9000
      - ${MINIO_CONSOLE_PORT}:9001
    environment:
      - MINIO_CONSOLE_PORT=9001
      - MINIO_PORT=9000
      - MINIO_USER=rag_flow
      - MINIO_PASSWORD=infini_rag_flow
      - REDIS_PORT=6378
      - REDIS_PASSWORD=infini_rag_flow
      - SVR_HTTP_PORT=9380
      - RAGFLOW_VERSION=dev
      - TIMEZONE=Asia/Shanghai
      - MEM_LIMIT=8073741824
      - KIBANA_PORT=6601
      - ELASTIC_PASSWORD=infini_rag_flow
      - STACK_VERSION=8.11.3
      - ES_PORT=1200
      - MYSQL_PASSWORD=infini_rag_flow
      - MYSQL_PORT=5455
      - MINIO_ROOT_USER=${MINIO_USER}
      - MINIO_ROOT_PASSWORD=${MINIO_PASSWORD}
      - TZ=${TIMEZONE}
    volumes:
      - minio_data:/data
    networks:
      - ragflow
    network_mode: host
    restart: always

  redis:
    image: redis:7.2.4
    container_name: ragflow-redis
    command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru
    ports:
      - 6379:6379
    volumes:
      - redis_data:/data
    networks:
      - ragflow
    network_mode: host
    restart: always

volumes:
  esdata01:
    driver: local
  mysql_data:
    driver: local
  minio_data:
    driver: local
  redis_data:
    driver: local

networks:
  ragflow:
    driver: bridge

同時啟動兩個docker-compose

docker-compose -f docker-compose-base.yml -f docker-compose-CN.yml up -d

可看到啟動成功

接著打開127.0.0.1就可以創建帳號並登入了