導讀
本文將詳細介紹如何通過 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.ai 的回答,從結果來說,tidb.ai 非常準確的理解了用戶的問題并給出了相應的回答。它首先給出 TiDB 優勢及 MySQL 限制的詳細說明,然后給出一個結論性的總結,最后給出更多的參考鏈接。
基于 TiDB 實現問答系統的基本流程
相信通過前面的一些介紹,大家對 tidb.ai 的能力已經有了一個清楚的認識。TiDB 的使用人員很幸運,因為有了 tidb.ai,幾乎任何有關 TiDB 的問題都可以在這個統一的平臺得到相應的解答,一方面節省了自己人工去查找 TiDB 官方文檔或 AskTUG 論壇的時間,另一方面 tidb.ai 擁有比普通大模型更專業的 TiDB 知識問答。
在技術實現上,tidb.ai 背后主要使用到 TiDB 的 Graph RAG 技術、TiDB 向量檢索功能以及 LLM 大模型的使用。實際上,在 AutoFlow 出來之前,我們也可以通過 python 編程開發的方式基于 LLM+RAG+TiDB 實現一套問答系統。主要的開發流程如下:
- 準備私域文本數據
- 對文本進行切分
- 通過 Embedding 將文本轉為向量數據
- 把向量數據保存到 TiDB
- 獲得用戶輸入問題并進行向量化,然后從 TiDB 中進行相似度搜索
- 將上述片段和歷史問答作為上下文,與用戶問題一起傳入大模型,最后輸出結果
基于 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=falseEMBEDDING_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 將是無效的。
數據初始化
運行數據遷移以創建所需的表并創建初始管理員用戶
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 相同的節點,需要考慮端口沖突問題。
此步驟需要配置的內容包括:
- 模型名稱
- 模型提供商(選擇 OpenAI Like)
- 模型型號(如 glm-4-0520)
- 智譜AI API KEY(見環境準備階段)
- 高級選項-> api_base 路徑(需與 LLM 對應)
- 是否默認 LLM(是或否)
配置完成后,點擊 Create LLM 創建 LLM 關聯。需要注意的是,這里提供的 API Key 必須是一個有效的 Key,如果創建 API Key 的賬戶本身就過時,創建 LLM 時可能就會遇到以下報錯。如果只是為了測試用途,可以重新注冊一個賬號并取得一個新的 API Key 試用。
Failed to create LLM
Error code: 429 - {'error': {'code': '1113', 'message': '您的賬戶已欠費,請充值后重試。'}}
此步驟需要配置的內容包括:
- embedding名稱
- 模型提供商(選擇 OpenAI Like)
- 模型型號(如 embedding-2)
- 智譜AI API KEY(與上述相同)
配置完成后,點擊 Create Embedding Model 創建 Embedding 模型。需要注意的是,這里的 Model 必須要與環境變量中的 EMBEDDING_DIMS 對應,否則可能會出現以下類似報錯。
Failed to create Embedding Model
Currently we only support 1536 dims embedding, got 1024 dims.
這里的數據來源可以是本地文件,也可以是具體的網址。這里我們配置具體有關 TiDB 和 MySQL 兼容性的網頁 https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility 為數據來源。具體配置內容包括:
- 數據源名稱
- 數據源描述
- 網頁 URL(可以配置一個或多個)
- 是否 build 知識圖譜 Index(是或否)
配置完成后,點擊 Create Datasource 創建數據來源。當然,如果有本地文件,也可以直接導入本地文件并創建數據源。另外如果不是在初始化時配置數據源,我們也可以在后續的過程中手動添加更多的數據源,下圖顯示將一個本地的文檔導入為數據源。
上述步驟配置完成后,應用將基于配置的數據源進行向量化并創建索引,這需要一定的時間,具體耗時跟數據源的多少以及機器的配置都有關。通過頁面左側菜單欄-> Index Progress 查看索引創建進度,綠色代表索引創建成功,藍色代表正在創建,紅色代表創建失敗。下圖表示 Vector Index 已經創建成功,Knowlege Graph Index 正在創建中。當兩個圖表都變成綠色時,代表全部創建成功。
體驗智能問答
至此,我們已經完成了配置數據源并完成了向量化存儲及向量索引的創建。在網頁的左側菜單欄中,我們可以點擊 Datasources 查看當前數據源, LLMs 查看當前 LLM,Embedding Model 查看 Embedding 模型。
我們現在也可以開始向自己搭建的 tidb.ai 咨詢有關 TiDB 的問題了,比如提問 “TiFlash 高性能列式分析引擎”。從結果可以看出,本地知識庫問答機器人引用導入的文檔并作出了相似回答,而假如我們刪除數據源之后再提出相同的問題,它的回答是 Empty Response。下圖對比充分說明了 TiDB 向量搜索在基礎 LLM 大模型的增強能力。