ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

Dify + OceanBase + MCP:三剑合璧,轻松构建 RAG 应用 1. 为什么我要把 Dify、OceanBase、MCP 拼在一起如果你正在找一个能快速落地知识库问答的组合Dify OceanBase MCP 这套链路值得认真试一次。Dify 负责把 RAG 流程可视化编排出来OceanBase 负责把向量和业务数据放在同一个数据库里MCP 负责把 Dify 应用变成外部客户端可以调用的标准工具。三者各管一段拼起来就是一条从文档入库到问答输出的完整通路。我这次的目标很具体上传两篇技术论文建一个知识库用 Dify 的聊天助手做检索增强问答再把这个助手通过 MCP Server 暴露给 Cherry Studio 调用。整个过程不需要写太多代码但每一步的配置参数都得对否则很容易卡在连接或返回异常上。适合谁看如果你已经会用 Docker 起服务知道什么是向量检索但还没把 Dify、OceanBase 和 MCP 串起来跑通过一次那这篇就是给你写的。我会把建表语句、环境变量、MCP 配置骨架和验证请求都列出来你跟着改 IP 和密码就能复现。先说结论这套方案跑通后你得到一个可被外部工具调用的知识库问答服务OceanBase 里同时存着向量和结构化数据Dify 负责编排MCP 负责对外暴露接口。下面按实际搭建顺序展开。2. 前置准备OceanBase 向量库与 Dify 环境2.1 OceanBase 部署与向量表建表OceanBase 从 4.3.3 版本开始原生支持向量数据类型这意味着你不需要额外引入一个向量数据库业务数据和向量可以放在同一个实例里。实验环境我用的是 OceanBase 桌面版它适合学习和测试不要用于生产。安装完成后默认会有 sys 和 test 两个租户。第一次使用 test 租户需要设置密码。然后在数据库管理页面新增一个名为 rag 的数据库后面 Dify 的向量数据就存在这里。接下来建向量表。OceanBase 的向量列用VECTOR(dim)声明dim 要和你的 Embedding 模型输出维度一致。比如通义千问的 text-embedding-v3 输出 1024 维建表时就得写VECTOR(1024)。下面是一张兼顾业务字段和向量字段的表结构CREATE TABLE rag.document_chunks ( id BIGINT AUTO_INCREMENT PRIMARY KEY, doc_id VARCHAR(64) NOT NULL, chunk_text TEXT NOT NULL, embedding VECTOR(1024) NOT NULL, metadata JSON, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, VECTOR INDEX idx_embedding (embedding) WITH (distancel2, typehnsw) );这里有几个参数需要留意。distancel2表示用欧氏距离做相似度计算如果你用的是余弦相似度可以改成cosine。typehnsw是近似最近邻索引类型适合数据量较大的场景数据量小的时候也可以不建向量索引直接暴力检索。metadata用 JSON 类型存来源、页码等附加信息方便后续过滤。建完表后你可以先用一条插入语句验证向量列是否正常工作INSERT INTO rag.document_chunks (doc_id, chunk_text, embedding, metadata) VALUES (paper_001, Chunked Prefill 将长序列拆分为多个块进行预填充, [0.01, 0.02, ...], {source: paper1.pdf, page: 3});实际使用时 embedding 数组由 Dify 在索引阶段自动写入你不需要手动拼这个数组。建表这一步的核心是维度对齐和索引参数选对。2.2 Dify 环境变量配置Dify 官方最新版的关系型数据库仍然只支持 PostgreSQL所以我的做法是PostgreSQL 存元数据OceanBase 存向量。这样既能用上 Dify 最新功能又能让向量数据落在 OceanBase 里。克隆 Dify 仓库后进入 docker 目录复制环境变量文件git clone https://github.com/langgenius/dify.git cd dify/docker cp .env.example .env然后编辑.env把向量存储指向 OceanBaseVECTOR_STOREoceanbase OCEANBASE_VECTOR_HOST198.19.249.160 OCEANBASE_VECTOR_PORT2881 OCEANBASE_VECTOR_USERroottest OCEANBASE_VECTOR_PASSWORDyour_password OCEANBASE_VECTOR_DATABASEragOceanBase 的 IP 地址需要从部署它的虚拟机里获取。如果你用的是 macOS 上的 OceanBase 桌面版它通过 OrbStack 启动虚拟机进入虚拟机终端执行ip addr找到 eth0 网卡的 inet 地址即可。这个地址填到OCEANBASE_VECTOR_HOST里。配置完成后启动服务docker compose up -d浏览器访问http://localhost就能看到 Dify 的 Web 界面第一次登录设置用户名和密码。注意Dify 的 docker-compose.yaml 里其实也带了 OceanBase 容器配置。如果你已经用桌面版部署了 OceanBase可以把那段容器配置注释掉避免起一个多余的容器占端口。2.3 模型供应商与知识库索引进入 Dify 设置页面在模型供应商里选择通义千问填入 API Key 后保存。然后设置默认的系统推理模型和 Embedding 模型。推理模型建议选一个没有深度思考模式的比如 qwen-turbo原因后面排障部分会讲。Embedding 模型选 text-embedding-v3维度 1024和前面建表时的VECTOR(1024)对应。回到首页进入知识库标签页创建知识库选择导入已有文本。我上传了两篇关于 Chunked Prefill 的论文。分段规则保留默认即可点击预览块可以看分段结果。确认后点保存并处理Dify 会自动调用 Embedding 模型把每个分段转成向量写入 OceanBase 的document_chunks表。索引完成后你可以去 OceanBase 里查一下数据是否真的写进去了SELECT COUNT(*) FROM rag.document_chunks; SELECT doc_id, LEFT(chunk_text, 50) FROM rag.document_chunks LIMIT 5;如果 count 为 0说明向量写入没成功优先检查.env里的连接信息和数据库名是否正确。3. 可复制配置Dify 工作流与 MCP Server 接入3.1 创建聊天助手并挂载知识库在 Dify 工作室标签页创建空白应用选择聊天助手填好名称后创建。进入应用编排页面在上下文区域添加刚才建的知识库。这样每次提问时Dify 会先从 OceanBase 里检索相关分段再交给模型生成回答。右侧聊天框可以直接调试。问一句“什么是 Chunked Prefill”如果配置正确AI 会基于论文内容回答并在下方附上引用来源。点击文件图标能看到具体引用了哪个分段。确认回答符合预期后点右上角发布。3.2 安装 MCP Server 插件并配置工具Dify 可以把应用转成 MCP Server让 Cursor、Cherry Studio 这类 MCP 客户端直接调用。在 Marketplace 里搜索 MCP server 插件并安装。安装后在插件配置里新建一个 MCP ServerApp 选择刚才发布的聊天助手。按照 MCP 规范工具需要提供清晰的输入模式。对于聊天类应用输入模式里必须包含一个 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 端点。Dify 提供 SSE 和 Streamable HTTP 两种我选的是/mcp后缀的 Streamable HTTP 端点。把这个 URL 复制到 Cherry Studio 的 MCP 配置里保存后就能在聊天界面选择这个 Dify MCP Server。3.3 MCP 客户端配置骨架Cherry Studio 里的 MCP 配置大致长这样不同客户端字段名可能略有差异但核心是 url 和传输类型{ mcpServers: { dify-rag: { type: streamableHttp, url: http://your-dify-host/mcp/server/xxxx/mcp, headers: { Authorization: Bearer your_dify_mcp_token } } } }如果你的 Dify 部署在本地your-dify-host就是localhost或局域网 IP。token 在 Dify 的 MCP Server 配置页面可以找到。配置好后重启客户端在工具列表里应该能看到search_paper这个工具。4. 验证请求与成功结果4.1 直接调用 MCP 端点验证在接入 Cherry Studio 之前可以先用 curl 直接打一下 MCP 端点确认服务是通的。Streamable HTTP 的请求体遵循 JSON-RPC 格式curl -X POST http://localhost/mcp/server/xxxx/mcp \ -H Content-Type: application/json \ -H Authorization: Bearer your_dify_mcp_token \ -d { jsonrpc: 2.0, id: 1, method: tools/call, params: { name: search_paper, arguments: { query: Chunked Prefill 的核心思想是什么 } } }预期返回是一个 JSON-RPC 响应result 里包含模型基于知识库生成的回答以及引用的来源分段。如果返回的是空内容或者只有think说明模型进入了深度思考模式换一个非推理模型即可。4.2 在 Cherry Studio 中验证问答在 Cherry Studio 聊天界面选择配置好的 Dify MCP Server然后提问“Chunked Prefill 解决了什么问题”。正常情况下客户端会先调用search_paper工具拿到 Dify 返回的检索增强结果再整合成回答展示给你。我实测下来用 qwen-turbo 时返回稳定回答里能准确提到论文中的分块预填充思路并附带来源。如果你看到工具调用成功但回答为空优先检查模型是否支持工具调用以及 Dify 应用是否已经发布。5. 本篇常见错排查5.1 MCP 调用只返回think这是最容易踩的坑。我一开始用 qwen3-32b 做推理模型调用 Dify MCP Server 后只返回了think没有实际内容。原因是 qwen3 系列支持混合思维模式模型进入了深度思考导致工具调用结果没有正常返回。解决方法很简单把系统推理模型换成 qwen-turbo 这类没有深度思考模式的模型重新发布应用后再试。5.2 OceanBase 向量写入失败如果知识库索引后查document_chunks表没有数据按这个顺序排查先确认.env里OCEANBASE_VECTOR_DATABASE填的是rag再确认OCEANBASE_VECTOR_USER格式是roottest而不是root。然后检查 OceanBase 桌面版虚拟机的 IP 是否变了OrbStack 重启后 IP 可能重新分配。最后确认 Embedding 模型维度是 1024和建表时的VECTOR(1024)一致维度不匹配会直接报错。5.3 Dify 启动后无法访问docker compose up -d之后如果http://localhost打不开先看容器状态docker compose ps docker compose logs -f api常见原因是 PostgreSQL 容器没起来或者端口被占用。Dify 默认用 80 端口如果你本机有别的服务占了 80改.env里的EXPOSE_NGINX_PORT即可。5.4 MCP 客户端连不上端点Cherry Studio 里配置 MCP Server 后如果工具列表为空检查三点URL 是否带了/mcp后缀Authorization 头是否填了正确的 token以及 Dify 服务是否允许外部访问。如果 Dify 跑在 Docker 里而客户端跑在宿主机localhost可能指向不同环境换成宿主机的局域网 IP 试试。6. 把这条链路用起来跑通一次之后你会发现这套组合的扩展性不错。OceanBase 里既然已经存了向量和业务数据后续要加过滤条件、做多租户隔离都很直接。Dify 的工作流可以继续加节点比如在检索前加一个查询改写或者在生成后加一个敏感词过滤。MCP 这一层则让 Dify 应用不再局限于自己的聊天界面而是能被更多工具调用。如果你在配置 MCP Server 或验证请求时遇到报错可以去 TaoToken 的 API Keys 页面生成密钥配合接入文档排查请求链路https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。想先确认模型对话是否正常用模型对话页面发一条测试消息即可https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。如果你打算把这条链路用于长期编码或 Agent 场景Coding Plan 里有更完整的配额和接入方式https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。最后留一个实用技巧Dify 的知识库分段大小和重叠长度会直接影响检索命中率。技术论文这类内容分段设 500 到 800 字符、重叠 100 字符左右比较稳。改完分段规则后记得重新索引否则 OceanBase 里还是旧向量。
返回列表