Dify + OceanBase + MCP:三剑合璧,轻松构建 RAG 应用


「作者简介:程治玮,OceanBase 布道师,《Elasticsearch 实战》(第 2 版)译者」

首先为大家推荐这个 OceanBase 开源负责人老纪的公众号“老纪的技术唠嗑局”,会持续更新和 #数据库、#AI、#技术架构相关的各种技术内容。欢迎感兴趣的朋友们关注!

在 AI 应用开发领域,检索增强生成(Retrieval Augmented Generation,RAG)已成为构建智能问答、文档分析等场景的核心技术。通过 RAG,AI 应用能够结合现有知识库,在生成回答时引入外部信息,从而为用户提供更准确、更智能的响应。

本文将通过一个实践案例,展示如何使用OceanBase, Dify, MCP从零开始构建一个功能完备的 RAG 应用。

Dify是一个开源的 LLM 应用开发平台,它提供了友好的图形化界面,让开发者可以快速编排和部署 AI 应用和工作流。

OceanBase是根自研的开源分布式关系型数据库,专为大规模数据处理、高并发访问及金融级可用性场景而设计。它不仅支持传统的结构化数据管理与事务处理,从 4.3.3 版本开始,还原生支持向量数据类型,满足 AI 及语义检索等新兴应用需求。

MCP(Model Context Protocol,模型上下文协议) 是由Anthropic公司于 2024 年 11 月推出并开源的开放协议,旨在实现大语言模型(LLM)与外部工具、数据源的高效交互。MCP 通过标准化的接口,让 AI 系统能够实时访问和调用数据库、API 及其他服务,从而打破“数据孤岛”,提升 AI 应用的实时性、可操作性和协作能力。

部署 OceanBase

OceanBase 提供了多种部署方式,例如通过 Docker、Kubernetes、OBD(OceanBase Deployer)和 OceanBase 桌面版等。为了方便实验,本文将使用OceanBase 桌面版来部署 OceanBase。

注:OceanBase 桌面版仅适用于学习或测试场景,请不要应用于生产环境。

安装 OceanBase 桌面版,可以参考该文档:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002866370

OceanBase 桌面版安装完成后,将看到如下界面:

默认情况下,OceanBase 会创建两个租户sys和test,我们将在test租户下创建 Dify 使用的向量数据库。第一次需要为test租户设置密码。

在数据库管理页面中,新增一个名为rag的数据库。

部署 Dify

在本文中,我们将使用 OceanBase 作为 Dify 的向量数据库,用于存储 RAG 应用所需的知识库内容。与此同时,Dify 还需要一个关系型数据库来存储元数据。目前 Dify 官方仓库(最新版为 v1.5.0)仅支持PostgreSQL,尚不支持 MySQL。

OceanBase 社区基于 Dify v0.14.2 分支进行了改造,使其支持使用兼容 MySQL 协议的数据库来存储结构化数据,相关代码和文档在 oceanbase-devhub/dify 仓库中。如果你希望同时使用 OceanBase 作为向量数据库和关系型数据库,可以参考该版本进行部署。

