腾讯开源多模态 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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, …