MCP + 数据库,一种比 RAG 检索效果更好的新方式!
大家好,欢迎来到 code秘密花园,我是 ConardLi。
在今天这一期,我们将一起学习一种基于 MCP 提高大模型检索外部知识精度的新思路,实测比 RAG 效果要好很多。
目前市面上讲 MCP 的教程比较多,但大多数都是一些概念性的讲解,最近我对 MCP 的体验也比较多,我也切实体验到了 MCP 确实是一项很有意义的技术标准,能帮助我们解决很多之前难以解决的问题,所以在今天的教程里,我从这样一个实际的案例出发来跟大家聊一聊 MCP,整体的学习路径如下:
在开始学习之前,我们先了解一下,RAG 技术目前的局限性。
一、背景:RAG 的局限性
RAG,即检索增强生成(Retrieval-Augmented Generation),是目前大模型领域的一个热门方向。它将信息检索技术与生成式模型相结合,解决大模型在知识准确性、上下文理解以及对最新信息的利用等方面的难题。
在之前的教程中,如何拥有一个无限制、可联网、带本地知识库的私人 DeepSeek? 我们一起学习了如何在本地部署模型并且引入知识库。
但是很多小伙伴可能对 RAG
有点误解,觉得我们只要将一些额外的知识通过 RAG 导入,模型就能完美的掌握并且回答这些知识相关的问题。但事实和想象还是有差距的,大家在实际尝试后可能会发现,RAG 的精准度似乎没有那么好。
从 RAG
本身技术原理的角度出发,目前存在着以下问题:
- 检索精度不足:首先,RAG 最核心的就是先将知识转换成 “向量“ ,导入 “向量数据库“,然后在将用户输入的信息也转换成 “向量” ,然后再去向量数据库匹配出相似的 “向量“,最后再由大模型去总结检索到的内容。
从这个过程中我们看出,大模型仅仅起到了总结的作用,而检索到信息的精准度大部分情况下取决于向量的相似度匹配,检索结果可能包含无关内容(低精确率)或遗漏关键信息(低召回率)。
- 生成内容不完整:由于 RAG 处理的是文档的切片,而切片的局部性注定了它无法看到整篇文档的信息,因此在回答诸如“列举XXX”“总结XXX”等问题时,一般回答是不完整的。
- 缺乏大局观:RAG 无法判断需要多少个切片才能回答问题,也无法判断文档间的联系。例如,在法律条文中,新的解释可能覆盖旧的解释,但 RAG 无法判断哪个是最新的。
- 多轮检索能力弱:RAG 缺乏执行多轮、多查询检索的能力,而这对推理任务来说是必不可少的。
尽管近期也有些新出现的技术,如 GraphRAG、KAG
等能够在一定程度上解决这些问题,但都还不成熟,目前的 RAG 技术还远远达不到我们预期想要的效果。
下面,我们将介绍一个新的方案,通过 MCP + 数据库来提高结构化数据的检索精准度,基本上能够实现 text to SQL
的效果,实测的检索效果也要比 RAG 好很多,例如我们有这样一份学生列表的信息:
我们用一个稍微复杂一点问题(身高 180-190cm 之间的女生有哪些?)来测试:
二、理论:了解 MCP 的基础知识
在开始学习 MCP 之前,有一个绕不开的话题,就是 Function Call
,我们先来回顾一下。
2.1 Function Call
以前的 AI 大模型就像一个知识丰富但被困在屋子里的人,只能依靠自己已有的知识回答问题,无法直接获取实时数据或与外部系统交互,比如不能直接访问数据库里的最新信息,也不能使用一些外部工具来完成特定任务。
Function Call
是 OPEN AI
在 2023
年推出的一个非常重要的概念:
Function Call
(函数调用) 本质上就是提供了大模型与外部系统交互的能力,类似于给大模型安装一个 “外挂工具箱”。当大模型遇到自己无法直接回答的问题时,它会主动调用预设的函数(如查询天气、计算数据、访问数据库等),获取实时或精准信息后再生成回答。
比如,我们在 Coze
这种零代码 Agent 搭建平台上看到的插件,其实都是基于 Function Call
的思路来封装的:
这个能力确实是挺好的,给了大模型更多的可能性,但是它有一个比较大的缺点,就是实现成本太高了。
在 MCP
出现之前,开发者想实现 Function Call
的成本是比较高的,首先得需要模型本身能够稳定支持 Function Call
的调用,比如我们在 Coze 中选择某些模型时提示,选择的模型不支持插件的调用,其实就是不支持 Function Call
的调用:
在之前的数据集教程 想微调特定领域的 DeepSeek,数据集究竟要怎么搞? 中,我们也提到了,在标准的 sharegpt
风格的数据集中就提供了专门用于 Function Call
训练的特殊字段。
[{"conversations": [{"from": "human","value": "人类指令"},{"from": "function_call","value": "工具参数"},{"from": "observation","value": "工具结果"},{"from": "gpt","value": "模型回答"}],"system": "系统提示词(选填)","tools": "工具描述(选填)"}
]
这也就意味着模型本身需要进行过专门的 Function Call
调用微调才能稳定支持这种能力。
另外还有一个比较大的问题,OPEN AI
最开始提出这项技术的时候,并没有想让它成为一项标准,所以虽然后续很多模型也支持了 Function Call
的调用,但是各自实现的方式都不太一样。
这也就意味着,如果我们要发开一个 Function Call
工具,需要对不同的模型进行适配,比如参数格式、触发逻辑、返回结构等等,这个成本是非常高的。
这也大大提高了 AI Agent
的开发门槛,所以在以前我们大部分情况下只能通过 Dify、Coze 这些平台来构建 Agent
。
::: block-1
核心特点
- 模型专属:不同模型(GPT/Claude/DeepSeek)的调用规则不同
- 即时触发:模型解析用户意图后直接调用工具
- 简单直接:适合单一功能调用(如"查北京温度"→调用天气API)
痛点
- 协议碎片化:需为每个模型单独开发适配层
- 功能扩展难:新增工具需重新训练模型或调整接口
类比
- 不同品牌手机的充电接口(Lightning/USB-C),设备间无法通用
:::
2.2 MCP
MCP(Model Context Protocol
,模型上下文协议)是一种由 Anthropic
公司(也就是开发 Claude 模型的公司)推出的一个开放标准协议,目的就是为了解决 AI 模型与外部数据源、工具交互的难题。
通过 Function Call
,每次要让模型连接新的数据源或使用新工具,开发者都得专门编写大量代码来进行对接,既麻烦又容易出错。而 MCP
的出现就是为了解决这些问题,它就像是一个 “通用插头” 或者 “USB 接口”,制定了统一的规范,不管是连接数据库、第三方 API,还是本地文件等各种外部资源,都可以通过这个 “通用接口” 来完成,让 AI 模型与外部工具或数据源之间的交互更加标准化、可复用。
最开始推出的时候,只有 Claude
客户端支持,大家也没把它当回事,但是后续由于 Cursor
(Cursor
和 Claude
的关系大家都懂) 的支持,各种插件和工具也开始陆续提供支持;再加上最近 AI Agent
被 Manus 这个 “概念” 工具给炒的非常火热,让 MCP
逐步开始走进大众视野,直到最近,OPEN AI 也宣布对 MCP
提供了支持:
这让我真正的感觉到,MCP
真的做到了,它已经成为 AI 工具调用的 “行业标准”。
MCP Host,比如 Claude Desktop、Cursor 这些工具,在内部实现了 MCP Client,然后 MCP Client 通过标准的 MCP 协议和 MCP Server 进行交互,由各种三方开发者提供的 MCP Server 负责实现各种和三方资源交互的逻辑,比如访问数据库、浏览器、本地文件,最终再通过 标准的 MCP 协议返回给 MCP Client,最终在 MCP Host 上展示。
开发者按照 MCP 协议进行开发,无需为每个模型与不同资源的对接重复编写适配代码,可以大大节省开发工作量,另外已经开发出的 MCP Server,因为协议是通用的,能够直接开放出来给大家使用,这也大幅减少了开发者的重复劳动。
比如,你如果想开发一个同样逻辑的插件,你不需要在 Coze 写一遍,再去 Dify 写一遍,如果它们都支持了 MCP,那就可以直接使用同一个插件逻辑。
::: block-1
核心特点
- 协议标准化:统一工具调用格式(请求/响应/错误处理)
- 生态兼容性:一次开发即可对接所有兼容MCP的模型
- 动态扩展:新增工具无需修改模型代码,即插即用
核心价值,解决三大问题
- 数据孤岛 → 打通本地/云端数据源
- 重复开发 → 工具开发者只需适配MCP协议
- 生态割裂 → 形成统一工具市场
类比
- USB-C 接口:手机/电脑/外设通过统一标准互联
:::
2.3 MCP 对比 Function Call
注:调用方式这里反了。
三、尝试:学会 MCP 的基本使用
从上面 MCP 的架构图中我们可以看到,想要使用 MCP 技术,首先就是得找到一个支持 MCP 协议的客户端,然后就是找到符合我们需求到 MCP 服务器,然后在 MCP 客户端里调用这些服务。
3.1 MCP 客户端(Host)
在 MCP 官方文档中,我们看到已经支持了 MCP 协议的一些客户端/工具列表:
从表格里,我们可以看到,MCP 对支持的客户端划分了五大能力,这里我们先简单了解即可:
- Tools:服务器暴露可执行功能,供 LLM 调用以与外部系统交互。
- Resources:服务器暴露数据和内容,供客户端读取并作为 LLM 上下文。
- Prompts:服务器定义可复用的提示模板,引导 LLM 交互。
- Sampling:让服务器借助客户端向 LLM 发起完成请求,实现复杂的智能行为。
- Roots:客户端给服务器指定的一些地址,用来告诉服务器该关注哪些资源和去哪里找这些资源。
目前最常用,并且被支持最广泛的就是 Tools
工具调用。
对于上面这些已经支持 MCP 的工具,其实整体划分一下就是这么几类:
- AI 聊天工具:如 5ire、LibreChat、Cherry Studio
- AI 编码工具:如 Cursor、Windsurf、Cline
- AI 开发框架:如 Genkit、GenAIScript、BeeAI
3.2 MCP Server
MCP Server
的官方描述:一个轻量级程序,每个程序都通过标准化模型上下文协议公开特定功能。
简单理解,就是通过标准化协议与客户端交互,能够让模型调用特定的数据源或工具功能。常见的 MCP Server
有:
- 文件和数据访问类:让大模型能够操作、访问本地文件或数据库,如 File System MCP Server;
- Web 自动化类:让大模型能够操作浏览器,如 Pupteer MCP Server;
- 三方工具集成类:让大模型能够调用三方平台暴露的 API,如 高德地图 MCP Server;
下面是一些可以查找到你需要的 MCP Server
的途径:
第一个是官方的 MCP Server
集合 Github 仓库(https://github.com/modelcontextprotocol/servers),里面包含了作为官方参考示例的 MCP Server
、被官方集成的 MCP Server
以及一些社区开发的第三方 MCP Server
:
另外一个是 MCP.so(https://mcp.so/):一个三方的 MCP Server 聚合平台,目前收录了 5000+ MCP Server:
其提供了非常友好的展示方式,每个 MCP Server 都有具体的配置示例:
- MCP Market(https://mcpmarket.cn/),访问速度不错,可以按工具类型筛选:
3.3 在 Cherry Studio 中尝试 MCP
我们先来尝试一个最简单的 MCP 接入示例,这里我们选择 Cherry Studio
。
Cherry Studio
对于小白用户还是比较友好的,可以让你在客户端一键完成必备环境(这些环境是什么意思我们后面会讲)的安装:
在很多其他工具中,需要用户手动在自己的电脑上安装这些环境,比如 Windsurf
:
所以对小白用户,我建议先使用 Cherry Studio
上手尝试。
打开 Cherry Studio
客户端,我们到「设置 - MCP 服务器」把上面提示的两个环境完成安装:
然后,我们在搜索框搜索 @modelcontextprotocol/server-filesystem
,这里我们接入一个简单的文件系统 MCP:
点击 + ,它会帮我们默认创建好一些 MCP Server 的配置,这里我们要补充一个参数,你允许让它访问的文件夹路径,比如 ~/Desktop
:
然后我们点击保存,如果服务器的绿灯亮起,说明配置成功:
下面,我们到聊天区域选择一个模型, 注意这里一定要选择带扳手🔧图标的模型,只有这种工具才支持 MCP(因为 Cherry Studio 其实本质上还是基于 Function Call 实现的 MCP,所以只有部分模型支持)
然后我们发现下面工具箱多了 MCP 的开关,我们把它打开:
然后我们尝试让他访问我桌面上有哪些文件:
调用成功,这就是一个最简单的 MCP 调用示例了。
但是,因为 Cherry Studio
是刚刚支持的 MCP
,在实际测试中,我发现体验并不是那么好,支持调用的模型种类比较少,而且在调用过程中不是很稳定。所以在后续的实战章节,我们使用 VsCode + Cline
来调用 MCP
。
不过这里用什么工具大家不用太纠结,目前 MCP 的发展势头非常迅猛,从最开始只有 Claude 支持,到现在已经有几十个工具提供了支持,后续生态一定是会更加繁荣,各种工具也会越来越成熟,所以大家核心是掌握使用的思路。
四、实战:使用 MCP 调用数据库
首先,为了方便给大家进行演示,我们先来构造一个简单的数据库案例。
4.1 Mongodb
这里我们选择的数据库是 MongoDB
:一款流行的开源的文档型数据库。MongoDB
使用文档型数据模型,数据以 JSON
格式存储。
为什么选择 MongoDB
而不是 sqlite
之类的关系型数据库呢,主要还是因为在关系型数据库中,表结构是固定的,若要添加新字段或修改表结构,往往需要进行复杂的迁移操作。而 MongoDB 的文档型数据模型,允许在同一个集合中存储不同结构的文档,应用程序可以根据需要灵活地添加或修改字段,无需事先定义严格的表结构,这对于我们想构建一个持续补充的结构化知识库的场景,是非常友好的。
大家可以直接在官方文档下载安装 MongoDB Community Server(MongoDB 的免费开源版本):
安装完成后,其会默认监听我们本地的 27017 端口:
然后,为了可视化查看数据,我们还需要安装 MongoDB Compass (MongoDB 提供的本地 GUI 可视化工具)
安装完成后,我们通过 MongoDB Compass
客户端链接到本地的 MongoDB Server
:
随后,大家就可以通过客户端将自己的数据导入 MongoDB
数据库,在后面的例子中,我们将使用一个学生信息的数据来进行演示,假定我们的数据是这样的:
如果你不知道怎么导入 MongoDB ,可以借助 AI 来帮你编写导入脚本,然后根据 AI 提示进行导入即可:
提示词:帮我编写一个脚本,可以将当前表格中的数据导入我本地的 MongoDB 数据库,数据库的名称为
studentManagement
然后根据 AI 提示运行脚本进行导入即可,成功导入后的效果:
学生信息表:
学生分数表:
4.2 VsCode + Cline
通过对几个支持了 MCP
的客户端进行测试,我觉得 Cline
对 MCP 的兼容效果还是不错的,也是开源、免费、国内都可以直接使用的,但是相对于 Cherry Studio
这种客户端,Cline
的使用对于小白用户还是有点成本的,因为它本质上是一个基于 VsCode
的 AI
编码辅助插件。
Cursor、Windsurf
这种付费的 AI 编程客户端,其实都是基于微软开源的编程 IDE
VsCode
二次开发、包装出来的,在其中内置了一些 AI 代码编辑能力,一般都需要按月付费,并且走海外的支付渠道。
而 Cline
则是完全开源,并且直接作为 VsCode
插件提供,并且支持配置各种三方的 AI API,非常灵活,所以如果你是 AI 编程小白,也是推荐使用 VsCode + Cline
来进行入门。
Cline
的安装也比较简单,直接在 VsCode 插件市场搜索,Cline
找到后点击安装即可(注意这里还有很多非官方的版本,直接安装那个下载量最大的就好):
安装完成后,我们在左侧工具栏找到 Cline 的图标,点击打开设置,然后进行模型配置:
这里支持了多种模型提供商,大家按需选择即可:
模型配置完成之后,我们可以在聊天窗口进行测试,如果正常输出则说明配置成功:
4.3 在 Cline 中配置 mcp-mongo-server
接下来,我们需要找到一个支持 MongoDB 的 MCP Server,本来想自己开发一个,但是简单搜了一下,发现已经有几个了:
这里我们选择使用 mcp-mongo-server
:
下面我们开始在 Cline
中配置 MCP Server,首先点击上方工具栏的 MCP Server
图标,可以发现这里内置了一批 MCP Server 列表,并且也支持一键安装:
但是搜了下我们选择的 MCP Server
并没有在这个内置列表里,所以我们选择手动配置,其实手动配置也非常简单,我们点击 installed
tab,然后点击下方的 Configure MCP Servers
,然后发现打开了一个 JSON 文件,这就是 Cline 用于存放 MCP 配置的地方,里面只有一个空对象:
每个 MCP Server 都会提供这份配置的写法,比如我们选择的 mcp-mongo-server
,这里所说的在 Claude Desktop
中使用,其实在任何支持了 MCP 的客户端中都可以这样配置:
配置看着挺复杂的,但实际上它支持提供了三种配置不同的写法,其实每个配置中只包含两个关键参数:
- command:指定在命令行中通过什么命令进行执行,在这个例子中,所有配置都使用 npx 命令(也就是 Node.js 环境)。
- args:是一个数组,包含传递给 command 的参数。
这三个配置的意思分别是:
mongodb
:运行 mcp-mongo-server npm 包,并且使用指定的 MongoDB 连接字符串,默认是读写模式。mongodb-readonly
:同样运行 mcp-mongo-server npm 包,使用相同的 MongoDB 连接字符串,但增加了–read-only 参数,意味着这个配置会以只读模式运行。mongodb-github
:从 GitHub 上的kiliczsh/mcp-mongo-server
仓库获取包来运行,而不是 npm 包,使用相同的 MongoDB 连接字符串,并且也设置了只读模式。
这里我们直接使用其最简单的配置,本地 mongo 一般不会设置用户名密码,我们可以直接到客户端查看这个数据库的连接地址:
然后配置如下:
{"mongodb": {"command": "npx","args": ["mcp-mongo-server","mongodb://localhost:27017/studentManagement?authSource=admin"]}}
}
讲这个配置粘贴到 Cline 的 MCP 配置文件,然后我们发现左侧的 mongodb 绿灯亮起,说明配置成功:
注意,这里我们需要使用到的是 npx 命令,前提是你电脑上需要有 Node.js
环境,可以到 Node.js 官方网站下载一键完成安装:
安装完成后,可以通过 npx -v
来测试环境是否配置成功:
然后我们测试一下效果(注意在 Cline 里是几乎所有模型都可以支持 MCP 的,原理我们后面会讲):
我们问一个关于统计学生数量的问题,目前一共有多少名学生?:
然后我们发现聊天窗口自动识别到了这个问题需要调用 MCP,并且询问我们是否允许调用 mongodb MCP
,我们点击允许:
然后 MCP 准确从数据库中查询出了结果,然后给出了回答。
然后我们再问一个更复杂一点的问题:有多少身高大于 180、姓李的男同学?
模型依然给出了准确的结果。
我们再上点难度,稳点更模糊的问题:求张老师的联系方式
我们继续上难度,有哪些同学期末考试比平时的考试成绩好?
这时候,模型并不知道期末考试、平时成绩对应的字段是什么,所以模型先尝试去在 scores 表下查询了一列,然后看到了所有字段:
然后模型生成了一个非常详细的查询条件:
然后从检索结果中准确的给出了答案:
4.4 通过 Prompt 优化查询效果
MCP Server
为模型提供了访问数据库的能力,但是数据库的表结构对于模型还是完全黑盒的,所以模型只能靠猜,或者去先获取一下表结构,再进行后续操作,猜还是有可能会出错的,多获取一次表结构也会让回答速度变慢,以及消耗更多的 Token
。
所以这里有个优化技巧,我们直接在全局提示词里将表结构的关键信息,和我们的明确要求告诉模型,就能让模型更准确、高效的响应了,关于表结构的说明大家可以去用 DeepSeek 来生成:
使用中文回复。当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MongoDB MCP 进行数据查询和操作,表结构说明如下:# 学生管理系统数据库表结构说明## 1. 教师表 (teachers)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| _id | String | 教师ID | 主键 | "T001" |
| name | String | 教师姓名 | 必填 | "张建国" |
| gender | String | 性别 | "男"或"女" | "男" |
| subject | String | 教授科目 | 必填 | "数学" |
| title | String | 职称 | 必填 | "教授" |
| contact.phone | String | 联系电话 | 必填 | "13812345678" |
| contact.office | String | 办公室位置 | 必填 | "博学楼301" |
| contact.wechat | String | 微信(可选) | 可选 | "lily_teacher" |
| isHeadTeacher | Boolean | 是否为班主任 | 可选 | true |## 2. 班级表 (classes)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| _id | String | 班级ID | 主键 | "202301" |
| className | String | 班级名称 | 必填 | "2023级计算机1班" |
| grade | Number | 年级 | 必填 | 2023 |
| headTeacherId | String | 班主任ID | 外键(teachers._id) | "T003" |
| classroom | String | 教室位置 | 必填 | "1号楼302" |
| studentCount | Number | 学生人数 | 必填 | 35 |
| remark | String | 备注信息 | 可选 | "市级优秀班集体" |## 3. 课程表 (courses)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| _id | String | 课程ID | 主键 | "C001" |
| courseName | String | 课程名称 | 必填 | "高等数学" |
| credit | Number | 学分 | 必填 | 4 |
| teacherId | String | 授课教师ID | 外键(teachers._id) | "T001" |
| semester | String | 学期 | 格式"YYYY-N" | "2023-1" |
| type | String | 课程类型 | "必修"或"选修" | "必修" |
| prerequisite | String | 先修课程ID | 可选,外键(courses._id) | "C003" |## 4. 学生表 (students)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| _id | String | 学号 | 主键 | "S20230101" |
| name | String | 学生姓名 | 必填 | "王强" |
| gender | String | 性别 | "男"或"女" | "男" |
| birthDate | Date | 出生日期 | 必填 | new Date("2005-01-15") |
| enrollmentDate | Date | 入学日期 | 必填 | new Date(2023, 8, 1) |
| classId | String | 班级ID | 外键(classes._id) | "202301" |
| contact.phone | String | 联系电话 | 必填 | "13812345678" |
| contact.email | String | 电子邮箱 | 必填 | "20230101@school.edu.cn" |
| contact.emergencyContact | String | 紧急联系人电话 | 必填 | "13876543210" |
| address | String | 家庭住址 | 必填 | "北京市海淀区中关村大街1栋101室" |
| profile.height | Number | 身高(cm) | 必填 | 175 |
| profile.weight | Number | 体重(kg) | 必填 | 65 |
| profile.healthStatus | String | 健康状况 | 必填 | "良好" |## 5. 成绩表 (scores)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| _id | String | 成绩记录ID | 主键 | "S20230101C001" |
| studentId | String | 学生ID | 外键(students._id) | "S20230101" |
| courseId | String | 课程ID | 外键(courses._id) | "C001" |
| score | Number | 综合成绩 | 0-100 | 85 |
| examDate | Date | 考试日期 | 必填 | new Date(2024, 5, 20) |
| usualScore | Number | 平时成绩 | 70-100 | 90 |
| finalScore | Number | 期末成绩 | 0-100 | 80 |### 补考成绩记录说明
补考记录在_id后添加"_M"后缀,如"S20230101C001_M"## 表关系说明1. **一对多关系**:- 一个班级(classes)对应多个学生(students)- 一个教师(teachers)可以教授多门课程(courses)- 一个学生(students)有多条成绩记录(scores)2. **外键约束**:- students.classId → classes._id- courses.teacherId → teachers._id- scores.studentId → students._id- scores.courseId → courses._id- classes.headTeacherId → teachers._id
然后我们到 Cline 设置中找到 Custom Instructions ,把这段提示词粘贴进去,点击 Done:
然后我们开一个新的聊天窗口,重新来问这个问题:
有哪些同学期末考试比平时的考试成绩好?
有了全局提示词指引后,模型直接给出了一个非常全面的思路:
在最后的结论中,按课程进行分组,给出了具体的各个科目期末考试大于平时考试的情况:
我们最后再来问一个更复杂的问题:
有个学计算机的周同学,他老师的联系方式给我一下
在这个查询中,模型先找到了所有姓周的同学,然后根据这些通过的班级过滤除了计算机相关班级,最后根据班级关联的 teacherId 找到了教师信息。
4.5 对比知识库
然后,我们将同样的数据集导入知识库,这里我们使用 Coze
进行演示,先来试试一张表的情况:
效果还可以,然后换上我们刚刚复杂一点的问题:
这个结果有点无语。。我们换个问题来测试:
模型依然无法分析出准确信息,这个对比就很明显了,在这种数据的检索场景下,MCP + 数据库明显优于传统 RAG 的方式。
4.6 目前的局限性
由于 MCP 技术才刚刚爆发,很多技术还不成熟,目前这个方案还存在一定局限性:
- 切忌让 AI 检索过大的数据,因为这种方式不像 RAG,每次只检索一小部分需要的内容,它是真正的会执行 SQL,你要多少数据,就查多少数据,如果一次查询数据量过大,会让你消耗大量 Token,甚至让 MCP 客户端卡死;
- 很多 MCP 客户端是依靠大量系统提示词来实现与 MCP 工具的通信,所以一旦使用 MCP,Token 的消耗量一定会大幅增长。
但是,未来可期,在这之前,其实就有一些基于 Function Call + Text2SQL
实现的类似能力,我也有过尝试,但由于开发成本以及恢复准确性的问题,没有得到普及。
而今天我们一起学习的这种 MCP + 数据库的方式真正的降低了开发成本,甚至是零代码,而且准确性也非常高,我相信未来一定会成为一种非常热门的查询方式,在智能客服、仓储管理、信息管理这些结构化数据检索场景下应该会替代掉传统的 RAG 方式。
相关文章:
MCP + 数据库,一种比 RAG 检索效果更好的新方式!
大家好,欢迎来到 code秘密花园,我是 ConardLi。 在今天这一期,我们将一起学习一种基于 MCP 提高大模型检索外部知识精度的新思路,实测比 RAG 效果要好很多。 目前市面上讲 MCP 的教程比较多,但大多数都是一些概念性的…...
图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
前言 书接上文 OpenCV图像处理实战全解析:镜像、缩放、矫正、水印与降噪技术详解-CSDN博客文章浏览阅读1.1k次,点赞38次,收藏29次。本文系统解析OpenCV图像处理五大实战场景:镜像反转的三种坐标变换模式,图像缩放的尺…...
TDengine 与 taosAdapter 的结合(一)
一、引言 在当今数字化时代,数据量呈爆发式增长,尤其是物联网、工业互联网等领域产生的海量时序数据,对数据存储和处理提出了极高要求。TDengine 作为一款高性能、开源的时序数据库,专为这些场景设计并优化,在时序数据…...
23种设计模式-行为型模式-模板方法
文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…...
Django异步执行任务django-background-tasks
1、安装 pip install django-background-tasks 2、注册服务 INSTALLED_APPS [...background_task, ]3、生成表 // 生成迁移 python manage.py makemigrations //运行迁移 python manage.py migrate 4、创建文件,模拟任务 from background_task import backgrou…...
从零设计React-Markdown组件的实现方案
从零设计React-Markdown组件的实现方案 现在,把这些步骤整理成代码结构。首先是解析器类,用正则表达式分割文本为Token,然后生成AST。接着,编写一个React组件,接收Markdown字符串,解析成AST,遍历AST生成对应的React元素。处理代码高亮需要引入第三方库,但用户不允许用现…...
如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解
本文深入解析基于 React 和 PDF.js 构建 PDF 查看器的实现方案,该组件支持 PDF 渲染、图片打印和下载功能,并包含完整的加载状态与错误处理机制。 完整代码在最后 一个PDF 文件: https://mozilla.github.io/pdf.js/web/compressed.tracemo…...
React-Markdown 组件底层实现原理详解
如何在 React 中渲染 Markdown 文档 React-Markdown 组件底层实现原理详解 一、核心架构:基于 Unified.js 的编译流水线 React-Markdown 的底层实现依赖于 Unified.js 这一开源内容处理系统,其核心是一个可插拔的编译流水线。整个过程分为四个阶段&…...
基于单片机的防火防盗报警系统设计(论文+源码)
2.1系统的功能及方案设计 本次课题为基于单片机的防火防盗报警系统,其系统采用STC89C52单片机为控制器,并结合SIM800短信模块,DS18B20温度检测模块,MQ-2烟雾检测模块,红外人体检测模块,按键模块,…...
NO.72十六届蓝桥杯备战|搜索算法-DFS|选数|飞机降落|八皇后|数独(C++)
P1036 [NOIP 2002 普及组] 选数 - 洛谷 组合型枚举,路径⾥⾯记录选择数的「总和」。在选出k 个数之后,判断「是否是质数」 #include <bits/stdc.h> using namespace std;const int N 25; int n, k; int a[N];int ret; int path; //记录路径中所…...
网络Socket编程基于UDP协议模拟简易网络通信
一、预备知识 网络编程(Network Programming)是指编写程序来实现计算机网络之间的通信。这通常涉及到使用套接字(sockets)来建立连接、发送和接收数据。 (一)套接字 套接字(Socket࿰…...
rust 使用select退出线程
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Capture {clear: bool, // ????????interface: String, // ??times: u64, // ?? }pub async fn cmd_capture(State(web_env): State<ArcWebEnv>,Json(args): Json<C…...
C++学习day7
思维导图: 使用vector实现一个简单的本地注册登录系统 注册:将账号密码存入vector里面,注意防重复判断 登录:判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #includ…...
【学习笔记】CoACD: 基于碰撞感知凹性与树搜索的近似凸分解
CoACD 基于碰撞感知凹性与树搜索的近似凸分解 CoACD 官方文档 CoACD(Convex Approximation of Complex Decompositions)是一种用于将复杂网格分解为多个凸包的算法, 专为 3D 网格设计了近似凸分解算法,强调在保持物体间潜在碰撞条件的同时减…...
Three.js 系列专题 6:后处理与特效
内容概述 后处理(Post-Processing)是在渲染完成后对画面进行额外的处理,以实现模糊、辉光、颜色校正等效果。Three.js 通过 EffectComposer 提供后处理支持。本专题还将简要介绍着色器和粒子系统,为更复杂的特效打基础。 学习目标 掌握 EffectComposer 的基本使用。实现辉…...
2025 年江苏保安员职业资格考试经验分享
江苏保安行业发展成熟,2025 年考试注重对考生综合素养的考查。报考条件常规,但对诚信记录有额外关注,如有不良信用记录可能影响报考资格。 报名在江苏省各地级市公安局指定点进行,提交资料包括身份证、学历证、个人诚信报告&am…...
亚马逊算法重构消费市场:解码2024年Q1北美站热搜商品的底层逻辑
在跨境电商迈入精细化运营时代的背景下,亚马逊平台最新发布的《2024年Q1零售搜索趋势报告》揭示了算法驱动下的消费新图景。数据显示,北美站点月均超300万人次重复搜索特定品类商品,健康生活、智能家居等五大领域形成持续增长极。这份由亚马逊…...
powershell绑定按钮事件的两种方式
写一个powershell的简单GUI做本地任务,试验出2个方法: 方法1: function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2: $btn2_click {write-host $…...
LearnOpenGL——OIT
教程地址:简介 - LearnOpenGL CN 简介 原文链接:LearnOpenGL - Introduction 前言 在混合(Blending)章节中,我们介绍了颜色混合的主题。混合是在3D场景中实现透明表面的方法。简而言之,透明度涉及到在计算…...
【蓝桥杯】Python大学A组第十五届省赛
1.填空题 1.1.拼正方形 问题描述 小蓝正在玩拼图游戏,他有个的方块和个的方块,他需要从中挑出一些来拼出一个正方形。 比如用个和个的方块可以拼出一个的正方形;用个的方块可以拼出一个的正方形。 请问小蓝能拼成的最大的正方形的边长为多少。 import math # 2*2的个数 a =…...
使用JS+HTML+CSS编写提词器实例
手搓提词器网页版,有些BUG但是基本功能使用没有问题,有需要的可复制粘贴,BUG自行修复。下面直接进入代码: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><me…...
人工智能基础知识详解:从概念到前沿技术与应用
在数字化浪潮席卷全球的今天,人工智能(Artificial Intelligence,简称AI)已不再是科技前沿的神秘概念,而是融入我们日常工作的实用工具。从智能语音助手到自动驾驶汽车,从医疗影像诊断到生成式艺术创作&…...
重温经典,畅享怀旧游戏盛宴
FC街机是一款专为安卓设备设计的经典游戏合集应用,它将玩家熟悉的红白机(FC)游戏体验带到了移动设备上。这款应用不仅提供了丰富的游戏选择,还通过优化的界面和操作,让玩家能够随时随地享受经典游戏的乐趣。 游戏非常…...
CPU 压力测试命令大全
CPU 压力测试命令大全 以下是 Linux/Unix 系统下常用的 CPU 压力测试命令和工具,可用于测试 CPU 性能、稳定性和散热能力。 1. 基本压力测试命令 1.1 使用 yes 命令 yes > /dev/null & # 启动一个无限循环进程 yes > /dev/null & # 启动第二个进…...
Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)
前言 资源 一、准备工作 (一)下载 VMware Workstation (二)下载 CentOS 7 镜像 二、安装 VMware Workstation(比较简单,按下面走即可) 三、创建 CentOS 7 虚拟机 四、安装 CentOS 7 系统…...
QLineEdit的提交前验证
QLineEdit是pyqt中常用的输入控件,默认情况下,它可以接受键盘输入的任何可打印字符。有时候,我们需要在用户提交前对其输入的内容先行验证,当用户输入不符合预期时予以清空,这就需要对QLineEdit控件进行以下操作&#…...
【Linux高级IO(二)】初识epoll
目录 1、epoll的接口 2、epoll原理 3、epoll工作方式 1、epoll的接口 #include <sys/epoll.h> 1、int epoll_create(int size) :创建epoll模型 返回值是一个文件描述符,创建一个struct file结构体,指向epoll模型,返回的…...
2018年真题
数学基础 一、 (共4分)用逻辑符号表达下列语句(论域为包含一切事物的集合) 1、(2分)集合A的任一元素的元素都是A的元素 经过对图片文字的识别与逻辑分析,结果如下: 符号定义&…...
Linux xxd命令
目录 一. xxd命令简介二. 简单使用三. -p选项纯16进制输出四. -r选项将十六进制还原成原始内容五. 小应用 一. xxd命令简介 xxd 是一个将文件或输入内容转换为十六进制(Hex Dump)格式的工具,也可以将十六进制恢复成原始数据。 它在调试二进制…...
高校实验室安全数智化分级分类管理-危化品管理LIMS
一、背景与依据 传统实验室安全管理如同老式挂钟,齿轮咬合处总会随时间产生间隙。为进一步规范学校实验室建设与适用,从源头管控实验室和实验项目安全风险,确保教学科研活动安全有序开展,分级分类体系构建如同绘制实验室的"…...
春芽儿智能跳绳:以创新技术引领运动健康新潮流
在全球运动健康产业蓬勃发展的浪潮中,智能健身器材正成为连接科技与生活的重要纽带。据《中国体育用品产业发展报告》显示,2023年中国智能运动装备市场规模突破千亿元,其中跳绳类目因兼具大众普及性与技术升级空间,年均增速超30%。…...
Fast网络速度测试工具
目录 网站简介 功能特点 测试过程 为什么使用Fast 如果网络速度不达标 网站简介 Fast是一个由Netflix提供的网络速度测试工具,主要用来测试用户的互联网下载速度。它以其简洁的界面和快速的测试过程而受到用户的欢迎。 功能特点 下载速度测试:这是…...
java的文件输入输出流(FileInputStream、FileOutputStream、FileReader、FileWriter)
文章目录 文件输入输出流1 java I/O 流的原理流的分类 2 FileInputStream 文件字节输入流3 FileOutputStream 文件字节输出流4 使用文件字节输入输出流完成对文件的拷贝5 FileReader 文件字符输入流6 FileWriter 文件字符输出流 文件输入输出流 1 java I/O 流的原理 I/O 是 In…...
stm32week10
stm32学习 七.CAN 7.STM32 CAN外设 标识符过滤器: 每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0] FSCx:位宽设置,置0为16位,置1为32位 FBMx:模式设置,置0为屏蔽模式,…...
【UnityEditor扩展】如何在 Unity 中创建棱柱体(用作VR安全区检测),同时在编辑器插件中实现与撤销/恢复功能
Unity 编辑器扩展:3D 空间中绘制安全区棱柱体(含撤销/恢复/保存/读取) 在虚拟现实(VR)和增强现实(AR)开发中,安全区是保障用户安全的重要组成部分。通过精确控制用户活动范围&#…...
C++小游戏 合集
生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…...
常州 d??
回来了! 今天(?发出来的时候可能已经是第二天了吧 真的爆零了qaq 挺难的 最高分只有100 而且t2t3t4一个人都没拿分qaq 这段时间在写网络流 唉博客还是不要写太水了 抄一点网络流代码上来 EK不写了 dinic会就行了 板子题洛谷p3376 dini…...
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略 1. juc包下的常用类:线程池:并发集合类:同步工具类:原子类: 2. 怎么保证多线程安全:3. Java中常用锁及使用场景:4. 线程同步的方法…...
学习日记-0407(Inductive Matrix Completion Using Graph Autoencoder)
论文阅读:Inductive Matrix Completion Using Graph Autoencoder 代码:swtheing/IMC-GAE 总而言之就是设计了一个不同评分下的邻接图,然后对每一个评分图T进行独立GNN编码。这个 GNN 编码器主要由三个组件构成:嵌入层、消息传递层…...
FPGA入门:状态机思想编程
一、状态机思想编写流水灯 1、状态机思想的概念 状态机思想是一种用于描述和处理具有多个状态以及状态之间转换关系的系统的思维方式。以下是对其主要概念、应用场景和优势的介绍: 主要概念 状态:指系统在某一时刻的状况或条件。例如,在一…...
【电路笔记】-切换触发器
切换触发器 文章目录 切换触发器1、概述2、切换触发器3、JK触发器转换为D型触发器4、D型触发器转换为切换触发器切换触发器是常用的时序逻辑电路,作为单个比特双稳态存储元件,在计数器、存储器设备中经常使用,或作为响应时钟脉冲的分频器。 1、概述 切换触发器是另一种基于…...
示例项目文档模板集:TaskBoard 任务管理系统
一套完整、高可读性、结构清晰的项目文档模板,适用于中小型软件项目的设计、开发、交接与展示全流程。 📌 项目概述文档(overview.md) 📂 项目名称:TaskBoard 🧭 项目简介 TaskBoard 是一款专为敏捷团队打造的任务管理系统,支持任务分配、状态追踪与协作沟通,帮…...
TF-IDF忽略词序问题思考
自从开始做自然语言处理的业务,TF-IDF就是使用很频繁的文本特征技术,他的优点很多,比如:容易理解,不需要训练,提取效果好,可以给予大规模数据使用,总之用的很顺手,但是人…...
代理模式的优缺点是什么?
什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,它通过创建代理对象来控制对原始对象的访问。 这种模式在前端开发中广泛应用,特别是在需要控制对象访问、添加额外逻辑或优化性能的场景中。 核心…...
十分钟上手:Distilling the Knowledge in a Neural Network
概述:知识蒸馏是一种模型压缩技术,通过让轻量化的学生模型模仿复杂教师模型的输出概率分布,结合软目标和硬目标进行训练,从而将教师模型的泛化能力迁移至学生模型,实现小模型的高效部署而不显著降低性能。 硬目标&…...
百度的deepseek与硅基模型的差距。
问题: 已经下载速度8兆每秒,请问下载30G的文件需要多长时间? 关于这个问题。百度的回答如下: 30GB文件下载时间计算 理论计算(基于十进制单位): 单位换算 文件大小:3…...
OpenCV 图形API(18)用于执行两个矩阵(或数组)的逐元素减法操作函数sub()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 计算两个矩阵之间的逐元素差值。 sub 函数计算两个矩阵之间的差值,要求这两个矩阵具有相同的尺寸和通道数: dst ( I ) src…...
布谷一对一直播源码android版环境配置流程及功能明细
一:举例布谷交友(一对一直播源码)搭建部署的基本环境说明 1. 首先安装Center OS 7.9系统,硬盘最低 40G 2. 安装宝塔环境 https://bt.cn(强烈推荐使用) 3. 安装环境 ● PHP 7.3(安装redis扩展…...
#MongoDB 快速上手
docker pull mongo docker run -d --name my-mongo -p 27017:27017 mongo docker exec -it my-mongo mongo 🚪进入 Mongo Shell 后的第一步 你进入后会看到类似提示符: >说明已经进入 Mongo Shell,现在就可以操作数据库了。 …...
docker相关命令
常用命令 #创建并启动 docker-compose up -d # 启动之后就可以通过浏览器访问了 #停止并删除 docker-compose down #重启 docker-compose restart #停止 docker-compose stop #启动 docker-compose startdocker search #搜索镜像(只搜索官方仓库的,官方仓库地址&am…...