此前,OceanBase 社区也曾向 Dify 官方提交支持 MySQL 的 PR(Make Dify compatible with MySQL database:https://github.com/langgenius/dify/pull/8364 ),但该 PR 未被 Dify 社区采纳。为了能够使用 Dify 的最新功能(例如 MCP Server 插件),本文将基于官方最新的 v1.5.0 版本,分别使用 OceanBase 和 PostgreSQL 作为向量数据库和关系型数据库。

启动 Dify 服务器最简单的方式是通过 Docker Compose。首先,克隆 Dify 仓库。进入 Dify 的docker目录,复制一份环境变量配置文件。

git clone https://github.com/langgenius/dify.git
cd dify
cd docker
cp .env.example .env

然后,编辑.env文件,将VECTOR_STORE设置为oceanbase,并填入 OceanBase 的连接信息。

VECTOR_STORE=oceanbase

OCEANBASE_VECTOR_HOST=198.19.249.160
OCEANBASE_VECTOR_PORT=2881
OCEANBASE_VECTOR_USER=root@test
OCEANBASE_VECTOR_PASSWORD=<your_password>
OCEANBASE_VECTOR_DATABASE=rag

OceanBase 的 IP 地址可以在 OceanBase 桌面版部署所使用的虚拟机中获取。在 macOS 上,OceanBase 桌面版是通过OrbStack启动虚拟机进行部署的。你可以在 OrbStack 的Machines界面点击Terminal按钮进入对应虚拟机,并通过ip addr命令查看其 IP 地址。

在输出信息中找到eth0网卡的inet地址,例如198.19.249.160,这就是连接 OceanBase 所需要用到的 IP。

admin@oceanbase-desktop:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo 
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
4: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd :: permaddr a2c4:a96f:bb63::
5: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether a6:e9:47:13:6a:81 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 198.19.249.160/24 metric 100 brd 198.19.249.255 scope global dynamic eth0
       valid_lft 168908sec preferred_lft 168908sec
    inet6 fd07:b51a:cc66:0:a4e9:47ff:fe13:6a81/64 scope global mngtmpaddr noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a4e9:47ff:fe13:6a81/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

修改完环境变量配置后,执行以下命令启动 Dify 服务。

docker compose up -d

可选:Dify 的docker-compose.yaml文件中其实也包含了 OceanBase 的容器配置。但由于我们已经通过 OceanBase 桌面版完成了部署,因此可以选择将其中的 OceanBase 容器配置注释掉,避免启动一个多余的容器。

服务启动后,浏览器输入http://localhost即可访问 Dify 的 Web 界面。第一次登录需要设置用户名和密码。

设置模型供应商

点击右上角的头像,选择设置进入设置页面。

点击模型供应商,这里我选择将通义千问作为模型供应商。读者也可以自行选择其他模型供应商。

在API Key中填入通义千问的 API Key,然后点击保存。

选择默认的系统模型,这里主要需要设置系统推理模型和Embedding 模型,大家可以根据自己的喜好自行选择。

索引知识库

完成模型设置后,接下来可以开始索引知识库了。回到首页,点击顶端的知识库标签页,进入知识库管理界面,点击创建知识库。

选择导入已有文本,可以直接拖入文件进行索引。这里我上传了两篇关于大模型推理优化技术 Chunked Prefill 的论文。

然后设置文本的分段规则,这里可以保留默认设置。点击预览块可以在右侧预览分段后的结果。确认没问题后,点击保存并处理。

创建对话应用

点击工作室标签页,进入应用管理界面,点击创建空白应用。

选择聊天助手,并填写应用名称。输入完成后点击创建按钮。

添加上一步索引的知识库作为聊天助手的上下文。然后可以在右侧聊天框里进行应用调试,例如询问什么是 Chunked Prefill?。从输出可以看到,AI 会根据文档内容生成回答,并附上引用的来源片段。

点击文件图标,可以看到具体引用的内容。

确认无误后,点击右上角的发布按钮。

然后就可以在聊天助手中进行提问了。

将 Dify 应用转换为 MCP Server

Dify 也可以作为一个 MCP Server,使你构建的 AI 应用能够被其他 MCP 客户端(如 Cursor、Windsurf、Cherry Studio 等)调用,从而拓展更多使用场景。mcp-server 插件由 Dify 社区贡献,是一种扩展类型插件。安装后,可将任意 Dify 应用转化为符合 MCP 标准的服务端点,供外部 MCP 客户端直接访问。

在 Dify 的Marketplace中选择MCP server插件进行安装。

接下来,设置 MCP Server,App选择上一步发布的聊天助手应用。

按照 MCP 规范,我们需要为工具提供一个清晰的输入模式。对于聊天 Dify 应用,确保在输入模式中包含一个query字段,格式如下:

{
    "name": "search_paper",
    "description": "Search information from Paper.",
    "inputSchema": {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "The keywords for search."
            }
        },
        "required": [
            "query"
        ]
    }
}

配置完 MCP Server 后,就可以得到一个 MCP Server 的端点,Dify 提供了 SSE 和 Streamable HTTP 两种端点,这里我们选择/mcp后缀的 Streamable HTTP 端点。

将端点 URL 复制到 MCP Client,这里我使用 Cherry Studio。

配置完成后,在聊天界面选择配置的 Dify MCP Server。

接着我们尝试询问一个与知识库内容相关的问题。但调用 Dify MCP Server 后并没有得到预期的回答,展开返回结果可以看到仅返回了<think>。这是因为我此前选择的推理模型qwen3-32b采用了混合思维模式,该模式允许 Qwen3 根据用户需求在“深度思考”和“快速响应”之间灵活切换。看起来是因为模型进入了深度思考模式,导致未能正常返回 Dify MCP Server 的调用结果。

解决方法就是将推理模型切换为没有深度思考模式的模型,例如qwen-turbo。

现在再次询问一个与知识库内容相关的问题,就能从 Dify MCP Server 得到预期的回答了。

总结

本文详细介绍如何结合 Dify、OceanBase 和 MCP 从零开始构建一个功能完备的 RAG 应用。教程涵盖了从部署环境、创建知识库、到构建聊天助手并进行调试的全过程。最后,文章还演示了如何将 Dify 应用转化为一个标准的 MCP Server,使其能被外部客户端调用,从而极大地扩展了 AI 应用的集成与协作能力。

参考资料

  • 安装 OceanBase 桌面版
  • MySQL Authentication Plugin Issues on macOS
  • Dify MCP Plugin Hands-On Guide: Integrating Zapier for Effortless Agent Tool Calls
  • Turn Your Dify App into an MCP Server
  • Dify MCP server

老纪的技术唠嗑局 不仅希望能持续给大家带来有价值的技术分享,也希望能和大家一起为开源社区贡献力量。如果你对 OceanBase 开源社区认可,点亮一颗小星星 吧!你的每一个Star,都是我们努力的动力~

https://github.com/oceanbase/oceanbase