發佈日期:

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就可以創建帳號並登入了

發佈日期:

開源RAG網頁套件研究

open-webui

Github位置: https://github.com/open-webui/open-webui

工具介紹

Open WebUI 是一種可擴展、功能豐富且使用者友好的自託管 WebUI,旨在完全離線運行。它支援各種LLM運行器,包括 Ollama 和 OpenAI 相容的 API。有關更多資訊,請查看: https://docs.openwebui.com/

主要功能

  • Ollama/OpenAI API 集成:毫不費力地集成與 OpenAI 相容的 API,以實現與 Ollama 模型一起進行的多功能對話。自定義 OpenAI API URL 以連結到 LMStudio、GroqCloud、Mistral、OpenRouter 等。
  • Pipelines、Open WebUI 外掛程式支援:使用 Pipelines 外掛程式框架將自定義邏輯和 Python 庫無縫集成到 Open WebUI 中。啟動您的 Pipelines 實例,將 OpenAI URL 設置為 Pipelines URL,並探索無限的可能性。示例包括函數調用、用於控制訪問的用戶速率限制、使用 Langfuse 等工具進行使用監控、使用 LibreTranslate 進行即時翻譯以實現多語言支援、有毒消息過濾等等。
  • 網頁,支持PWA、回應式設計:在台式電腦、筆記型電腦和行動裝置上享受無縫體驗。
  • 免提語音/視頻通話:通過集成的免提語音和視頻通話功能體驗無縫通信,從而實現更加動態和互動的聊天環境。
  • 模型生成器:通過 Web UI 輕鬆創建 Ollama 模型。通過 Open WebUI 社區集成,輕鬆創建和添加自定義角色/代理、自定義聊天元素和導入模型。
  • 本機 Python 函數調用工具:通過工具工作區中的內置代碼編輯器支援來增強您的LLMs功能。只需添加純 Python 函數,即可自帶函數 (BYOF),從而實現與LLMs的無縫集成。
  • 本地RAG整合:通過突破性的檢索增強生成 (RAG) 支援,深入瞭解聊天交互的未來。此功能將文檔交互無縫集成到您的聊天體驗中。您可以將文件直接載入到聊天中或將檔案添加到文件庫中,在查詢之前使用 # 命令輕鬆訪問它們。
  • RAG 的 Web 搜尋:使用 SearXNG 、 Google PSE 、 Brave Search 、 serpstack、serper、Serply、DuckDuckGo 和 TavilySearch 等提供程式執行 Web 搜尋,並將結果直接注入到您的聊天體驗中。
  • Web 瀏覽功能:使用後跟URL的命令將網站無縫集成到您的聊天體驗中。此功能允許您將 Web 內容直接合併到您的對話中,從而增強交互的豐富性和深度。
  • 圖像生成集成:使用 AUTOMATIC1111 API 或 ComfyUI(本地)和 OpenAI 的 DALL-E(外部)等選項無縫整合圖像生成功能,通過動態視覺內容豐富您的聊天體驗。
  • 多種模型對話:毫不費力地同時與各種模型互動,利用它們的獨特優勢獲得最佳回應。通過並行利用一組不同的模型來增強您的體驗。
  • 基於角色的訪問控制 (RBAC):確保具有受限許可權的安全訪問;只有經過授權的個人才能訪問您的Ollama,並且為管理員保留了獨佔的模型創建/拉取許可權。

Hollama

Github位置: https://github.com/fmaclen/hollama

線上DEMO: https://hollama.fernando.is

用於與 Ollama 伺服器通訊的最小 Web UI。

主要功能

  • 具有代碼編輯器功能的大型prompt輸入框
  • Markdown 解析,帶語法高亮顯示
  • 輕鬆將 Markdown 複製為原始文字
  • 可自定義的系統提示
  • 保存瀏覽器上 localStorage 的所有更改
  • 桌面和移動友好的佈局
  • 淺色和深色主題
  • 支持重新產出答案以及流式輸出

LoLLMs Webui

LoLLMs Webui是一個基於Web的用戶介面,用來運行和管理大型語言模型(Large Language Models,簡稱LLMs)。它提供了一個友好的界面,讓使用者能夠輕鬆地與各種大型語言模型互動,進行文本生成、對話、翻譯等操作。這個Webui通常用於研究和開發人員,需要處理自然語言處理任務的專業人員,或任何對語言模型有興趣的人。

lollms v6 支持文本生成,例如自動寫詩,並允許用戶在「遊樂場」應用中測試不同的文本完成任務。此外,用戶可以進行討論和創建自定義預設以應對特定任務。

主要功能

  1. 模型選擇:允許使用者選擇和切換不同的語言模型。
  2. 文本生成:根據用戶輸入的提示生成文本。
  3. 對話系統:進行類似於聊天機器人的對話。
  4. 多語言支持:支持多種語言的文本生成和翻譯。
  5. 性能監控:提供模型運行的性能數據和使用統計。
  6. 擴展和自定義:允許用戶添加自定義模型和擴展功能。

