基於 AutoFlow 快速搭建基於 TiDB 向量搜尋的本地知識庫問答機器人

PingCAP發表於2024-12-05

導讀

本文將詳細介紹如何透過 PingCAP 開源專案 AutoFlow 實現快速搭建基於 TiDB 的本地知識庫問答機器人。如果提前準備好 Docker、TiDB 環境,整個搭建過程估計在 10 分鐘左右即可完成,無須開發任何程式碼。
文中使用一篇 TiDB 文件作為本地資料來源作為示例,在實際情況中,您可以基於自己的企業環境用同樣的方法快速構造企業內部知識庫問答機器人。

背景知識

AutoFlow 是 PingCAP 開源的一個基於 Graph RAG、使用 TiDB 向量儲存和 LlamaIndex 構建的對話式知識庫聊天助手。https://tidb.ai 也是 PingCAP 基於 AutoFlow 實現的一個 TiDB AI 智慧問答系統,我們可以向 tidb.ai 諮詢任何有關 TiDB 的問題,比如 "TiDB 對比 MySQL 有什麼優勢?"

TiDB 對比 MySQL 有什麼優勢

以下是 tidb.ai 的回答,從結果來說,tidb.ai 非常準確的理解了使用者的問題並給出了相應的回答。它首先給出 TiDB 優勢及 MySQL 限制的詳細說明,然後給出一個結論性的總結,最後給出更多的參考連結。

tidb.ai 的回答

基於 TiDB 實現問答系統的基本流程

相信透過前面的一些介紹,大家對 tidb.ai 的能力已經有了一個清楚的認識。TiDB 的使用人員很幸運,因為有了 tidb.ai,幾乎任何有關 TiDB 的問題都可以在這個統一的平臺得到相應的解答,一方面節省了自己人工去查詢 TiDB 官方文件或 AskTUG 論壇的時間,另一方面 tidb.ai 擁有比普通大模型更專業的 TiDB 知識問答。

在技術實現上,tidb.ai 背後主要使用到 TiDB 的 Graph RAG 技術、TiDB 向量檢索功能以及 LLM 大模型的使用。實際上,在 AutoFlow 出來之前,我們也可以透過 python 程式設計開發的方式基於 LLM+RAG+TiDB 實現一套問答系統。主要的開發流程如下:

  1. 準備私域文字資料
  2. 對文字進行切分
  3. 透過 Embedding 將文字轉為向量資料
  4. 把向量資料儲存到 TiDB
  5. 獲得使用者輸入問題並進行向量化,然後從 TiDB 中進行相似度搜尋
  6. 將上述片段和歷史問答作為上下文,與使用者問題一起傳入大模型,最後輸出結果

開發流程

基於 AutoFlow 搭建本地知識庫問答系統

基於 python 開發這樣一套問答系統,一般要結合大模型常用開發框架如 Langchain,Langchain 整合了多種檔案格式或 URL 網址的匯入功能。如果希望給這個系統增加 Web 介面的能力,還需要引入前端視覺化工具,如 Gradio 或 Steamlit。但是如果使用開源的 AutoFlow,即使對於沒有任何開發背景的同學來說,搭建一套這樣的問答系統也是一件輕而易舉的事情,以下我們具體演示整個搭建的過程。

環境準備

在環境準備階段,我們主要需要準備以下幾項內容:

  • Docker 環境

需要確保 AutoFlow 執行的機器上具備 Docker 執行環境,因為 AutoFlow 專案中的應用是基於 docker 容器環境執行的。有關 Docker 執行環境的準備工作本文不作說明,安裝完成後可使用 docker run hello-world 命令驗證安裝成功。

  • AutoFlow 專案

AutoFlow 是一個開源的 github 專案,地址為 https://github.com/pingcap/autoflow。下載之後需要在 AutoFlow 根目錄下配置相關資訊,包括 TiDB 資料庫連線資訊、EMBEDDING 維度等。

cat > .env <<'EOF'
ENVIRONMENT=production

# 可使用 python3 -c "import secrets; print(secrets.token_urlsafe(32))" 生成金鑰
SECRET_KEY="some_secret_key_that_is_at_least_32_characters_long"

TIDB_HOST=<ip>
TIDB_PORT=<port>
TIDB_USER=<username>
TIDB_PASSWORD=<password>
TIDB_DATABASE=tidbai_test
# 非 TiDB serverless 環境需要將 TIDB_SSL 設定為 false
TIDB_SSL=false

EMBEDDING_DIMS=1024
EMBEDDING_MAX_TOKENS=4096
EOF
  • 帶向量功能的 TiDB 環境

TiDB 最新發布的 v8.4 版本,支援向量搜尋功能(實驗特性)。向量搜尋是一種基於資料語義的搜尋方法,可以提供更相關的搜尋結果。有關 TiDB 向量搜尋功能,參考 https://docs.pingcap.com/zh/tidb/v8.4/vector-search-overview

需要確保 TiDB 8.4 叢集正常執行,且已經建立有 AutoFlow 配置中指定的 TIDB_DATABASE 資料庫(必須為空庫)。

mysql> select version();
+--------------------+
| version()          |
+--------------------+
| 8.0.11-TiDB-v8.4.0 |
+--------------------+
1 row in set (0.00 sec)

