上篇,分享了 小智AI + MCP
系列的第一篇:
小智 AI + 鬧鐘提醒 + 定時任務,設備端MCP實現
有朋友問,能否接入知識庫 RAG
?
讓小智可以根據企業知識庫,回答客戶的疑問~
當然可以,接入方式同樣是 MCP,但需要 知識庫
工具暴露出來檢索 API。
知識庫
工具有很多,盡管開源版 Coze
、Dify
很強,但都沒有檢索 API 可供調用。
本著好東西要分享
的原則,今日帶來:
騰訊最近開源的 知識庫
工具:WeKnora
,本地部署,一手實測!
全文目錄:
1. WeKnora 簡介
項目地址:https://github.com/Tencent/WeKnora
說實在的,這名字起的,嚴重影響推廣啊~
老規矩,簡單介紹下項目亮點:
- 復雜文檔:結構化提取 PDF / Word / Txt / Markdown / 圖片(OCR / Caption);
- 高效檢索:支持多種檢索策略:關鍵詞、向量、知識圖譜;
- 簡潔易用:Web界面 + 標準 API;
- 靈活擴展:從解析、嵌入、召回到生成,全流程解耦,便于靈活集成;
應該說,最吸引筆者的就是最后兩個亮點,定制化程度非常高~
2. 本地部署
官方提供了 docker 部署示例,我們一步步來。
2.1 設置環境變量
首先在項目根目錄下,復制得到一份環境變量:
git clone https://github.com/Tencent/WeKnora.git
cd WeKnora
# 復制示例配置文件
cp .env.example .env
支持接入本地 Ollama 模型,只需填入你的 Ollama 地址即可:
OLLAMA_BASE_URL=http://host.docker.internal:11434
關于 Ollama,可見筆者之前的教程:
https://zhuanlan.zhihu.com/p/710560829
至于 .env 中其它配置信息,如果只用到基本功能,采用默認配置即可!
2.2 修改 docker-compose 文件
官方提供的 docker-compose 提供了完備的依賴,具體功能如下:
1. app:(WeKnora-app)
后端服務,負責處理業務邏輯、API 請求等核心功能。2. minio (WeKnora-minio)
提供文件存儲服務,存儲系統中的文件數據,作為文檔讀取服務(docreader)的存儲后端3. frontend (WeKnora-frontend)
前端界面,為用戶提供可視化的操作界面4. docreader (WeKnora-docreader)
文檔讀取服務,用于處理和解析各種文檔格式。可集成視覺語言模型(VLM)進行文檔分析5. jaeger (Jaeger)
分布式追蹤系統,用于監控和診斷微服務之間的調用鏈。6. postgres (WeKnora-postgres)
數據庫服務,存儲系統的核心數據7. redis (WeKnora-redis)
緩存和消息隊列服務。
如果在本地已經有 redis / postgres 等服務,刪掉對應服務,然后在 app 里通過環境變量傳入服務地址。
其中,
extra_hosts:- "host.docker.internal:host-gateway"
意味著把host.docker.internal
在容器中映射為主機地址,保證同一份 docker-compose.yml
,可以成功跑在 Windows 和 Linux 上。
當然,也可以查看下 Docker 網橋對應的網關地址:
ip addr show docker0
# 假設輸出
inet 179.10.0.1/24 brd 179.10.0.255 scope global docker0
# 那么
IP 地址: 179.10.0.1/24 (這是 Docker 容器的網關地址)
廣播地址: 179.10.0.255
子網范圍: 179.10.0.0 到 179.10.0.255 (可容納 254 個容器)
2.3 啟動服務
docker-compose.yml
準備好后,一鍵拉起:
docker compose up -d
如果用的默認端口號,啟動成功后,可訪問以下地址:
- Web UI:http://localhost
- 后端 API:http://localhost:8080
- 鏈路追蹤(Jaeger):http://localhost:16686
3. Web 應用
3.1 系統配置
瀏覽器打開:http://localhost
進入網頁配置界面
如果部署了 Ollama,這里會檢查服務狀態:
如果沒有部署 Ollama,也支持 OpenAI 兼容的 API:
推薦大家先試試硅基流動
的免費API:https://cloud.siliconflow.cn/?referrer=clxv36914000l6xncevco3u1y
3.2 知識庫
配置成功后,進入主界面,左側菜單欄簡潔到只有兩個 Tab:
- 知識庫
- 對話
首先,上傳文檔,等待解析:
我這里測試了 PDF / Markdown 兩種格式:
3.3 對話測試
文檔解析成功后,就可以基于知識庫提問:
4. API 調用
API 文檔:https://github.com/Tencent/WeKnora/blob/main/docs/API.md
我們測試幾個核心 API,走一遍解析、嵌入、召回到生成
的完整流程。
下面以 Python
為例展開:
4.1 租戶管理
每個租戶都可以獨立創建知識庫,我們剛才在前端操作的,其實就是 Default 租戶身份。
所以,如果要多用戶使用,就得創建租戶:
base_url = 'http://localhost:8080/api/v1'def create_tenants():url = f'{base_url}/tenants'data = {"name": "test","description": "weknora tenants","business": "wechat","retriever_engines": {"engines": [{"retriever_type": "keywords","retriever_engine_type": "postgres"},{"retriever_type": "vector","retriever_engine_type": "postgres"}]}}response = requests.post(url, json=data)print(response.json())
返回結果:
{'data': {'id': 10002, 'name': 'test', 'description': 'weknora tenants', 'api_key': 'sk-XCLeBAgW4z7Ofq0b1uP4LxpiwJpwfq01NTwfVurcyvJcvmrA', 'status': 'active', 'retriever_engines': {'engines': [{'retriever_engine_type': 'postgres', 'retriever_type': 'keywords'}, {'retriever_engine_type': 'postgres', 'retriever_type': 'vector'}]}, 'business': 'wechat', 'storage_quota': 10737418240, 'storage_used': 0, 'created_at': '2025-09-09T10:01:58.330697479+08:00', 'updated_at': '2025-09-09T10:01:58.330697679+08:00', 'deleted_at': None}, 'success': True}
每個租戶,訪問API的權限通過 API-KEY 管理,為此可以通過查詢租戶信息,獲取 API-KEY:
def get_tenants():# url = f'{base_url}/tenants' # 查詢所有用戶url = f'{base_url}/tenants/10000' # 查詢指定用戶headers = {'X-API-Key': 'sk-XCLeBAgW4z7Ofq0b1uP4LxpiwJpwfq01NTwfVurcyvJcvmrA'}response = requests.get(url, headers=headers)print(response.json())
4.2 知識庫管理
查詢知識庫:
注意,如果是在前端界面上傳文件創建知識庫的,這里的 headers 要傳入 default 租戶的 api-key:
def get_kb():# url = f'{base_url}/knowledge-bases' # 查詢所有知識庫url = f'{base_url}/knowledge-bases/kb-00000001' # 查詢指定知識庫response = requests.get(url, headers=headers)print(response.json())
搜索知識庫:
def search_kb():kb_id = 'kb-00000001'url = f'{base_url}/knowledge-bases/{kb_id}/hybrid-search'data = {"query_text": "硅基學生活動","vector_threshold": 0.5,"keyword_threshold": 0.3,"match_count": 1}response = requests.get(url, json=data, headers=headers)print(response.json())
響應中,每一條的 content 即可作為大模型的參考:
4.3 知識管理
查看知識庫中有多少個文件:
def get_knowledge():# kb_id = 'kb-00000001'# url = f'{base_url}/knowledge-bases/{kb_id}/knowledge' # 查詢知識庫下所有文件file_id = '3ee788a2-35cb-4a6d-afaf-53079ff07202'url = f'{base_url}/knowledge/{file_id}' # 查詢指定文件response = requests.get(url, headers=headers)print(response.json())
我這里上傳了兩個文件,所以有兩個 id:
獲取知識的分塊列表:
def get_chunks():file_id = '3ee788a2-35cb-4a6d-afaf-53079ff07202'url = f'{base_url}/chunks/{file_id}?page=1&page_size=20'response = requests.get(url, headers=headers)print(response.json())
因為這個文檔內容不多,所以只分了 4 個片段:
寫在最后
本文分享了騰訊開源的知識庫工具-WeKnora
,并進行了本地部署實測。
如果對你有幫助,不妨點贊收藏備用。
篇幅有點長,下篇再來分享:
如何通過 MCP 的方式,把它接入 小智AI
,打造你的私人定制專家~