BionicGPT

Github頁面: https://github.com/bionic-gpt/bionic-gpt

BionicGPT 是 ChatGPT 的本地替代品,提供生成式 AI 的優勢,同時保持嚴格的數據機密性 BionicGPT 可以在您的筆記型電腦上運行或擴展到數據中心。

主要功能

  • 在幾秒鐘內本地運行 Gen AI:嘗試我們的 Docker Compose 安裝,適合本地運行 AI 和小型試點項目。
  • 熟悉的聊天體驗:我們的聊天介面借鑒了 ChatGPT,確保使用者友好的體驗。仿生主題完全可定製,提供快速回應的性能,並支援聊天記錄管理。
  • AI 助手(檢索增強產生):用戶可以創建使用自己的數據來增強 AI 的助手,並在團隊中無縫共享。助手是企業級 RAG 管道,支援多種格式文件,並可通過 UI 進行無代碼配置。
  • 團隊功能:Bionic 利用團隊設置最大化效果,支持邀請和管理團隊成員。用戶可以在團隊之間切換,保持數據隔離,並使用 SSO 系統配置訪問權限。
  • 縱深防禦安全:我們的 CI/CD 管道運行 SAST 測試,並在 Postgres 中使用行級別安全性。內容安全策略處於最高級別,容器構建和運行具備安全保障,並支持 SIEM 集成和機密管理。
  • 可觀察性和報告:與 Prometheus 相容的可觀測性 API,使用 Grafana 創建儀錶板,所有問題和回復都記錄在 Postgres 資料庫中。
  • 令牌使用限制和控制:設置令牌使用限制,保護模型不過載,通過反向代理和角色基於限制確保公平使用。
  • 將 AI 助手轉變為 API:任何助手都可以轉換為相容 Open AI 的 API,並支持 API 金鑰管理和限制。
  • 使用 GuardRails 管理數據治理:將規則應用於批量和流式數據管道,抵禦立即注射攻擊等多種威脅。
  • 本地或遠端大型語言模型:支援在本地或數據中心運行的開源模型,支持多模型管理和無縫切換。
  • 基於角色的訪問控制:根據 IAM 系統中的角色授予或限制功能訪問權限,確保數據安全。
  • 數據集成:通過 Airbyte 集成,批量上傳數據,並支援手動上傳和即時數據捕獲,確保數據不洩露。
  • 部署到裸機或雲端:使用 Kubernetes 無縫安裝,定期更新和引入新功能以改進 Bionic。

LibreChat

LibreChat 將助理 AI 的未來與 OpenAI 的 ChatGPT 的革命性技術相結合。相容遠端和本地 AI 服務:groq, Ollama, Cohere, Mistral AI, Apple MLX, koboldcpp, OpenRouter, together.ai, Perplexity, ShuttleAI, and more

RAG API: github.com/danny-avila/rag_api

主要功能

  1. 語音轉文字和文字轉語音功能:用戶可以透過語音與系統互動,系統能夠識別語音並回應,也能將文字信息轉換為語音輸出。
  2. 共享連結功能:允許用戶創建訊息的共享連結,並將共享訊息在創建時固定,確保即使後來有新訊息添加,共享的內容也不會變更。更新共享訊息只需重新生成連結。
  3. 電子郵件驗證和密碼重設:增加註冊和登入的安全性,用戶可以通過驗證電子郵件地址來保護帳戶安全,並支持通過電子郵件重設密碼。
  4. 搜索功能增強:改進了搜索功能,使用戶更容易在聊天記錄中找到特定的信息。
  5. 初步支持 OpenAI 助理 V2:包括支持 GPT-4.0,原生圖像視覺支持,以及由 LibreChat 支持的圖像和代碼解釋功能。
  6. 增強的隱私保護:用戶可以設定只顯示自己創建或沒有作者的助理,這在使用共享 API 密鑰的環境中尤為重要,以防止用戶間的信息洩露。
  7. LDAP 支持:支持輕量級目錄訪問協議(LDAP)服務器認證,方便組織管理對 LibreChat 的訪問。
  8. 可以從 LibreChat、ChatGPT、Chatbot UI 導入對話

LLMStack

LLMStack 是一個強大的生成式 AI 平台,旨在簡化 AI 應用的構建和部署。無需編寫任何代碼,您就可以構建多種 AI 代理,並將它們連接到您的內部或外部工具,進行網頁搜索或互聯網瀏覽。這是一個專為現代業務需求設計的全面解決方案。

主要功能

  • 代理:構建生成式 AI 代理,如 AI SDR、研究分析師、RPA 自動化等,無需編寫任何代碼。將代理連接到您的內部或外部工具,搜索 Web 或與代理一起瀏覽互聯網。
  • 連結多個模型:LLMStack 允許您將多個 LLMs 模型連結在一起,以構建複雜的生成式 AI 應用程式。
  • 對您的數據使用生成式 AI:將您的數據導入帳戶,並在 AI 鏈中使用它。LLMStack 支援從各種來源(如 gdrive、notion、網站、直接上傳等)導入多種類型的數據(如 CSV、TXT、PDF、DOCX、PPTX 等)。平台將自動進行預處理和向量化,並將數據存儲在開箱即用的向量資料庫中。
  • 無代碼構建器:LLMStack 帶有一個無代碼構建器,允許您在沒有任何編碼經驗的情況下構建 AI 鏈。您可以將多個 LLMs 連結在一起,並將它們連接到您的數據和業務流程。
  • 部署到雲端或本地:LLMStack 可以部署到雲端或本地。您可以將其部署到您自己的基礎架構中,或使用我們的雲產品,網址為 Promptly。
  • API 訪問:使用 LLMStack 構建的應用程式或聊天機器人可以通過 HTTP API 訪問。您還可以從 Slack 或 Discord 觸發您的 AI 鏈。
  • 多租戶:LLMStack 是多租戶的。您可以建立多個組織並向其中添加使用者。使用者只能訪問屬於其組織的數據和 AI 鏈。
發佈日期:

EchoMimic – 人物圖片轉影片的開源模型

介紹EchoMimic

EchoMimic 是一款開源 AI 工具,可以將人物圖片轉換為逼真的說話視頻。它採用了創新的肖像圖像動畫技術,能夠通過組合音頻信號和面部關鍵點來生成生動自然的視頻。

EchoMimic 的工作原理

  1. 首先,需要將人物圖片和音頻輸入到模型中。
  2. 模型會提取音頻中的音素和人物圖片中的面部關鍵點。
  3. 然後,模型會利用這些信息生成相應的面部動畫。
  4. 最後,將生成的的面部動畫與原來的圖片合成,得到最終的說話視頻。

例如這樣的圖片

加上這樣的音檔

可以合成這樣的影片

安裝教學

事前作業

  1. 先安裝CUDA和CUDNN(https://developer.nvidia.com/cuda-toolkit)
  2. 接著安裝可支援GPU的pytorch,要注意的是,Pytorch所支持的CUDA版本有可能無法支持最新的,我們可以在官網看現在最新支持到哪個版本的CUDA,以下圖為例,我們所安裝的CUDA版本就不可以高於CUDA12.1

接著下載EchoMimic 專案,並創建新的CONDA環境,安裝所需函式庫

git clone https://github.com/BadToBest/EchoMimic
cd EchoMimic
conda create -n echomimic python=3.8
conda activate echomimic
pip install -r requirements.txt

接著到這邊下載FFMPEG: https://www.gyan.dev/ffmpeg/builds/

此為一個範例的下載網址: https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z

接著將ffmpeg的exe的路徑加入環境變數的path當中,如果能夠在CMD裡面輸入ffmpeg看到以下回覆代表安裝成功

接著下載預訓練權重

git lfs install
git clone https://huggingface.co/BadToBest/EchoMimic pretrained_weights

然後修改configs/prompts裡面的yaml檔案

接著執行 python 

python -u infer_audio2vid.py
python -u infer_audio2vid_pose.py

就可以看見執行的狀態,最終產生的檔案會位於output資料夾下

發佈日期:

文字轉語音的開源套件ChatTTS

ChatTTS介紹

chatTTS 是一個開源的文本轉語音(Text-to-Speech, TTS)項目,旨在將文字內容轉換為接近人類真實聲音的語音輸出。該項目在GitHub上迅速獲得了大量關注,因其語音合成效果非常逼真,甚至超越了一些商用TTS服務。chatTTS使用了大量的語音數據進行訓練,目前提供的模型已能夠生成語氣、停頓和節奏都極其自然的語音,並且支持多種語言和音色的合成。該項目允許用戶在本地或雲端(如Colab)環境中運行,並提供了易於使用的整合包和腳本,方便用戶快速上手。

官方網站

Github項目地址: https://github.com/2noise/ChatTTS/tree/main

直接可使用的易用版本ChatTTS_colab: https://github.com/6drf21e/ChatTTS_colab

模型的優勢

  1. 對話式TTS:ChatTTS針對對話式任務進行了最佳化,能夠實現自然且富有表現力的合成語音。
  2. 精細的控制:模型可以預測和控制精細的韻律特徵,包括笑聲、停頓和插入語。
  3. 更好的韻律:ChatTTS在韻律方面超越了大多數開源TTS模型。

ChatTTS安裝

Clone Repo 

git clone https://github.com/2noise/ChatTTS
cd ChatTTS

安裝相關套件

pip install --upgrade -r requirements.txt

啟動

python examples/web/webui.py

ChatTTS_colab下載

這個套件真的可以讓人很容易地使用ChatTTS,從官方Github的下載連結下載、解壓縮後,直接便可以使用

點選運行就可以跑出網頁操作介面了

以下為網頁介面的樣子,可使用音色抽卡功能挑選滿意的音色,並且下載該語音模型檔案

另外有Refine Text的功能,這個功能可以透過大語言模型,自動為所輸入的文字加上停頓或笑聲,或者我們也可以自己手動加上這個(使用特別的標籤[uv_break][uv_laugh])

也可以透過文本來產生多個人的對話,用::來分隔”腳色”和”對話內容”,例如:

旁白::在一個風和日麗的下午,小紅帽準備去森林裡看望他的奶奶

接著按下步驟1提取腳色,右邊的腳色種子就會根據文本的腳色來出現在表格當中,接著我們可以填入預選好的種子編號以及相關語速、笑聲等設定,就可以將整段對話產生為一個音檔

此為開啟伺服器的python視窗,我們可以看到伺服器正在產生影片

模型產生的音檔試聽

也有整理過的音色評比網站,登入後可直接線上試聽不同的音色

https://modelscope.cn/studios/ttwwwaa/ChatTTS_Speaker

發佈日期:

適用於雲端的物件存儲系統 – Minio

Minio介紹

MinIO 是一個開源的分佈式物件儲存服務器,針對需要大規模數據基礎架構的用戶設計。它支持與 S3 API 的完全兼容,並以私有雲為目標從頭開始建立。MinIO 在全球範圍內擁有廣泛的用戶和開發者社群,並且在 GitHub 上有超過 16,000 個星標,以及在 Docker 上超過 2.19 億次的下載。

核心功能

  • 非結構化數據存儲:能夠存儲各種類型的非結構化數據,包括照片、視頻、日誌文件和時間序列數據。
  • HTTP 方法支持:使用 PUT 方法上傳數據,GET 方法訪問數據,DELETE 方法刪除數據。
  • 高可擴展性:支持從單個服務器到成千上萬個節點的集群配置。
  • 企業級安全性:集成了擦除編碼和防位腐壞保護,並支持多種身份驗證系統如 WSO2、Keycloak 等。

部署教學

1. 下載和安裝

首先,訪問 MinIO 的 GitHub 頁面 下載最新的 MinIO 二進制文件。選擇適合您操作系統的版本進行下載並解壓。

2. 啟動 MinIO 服務器

在命令行中導航到 MinIO 二進制文件的位置,運行以下命令來啟動 MinIO 伺服器:

minio.exe server D:\

這裡 D:\ 是您想要 MinIO 使用來存儲數據的目錄。

3. 訪問 MinIO 管理界面

啟動伺服器後,可以通過瀏覽器訪問 http://localhost:9000 來打開 MinIO 的內建網頁管理界面。在這裡,您可以創建存儲桶,上傳和管理數據。

使用 MinIO 控制台進行測試

MinIO Server 帶有一個嵌入式的基於 Web 的物件瀏覽器。將您的 Web 瀏覽器指向 http://127.0.0.1:9000,以確保您的伺服器已成功啟動。

適用於 Kubernetes 的 MinIO 物件存儲

相關教學請見此: https://min.io/docs/minio/kubernetes/upstream/index.html

發佈日期:

專為連接性設計的查詢語言 – Cypher

甚麼是Cypher 

Cypher 是為了滿足開發者在處理圖形數據時的需求而生的。它的設計靈感來自於 SQL,目的是提供一種易於閱讀且表達能力強的語言來操作圖形數據。與傳統的 SQL 針對表格數據操作不同,Cypher 是專門為圖形數據設計的,能夠直觀地表示節點、關係及其屬性。

Cypher 的優點

  • 簡潔:Cypher 使用類似於自然語言的語法,因此易於閱讀和編寫。
  • 強大:Cypher 可以用於執行從簡單的查詢到複雜的圖形分析的所有操作。
  • 高效:Cypher 經過優化以實現圖形資料庫的快速查詢。

Cypher 的基本結構

在 Cypher 中,圖形被視為由節點(Nodes)和關係(Relationships)構成的網絡。每個節點和關係都可以擁有多個屬性。Cypher 查詢主要包括以下幾個部分:

  • CREATE: 用於創建圖中的節點和關係。
  • MATCH: 用來尋找匹配特定模式的節點和關係。
  • WHERE: 提供條件來限制 MATCH 或其他操作的結果。
  • RETURN: 指定返回的數據。
  • UPDATE: 更新節點或關係的屬性。
  • DELETE: 用於刪除節點或關係。

與 SQL 的比較

以下是一個客戶提供的實際 SQL 查詢示例,用於了解其組織結構:

SELECT *
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
WHERE e.manager_id IS NULL;

以下是等效的 Cypher 查詢:

MATCH (e:Employee)-[:MANAGES*0..]->(m:Employee)
WHERE m.manager_id IS NULL
RETURN e

新增圖形資料的步驟

1. 定義節點與關係

首先,您需要定義圖形中的節點(Nodes)和邊(Edges)或稱關係(Relationships)。節點代表實體,如人、地點、物件等,而邊則代表節點間的關係,如“朋友”、“位於”或“擁有”。

2. 創建模型

在 Neo4j 中,您可以透過 Cypher 語言創建模型。例如,如果您要建立一個表示人和學校的簡單模型,您可能會有如下命令:

CREATE (p:Person {name: "John", age: 25})
CREATE (s:School {name: "Stanford University", location: "California"})

這裡,PersonSchool 是節點的標籤,用於描述節點類型,而花括號內的是節點的屬性。

3. 建立關係

接著,您可以建立節點之間的關係。使用 CREATE 語句,您可以加上一個關係,比如:

MATCH (p:Person {name: "John"}), (s:School {name: "Stanford University"})
CREATE (p)-[:STUDIED_AT]->(s)

這個命令中,MATCH 部分先找到名字為 John 的人和名字為 Stanford University 的學校,然後 CREATE 建立了一個名為 STUDIED_AT 的關係,從人指向學校。

4. 數據加載

如果您已有現成的數據,如 CSV 文件,可以透過 Neo4j 的導入工具或命令行工具來批量導入數據。例如,使用以下 Cypher 命令從 CSV 文件中加載數據:

LOAD CSV WITH HEADERS FROM 'file:///path_to_your_file.csv' AS line
CREATE (:Person {name: line.name, age: toInteger(line.age)})

這樣就可以創建多個節點,每個節點根據 CSV 文件中的一行數據來設定屬性。

5. 驗證與查詢

建立數據後,您可以使用各種查詢來檢視數據是否正確加載,並進行分析。例如,查詢所有學生和他們就讀的學校:

MATCH (p:Person)-[:STUDIED_AT]->(s:School)
RETURN p.name, s.name

6. 數據更新與管理

管理和更新圖形數據庫中的數據是日常操作的一部分。例如,你可以更新一個節點的屬性或添加新的關係:

MATCH (n:Person {name: 'Ann'})
SET n.age = 26

7. 高級過濾技術

Cypher 提供了豐富的過濾條件來精確控制查詢結果。使用 WHERE 子句可以根據具體條件篩選節點或邊。例如,要找出所有2000年後上映的電影,可以使用:

MATCH (movie:Movie)
WHERE movie.releaseDate >= 2000
RETURN movie

這種過濾方式使得 Cypher 查詢在處理複雜條件時更加靈活和強大。

8. 聚合函數的應用

與 SQL 不同,Cypher 的聚合操作不需要指定分組鍵,因為非聚合字段會自動成為分組的依據。這一特性簡化了查詢的編寫。例如,計算每個演員參演的電影數量:

MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
RETURN actor.name, COUNT(movie)

這裡,COUNT(movie) 是一個聚合函數,用來統計每位演員參演的電影數。

這些基本步驟可幫助您開始使用圖形資料庫並有效地管理圖形數據。隨著熟悉過程,您可以進一步探索更複雜的模型和查詢技術。

發佈日期:

圖形資料庫的概念入門

本文為此視頻的學習筆記

關聯式資料庫的核心概念 – ACID

ACID 是一個用來描述資料庫事務正確性的術語,它代表了原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)四個關鍵特性:

  1. 原子性(Atomicity):保證事務中的所有操作要麼全部完成,要麼全部不完成,不會出現只執行了部分操作的情況。如果任何一部分的事務失敗,整個事務將被回滾,資料庫狀態不會改變。
  2. 一致性(Consistency):事務必須使資料庫從一個一致的狀態轉變到另一個一致的狀態。也就是說,事務完成後,所有的資料庫規則都必須應用,保證資料庫的正確性和完整性。
  3. 隔離性(Isolation):確保並行運行的事務彼此隔離,防止事務間的相互干擾。即使事務是同時執行的,每個事務也應該獨立於其他事務,就像它是系統中唯一運行的事務一樣。
  4. 持久性(Durability):一旦事務被提交,它對於資料庫的改變就是永久的,即使系統發生故障也不會丟失事務執行的結果。

