MCP教程
前言 想法总览 这一篇会是一篇mcp的教程文档,但是在此之前我想要先介绍一下为什么我想要去做这篇文档,以及为什么我会去学mcp。 这些天我在刷牙的时候想,这个时候其实我是不方便去用手机打字的,假设我可以说几句话,然后手机就自动帮我执行了这个操作(例如记录到xx位置)该有多好。同样的意思还在我睡觉的时候突然想到什么事情经常出现——我忽然想到一个idea,最好它自动就可以把它加到我的一个待办清单里面去了。那么,我就花了一天时间真实地去做mcp这件事情,很快就掌握了。 实际上,像智谱这种大厂,现在就在做类似的事情(我同学在这个部门实习负责该业务,adb控制美团购买瑞幸咖啡)。我们可以把它理解为一个大号的siri,我对着它发号指令,它自动地去完成手机上操作的各种事情。在后续的章节中我会介绍不同场景和任务的技术难度,此处抛开不谈。但无疑,作为一个大号的Siri,它的竞争压力和大厂应该是直接竞争的,因为现在这些大模型厂商,肉眼可见的他们的趋势全是在往这上面去走。此前我在深圳的黑客松上做了一款产品(语音控制写入飞书,录音写入飞书,未来可以作为语音控制飞书实现各种操作功能),它和大模型厂商所不同的方案是多了一个硬件去做这种MCP的交互,它可以作为一些手机不想去使用的一些场景之下(例如你睡觉的时候,手机不想放在手边)。硬件天然具有一定的护城河,并且市场也不会像大号siri这么大,任务难度上因为场景的数量和复杂度的限制也会有非常大的减弱;所以我认为会有一定优势。 但是无论如何,我觉得这一系列以mcp为代表的任务一定是有巨大的一个前景的,只是我们受限于能力、资源,我们需要找好一个具体的、单独的场景和任务去切。并且我想,肉眼可见,如果你现在不做,那么未来其他人就会很快就会去做,它是时间不等人的一件事情。 和其他人聊天的一点补充 对于安卓的开发是常见的,关注ios封闭系统如何操作。 plaude note最新和notion合作开发的:plaude note接入notion。anyway,我自己该买一个山寨plaude了。 语音交互是下一个重要的交互形式,但随着计算和数据能力增强,视频交互可能最终会占据主导地位。同时,落地应用场景的选择也很关键,AR眼镜等硬件将结合语音和操纵功能推动交互方式的发展。 大模型在白领领域如文字判断等工作中的替代机会较大,但真正的巨大市场可能集中在制造业、服务业、养老业等蓝领领域。 plaude在获取用户数据上具有先发优势,它在用户使用过程中积累了大量互联网之外的线下高质量数据,这在未来具有巨大的价值潜力,比如能够更好地理解并满足用户的个性化风格和需求。(根据大量数据训练模型对于用户个人习惯、风格的提取)。这个市场空间非常大,而plaude通过这样一个c端产品已经具有了先发优势和天然壁垒。这种通过切入工作流并获取大量的非互联网信息,这些数据将随着时间升值,成为公司的重要资产。同时,解决实际工作问题还能带来现金流,进一步增强公司的数据积累能力。(躺着赚钱) “我们目前面临的主要问题是销售渠道的选择,而非产品或技术问题。我们在考虑通过工会、参加展会还是线上视频等不同方式来寻找最有效的销售渠道。”“我打算亲自去当地体验当地养老行业,包括从事一段时间的护工工作,直接与老人交流,以期能更好地理解并找到适合的场景。同时,考虑到智能手机对很多老年人不友好,我们可能需要探索硬件交互或语音交互的方式来满足他们的需求。” 一些针对老年人的产品和服务,如定期电话沟通并将对话内容转写为故事书,以及为老年人提供精神需求满足(如读圣经)的电话服务。一款名为Whisper Flow的软件,它允许用户通过语音指令代替键盘操作电脑,大大提高了工作效率。 随着人们对便捷性和简单化流程的需求增加,类似语音助手这类能够简化复杂流程、提高效率的科技将在很多场景中发挥重要作用。例如我马上有一个会我文档还什么都没写,要是有一个语音控制agent调用各种agent帮我完成各种任务最终写好文档就好了。 任务难度 如果只是我本仓库中的高德的任务是相对简单的。因为用户的输入本质上大概只可能是“我想要从a到b,…”,大模型去提取处理这些关键词和函数匹配,这种映射关系是简单的。那例如说我现在。想在飞书上面去干一件事情,我要跟他描述一大堆。然后他要从这一大堆语句里面去提取出来,这样的一个你想要执行的动作(函数),以及你所要干的内容(参数)。这其实是挺困难的,我忽然想到,因为飞书里面涉及的东西实在是太多了。 本次仓库我将从最简单的调用高德api规划路径开始,在未来一点一点地增加任务的难度量级和实用性。 mcp参考学习仓库 本仓库实现了用户输入查询从a地点到b地点怎么走,ai调用高德地图路径规划api给出指引。 以下教程务必详见我的仓库地址(一定要对着代码看):仓库,使用方法如下: bash 1. #配置api key 2. python main.py #启动后端服务器 3. #发送指令到后端服务器,命令行输入: $body = '{"user_input": "从北京天安门到上海外滩怎么走"}' $response = Invoke-RestMethod -Uri "http://localhost:8000/chat" -Method Post -ContentType "application/json; charset=utf-8" -Body $body $response | ConvertTo-Json -Depth 10 未来规划 本仓库未来的规划是:mcp可以通过adb打开高德地图,然后帮我去查询这两个路线信息,能够直接打开手机和APP结合在一起。以及本仓库的所有内容会作为学习文档和视频教程公开。 关于飞书的规划是:飞书上面应该是我输入一大串这样的一个文字,一部分被提取关键词为我想要的函数,另一部分被提取为我的内容。那么这样的话就是执行函数或这部分内容。再写到分书里面,或者在创建文档等等,就会是一个比较复杂的一个工作,最多也就只能完成一个小的一个函数。 关于抖音黑客松:可能是输入博主名,爬虫打开抖音,然后可以关注某个博主。 参考学习资料 10分钟科普 【10分钟讲清楚 Prompt, Agent, MCP 是什么 各种提示词 user prompt,用户发送的信息(gpt聊天框) system prompt,AI嵌入的人设,相当于每一次发送user prompt,AI会自动加入system prompt 通常gpt等很少可以在网站上直接修改system prompt(少量可以),大部分都是开发者去设定 但无论是什么提示词,归根到底还是AI去回答问题,它没有办法帮你做事。 本质上程序如何去帮你执行、”做事“ 例如我们现在希望用代码去完成12306买票的功能,本质上是我们写了一段爬虫代码,通过html语句xxx 例如我们现在希望获取杭州到南京的路程信息,我们使用代码程序调用高德地图api的接口, 让我们去模拟一遍整个mcp架构下任务工作的流程 前端:发送用户问题(自然语言)→ 通过通信协议传递给后端 后端1:后端定义有一个tools类,类里面有多个函数,每个函数对应一个工具/功能,即代表可以完成一个任务(如高德打车、美团点外卖等)。在tools类里不会具体的去写这个函数,而是对其进行描述,让人知道里面的每个函数是在干什么。 bash # 工具描述(OpenAI格式) TOOLS = [ { "name": "query_route", "description": "查询两地之间的驾车路径信息", "parameters": { "type": "object", "properties": { "origin": {"type": "string", "description": "起点地址或坐标,如'北京西站'或'116.32,39.9'"}, "destination": {"type": "string", "description": "终点地址或坐标"}, "city": {"type": "string", "description": "城市名(可选)"} }, "required": ["origin", "destination"] } } ] 后端2:后端会单独有一个文件,用于具体地写函数的代码,用于被调用执行功能。 bash def query_route( self, origin: str, destination: str, city: str = None ) -> Dict[str, Union[str, float]]: """ 查询驾车路径信息 :param origin: 起点(地址或坐标,如"北京西站"或"116.32,39.9") :param destination: 终点(格式同起点) :param city: 城市名(可选,提高地址解析精度) :return: 结构化路径信息 """ base_url = "https://restapi.amap.com/v3/direction/driving" params = { "key": self.api_key, "origin": origin, "destination": destination, "extensions": "base", "output": "json", "city": city or "" } 2和3统称为mcp。每次当前端的问题进来,模型会尝试理解这是什么(根据用户输入的关键词和上下文),如果它认为这和我们tools里面定义的东西有关(description 和 parameters),那么它会返回一个与该函数有关的变量。if变量.name=函数名,则调用对应的函数。 bash # 调用大模型生成工具调用指令 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": user_input}], tools=TOOLS, tool_choice="auto" ) message = response.choices[0].message # 处理工具调用 if hasattr(message, "tool_calls"): tool_call = message.tool_calls[0] if tool_call.function.name == "query_route": args = json.loads(tool_call.function.arguments) result = amap_tool.query_route(**args) return {"result": result} 至此,整个过程完毕。总结:用户通过前端输入进来,大模型根据用户的输入和我们已经注册好的tools变量判断应该使用哪个mcp工具(大模型会输出一个函数名结果给变量,if变量名=xx则执行xx函数)。如果你仍然没有理解,我个人认为是tools这里没有理解,可以再去问gpt。 为什么模型可以根据tools完成这个功能(例如限制回复的格式)——tools本身和模型的训练 这在训练阶段体现为输入大量“自然语言问题→工具调用指令返回格式”的配对数据,例如: ...