騰訊開源多模態 RAG:復雜文檔秒變自建知識庫,支持 API 調用

上篇,分享了 小智AI + MCP系列的第一篇:

小智 AI + 鬧鐘提醒 + 定時任務,設備端MCP實現

有朋友問,能否接入知識庫 RAG

讓小智可以根據企業知識庫,回答客戶的疑問~

當然可以,接入方式同樣是 MCP,但需要 知識庫 工具暴露出來檢索 API。

知識庫 工具有很多,盡管開源版 CozeDify 很強,但都沒有檢索 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 ,打造你的私人定制專家~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98051.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js中的 http 模塊詳解

http 模塊是 Node.js 中的核心模塊之一,專門用于構建基于 HTTP 的網絡應用程序。它允許創建 HTTP 服務器和客戶端,處理網絡請求和響應。1. 核心 API 詳解1.1. http.createServer([options][, requestListener])用于創建 HTTP 服務器的核心方法&#xff0…

LAMP 環境部署

LAMP 環境部署 一、概述 1. 目的 基于 CentOS 7 系統部署 LAMP(Linux Apache MySQL PHP)環境的完整步驟,通過腳本化操作實現環境快速搭建,適用于運維人員進行測試環境或基礎生產環境的 LAMP 部署 2. 適用環境操作系統&#xff…

