發佈日期:

開源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

每個 MinIO Tenant 代表 Kubernetes 集群中一個獨立的 MinIO 物件存儲。下圖描述了部署到 Kubernetes 的 MinIO Tenant 的架構:

發佈日期:

專為連接性設計的查詢語言 – 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 在多個應用領域,如推薦系統、詐騙檢測和網絡管理等,展現出極大的潛力。

發佈日期:

使用GitHub 的 HTTPS 憑證拉取私有庫

為什麼不能用登入帳密拉取

使用帳密進行身份驗證存在安全風險,尤其是在命令列工具中,如果密碼被儲存或洩露,可能會導致帳戶被入侵。因此,GitHub 要求使用 HTTPS 憑證來增加安全性,並且從 2021 年 8 月 13 日起,GitHub 停止支援使用帳戶密碼進行命令列操作,改為強制使用 Personal Access Token 進行身份驗證。

兩者的區別和為什麼不能通用的原因:

登入帳密

  • 用途:用於登入 GitHub 網站,管理你的帳戶、瀏覽儲存庫、設定等。
  • 形式:一般由使用者名稱和密碼組成。

HTTPS 憑證(Personal Access Token 或 OAuth Token)

  • 用途:用於從命令列或 API 中進行身份驗證,主要用於推送和拉取程式碼等操作。
  • 形式:這是一個隨機生成的長字符串,用來替代密碼進行身份驗證。
  • 原因:使用 token 可以提供更高的安全性,因為 token 可以被限制使用範圍和存取權限,即使被洩露,也不會洩露你的完整帳戶資料。而且,你可以隨時撤銷或重新生成新的 token。

如何生成 Personal Access Token

登入 GitHub。點擊右上角的個人頭像,選擇「Settings」。

在左側欄位中選擇「Developer settings」。

選擇「Personal access tokens」。點擊「Generate new token」,設置 token 的名稱和存取權限。

生成後會顯示 token,把它複製並安全地保存,因為這是唯一能看到它的機會。

GitAhead圖形化Git工具

GitAhead 是一款用於管理 Git 儲存庫的圖形化工具,提供了直觀的界面和多種功能,適合開發者進行版本控制操作。

GitAhead 的特點

  1. 圖形化界面
    • GitAhead 提供一個直觀的圖形化界面,使得管理和查看 Git 儲存庫變得更加簡單。你可以直觀地查看分支、提交歷史、變更等。
  2. 跨平台支持
    • GitAhead 支持 Windows、Mac 和 Linux 平台,讓開發者可以在不同的操作系統上使用相同的工具。
  3. 簡單易用
    • 對於新手來說,GitAhead 提供了易於理解的操作界面,減少了學習曲線。它的直觀性使得進行常見的 Git 操作變得更加簡單。

在GitAhead中連接GitHub私有庫

