
构建 MCP 驱动的 Agentic RAGCursor Bright Data Qdrant 的本地向量检索与联网搜索一体化实践【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub本指南围绕 ai-engineering-hub 仓库中的 mcp-agentic-rag 项目展开讲解如何将 Qdrant 本地向量数据库、Bright Data 联网抓取能力与 MCPModel Context Protocol协议结合打造一个既能回答知识库内问题、又能随时联网兜底的 Agentic RAG 系统。读完本文你将掌握从数据向量化、向量库入库、MCP 服务器封装到在 Cursor IDE 中注册使用工具的全套落地流程。项目概览Agentic RAG 的三层架构mcp-agentic-rag 项目的核心思路是把确定性检索与智能决策结合起来传统 RAG 只会对任何问题都做向量检索而 Agentic RAG 让 LLM Agent 先判断问题性质再决定调用哪个工具。该项目由三个核心组件构成见 README.mdBright Data提供 SERP API 与代理服务用于从互联网抓取实时数据充当联网搜索工具Qdrant作为本地向量数据库vector database存储并检索预置知识文档充当本地知识库工具Cursor IDE作为 MCP 客户端加载并调用上述能力让 Agent 具备工具选择能力。整个系统的工作流可以概括为用户在 Cursor 中提问 → Agent 根据问题主题选择工具 → 若问题属于知识库覆盖范围如机器学习相关调用向量检索工具从 Qdrant 召回最相关文档若问题超出知识库范围则调用 Bright Data 联网搜索工具获取最新网页结果 → 检索到的上下文被拼接进 Prompt辅助 LLM 生成回答。环境准备获取 Bright Data API Key联网搜索能力依赖 Bright Data 的 SERP API获取密钥的步骤如下对应 README.md 中 Get BrightData API Key 一节前往 Bright Data 官网注册账户选择 Proxies Scraping新建一个 SERP API接入方式选择 Native proxy-based access在该页面即可找到代理的 username 与 password将二者写入项目根目录的.env文件。README 中给出的.env示例如下BRIGHDATA_USERNAME... BRIGHDATA_PASSWORD...需要注意的一个关键差异README 中环境变量名写的是BRIGHDATA_USERNAME/BRIGHDATA_PASSWORD而实际源码 server.py 读取的是BRIGHT_DATA_USERNAME和BRIGHT_DATA_PASSWORD。配置时请以源码为准否则联网搜索工具会拿到空凭据导致认证失败username os.getenv(BRIGHT_DATA_USERNAME) password os.getenv(BRIGHT_DATA_PASSWORD)安装依赖与运行环境README 要求Python 3.11 或更高版本notebook 实际运行环境为 Python 3.12.2见 notebook.ipynb 的 kernel 信息然后安装核心依赖pip install mcp qdrant-client不过从源码的实际导入情况看完整的运行依赖不止这两个。检查 rag_code.py 与 server.py还需要以下包依赖包用途使用位置llama-indexembeddings.huggingface加载 HuggingFace 嵌入模型生成向量rag_code.pytqdm批量处理时的进度条rag_code.pyrequests通过代理发起 Google 搜索请求server.pypython-dotenv加载.env中的 Bright Data 凭据server.py建议一次性安装齐全pip install mcp qdrant-client llama-index tqdm requests python-dotenv启动本地向量数据库 QdrantQdrant 使用 Docker 容器方式启动README 给出的命令如下docker run -p 6333:6333 -p 6334:6334 \ -v $(pwd)/qdrant_storage:/qdrant/storage:z \ qdrant/qdrant该命令的关键点端口映射6333是 Qdrant 的 HTTP/REST 与 gRPC 网关端口6334是原生 gRPC 端口。源码中 QdrantVDB.define_client 使用QdrantClient(urlhttp://localhost:6333, prefer_grpcTrue)连接数据库prefer_grpcTrue意味着客户端优先走 gRPC 协议因此两个端口都必须暴露数据持久化-v $(pwd)/qdrant_storage:/qdrant/storage:z将宿主机当前目录下的qdrant_storage挂载为容器的存储目录向量数据落盘保存容器重建后数据不丢失Linux 环境下:z后缀用于自动设置 SELinux 标签避免挂载目录权限问题启动后 Qdrant 即监听本机 6333/6334 端口等待后续向量库的创建与数据写入。构建向量知识库notebook.ipynb 全流程拆解启动 Qdrant 后README 要求打开 notebook.ipynb运行代码在你的向量数据库中创建集合。该 notebook 与 rag_code.py 内容一致将 RAG 管线拆分为四个阶段。4.1 数据准备ML FAQ 语料项目内置了一段包含 20 个问答对的机器学习 FAQ 语料见 rag_code.py覆盖过拟合、特征工程、缺失值处理、模型评估指标、数据泄漏等经典问题。原始文本按\n\n分隔成 20 个块再将块内换行替换为空格new_faq_text [i.replace(\n, ) for i in faq_text.split(\n\n)]这样每个文档块变成一行紧凑文本便于后续逐条向量化与入库。4.2 向量化EmbedData 类EmbedData 负责把文本转换为向量默认使用 HuggingFace 模型nomic-ai/nomic-embed-text-v1.5输出 768 维向量class EmbedData: def __init__(self, embed_model_namenomic-ai/nomic-embed-text-v1.5, batch_size32): self.embed_model_name embed_model_name self.embed_model self._load_embed_model() self.batch_size batch_size self.embeddings [] def _load_embed_model(self): embed_model HuggingFaceEmbedding(model_nameself.embed_model_name, trust_remote_codeTrue, cache_folder./hf_cache) return embed_model值得注意的实现细节trust_remote_codeTrue该模型需要执行远程代码才能正确加载必须开启此参数cache_folder./hf_cache模型权重缓存在项目本地hf_cache目录首次运行会联网下载之后离线可用批量嵌入embed()通过batch_iterate生成器按batch_size32分批调用get_text_embedding_batch()进度由 tqdm 展示嵌入结果累积到self.embeddings。4.3 建集合与入库QdrantVDB 类QdrantVDB 封装了与 Qdrant 交互的全部逻辑。创建集合时使用了多项关键配置def create_collection(self): if not self.client.collection_exists(collection_nameself.collection_name): self.client.create_collection( collection_nameself.collection_name, vectors_configmodels.VectorParams( sizeself.vector_dim, # 768与 nomic-embed-text-v1.5 输出维度一致 distancemodels.Distance.DOT, # 点积距离 on_diskTrue), # 向量存磁盘节省内存 optimizers_configmodels.OptimizersConfigDiff( default_segment_number5, # 默认分段数 indexing_threshold0) # 建索引阈值0 表示立即建索引 )各参数含义与作用参数值说明vector_dim768必须与嵌入模型输出维度一致否则入库会报维度不匹配错误distanceDOT点积距离。对于已归一化的嵌入向量点积等价于余弦相似度且计算更快on_diskTrue向量保存在磁盘而非全量驻留内存适合本地轻量部署default_segment_number5初始化时划分的段数量便于并行优化indexing_threshold0 → 20000先设为 0 让数据立即可检索全部入库后再通过update_collection调整为 20000让 HNSW 索引在数据量超过阈值时自动重建入库阶段ingest_data()按batch_size512将文本与向量打包调用upload_collection写入同时为每条向量附带{context: ...}的 payload——检索时返回的就是这个原始文本。4.4 检索Retriever 类Retriever 完成查询向量化与相似度检索def search(self, query): query_embedding self.embeddata.embed_model.get_query_embedding(query) result self.vector_db.client.search( collection_nameself.vector_db.collection_name, query_vectorquery_embedding, search_paramsmodels.SearchParams( quantizationmodels.QuantizationSearchParams( ignoreTrue, # 忽略量化索引使用全精度向量搜索 rescoreTrue, # 搜索后重新打分提高精度 oversampling2.0, # 预取 2 倍候选再做重排 ) ), limit3, # 返回 Top-3 最相关文档 timeout1000, # 毫秒级超时 )检索后代码取 Top-3 结果的 payload 文本用\n\n---\n\n拼接成一段结构化上下文作为最终工具输出。notebook 中最后的验证调用为Retriever(database, embeddata).search(How to prevent overfitting?)即针对如何防止过拟合这一 FAQ 内问题做召回测试。编写 MCP 服务器并接入 Cursor5.1 MCP 服务器源码解析server.py 是整套系统的枢纽它把上述 RAG 能力与 Bright Data 联网能力封装成两个标准 MCP 工具。服务器基于mcp官方 Python SDK 的 FastMCP 高层 API 构建mcp FastMCP(MCP-RAG-app, host127.0.0.1, port8080, timeout30)服务器命名为MCP-RAG-app绑定本机 8080 端口请求超时 30 秒。随后通过mcp.tool()装饰器注册两个工具工具一machine_learning_faq_retrieval_tool本地向量检索mcp.tool() def machine_learning_faq_retrieval_tool(query: str) - str: Retrieve the most relevant documents from the machine learning FAQ collection. Use this tool when the user asks about ML. ... retriever Retriever(QdrantVDB(ml_faq_collection), EmbedData()) response retriever.search(query) return response从源码可见server.py该工具固定连接名为ml_faq_collection的集合每次调用时动态构建Retriever实例执行语义检索。docstring 明确提示 Agent当用户询问机器学习相关问题时使用此工具——这正是 Agentic 路由决策的依据。工具二bright_data_web_search_tool联网搜索兜底mcp.tool() def bright_data_web_search_tool(query: str) - list[str]: Search for information on a given topic using Bright Data. Use this tool when the user asks about a specific topic or question that is not related to general machine learning. ... host brd.superproxy.io port 33335 username os.getenv(BRIGHT_DATA_USERNAME) password os.getenv(BRIGHT_DATA_PASSWORD) proxy_url fhttp://{username}:{password}{host}:{port} proxies {http: proxy_url, https: proxy_url} formatted_query .join(query.split( )) url fhttps://www.google.com/search?q{formatted_query}brd_json1num50 response requests.get(url, proxiesproxies, verifyFalse) return response.json()[organic]该工具的实现细节server.py值得展开通过brd.superproxy.io:33335这个 Bright Data 原生代理入口发起请求用户名密码来自.env查询词以连接拼进 Google 搜索 URL并附加brd_json1让代理返回 JSON 结构化结果与num50每页最多 50 条结果verifyFalse关闭 SSL 证书校验源码同时在导入时通过ssl._create_default_https_context ssl._create_unverified_context全局放宽 HTTPS 校验便于在本地代理隧道下正常工作返回response.json()[organic]即 Google 的自然搜索结果列表。两个工具的 docstring 形成了互补的路由约定ML 相关问题 → 向量库其他问题 → 联网搜索。LLM Agent 读取工具描述后自主决策实现真正的 Agentic 检索增强。5.2 在 Cursor 中注册 MCP 服务器README 给出了接入 Cursor 的操作路径打开 Cursor 的设置Settings选择 MCP 选项卡添加一个新的全局 MCP 服务器Add new global MCP server。在弹出的 JSON 配置文件中填入{ mcpServers: { mcp-rag-app: { command: python, args: [/absolute/path/to/server.py], host: 127.0.0.1, port: 8080, timeout: 30000 } } }配置要点args中的路径必须替换为仓库中 server.py 的绝对路径command为python需确保当前环境能解析到安装了mcp包的 Python 解释器配置中的host/port/timeout与源码中FastMCP初始化参数127.0.0.1:8080保持一致其中timeout在 README 中按毫秒记作 30000而源码内FastMCP的timeout30以秒为单位二者表达同一超时语义保存配置后 Cursor 会自动拉起该进程此时即可在对话中调用machine_learning_faq_retrieval_tool与bright_data_web_search_tool两个工具。运行验证与完整调用链启动 MCP 服务器的方式很直接执行python server.py控制台会输出Starting MCP server at http://127.0.0.1:8080 on port 8080见 server.py随后mcp.run()进入事件循环等待 Cursor 的调用请求。完整的端到端调用链为用户在 Cursor 中提问Agent 阅读两个工具的描述判断问题归属若为机器学习问题 →machine_learning_faq_retrieval_tool→Retriever.search()→ Qdrant 召回 Top-3 → 拼接上下文返回若为其他问题 →bright_data_web_search_tool→ Bright Data 代理请求 Google → 返回结构化搜索结果上下文注入 PromptLLM 基于检索结果作答。常见问题与注意事项环境变量名不一致README 写的是BRIGHDATA_USERNAME/PASSWORD而 server.py 实际读取BRIGHT_DATA_USERNAME/PASSWORD务必以源码为准否则联网工具认证失败首次运行需下载模型nomic-ai/nomic-embed-text-v1.5会在首次向量化时从 HuggingFace 下载并缓存在项目内hf_cache目录需保持网络畅通嵌入维度必须匹配集合的vector_dim768是写死的若更换其他嵌入模型需同步修改集合配置否则检索阶段会报向量维度错误Qdrant 必须先行启动notebook 的建库入库与 server 的检索都依赖本地 6333/6334 端口忘记启动 Docker 容器会导致连接被拒gRPC 端口不可省略客户端设置了prefer_grpcTrue因此 Docker 启动时-p 6334:6334与 6333 一样必不可少。结语mcp-agentic-rag 是一个结构清晰、可直接运行的 Agentic RAG 参考实现它以 notebook.ipynb 完成向量知识库构建以 rag_code.py 沉淀 RAG 核心类再经 server.py 以标准 MCP 工具的形式暴露给 Cursor 消费。整套流程无需 GPU 即可在本地跑通是理解MCP 协议 向量检索 联网搜索三者如何协同的最佳入门范本。你可以在此基础上替换 FAQ 语料、更换嵌入模型或增补更多工具将其扩展为自己的知识库 Agent。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考