用html5仿造nes游戲敲玻璃寫一個敲玻璃游戲

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>敲玻璃游戲</title><style>body {ma…

996引擎-ItemTips特效框層級自定義

996引擎-ItemTips特效框層級自定義 需求場景 ItemTips 中相關方法 創建特效的位置 創建特效框 核心修改 調整視圖,自己加個背景,不用原來的 設置 tipsLayout_bg 的層級 結果預覽 參考資料 需求場景 策劃說我們的tips特效框,遮擋文字。如果按官方說的設為底層又跑到背景框后…

Java 注解與 APT(Annotation Processing Tool)

Java 注解與 APT&#xff08;Annotation Processing Tool&#xff09; 注解&#xff08;Annotation&#xff09;基礎 注解是 Java 語言的一種元數據形式&#xff0c;它可以在代碼中添加標記信息&#xff0c;用于描述代碼的額外信息&#xff0c;但不會直接影響代碼的執行邏輯。注…

Unity 檢測網絡-判斷當前(Android/Windows平臺)設備是否連接了指定WiFi

判斷設備是否連接了特定的網絡1.Unity 腳本2.Unity AndroidManifest.xml文件①改個設置②補充權限語句1.Unity 腳本 using UnityEngine; using System.Collections; using System.Diagnostics; using Debug UnityEngine.Debug; using UnityEngine.UI;#if UNITY_ANDROID &…

通過網絡強化增強混合IT環境的安全

網絡是企業運營的支柱&#xff0c;也是網絡犯罪分子和惡意威脅者的主要目標&#xff0c;他們會破壞IT運營的連續性。隨著混合云基礎設施、遠程辦公和物聯網&#xff08;IoT&#xff09;生態系統的出現&#xff0c;網絡邊界正在不斷擴大&#xff0c;新的漏洞不斷產生&#xff0c…

ACP(四):RAG工作流程及如何創建一個RAG應用

RAG的工作原理 你在考試的時候有可能會因為忘記某個概念或公式而失去分數&#xff0c;但考試如果是開卷形式&#xff0c;那么你只需要找到與考題最相關的知識點&#xff0c;并加上你的理解就可以進行回答了。 對于大模型來說也是如此&#xff0c;在訓練過程中由于沒有見過某個知…

宇視設備視頻平臺EasyCVR視頻設備軌跡回放平臺監控攝像頭故障根因剖析

監控攝像頭的類型繁多&#xff0c;市場上提供了廣泛的選擇。然而&#xff0c;在使用監控攝像頭的過程中&#xff0c;用戶可能會遇到云臺在很短的時間內出現運轉不靈或完全無法轉動的問題。這里&#xff0c;我們將對這一常見問題進行深入分析。一、具體的原因&#xff1a; 1、距…

【Uni-App+SSM 寵物項目實戰】Day15:購物車添加

大家好!今天是學習路線的第15天,我們正式進入訂單與購物車核心模塊。昨天完成了商家服務列表的分頁加載,今天聚焦“購物車添加”功能——這是連接“商品瀏覽”與“訂單提交”的關鍵環節,用戶可將寵物用品(如糧食、玩具)加入購物車,后續統一結算。 為什么學這個? 購物車…

Java 黑馬程序員學習筆記(進階篇6)

常用的 API1. 正則表達式(1) 題目&#xff1a;貪婪爬取和非貪婪爬取① 貪婪爬取&#xff1a;爬取數據的時候盡可能的多獲取數據 ② 非貪婪爬取&#xff1a;爬取數據的時候盡可能的少獲取數據 ③ Java中默認的是貪婪爬取 ④ 后面加上 ? 可以轉變為非貪婪爬取(2) 捕獲分組捕獲分…

計算機網絡---數據鏈路層上

文章目錄1. 數據鏈路層的功能2. 組幀2.1 字符填充法2.2 字節填充法2.3 零比特填充法2.4 違規編碼2.5 總結3. 差錯控制3.1 檢錯編碼3.1.1 奇偶校驗3.1.2 循環冗余校驗碼&#xff08;CRC&#xff09;3.1.3 總結3.2 糾錯編碼&#xff08;海明校驗碼&#xff09;3.3 總結4. 流量控制…

機器學習實戰項目中,回歸與分類模型中該如何科學定義目標變量Y?

前言 在機器學習項目里&#xff0c;目標變量 (Y) 的定義決定了你能解答什么問題&#xff0c;以及模型能給業務帶來什么價值。選擇不當不僅可能導致模型誤差大、偏差嚴重&#xff0c;還可能讓業務決策方向偏離。 本文分兩大場景&#xff1a; 供應鏈項目中的 銷量預測&#xff08…

【 C/C++ 算法】入門動態規劃-----一維動態規劃基礎(以練代學式)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是動態規劃算法的基礎入門篇&#xff0c;我將通過三道簡單題 一道中等難度的一維動態規劃題來帶你對動態規劃有個初認識&#xff0c;并基本了解動…

深入對比Tomcat與Netty:HTTP請求從網卡到Controller的全鏈路追蹤

我們日常用Spring Boot寫的RestController&#xff0c;感覺上就是一個簡單的方法&#xff0c;但它背后其實有一套復雜的網絡服務在支撐。一個HTTP請求到底是怎么從用戶的瀏覽器&#xff0c;穿過層層網絡&#xff0c;最終抵達我們代碼里的Controller方法的&#xff1f;理解這個過…

GO學習記錄十——發包

記錄下不同平臺的發包操作和期間遇到的問題 1.命令&#xff1a; $env:GOOSlinux $env:GOARCHamd64 go build -o release/HTTPServices-linux第一行&#xff0c;配置平臺&#xff0c;linux、windows 第二行&#xff0c;配置部署服務器的處理器架構 第三行&#xff0c;輸出目標文…

貪心算法與動態規劃

1. 什么是貪心算法&#xff1f; 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法。 核心思想&#xff1a;“每步都貪心地選擇眼前最好的&#xff0c;不去考慮整個未來的長…

學會“讀網頁”:生成式 AI 在足球賽事信息整理中的實戰

逐步教程&#xff08;Step-by-Step&#xff09; — 適合初學者與教學類文章 背景&#xff08;為什么要這樣做&#xff09; 對于足球迷、資訊編輯與數據分析師來說&#xff0c;最快、最準確把握一場比賽的核心信息至關重要&#xff1a;比分、關鍵事件&#xff08;進球、點球、紅…

BM3D 圖像降噪快速算法的 MATLAB 實現

BM3D 圖像降噪快速算法的 MATLAB 實現1. 快速 BM3D 算法流程&#xff08;概述&#xff09;步驟操作加速技巧① 分組塊匹配 堆疊FFT 互相關② 協同濾波3D 變換 硬閾值FFT 沿第三維③ 聚合加權平均稀疏矩陣累加 2. 核心函數&#xff08;單文件版&#xff09; 保存為 bm3d_fast.…

Go的schedt調度(runtime/proc.go)

1. 創建go的入口函數// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …