尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AI Agent与MCP协议实战:零代码构建智能点单系统

AI Agent与MCP协议实战:零代码构建智能点单系统 1. 项目概述一次Agent与MCP的实战碰撞最近AI Agent智能体和MCPModel Context Protocol模型上下文协议这两个词在技术圈里火得不行。大家都在讨论它们如何改变人机交互如何让大模型更“接地气”地操作真实世界的应用。作为一个喜欢折腾新技术的从业者我总觉得光看理论不够过瘾得亲手试试才知道深浅。于是我给自己定了个小目标不写一行传统代码完全依靠一个AI Agent通过瑞幸咖啡官方的MCP服务完成一次真实的点单。这听起来像是个简单的自动化脚本但背后的逻辑和踩过的坑远比想象中复杂。今天我就把这次从零到一的完整过程、技术细节、心路历程以及最关键的优缺点分析毫无保留地记录下来。无论你是对Agent开发感兴趣的工程师还是好奇MCP如何落地的产品经理甚至是单纯想了解未来点咖啡新姿势的用户这篇记录或许都能给你带来一些实在的参考。2. 核心概念与工具选型解析2.1 为什么是Agent MCP在开始动手之前我们得先搞清楚手里的“武器”到底是什么。AI Agent在这里我把它理解为一个具备一定自主决策和执行能力的智能程序。它不只是一个聊天机器人而是能理解我的模糊指令比如“帮我点一杯最近门店的生椰拿铁少冰”并拆解成一系列可执行的操作步骤查找门店、选择商品、配置选项、下单支付。而MCP (Model Context Protocol)则是这次实验的关键桥梁。你可以把它想象成一套标准化的“插头插座”规范。瑞幸官方提供了符合MCP规范的“插座”即MCP服务我的Agent只需要配备标准的“插头”MCP客户端就能安全、规范地“插入”瑞幸的服务调用其查询菜单、获取门店、提交订单等能力。这与传统的爬虫或逆向工程API有本质区别MCP是官方主动开放、标准化的接口稳定性和合法性有保障。2.2 核心工具栈搭建工欲善其事必先利其器。为了实现这个目标我选择了以下工具组合这也是目前社区比较主流的方案Agent框架LangChain我选择LangChain作为构建Agent的底座。原因很简单生态成熟、文档丰富并且它对工具Tools的调用和编排能力非常强大。我们的Agent核心就是学会调用一系列工具Tools而LangChain的AgentExecutor能很好地处理工具选择、参数传递和结果解析的循环。大模型GPT-4Agent的“大脑”。我需要一个理解力、推理能力和指令跟随能力都足够强的模型来驱动整个流程。GPT-4在复杂任务分解和上下文理解上的表现目前依然是第一梯队。这里使用的是OpenAI的API。MCP客户端与服务器modelcontextprotocol/sdk这是MCP协议的核心JavaScript/TypeScript SDK。我需要用它来创建两个东西MCP客户端集成到我的Agent中用于向MCP服务器发送请求。MCP服务器模拟由于瑞幸的官方MCP端点细节非公开我需要根据其可能的行为模拟一个本地MCP服务器进行开发和测试。这能让我在完全可控的环境下调试Agent的逻辑。开发环境Node.js TypeScript一个轻量、高效的运行时配合TypeScript可以在开发阶段就捕获很多类型错误对于构建有一定复杂度的Agent项目来说能节省大量调试时间。注意整个项目将完全运行在我的本地开发环境或测试服务器上所有操作模拟真实流程但不会产生实际订单或支付避免不必要的消费和资源占用。重点在于技术流程的验证。3. 实战过程全记录3.1 第一步模拟瑞幸MCP服务器真正的瑞幸官方MCP服务器地址和认证方式属于其商业接口范畴。为了开发测试我必须先搭建一个行为相似的模拟服务器。这个过程实际上是在定义Agent与瑞幸服务交互的“合同”。我使用modelcontextprotocol/sdk创建了一个简单的MCP服务器它主要暴露了几个核心“工具”在MCP中称为“resources”或“tools”// 模拟瑞幸MCP服务器核心工具定义示例 const luckinServer new Server( { name: luckin-coffee-mcp-simulator, version: 0.1.0, }, { capabilities: { tools: { list: [search_nearest_store, get_store_menu, create_order], }, }, } ); // 工具实现搜索最近门店 luckinServer.setRequestHandler(ListToolsRequestSchema, async () { return { tools: [ { name: search_nearest_store, description: 根据用户提供的经纬度或地址搜索最近的瑞幸咖啡门店。, inputSchema: { type: object, properties: { location: { type: string, description: 地址或自动获取。 }, }, required: [location], }, }, // ... 其他工具定义 ], }; }); // 处理工具调用 luckinServer.setRequestHandler(CallToolRequestSchema, async (request) { switch (request.params.name) { case search_nearest_store: // 模拟返回附近门店信息 return { content: [ { type: text, text: JSON.stringify({ stores: [ { id: store_001, name: 瑞幸咖啡(中关村店), address: 海淀区中关村大街1号, distance: 500m }, { id: store_002, name: 瑞幸咖啡(五道口店), address: 海淀区成府路28号, distance: 1.2km }, ], }), }, ], }; case get_store_menu: // 模拟返回指定门店的菜单 // ... case create_order: // 模拟创建订单并返回结果 // ... } });这个模拟服务器响应了门店查询、菜单获取和订单创建三个关键操作并返回结构化的模拟数据。这里的关键在于工具描述的准确性description和inputSchema必须清晰无误因为Agent的大模型“大脑”就靠这些描述来理解什么时候该调用哪个工具以及需要传入什么参数。3.2 第二步构建点单Agent有了“插座”MCP服务器接下来就要制作“插头”和“大脑”Agent。我在LangChain中创建了一个Agent其核心是赋予它使用上述MCP工具的能力。首先将MCP工具封装为LangChain可识别的Tool对象# 注意此处为LangChain Python代码示例实际项目我用的TS但逻辑相通 from langchain.tools import Tool import requests import json MCP_SERVER_URL http://localhost:3000/mcp # 模拟服务器地址 def call_mcp_tool(tool_name: str, arguments: dict) - str: 调用模拟MCP服务器的统一函数 # 这里简化了MCP协议的实际通信格式实际应使用SDK response requests.post(MCP_SERVER_URL, json{ method: tools/call, params: {name: tool_name, arguments: arguments} }) result response.json() return result.get(result, 调用失败) # 将MCP工具包装成LangChain Tool search_store_tool Tool( namesearch_nearest_store, funclambda loc: call_mcp_tool(search_nearest_store, {location: loc}), description根据地址搜索最近的瑞幸门店。输入应是一个地址字符串例如北京市海淀区。 ) get_menu_tool Tool( nameget_store_menu, funclambda store_id: call_mcp_tool(get_store_menu, {storeId: store_id}), description获取指定门店的详细饮品菜单。输入应是门店ID。 ) create_order_tool Tool( namecreate_order, funclambda order_data: call_mcp_tool(create_order, order_data), description提交订单。输入应是一个JSON对象包含storeId, items商品列表, remark备注等字段。 )然后使用这些工具和GPT-4来初始化一个Agentfrom langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI llm ChatOpenAI(modelgpt-4, temperature0) # temperature设为0减少随机性 tools [search_store_tool, get_menu_tool, create_order_tool] agent initialize_agent( tools, llm, agentAgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 适合复杂、结构化工具调用的Agent类型 verboseTrue, # 开启详细日志方便观察Agent的思考过程 handle_parsing_errorsTrue # 处理解析错误 )这个Agent的类型STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION是关键它特别适合处理需要调用多个、且输入输出结构清晰的工具的场景。verboseTrue让我能在控制台看到Agent的完整思考链ReAct这对于调试至关重要。3.3 第三步发起指令与观察执行一切就绪我向Agent发出了一个自然语言指令“帮我找一下最近的门店点一杯标准美式大杯冰的不要糖。”接下来就是见证Agent“思考”和“行动”的时刻。通过verbose日志我看到了如下过程 Entering new AgentExecutor chain... 思考用户想点一杯瑞幸咖啡。我需要先找到最近的门店然后查看该门店的菜单最后下单。 行动我应该使用“search_nearest_store”工具来查找门店。用户没有提供具体地址我可以假设使用默认或自动获取的位置。 行动输入{location: 自动获取} 观察{stores: [{id: store_001, name: 瑞幸咖啡(中关村店), address: ..., distance: 500m}, ...]} 思考找到了最近的门店是“store_001”。接下来需要获取这个门店的菜单看看是否有“标准美式”。 行动使用“get_store_menu”工具。 行动输入{storeId: store_001} 观察{menu: [{id: drink_01, name: 标准美式, sizes: [大杯, 中杯], options: {ice: [正常冰, 少冰, 去冰], sugar: [标准糖, 半糖, 无糖]}, ...}, ...]} 思考菜单里有“标准美式”。用户要的是“大杯冰的不要糖”。这对应“大杯”、“正常冰”或默认冰量、“无糖”。我需要组装订单信息。 行动使用“create_order”工具。 行动输入{storeId: store_001, items: [{productId: drink_01, quantity: 1, customizations: {size: 大杯, ice: 正常冰, sugar: 无糖}}], remark: 用户通过Agent下单} 观察{orderId: sim_order_20240415001, status: created, message: 订单创建成功模拟} 思考订单已经成功创建订单号是sim_order_20240415001。我可以把这个结果告诉用户。 最终答案已为您在瑞幸咖啡(中关村店)成功下单订单号sim_order_20240415001。商品大杯、正常冰、无糖的标准美式一杯。 Finished chain.整个流程一气呵成。Agent自动判断需要按“寻店 - 查菜单 - 下单”的顺序执行并正确地将我的自然语言描述转换成了每个工具所需的、结构化的参数。这背后是GPT-4对工具描述的理解、对任务逻辑的推理以及LangChain框架对工具调用流程的可靠编排。3.4 第四步处理复杂情况与边界测试一次成功不代表万事大吉。我设计了几种复杂场景来测试Agent的鲁棒性模糊指令“我想喝点提神的不要太甜。”Agent表现它先搜索门店、获取菜单然后在菜单中寻找“提神”相关的描述如咖啡因含量并过滤掉高糖分的饮品最终推荐了“椰云拿铁默认糖度较低”或“美式咖啡”并向我确认选择。这展示了其基于语义的理解和筛选能力。信息不全“点一杯拿铁。”Agent表现它发现“拿铁”这个品类下可能有多种如厚乳拿铁、生椰拿铁且未指定门店、规格。它会主动发起追问“请问您具体要哪种拿铁需要选择门店和规格如大杯、冰热、糖度吗” 这是一个合格的Agent应具备的“澄清”能力。操作失败我故意关闭模拟的MCP服务器让“搜索门店”工具返回网络错误。Agent表现LangChain AgentExecutor捕获到工具调用异常。根据配置它可以尝试重试或者将错误信息反馈给用户。在我的设置下它最终向用户输出了“无法连接到门店服务请检查网络或稍后再试。”这考验的是整个系统的错误处理机制。这些测试让我更清楚地认识到一个成熟的、面向生产的Agent不仅要有“一帆风顺”的执行流更要有完善的异常处理、澄清反问、状态管理能力。4. 深度优缺点分析与反思经过完整的构建和测试我对这种Agent 官方MCP的模式有了更立体、更实际的认识。它绝非万能优势和短板同样明显。4.1 核心优势为什么这条路值得探索用户体验的质变这是最直观的。用户从“在多级菜单中点击选择”变成了“用一句话描述需求”。交互变得极其自然降低了使用门槛尤其适合语音交互、车载等场景。想象一下开车时说一句“帮我点一杯常喝的生椰拿铁送到公司”Agent就能自动完成体验非常流畅。开发范式的升级对于开发者而言MCP提供了一套标准化协议。我们不再需要为每个服务去研究其独有且可能随时变动的API文档或者冒险使用不稳定的爬虫。只要服务方提供了MCP服务我们就能用一种统一的方式去连接和调用。这大大降低了集成成本提高了代码的可维护性和可复用性。任务自动化与编排潜力巨大Agent不仅能调用单一服务还能编排多个服务完成复杂任务。例如“点一杯咖啡并提醒我30分钟后去取”结合日历和提醒服务或者“比较一下瑞幸和星巴克的美式价格选便宜的买”需要调用多个品牌的MCP。Agent作为智能调度中心潜力远超简单的点单。4.2 无法回避的挑战与缺点成本与延迟问题每一次Agent的“思考”都意味着调用大模型API如GPT-4这会产生费用。复杂的任务可能需要多轮思考ReAct进一步增加成本和响应时间。对于“点咖啡”这种高频、对实时性要求高的场景目前的成本结构和速度可能还难以支撑大规模应用。优化提示词Prompt以减少思考轮次、使用更轻量的模型或特定微调模型是必须攻克的技术点。可靠性依赖“描述”Agent完全依赖MCP工具的描述description和inputSchema来理解和使用工具。如果描述模糊、不准确或不完整Agent就可能做出错误决策。例如如果“创建订单”工具的描述里没说明必填字段Agent就可能提交一个缺少关键信息的错误请求。这要求服务提供方必须编写极其精准的工具定义。复杂决策与责任归属当用户指令非常复杂或模糊时如“点一杯适合今天心情的咖啡”Agent的决策可能变得不可预测。更重要的是如果下单错了、支付出问题了责任是谁的是Agent开发者、MCP服务提供方还是大模型本身这涉及到复杂的可解释性、可控性和权责界定问题目前还没有成熟的解决方案。生态成熟度虽然MCP概念很热但像瑞幸这样提供完整、稳定、面向公众的官方MCP服务的大型消费应用还凤毛麟角。生态的建立需要时间目前更多是像我的项目一样处于内部模拟和概念验证阶段。4.3 实操中的“坑”与心得提示词工程是灵魂构建Agent时给它的系统提示词System Prompt至关重要。我最初的版本只是简单说“你是一个点咖啡助手”结果Agent在处理异常时表现得很蠢。后来我优化为“你是一个瑞幸咖啡点单助手。你的核心任务是准确理解用户意图并按‘确认门店-确认商品及规格-提交订单’的流程操作。如果信息不足必须主动、清晰地询问用户。如果遇到错误如实告知用户并建议重试或检查网络。” 明确了角色、流程和原则后Agent的行为立刻稳定、可靠了很多。工具描述要像“产品说明书”编写MCP工具的description时不能只写“搜索门店”。要写成“根据用户提供的地址字符串例如‘北京市海淀区’或‘自动获取’返回一个按距离排序的门店列表每个门店包含ID、名称、详细地址和距离信息。如果地址无效或无法解析返回空列表。” 输入模式inputSchema也要定义得尽可能严格比如location字段是否必填格式要求等。这相当于给大模型一份清晰无误的产品说明书。结构化输出是关键MCP服务器返回的数据以及Agent每一步的思考都应尽量使用结构化数据如JSON。这不仅能被程序更好地解析也能让大模型更准确地理解内容。在我的模拟中所有工具返回的都是格式良好的JSON字符串极大降低了Agent解析的难度。本地模拟是高效开发的基石在对接真实服务前搭建一个高度仿真的本地MCP服务器进行开发测试这个步骤绝对不能省。它让我可以随意模拟各种成功、失败、超时的场景快速迭代Agent的逻辑而不用担心触发真实服务的风控、产生费用或垃圾数据。5. 未来展望与实用建议这次实验让我确信Agent MCP 代表了一种更智能、更集成的服务交互未来但它走向大规模成熟应用还需要跨越几道坎。对于开发者我的建议是现在就可以开始学习LangChain、LlamaIndex等Agent框架并理解MCP这类协议的思想。从小实验开始比如先做一个能调用本地天气API和日历API的个人日程安排Agent。重点掌握提示词优化、工具编排和错误处理这三项核心技能。对于产品设计者需要思考如何重新设计交互流程。当用户可以用自然语言表达复杂需求时传统的GUI界面该如何演进是变成纯粹的语音界面还是“语音关键信息确认屏”的混合模式如何设计对话流才能高效地引导用户补全必要信息如门店、规格对于服务提供方如瑞幸考虑提供MCP这样的标准化智能接口实际上是在构建自己的“AI生态”。这不仅能吸引更多开发者为其创造创新的使用场景如智能车载点单、智能家居联动也能在未来无缝接入各类超级AI助理如未来的Siri、小爱同学升级版成为其默认的服务提供商之一。回过头看这次“用Agent点瑞幸”的项目技术实现本身只是一个载体。它更像是一次对未来人机交互模式的“探路”。过程充满了调试的繁琐和遇到边界情况时的挫败但当Agent最终准确理解并执行了那句“点一杯标准美式大杯冰的不要糖”时那种感觉是兴奋的。它让我真切地触摸到了“让机器理解人而非让人适应机器”的可能性。这条路还很长坑也不少但方向我觉得是对了。
返回列表