基于skill-mcp-builder快速构建生产级MCP服务器:从协议到实践

news2026/5/8 4:39:14
1. 项目概述与核心价值如果你正在为AI助手比如Claude Code、Cursor、或是Gemini CLI开发工具并且厌倦了为每个平台重复编写适配代码那么你很可能已经听说过Model Context Protocol。MCP你可以把它理解为AI工具领域的“USB-C”接口标准。它定义了一套统一的协议让开发者编写的工具能够被任何支持MCP的AI智能体直接调用实现“一次编写处处运行”。这听起来很美好但当你真正上手时往往会发现从零开始构建一个生产级的MCP服务器并非易事你需要处理协议细节、设计工具模式、确保错误处理得当还要考虑安全性和部署问题。这正是aptratcn/skill-mcp-builder这个项目要解决的问题。它不是一个庞大的框架而是一个精心设计的“脚手架”或“构建器”。它为你提供了构建生产就绪的MCP服务器所需的最佳实践、完整示例和核心模式。无论你是想为你的AI助手添加一个查询数据库的工具还是一个执行长时间运行任务比如代码生成后的格式化检查的工具这个项目都能给你一个清晰、可靠的起点。它尤其适合那些希望快速将内部API、脚本或服务封装成AI可用工具的开发者以及任何想要深入理解MCP协议并构建健壮工具的工程师。2. MCP核心概念与“USB-C”类比解析在深入如何使用构建器之前我们有必要先厘清MCP到底是什么以及为什么它如此重要。Model Context Protocol是由Anthropic提出的一种开放协议旨在标准化AI模型智能体与外部工具、数据源之间的交互方式。2.1 为什么需要MCP—— 从“万能遥控器”的困境说起想象一下你家里有五个不同品牌的电器电视、空调、音响、灯光和窗帘。每个电器都配有一个专属的遥控器。你想实现一个“观影模式”需要依次操作五个遥控器关灯、降窗帘、开电视、开音响、调低空调温度。这个过程繁琐且容易出错。在没有MCP之前AI工具生态就有点像这个场景。Claude Code有自己的一套工具调用方式Cursor有另一套其他AI智能体又各有各的“方言”。开发者如果想让自己的工具被多个AI使用就必须为每个平台编写特定的适配器代码这极大地增加了开发和维护成本。2.2 MCP如何成为“USB-C”—— 协议的统一MCP的出现就像为所有电器定义了一个统一的红外信号编码标准。现在你只需要一个支持这个标准的“万能遥控器”即支持MCP的AI智能体就可以控制所有同样支持该标准的电器即MCP服务器提供的工具。具体来说MCP协议主要规范了以下几件事工具发现AI智能体如何知道MCP服务器提供了哪些工具list_tools。工具调用AI智能体如何以结构化的方式请求执行某个工具并传递参数call_tool。结果返回MCP服务器如何将工具执行的结果文本、图片、数据、错误返回给AI智能体。资源描述如何向AI智能体描述可访问的数据资源如文件、数据库表使其能够理解和引用。双向通信支持服务器向客户端推送通知以及处理长时间运行的任务。skill-mcp-builder的价值在于它帮你处理了与MCP协议底层通信的复杂性让你可以专注于工具本身的业务逻辑。它提供了符合协议规范的服务器骨架、标准的工具定义格式、以及处理各种交互模式如分页、长任务的样板代码。3. 快速上手与项目结构剖析让我们立即动手看看如何获取并使用这个构建器。根据项目说明有两种主要安装方式。3.1 安装方式选择与实操方式一通过Vercel Skills CLI推荐这是最便捷的方式尤其适合已经使用Vercel生态或希望管理多个技能Skill的开发者。npx skills add aptratcn/skill-mcp-builder这条命令会通过npx临时下载并执行Vercel的Skills CLI工具将skill-mcp-builder添加到你的全局技能目录中通常是~/.claude/skills/。之后你可以在任何支持Skills的项目中引用它。方式二直接复制文件如果你更喜欢手动控制或者环境网络受限可以直接复制项目提供的SKILL.md文件。# 假设你已经将项目克隆到本地或下载了SKILL.md cp /path/to/skill-mcp-builder/SKILL.md ~/.claude/skills/mcp-builder/你需要确保目标目录~/.claude/skills/mcp-builder/存在。这种方式让你能直接查看和修改这个“技能”文件的内容。注意SKILL.md文件本身并不是一个可执行的构建脚本而是一个包含详细指南、代码片段和配置示例的Markdown文档。它的作用是作为一个集中式的知识库和模板库。安装后你需要参考其中的内容来搭建你自己的MCP服务器项目。3.2 解构“技能”包你究竟得到了什么执行安装后你获得的不是一个可以直接npm start的应用而是一套完整的参考实现和开发指南。根据项目描述它主要包含以下几个核心部分我们可以将其视为一个“工具箱”完整的TypeScript和Python示例这是构建器的基石。它提供了用两种主流语言编写的、可直接运行的MCP服务器示例。你可以将其作为模板复制并修改成你自己的工具。TypeScript示例通常基于modelcontextprotocol/sdk或其他流行的Node.js MCP库展示了现代ES模块或CommonJS下的开发方式。Python示例通常基于mcp官方SDK或其他Python库适合数据科学、后端自动化等场景。核心设计模式这是构建生产级工具的关键文档会详细阐述如何实现CRUD模式如何创建、读取、更新、删除资源的工具。例如构建一个管理待办事项的MCP工具。分页模式当工具返回大量数据如数据库查询结果、API列表时如何实现安全、高效的分页防止一次性返回数据过多导致上下文溢出。长时间运行操作模式对于一些耗时任务如代码库扫描、数据同步如何设计工具使其能够启动任务、轮询状态、并最终返回结果而不是让AI客户端一直等待。错误处理最佳实践MCP服务器必须健壮。这部分会指导你如何定义和返回结构化的错误信息让AI能理解哪里出了问题。如何处理无效输入、网络超时、依赖服务不可用等异常情况。如何记录日志以便于调试同时不泄露敏感信息。安全检查清单将工具暴露给AI意味着新的攻击面。清单会提醒你输入验证对所有来自AI客户端的参数进行严格的类型、范围、格式检查。权限控制工具是否应该有无差别的执行权限是否需要引入认证或基于上下文的权限判断资源隔离与限流防止单个工具调用耗尽系统资源如CPU、内存、数据库连接。敏感信息过滤确保工具返回的结果中不会意外包含API密钥、内部IP、个人信息等。部署指南指导你如何将构建好的MCP服务器交付给不同的AI客户端使用Claude Code如何配置Claude Desktop的claude_desktop_config.json来加载你的自定义MCP服务器。Cursor如何在Cursor的设置中配置MCP服务器。Gemini CLI 其他提供通用的命令行启动和配置示例。4. 从零构建你的第一个MCP工具一个天气查询服务器理论说得再多不如亲手实践。让我们以构建一个简单的“天气查询”MCP服务器为例全程模拟如何使用skill-mcp-builder提供的模式和指南。我们将使用TypeScriptNode.js环境。4.1 初始化项目与环境准备首先创建一个新的项目目录并初始化。mkdir mcp-weather-server cd mcp-weather-server npm init -y接下来安装MCP的核心依赖。这里我们使用Anthropic官方维护的SDK它非常稳定且文档齐全。npm install modelcontextprotocol/sdk npm install -D typescript tsx types/node # 初始化TypeScript配置 npx tsc --init在tsconfig.json中确保target设置为ES2022或更高module设置为NodeNext。4.2 定义工具get_weather参考构建器中的模式一个工具需要清晰的定义。我们在src/index.ts中开始编写。首先定义工具的参数和返回结构。这是与AI沟通的“契约”。import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { CallToolRequestSchema, ToolSchema, } from modelcontextprotocol/sdk/types.js; // 1. 定义工具这是一个获取天气的工具 const WEATHER_TOOL: ToolSchema { name: get_weather, description: 获取指定城市的当前天气信息。, inputSchema: { type: object, properties: { city: { type: string, description: 城市名称例如Beijing, Shanghai, New York, }, units: { type: string, enum: [metric, imperial], description: 温度单位。metric为摄氏度imperial为华氏度。默认为metric。, default: metric, }, }, required: [city], additionalProperties: false, // 禁止额外参数增强安全性 }, };关键点解析inputSchema使用了JSON Schema来严格定义输入参数。这不仅能被AI理解也能在服务器端进行自动验证。required: [city]指定了必填参数。additionalProperties: false是一个重要的安全实践防止客户端传入未预期的参数可能用于注入攻击。4.3 实现工具逻辑与模拟API调用接下来我们实现工具的处理函数。在生产环境中这里会调用真实的天气API如OpenWeatherMap。为了示例我们进行模拟。// 2. 实现工具处理函数 async function handleGetWeather(args: { city: string; units?: string }) { const { city, units metric } args; // 模拟API调用延迟 await new Promise(resolve setTimeout(resolve, 100)); // 模拟根据城市和单位返回数据 const mockWeatherData: Recordstring, { temp: number; condition: string } { beijing: { temp: units metric ? 22 : 71.6, condition: Sunny }, shanghai: { temp: units metric ? 25 : 77, condition: Cloudy }, new york: { temp: units metric ? 18 : 64.4, condition: Rainy }, }; const key city.toLowerCase(); const data mockWeatherData[key]; if (!data) { // 结构化错误返回让AI能理解并可能引导用户更正 throw new Error(City ${city} not found in our database. Please check the spelling or try a major city.); } const unitSymbol units metric ? °C : °F; return { content: [ { type: text, text: 当前 ${city} 的天气\n - 温度${data.temp} ${unitSymbol}\n - 状况${data.condition}\n - 单位${units}, }, ], }; }4.4 组装服务器并处理请求现在创建MCP服务器实例注册工具并启动服务。// 3. 创建MCP服务器 const server new Server( { name: weather-mcp-server, version: 0.1.0 }, { capabilities: { tools: {} } } ); // 4. 注册工具列表 server.setRequestHandler(ListToolsRequestSchema, async () ({ tools: [WEATHER_TOOL], })); // 5. 处理工具调用请求 server.setRequestHandler(CallToolRequestSchema, async (request) { if (request.params.name ! WEATHER_TOOL.name) { throw new Error(Unknown tool: ${request.params.name}); } // 这里可以添加更复杂的输入验证逻辑 const args request.params.arguments as { city: string; units?: string }; try { const result await handleGetWeather(args); return result; } catch (error: any) { // 统一错误处理返回给AI客户端 return { content: [ { type: text, text: 工具执行失败: ${error.message}, }, ], isError: true, // MCP协议中标记这是一个错误结果 }; } }); // 6. 启动服务器使用标准输入输出这是与AI客户端通信的常见方式 async function main() { const transport new StdioServerTransport(); await server.connect(transport); console.error(Weather MCP server running on stdio...); } main().catch((error) { console.error(Server fatal error:, error); process.exit(1); });4.5 测试你的MCP服务器在部署到AI客户端前最好先进行本地测试。我们可以创建一个简单的测试脚本test-client.js模拟AI客户端的调用。// 这是一个简化的测试实际AI客户端调用会更复杂 import { spawn } from child_process; import { createInterface } from readline; const serverProcess spawn(node, [--loader, tsx, src/index.ts], { stdio: [pipe, pipe, inherit] // 继承stderr以便看日志 }); const rl createInterface({ input: process.stdin, output: process.stdout }); // 模拟发送一个ListTools请求 const listToolsRequest JSON.stringify({ jsonrpc: 2.0, id: 1, method: tools/list, params: {} }) \n; serverProcess.stdin.write(listToolsRequest); serverProcess.stdout.on(data, (data) { console.log(Server response:, data.toString()); }); // 可以再模拟一个CallTool请求...更简单的测试方法是直接使用像mcp-cli这样的命令行测试工具如果可用或者直接配置到Claude Desktop进行真实交互测试。5. 进阶模式实现分页与长任务简单的工具如上所示但现实中的工具往往更复杂。skill-mcp-builder提供的模式在这里至关重要。5.1 实现分页模式查询城市列表假设我们的天气服务支持查询所有可用的城市数据量很大必须分页。// 在工具定义中增加分页参数 const LIST_CITIES_TOOL: ToolSchema { name: list_cities, description: 分页获取支持查询天气的城市列表。, inputSchema: { type: object, properties: { page: { type: number, description: 页码从1开始。, default: 1, minimum: 1, }, pageSize: { type: number, description: 每页数量默认为20最大100。, default: 20, minimum: 1, maximum: 100, // 限制单次返回上限保护服务器 }, }, required: [], }, }; async function handleListCities(args: { page?: number; pageSize?: number }) { const page args.page ?? 1; const size args.pageSize ?? 20; const startIdx (page - 1) * size; // 模拟从数据库或大数组中获取数据 const allCities [...Array(1000).keys()].map(i City_${i 1}); const pageCities allCities.slice(startIdx, startIdx size); const total allCities.length; const hasNext startIdx size total; return { content: [{ type: text, text: 第${page}页共${Math.ceil(total / size)}页\n 城市列表${pageCities.join(, )}\n 是否还有下一页${hasNext ? 是 : 否}, }], // 可以在返回中包含结构化数据供AI解析但文本描述是必须的 }; }分页设计要点参数校验pageSize设置了maximum这是防止资源耗尽的关键。元信息返回在返回结果中明确告知总页数、是否有下一页这能帮助AI决定是否需要继续调用。性能在实际应用中务必使用数据库的LIMIT和OFFSET或更优的游标分页而不是在内存中切片。5.2 实现长任务模式生成天气报告有些任务如生成一份过去一周的天气趋势PDF报告可能需要数十秒。不能让AI客户端一直阻塞等待。// 长任务模式通常涉及两个工具一个启动任务一个查询状态 const tasks new Mapstring, { status: running | completed | failed; result?: any; error?: string }(); const GENERATE_REPORT_TOOL: ToolSchema { name: generate_weather_report, description: 启动生成指定城市的周度天气报告长时间任务。, inputSchema: { type: object, properties: { city: { type: string, description: 城市名 } }, required: [city], }, }; const CHECK_REPORT_TOOL: ToolSchema { name: check_report_status, description: 检查报告生成任务的状态。, inputSchema: { type: object, properties: { taskId: { type: string, description: 启动任务时返回的任务ID } }, required: [taskId], }, }; async function handleGenerateReport(args: { city: string }) { const taskId report_${Date.now()}_${Math.random().toString(36).substr(2, 9)}; tasks.set(taskId, { status: running }); // 立即返回任务ID不等待任务完成 setTimeout(() { // 模拟长时间处理 console.error([Background] Starting report generation for ${args.city}, taskId: ${taskId}); // ... 这里是实际的报告生成逻辑 ... // 完成后更新状态 tasks.set(taskId, { status: completed, result: 报告内容${args.city}过去一周天气晴好。 }); }, 0); // 使用setTimeout或放入任务队列确保非阻塞 return { content: [{ type: text, text: 已开始生成报告任务ID${taskId}。请使用 check_report_status 工具查询进度。, }], }; } async function handleCheckReportStatus(args: { taskId: string }) { const task tasks.get(args.taskId); if (!task) { throw new Error(任务ID ${args.taskId} 不存在。); } if (task.status running) { return { content: [{ type: text, text: 任务 ${args.taskId} 正在处理中请稍后再查。 }] }; } else if (task.status completed) { const result task.result; tasks.delete(args.taskId); // 可选完成后清理 return { content: [{ type: text, text: 任务完成结果${result} }] }; } else { return { content: [{ type: text, text: 任务失败${task.error} }], isError: true }; } }长任务设计要点异步与状态管理任务启动后立即返回通过一个共享的存储这里用Map生产环境用Redis或数据库来管理任务状态。任务ID生成一个唯一ID作为后续查询的凭证。资源清理任务完成后考虑清理存储的状态避免内存泄漏。6. 安全加固、错误处理与部署指南6.1 安全加固检查清单基于构建器指南扩展输入验证重中之重对所有工具参数使用JSON Schema进行严格校验。对字符串参数警惕命令注入如city: \; rm -rf /\和路径遍历。使用白名单或严格的正则表达式过滤。对数值参数检查范围如page不能为负数。// 更严格的city验证示例 function isValidCity(city: string): boolean { return /^[a-zA-Z\s\-]$/.test(city) city.length 100; } // 在handleGetWeather中调用 if (!isValidCity(args.city)) { throw new Error(Invalid city name format.); }权限与上下文感知MCP协议本身不强制认证但你的服务器可以。例如可以从环境变量读取API密钥或设计一个auth_token参数需谨慎传输。更优雅的方式是依赖AI客户端运行的环境。例如你的MCP服务器只允许来自localhost的连接通过Stdio Transport本身已保证或者部署在需要特定网络权限才能访问的内部环境中。限流与防滥用对于公开服务必须实施限流。可以使用express-rate-limit如果走HTTP或自定义计数器。记录日志监控异常调用模式。输出过滤确保工具返回的内容不包含敏感信息如数据库错误详情、堆栈跟踪、内部文件路径。在生产环境中应返回对用户友好、对攻击者无用的错误信息。6.2 系统化错误处理策略除了在每个工具函数内进行try...catch还应该在服务器层面设置全局错误处理器防止未捕获的异常导致进程崩溃。// 在server.setRequestHandler之外 process.on(uncaughtException, (error) { console.error(Uncaught Exception:, error); // 根据情况决定是否退出进程对于长期运行的服务可能选择记录错误并继续 }); process.on(unhandledRejection, (reason, promise) { console.error(Unhandled Rejection at:, promise, reason:, reason); });在工具函数中区分预期错误如用户输入错误和意外错误如数据库连接失败。预期错误应提供清晰的指引意外错误则记录详细日志但返回泛化的错误信息。6.3 部署到不同AI客户端这是最后一步也是工具真正产生价值的一步。skill-mcp-builder提供了针对不同客户端的配置指南。部署到Claude Desktop将你的MCP服务器构建成可执行文件例如用pkg打包Node.js项目或用PyInstaller打包Python项目或者确保目标机器有运行环境。编辑Claude Desktop的配置文件。在macOS上路径通常是~/Library/Application Support/Claude/claude_desktop_config.json。在Windows上是%APPDATA%\Claude\claude_desktop_config.json。添加你的服务器配置{ mcpServers: { weather-server: { command: node, args: [/absolute/path/to/your/compiled/index.js], env: { OPENWEATHER_API_KEY: your_key_here // 通过环境变量传递敏感配置 } } } }重启Claude Desktop。在聊天窗口中Claude应该就能识别并使用get_weather等工具了。部署到CursorCursor的配置通常在设置菜单中。找到MCP Servers部分。添加一个新的服务器配置方式与Claude Desktop类似指定命令和参数。保存后在Cursor的AI对话中即可使用。通用建议使用配置文件将服务器地址、API密钥等配置外置如config.yaml或环境变量不要硬编码在代码中。日志记录使用winston或pino等日志库将日志输出到文件或日志收集系统便于问题排查。进程管理对于生产环境使用pm2、systemd或Docker来管理你的MCP服务器进程确保其崩溃后能自动重启。7. 常见问题与排查技巧实录在实际开发和集成过程中你几乎一定会遇到下面这些问题。这里记录了我踩过的坑和解决方案。7.1 工具列表不显示或调用失败问题现象在AI客户端中输入/tools或类似指令看不到你定义的工具或者调用时提示“工具未找到”。排查步骤检查服务器日志首先确保你的MCP服务器进程正在运行并且没有在启动时报错。查看stderr输出。验证Stdio通信MCP服务器通过标准输入输出与客户端通信。确保你的服务器正确读取了stdin并写入了stdout。一个常见的错误是服务器代码中使用了console.log来输出业务信息这会把MCP协议消息和调试信息混在一起破坏JSON-RPC格式。所有业务输出必须通过CallToolResult的content返回只有调试信息才用console.error。检查工具定义确认ListToolsRequest的返回格式正确tools数组中的每个工具对象都符合ToolSchema。特别注意name字段不能有空格或特殊字符最好使用蛇形命名snake_case。客户端配置确认AI客户端的配置文件路径正确JSON格式无误并且命令和参数能成功启动你的服务器。可以尝试在终端手动运行配置中的命令看服务器是否能正常启动。7.2 AI无法正确理解或使用工具问题现象工具能列出但AI在应该使用它的时候不用或者传参错误。排查与解决优化工具描述description字段至关重要。用清晰、自然、无歧义的语言描述工具的功能、适用场景和参数含义。例如“获取天气”不如“获取指定城市当前的温度、天气状况和湿度如支持”。细化参数描述每个参数的description要具体。对于枚举类型enum明确列出选项及其含义。对于字符串给出格式示例如日期“YYYY-MM-DD”城市“城市名支持中文或拼音”。提供示例虽然MCP协议本身没有强制要求但在inputSchema中为复杂参数提供examples字段可以极大地帮助AI理解如何构造输入。properties: { city: { type: string, description: 城市名称, examples: [北京, Shanghai, Tokyo] } }7.3 性能问题与超时问题现象工具调用缓慢或AI客户端因等待超时而断开连接。解决思路优化工具逻辑检查你的工具函数。是否有耗时的同步操作是否有不必要的网络请求或复杂计算对于I/O操作确保使用异步模式。实现分页对于返回大量数据的工具必须实现分页。一次性返回上万条数据不仅慢还可能撑爆AI的上下文窗口。长任务异步化任何预计执行时间超过5-10秒的操作都应该设计为“启动-查询”的长任务模式如第5.2节所示。设置超时在服务器端为你依赖的外部API调用或数据库查询设置合理的超时时间并使用Promise.race或类似机制避免一个慢请求拖死整个服务器。7.4 安全性漏洞问题现象工具被滥用或暴露出敏感信息。加固措施回顾永远不要信任输入这是铁律。即使来自AI客户端所有参数也必须经过验证和清洗。最小权限原则你的MCP服务器进程应该以尽可能低的系统权限运行。它不需要访问整个文件系统或所有网络端口。隔离运行考虑使用Docker容器来隔离你的MCP服务器限制其资源使用CPU、内存。审计日志记录所有工具调用的时间、参数可脱敏、调用者如果可识别和结果状态。这对于事后分析和发现异常行为至关重要。构建一个稳定、安全、易用的MCP服务器是一个将严谨的工程实践与对AI交互模式的理解相结合的过程。aptratcn/skill-mcp-builder提供了一个坚实的起点和最佳实践地图但最终工具的强大与否取决于你赋予它的业务逻辑和对细节的打磨。从今天开始选一个你日常工作中重复性的小任务试着把它变成一个MCP工具你会立刻感受到AI作为助手的生产力提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2593714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…