發佈日期:

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).
"""
發佈日期:

向量搜尋資料庫的比較

ChromaDB介紹

官方文件: https://docs.trychroma.com/getting-started

GitHub: https://github.com/chroma-core/chroma

Chroma是一個新的AI原生開源嵌入式資料庫,非常輕量且易用。 Chroma是開源嵌入式資料庫,它使知識、事實​​和技能可插入,從而輕鬆建立LLM應用程式。它可以運行在記憶體中(可保存在磁碟中),也可做為資料庫伺服器來使用(這和傳統資料庫類似)。

基本使用範例

import chromadb

# 建立客戶端
# 記憶體模式
# client = chromadb.Client()

# 持久模式,資料保存在磁碟
client = chromadb.PersistentClient(path="./chromac")

# Docker客戶端模式
# chroma_client = chromadb.HttpClient(host="localhost", port=8000)

# 遍歷所有集合
collections = client.list_collections()
print("現有的集合:", collections)

# 建立新集合
collection = client.create_collection("testname")

# 取得集合
collection = client.get_collection("testname")

# 建立或取得集合
collection = client.get_or_create_collection("testname")

# 刪除集合
client.delete_collection("testname")

# 建立或取得集合(帶有嵌入函數)
def embedding_function(doc):
    # 定義你的嵌入函數
    return [0.1, 0.2, 0.3]

collection = client.get_or_create_collection(name="my_collection2", embedding_function=embedding_function)

# 取得集合中最新的5條資料
latest_documents = collection.peek()
print("最新的資料:", latest_documents)

# 新增資料
collection.add(
    documents=[
        "2022年2月2號,美國國防部宣布:將向歐洲增派部隊,應對俄烏邊境地區的緊張局勢。",
        "2月17號,烏克蘭軍方稱:東部民間武裝向政府軍控制區發動砲擊,而東部民間武裝則指責烏政府軍先動用了重型武器發動襲擊,烏東地區緊張局勢持續升級。"
    ],
    metadatas=[
        {"source": "my_source"},
        {"source": "my_source"}
    ],
    ids=["id1", "id2"]
)

# 改變資料(更新或新增)
collection.upsert(
    ids=["id1"],
    documents=["更新後的文檔內容"],
    metadatas=[{"source": "updated_source"}]
)

# 刪除資料
collection.delete(ids=["id1", "id2"])

# 查詢資料
results = collection.query(
    query_texts=["俄烏戰爭發生在哪天?"],
    n_results=2
)
print("查詢結果:", results)

Elasticsearch Vector Store

Elasticsearch 是一個非常強大和靈活的搜索和分析引擎。雖然它的主要用例圍繞全文搜索,但它的用途足夠廣泛,可以用於各種其他功能。其中一個引起許多開發人員和數據科學家注意的功能是使用 Elasticsearch 作為向量資料庫。隨著 dense_vector 數據類型的出現和利用該 script_score 函數的能力,Elasticsearch 的功能已經擴展到促進向量相似性搜索。

Elasticsearch 與專用向量搜索庫相比的優點

使用 Elasticsearch 作為向量資料庫的不可否認的優勢之一是其內置功能,可以過濾對特定數據子集的查詢。當您想要縮小搜索空間範圍或應用程式需要上下文感知向量搜索時,此功能非常有用。相比之下,雖然其他專用的向量搜索庫(如 ChromaDB 和 Faiss)為純向量搜索提供了無可挑剔的速度和效率,但它們缺乏 Elasticsearch 中的全功能查詢功能。例如,ChromaDB 確實允許查詢元數據,但它僅限於字元串的精確匹配。此限制有時會妨礙複雜搜索方案中所需的靈活性和粒度。

將 Elasticsearch 豐富的查詢環境與向量相似度搜索相結合,意味著使用者可以兩全其美:基於向量的精確結果,並通過使用細緻入微的上下文感知篩檢程式對這些搜索進行分層的能力來增強。這種合併使 Elasticsearch 成為需要深度和廣度的開發人員的有力選擇。

Elasticsearch 與專用向量搜索庫的缺點

Elasticsearch 憑藉其廣泛的工具集和適應性,在搜尋引擎領域為自己開闢了一席之地。然而,當與 Faiss 和 ChromaDB 等專門的向量搜索庫相比時,它在某些領域暴露了它的局限性。

近似最近鄰和分層可導航小世界技術

對於Elasticsearch的OpenSearch版本7來說,它缺乏對近似最近鄰(ANN)算法和分層可導航小世界(HNSW)技術的內置支持。這些先進的方法對於提高在廣泛數據集中的搜索速度至關重要。利用它們,搜索速度可以大大加快,而準確性只有很小的權衡。

Faiss 和 ChromaDB

Faiss 和 ChromaDB 將這些策略作為核心技術,展示了快速導航廣闊向量空間的天生能力。他們在該領域的實力使其在圍繞廣泛數據集並需要快速結果的應用中具有優勢。

使用過濾器來緩解

對於Elasticsearch愛好者來說,一切並不黯淡。該系統固有的靈活性提供了一種對策。通過熟練地將過濾器應用於查詢,可以減少Elasticsearch中的搜索空間。這種減少在一定程度上可以平衡因缺乏ANN和HNSW支持而造成的效率差距。此類過濾器使Elasticsearch能夠關注相關數據子集,從而使搜索過程更易於管理和更快速。

Faiss Vector Store

官方網站: https://faiss.ai/index.html

Faiss 是一個用於高效相似性搜索和密集向量聚類的庫。它包含搜索任何大小的向量集的演算法,直到可能不適合 RAM 的向量集。它還包含用於評估和參數調整的支援代碼。Faiss 基於多年的研究,實現了多種先進的技術,使其在大規模向量數據搜索中具有顯著優勢。以下是 Faiss 的主要優點:

Faiss 向量資料庫的優點在於其能夠快速在大量數據中找到匹配項,節省存儲空間,同時保持搜索的準確性。它通過多層次的方法和高效索引技術顯著提高搜索速度,並利用 GPU 進行加速,使得大規模數據的搜索更加高效且穩定。這些特性使得 Faiss 非常適合需要快速檢索大量資料的應用。

  1. 非詳盡搜索:基於 “Video google: A text retrieval approach to object matching in videos.” 的倒排文件技術,使得在大型數據集中進行非詳盡搜索成為可能,避免了全量掃描,提高了搜索效率。
  2. 產品量化 (PQ):來自 “Product quantization for nearest neighbor search” 的產品量化方法,是一種高維向量的有損壓縮技術,能在壓縮域中進行相對準確的重建和距離計算,減少存儲和計算成本。
  3. 三級量化 (IVFADC-R):從 “Searching in one billion vectors: re-rank with source coding” 引入的三級量化方法,進一步提高了搜索效率。
  4. 倒排多重索引:基於 “The inverted multi-index” 的技術,大大提高了倒排索引的速度,適用於快速且精度要求不高的操作。
  5. 優化產品量化 (OPQ):來自 “Optimized product quantization” 的技術,通過向量空間的線性變換,使索引更為高效。
  6. GPU 加速:在 “Billion-scale similarity search with GPUs” 中描述的 GPU 實現和快速 k 選擇,使得在大規模相似性搜索中能充分利用 GPU 的計算能力。
  7. 分層可導航小世界 (HNSW):使用 “Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs” 的 HNSW 索引方法,提供高效而穩健的近似最近鄰搜索。
  8. 二進位多索引哈希:基於 “Fast Search in Hamming Space with Multi-Index Hashing” 的二進位多索引哈希方法,提高了哈希空間中的搜索速度。
  9. 基於圖的索引 (NSG):從 “Fast Approximate Nearest Neighbor Search With The Navigating Spreading-out Graph” 引入的 NSG 方法,進一步提高了近似最近鄰搜索的效率。
  10. 殘差量化器:來自 “Improved Residual Vector Quantization for High-dimensional Approximate Nearest Neighbor Search” 的殘差量化器技術,改進了高維度近似最近鄰搜索的性能。

Redis Vector Store

官方介紹: https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/

大多數具有 Web 服務背景的開發人員可能都熟悉 Redis。從本質上講,Redis 是一個開源鍵值存儲,可以用作緩存、消息代理和資料庫。開發人員之所以選擇 Redis,是因為它速度快,擁有龐大的用戶端庫生態系統,並且已被各大企業部署多年。

RediSearch 是一個 Redis 模組,為 Redis 提供查詢、二級索引、全文搜索和向量搜索。要使用 RediSearch,首先要在 Redis 數據上聲明索引。然後,可以使用 RediSearch 用戶端查詢該數據。有關 RediSearch 功能集的詳細資訊,請參閱 README 或 RediSearch 文檔。

Redis向量資料庫支援2種向量索引類型,分別是暴力搜尋的FLAT以及近似搜尋HNSW,同時也提供餘弦距離、內積距離和歐幾里德距離3種距離運算,另外還支援範圍搜尋,以及可以添加組合過濾器和語義搜尋的混合搜尋,並提供JSON物件支援。