mysql> create database tidbai_test;
Query OK, 0 rows affected (0.52 sec)
  • 智譜 AI API Key

註冊並登入智譜 AI 平臺 https://bigmodel.cn/, 在個人中心->API kys 新增新的 API Key 並複製儲存。注意,如果免費建立的使用者已經超過一定的時效期限,API Key 將是無效的。

智譜 AI API Key

資料初始化

執行資料遷移以建立所需的表並建立初始管理員使用者

cd autoflow
docker compose -f docker-compose-cn.yml run backend /bin/sh -c "alembic upgrade head"
docker compose -f docker-compose-cn.yml run backend /bin/sh -c "python bootstrap.py"

建立初始管理員使用者

當看到如上輸出結果時,說明初始化這一步已經成功(注意儲存好紅色字型中的密碼以備後面使用)。這時我們去 TiDB 資料庫中檢視,發現 tidbai_test 這個庫中已經自動建立出了相應的表並有一些初始化資料,符合預期。

初始化資料

啟動知識庫應用

執行以下 docker compose 命令啟動知識庫應用程式

cd autoflow
docker compose -f docker-compose-cn.yml up -d --force-recreate

啟動知識庫應用

網頁訪問和配置知識庫應用

應用啟動成功後,我們可以直接透過預設的 3000 埠訪問相應的介面進行下一步操作了。使用預設管理員使用者 admin@example.com 以及上述應用啟動列印的密碼進行登入。

網頁訪問和配置知識庫應用

登入成功後,會彈出如下圖所示的提示框,後面我們只要按照提示框一步步進行相應配置即可。

注意:3000 這個埠是 TiDB 資料庫預設的 Grafana 埠號,如果把 AutoFlow 部署在和 Grafana 相同的節點,需要考慮埠衝突問題。

提示框

  1. 配置 LLM

此步驟需要配置的內容包括:

  • 模型名稱
  • 模型提供商(選擇 OpenAI Like)
  • 模型型號(如 glm-4-0520)
  • 智譜AI API KEY(見環境準備階段)
  • 高階選項-> api_base 路徑(需與 LLM 對應)
  • 是否預設 LLM(是或否)

配置 LLM

配置完成後,點選 Create LLM 建立 LLM 關聯。需要注意的是,這裡提供的 API Key 必須是一個有效的 Key,如果建立 API Key 的賬戶本身就過時,建立 LLM 時可能就會遇到以下報錯。如果只是為了測試用途,可以重新註冊一個賬號並取得一個新的 API Key 試用。

Failed to create LLM
Error code: 429 - {'error': {'code': '1113', 'message': '您的賬戶已欠費,請充值後重試。'}}
  1. 配置 Embedding 模型

此步驟需要配置的內容包括:

  • embedding名稱
  • 模型提供商(選擇 OpenAI Like)
  • 模型型號(如 embedding-2)
  • 智譜AI API KEY(與上述相同)

配置 Embedding 模型

配置完成後,點選 Create Embedding Model 建立 Embedding 模型。需要注意的是,這裡的 Model 必須要與環境變數中的 EMBEDDING_DIMS 對應,否則可能會出現以下類似報錯。

Failed to create Embedding Model
Currently we only support 1536 dims embedding, got 1024 dims.
  1. 配置資料來源

這裡的資料來源可以是本地檔案,也可以是具體的網址。這裡我們配置具體有關 TiDB 和 MySQL 相容性的網頁 https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility 為資料來源。具體配置內容包括:

  • 資料來源名稱
  • 資料來源描述
  • 網頁 URL(可以配置一個或多個)
  • 是否 build 知識圖譜 Index(是或否)

配置資料來源

配置完成後,點選 Create Datasource 建立資料來源。當然,如果有本地檔案,也可以直接匯入本地檔案並建立資料來源。另外如果不是在初始化時配置資料來源,我們也可以在後續的過程中手動新增更多的資料來源,下圖顯示將一個本地的文件匯入為資料來源。

將一個本地的文件匯入為資料來源

  1. 檢視索引建立進度

上述步驟配置完成後,應用將基於配置的資料來源進行向量化並建立索引,這需要一定的時間,具體耗時跟資料來源的多少以及機器的配置都有關。透過頁面左側選單欄-> Index Progress 檢視索引建立進度,綠色代表索引建立成功,藍色代表正在建立,紅色代表建立失敗。下圖表示 Vector Index 已經建立成功,Knowlege Graph Index 正在建立中。當兩個圖表都變成綠色時,代表全部建立成功。

檢視索引建立進度

體驗智慧問答

至此,我們已經完成了配置資料來源並完成了向量化儲存及向量索引的建立。在網頁的左側選單欄中,我們可以點選 Datasources 檢視當前資料來源, LLMs 檢視當前 LLM,Embedding Model 檢視 Embedding 模型。

選單欄

我們現在也可以開始向自己搭建的 tidb.ai 諮詢有關 TiDB 的問題了,比如提問 "TiFlash 高效能列式分析引擎"。從結果可以看出,本地知識庫問答機器人引用匯入的文件並作出了相似回答,而假如我們刪除資料來源之後再提出相同的問題,它的回答是 Empty Response。下圖對比充分說明了 TiDB 向量搜尋在基礎 LLM 大模型的增強能力。

體驗智慧問答

相關文章