ACID 特性是許多關係型資料庫管理系統(RDBMS)的基礎,是它們能夠提供可靠事務處理的關鍵所在。

NoSQL:資料庫技術的演進

以前,我們使用關係型數據庫管理系統(RDBMS)來存儲數據。這種方法雖然在當時是最先進的技術,但其存在許多缺點:

  • 難以理解和查找數據:數據存儲的方式使得查找和理解數據變得困難。
  • 難以索引和消除不一致性:儘管ACID特性保障了數據的一致性,但實現起來相當困難。

隨著技術的進步,我們開始在關係型資料庫中使用表格的形式來存儲數據。這些表格使得數據更容易被人類讀懂,但一旦為了去重和保持一致性而標準化數據,就會出現以下問題:

  • 數據標準化帶來的挑戰:標準化數據涉及大量自動生成的數字外鍵,這讓數據變得難以理解和維護。
  • 聯接查詢的複雜性:需要使用復雜的聯接查詢才能查找到所需的數據。

關係型資料庫的優勢與限制

關係型資料庫的一個顯著優勢是支持ACID特性,這保證了數據一旦提交,後續查詢都能訪問到這些數據。然而,這也帶來了一些挑戰:

  • 高查找成本:為了加快查找速度,我們需要添加索引。但如果進行多次聯接操作,每次聯接都需要進行索引查找,尤其當涉及多個表格時(例如20個),查找成本會非常高。
  • 數據量增加的挑戰:隨著數據量的增長,查找成本只會越來越高。

NoSQL技術的崛起

過去十年,雲計算的出現使情況變得更加複雜。數據量爆炸性增長,我們面臨的挑戰是如何存儲這些海量數據,並使其易於查詢。傳統的關係型資料庫已經難以應對這種規模的數據,這促使了NoSQL技術的革新。

NoSQL技術的發展目的是為了更快地查詢更多的數據,這其中需要做出一些權衡,比如放棄ACID的某些要求。畢竟,在處理數以百萬計的交易時,偶爾丟失一兩筆交易可能是可以接受的。

現代資料庫的用戶接口

為了提高開發者與大數據互動的便利性,我們需要發明或普及不同的用戶接口。其中最簡單的一種是鍵值接口:

鍵值接口:用一個鍵來存儲值,之後可以用這個鍵來獲取值,但這些值對資料庫來說是不透明的,毫無意義。

如果希望資料庫能根據內容來索引和查詢這些值,文檔資料庫就派上用場了:

文檔資料庫:讓你既可以用鍵來查找文檔,也可以基於文檔的內容來進行查找,這些內容都是為了快速檢索而被索引的。

圖形資料庫入門:掌握數據關係與提升查詢效率

1. 圖形資料庫的概念

圖形資料庫主要是用來存儲和操作由節點(實體)和邊(關係)組成的圖形結構數據。與傳統的關係型資料庫不同,圖形資料庫專注於實體之間的關係,這使得它們在處理複雜且相互連接的數據時更為有效。例如,社交網絡分析、推薦系統、欺詐檢測等場景,都能從圖形資料庫的結構中獲益。

2. 數據的存儲與查詢方式

圖形資料庫將數據以圖的形式存儲,其中每個節點表示一個實體,每條邊表示實體之間的某種關係。這種存儲方式不僅反映了真實世界的結構,而且使得查詢和分析數據關係變得直觀且高效。開發者可以直接利用這些關係來快速獲取複雜的查詢結果,而無需執行繁瑣的表連接操作。

3. ACID支持與數據完整性

雖然NoSQL資料庫在處理大量數據時提供了極大的靈活性和擴展性,但對於需要嚴格事務管理和數據完整性保證的應用,這可能是一個挑戰。圖形資料庫如Neo4j在這方面做出了調整,它提供了對ACID事務的支持,使得開發者在維護數據完整性的同時,也能享受NoSQL帶來的其他好處。

4. 從關係型資料庫到圖形資料庫的遷移

將現有的關係型資料庫數據遷移到圖形資料庫看似一個巨大的挑戰,但實際上這是一個直觀且簡單的過程。這種遷移不僅可以提供一個更直觀的數據模型,還能提高查詢的速度和數據處理的靈活性,特別是在業務需求迅速變化的今天,這一點尤為重要。

圖形資料庫的特性及應用案例

在評估資料庫時,開發者通常會考量以下三個主要目標:

1. 直觀性

直觀性意味著以邏輯方式創建和維護數據,減少從代碼到資料庫調用的轉換摩擦,以及業務人員描述應用需求與開發人員滿足這些需求之間的轉換。轉換減少等於提升生產力。在圖形資料庫中,白板模型即是物理模型。你在白板上繪製的數據模型將以完全相同的方式在磁盤上表示,這樣可以大大降低理解和實施上的難度。

2. 速度

速度不僅關乎開發速度,這是由於其更直觀而自然實現的,也關乎執行速度,以及你能多快為應用提供結果以實現實時決策。例如 eBay,他們的應用程式比之前使用 MySQL 解決方案快了數千倍。這支持了產品的實時交付,而 eBay 並不孤單,許多客戶主要因為我們能提供的性能優勢而選擇我們。過去無法實現的業務邏輯現在成為可能,過去需要批處理的流程現在可以實時進行。

3. 敏捷性

敏捷性是開發者在評估資料庫時考慮的第三個特性。敏捷性是速度的另一種衡量。你的代碼能多快、多容易適應業務變化?在 Neo4j 中,我們提供了一個自然適應的 schema optional 數據模型。你可以加入一些約束以維護數據完整性,但也具有隨時添加和刪除數據的靈活性。需要新的節點或關聯?你只需創建它們。需要在現有節點或關聯上存儲更多屬性?只需添加它們。就這麼簡單。不再有 schema 遷移讓你夜不能寐。

發佈日期:

Neo4j圖形資料庫介紹

官方資訊

官方網站: https://neo4j.com/

GitHub: https://github.com/neo4j/neo4j

什麼是Neo4j?

圖形資料庫是一種非關係型的資料庫,以圖形的方式存儲和處理數據。在圖形資料庫中,數據結構主要由節點(Node)和邊(Edge)組成,其中節點代表實體,邊則代表實體間的關係。這種資料庫尤其適合解決複雜的連接問題,例如社交網絡分析、推薦系統和欺詐檢測等。

Neo4j是目前最受歡迎的圖形資料庫之一,它提供了強大的數據建模能力和高效的查詢性能。作為一款專門處理連接數據的數據庫,Neo4j從設計之初就針對數據及其關係進行了優化。作為一種原生圖形數據庫,Neo4j在結構上與其他數據存儲方式大不相同。所謂「原生」意味著每一個數據記錄或節點都包含了直接指向其相連節點的指針,這些直接指針稱為關係。節點中已包含了查找下一個節點所需的所有信息,這就構成了一個連接的圖形,即所謂的原生存儲層。

由於這個設計原理,Neo4j在查詢時不需要計算數據之間的關係,因為這些連接已經存在於數據庫中。這使得對密集連接數據的查詢速度比其他數據庫快數個量級。其他數據庫沒有保存記錄之間的直接指針,它們需要通過搜索一個稱為索引的單獨數據結構來計算連接,這一查找過程需要反复執行以找到每一個連接,不僅耗時而且隨著數據量和查詢複雜度的增加,速度會呈指數級下降,這使它們在處理關係密集型查詢時的速度遠不及Neo4j。

甚麼是圖形數據庫

圖形數據庫將數據以圖的形式表示,這裡的「圖」是數學上的概念,即由節點通過邊連接。在Neo4j中,這些邊被稱為關係。這種表示方式讓客戶能夠實現傳統數據庫無法達到的洞察,因為傳統數據庫通常只將數據表示為行和列。這些新的洞察促使企業能夠做出更多基於數據的決策。

圖形數據庫可以解決三種類型的問題:旅程問題、複雜模式匹配和圖形算法應用。例如,在供應鏈管理中,從產品的來源追踪到消費者的餐盤;或者在零售行業中,通過知識圖形來支持對話代理,讓顧客能夠查詢產品成分等信息。

四種NoSQL 非關聯性資料庫

NoSQL 非關聯性資料庫例子
鍵-值資料庫Hadoop HBase
記憶體資料庫Redis
文件資料庫Mongodb
圖形資料庫Neo4j

主要功能及應用

(一)社交網路圖譜

Neo4j 可以進行複雜關係的查詢,讓使用者或其資料作為節點,使用者與資料的關係作為結點間的連結。

舉例來說,Neo4j 儲存公司、員工資料,便可進行查詢員工與公司的關係、員工與員工的關係、公司與其他類似公司的關係或與員工其他公司的關聯。

(二)企業網路圖譜

相較於單純的工商資訊查詢,藉由 Neo4j 的企業資訊查詢,可以更全面的了解企業資訊。

舉例來說,想了解一家企業的資訊,涵蓋了公司設立資訊、產品資訊、相關聯性資訊等等,利用 Neo4j 就可以查詢到相關聯的關係人資訊,如合作夥伴、客戶、投資人、供應商資料等等,藉由圖資料查詢可以層層挖掘資料,了解其中的複雜關係。

(三)金融產業應用:反洗錢的模型與反欺詐多維關聯分析場景

藉由 Neo4j 可以清楚知道有洗錢疑慮的網絡,相關的帳號、交易時間、手機 IMEI 碼等等,再進一步可進行關聯性的分析。

Neo4j的操作介面

在 neo4j 的數據模型中,您可以看到有許多節點,這些節點是名詞,例如人物、地點、物品等。這些節點之間還可以設置屬性,就像標籤一樣。更重要的是,節點之間可以有關係,並且在 neo4j 中,這些關係是一等公民,意味著它們與節點本身一樣重要。您可以為這些關係添加不同的屬性,甚至是地理空間信息或日期時間信息。

專為圖形設計的查詢語言——Cypher

neo4j 開發了一種專為圖形設計的查詢語言——Cypher。這種語言基於模式匹配,適合處理高度連接的數據問題。相比於傳統的 SQL,Cypher 提供了更靈活的查詢方式,使得用戶可以更容易地查找和分析網絡和圖形中的模式。

MATCH (p:Person)<-[:ACTED_IN]->(m:Movie)
WHERE m.title = "雲圖"
RETURN p

作為一個例子,假如您在探索如何通過遊戲推薦來了解用戶,使用 Cypher 可以讓這一過程非常直觀而有效。這種強大的數據模型和查詢語言的組合,讓 neo4j 在多個應用領域,如推薦系統、詐騙檢測和網絡管理等,展現出極大的潛力。

發佈日期:

FlashAttention介紹

官方資訊

Github: https://github.com/Dao-AILab/flash-attention

論文文檔: https://arxiv.org/abs/2205.14135

此存儲庫提供了以下論文中 FlashAttention 和 FlashAttention-2 的官方實現。可讓我們在建模時有更快的注意力,更好的並行度和工作分區。下面為一張概念示意圖:

官方所做的效能提升試驗結果如下:

甚麼是Flash Attention

Flash Attention 是一種注意力算法,旨在提高基於 Transformer 的模型的效率,使其能夠處理更長的序列長度並更快地進行訓練和推理。它通過減少計算量和內存使用來實現這一點。Flash Attention 是一種快速且內存高效的精確注意力機制,其設計考慮了IO(輸入輸出)的特性。

這項技術的關鍵點

快速 (Fast)

  • 訓練BERT-large(序列長度512)比MLPerf 1.1中的訓練速度記錄快15%。
  • 訓練GPT-2(序列長度1K)比HuggingFace和Megatron-LM的基準實現快3倍。
  • 在long-range arena(序列長度1K-4K)中,比基準速度快2.4倍。

高效內存使用 (Memory-efficient)

  • 傳統的注意力機制內存訪問量是O(N²),而Flash Attention的內存訪問量是亞二次方/線性的。

精確 (Exact)

  • 這不是近似算法(例如稀疏或低秩矩陣方法),其結果與原始方法完全相同。

IO感知 (IO-aware)

  • 與原始的注意力計算方法相比,Flash Attention考慮了硬件(特別是GPU)的特性,而不是將其當作黑盒來處理。

使用Flash Attention

可以通過以下兩種方式來實現:

  • 切片和重新計算:Flash Attention 將序列分成較小的塊,並在每個塊上計算注意力。這可以減少計算量,因為每個塊的注意力矩陣都小得多。此外,Flash Attention 還會重新利用中間計算結果,以進一步減少計算量。
  • 稀疏表示:Flash Attention 使用稀疏表示來表示注意力矩陣。這意味著只存儲非零元素,從而減少內存使用量。

安裝/使用Flash Attention

系統要求:

  • CUDA 11.6 及更高版本。
  • PyTorch 1.12 及更高版本。
  • Linux系統。此功能有可能於 v2.3.2版本之後開始支持 Windows,但 Windows 編譯仍然需要更多的測試。

我們推薦 Nvidia 的 Pytorch 容器,它具有安裝 FlashAttention 所需的所有工具。

在使用Flash Attention要先安裝:

  1. PyTorch。
  2. 安裝  pip install packaging 
  3. 確保已安裝並且 ninja 工作正常(例如, ninja --version 然後 echo $? 應返回退出代碼 0)。如果不是(有時 ninja --version 然後 echo $? 返回非零退出代碼),請卸載然後重新安裝 ninja ( pip uninstall -y ninja && pip install ninja )。如果沒有 ninja ,編譯可能需要很長時間(2 小時),因為它不使用多個 CPU 內核。 ninja 在 3 核機器上編譯需要 5-64 分鐘。
  4. 然後:
pip install flash-attn --no-build-isolation

如果您的電腦的 RAM 小於 96GB 且 CPU 內核眾多, ninja 則可能會運行過多的並行編譯作業,從而耗盡 RAM 量。要限制並行編譯作業的數量,可以設置環境變數 MAX_JOBS :

MAX_JOBS=4 pip install flash-attn --no-build-isolation

使用範例

from flash_attn import flash_attn_qkvpacked_func, flash_attn_func

flash_attn_qkvpacked_func(qkv, dropout_p=0.0, softmax_scale=None, causal=False,
                          window_size=(-1, -1), alibi_slopes=None, deterministic=False):
"""dropout_p should be set to 0.0 during evaluation
If Q, K, V are already stacked into 1 tensor, this function will be faster than
calling flash_attn_func on Q, K, V since the backward pass avoids explicit concatenation
of the gradients of Q, K, V.
If window_size != (-1, -1), implements sliding window local attention. Query at position i
will only attend to keys between [i - window_size[0], i + window_size[1]] inclusive.
Arguments:
    qkv: (batch_size, seqlen, 3, nheads, headdim)
    dropout_p: float. Dropout probability.
    softmax_scale: float. The scaling of QK^T before applying softmax.
        Default to 1 / sqrt(headdim).
    causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
    window_size: (left, right). If not (-1, -1), implements sliding window local attention.
    alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of (-alibi_slope * |i - j|) is added to
        the attention score of query i and key j.
    deterministic: bool. Whether to use the deterministic implementation of the backward pass,
        which is slightly slower and uses more memory. The forward pass is always deterministic.
Return:
    out: (batch_size, seqlen, nheads, headdim).
"""