初探 Ai,Prompt、Agent、Function Calling、MCP是什么?
有人说 Agent 是智能体,但是智能体又是什么呢?有人说 MCP 是 Ai 时代的 USB 协议,那它是可以接 U 盘吗?
Prompt
User Prompt
2023年 open Ai 刚发布 GPT 的时候,Ai看起来只是一个聊天框。
我们通过聊天框发送一条消息给 Ai 模型,然后 Ai 模型生成一条回复,我们发的消息叫 User Prompt,也就是 用户提示词。一般就是我们提出的问题或者想说的话。
System Prompt
但是现实生活中,当我们和不同人聊天时,即便是完全相同的话,对方也会根据自己的经验给出不同的答案,比如我说:“肚子疼”,我妈可能会说:“病了吧”,我爸可能会说:“吃多了吧”,我女朋友可能会说:“爬开,老娘也疼!”。
使用 Ai 的时候并没有这样的人设,所以它就只能给出一个通用的回答:
于是,就希望给 Ai 加上人设,就是 System Prompt,也叫做 系统提示词。System Prompt 只要用来描述 Ai 的角色、性格、背景信息、语气等等。总之不是用户直接说出来的提示词都可以直接放在 System Prompt 里面。
每次用户发送 User Prompt 的时候,系统会自动把 System Prompt 也一起发给 Ai 模型,这样子整个对话就对味了。
Agent
即使人设设定的再完美,说到底 Ai 还只是一个聊天机器人。问一个问题,它最多给你答案或者告诉你怎么做,但实际动手的还是你自己。那么能不能让 Ai 自己去完成任务呢?
第一个做出尝试的是一个开源项目,叫做 AutoGPT,它是本地运行的一个小程序。
如果想让 AutoGPT 帮我们管理电脑的文件,那得先写好一些文件的管理函数,比如说 list_files 用来列目录,read_files 用来来文件等等。,然后把这些函数以及它们的功能描述、使用方法注册到 Auto GPT 中。
AutoGPT 会根据这些信息生成一个 System Prompt,告诉 Ai 模型用户给了哪些工具,它们都是干什么的,以及 Ai 如果想要使用它们应该返回什么样的的格式,最后把这个 System Prompt 连同用户的请求一起发给 Ai 模型。
如果 Ai 模型足够的聪明的话就会按照要求的格式返回一个调用某个函数的信息,AutoGPT进行解析之后就可以调用对应的函数了,然后再把结果丢回给 Ai,Ai 再根据函数调用的结果决定下一步应该做什么操作,这个过程反复进行,直到任务完成为止。
人们把AutoGPT这种负责在模型、工具和最终用户之间传话的程序就叫做 Ai Agent,而这些提供给 Ai 调用的函数或服务就叫做 Agent Tool。
Function Calling
Ai 模型说到底是个概率模型,还是可能返回格式不对的内容。
为了处理这种情况,很多 Ai Agent 会在发现 Ai 返回的格式不对时自动进行重试,一次不行就来第二次,现在市面上很多 Agent 使用的还是这种方式,例如 Cline 。但这种反复重试总归让人觉得不太靠谱。于是大模型厂商开始出手了,例如 ChatGPT、Claude、Gemini等等,纷纷推出了一个叫做 Function Calling 的新功能,这个功能的核心思想就是统一格式规范描述。
回到刚刚的例子,我们告诉 Ai 哪些工具以及返回格式,但是这些描述都是用自然语言随意写的,只要 Ai 看得懂就行。Function Calling则是对这些描述进行标准化,比如每个 Tool 都用一个 JSON 对象来定义,工具名写在 name 字段、功能说明写在 desc 字段,所需要的参数写在 params 字段里面等等。然后这些 JSON 对象也从 System Prompt 中剥离了出来单独放在一个字段里面,最后 function Calling 也规定了 Ai 使用工具时应该返回的格式。这样一来相同的工具描述都放在了相同的地方。
所有工具描述也都依照相同的格式,Ai 使用工具时的回复也都依照相同的格式,于是就能更加针对性的训练 Ai 模型,让它理解这种调用的场景。甚至在这种场景 Ai 依然生成错误的回复,因为回复的格式是固定的,Ai 服务器自己就可以检测到并且进行重试后返回给用户。用户根本感知不到错误的回复,不仅降低了用户端的开发难度,也节省了用户重试带来的 Token 开销。就是因为这些好处,现在很多的 Ai Agent 开始从 System Prompt 转向 Function Calling。
但是 Function Calling 也有着自己的问题:没有统一的标准。每家大厂的 Api 定义都不一样,而且很多开源模型还不支持 Function Calling ,所以 System Prompt 和 Function Calling 这两种方式现在在市面上是并存的。
以上讲的都是 Ai Agent 和 Ai 模型之间的通信方式:
MCP
Ai Agent 是怎么跟 Agent Tool 来进行通信的?
最简单的做法是把 Ai Agent 和 Agent Tool 写在同一个程序里面,直接函数调用,这也是大多数 Agent 的做法。
但是后来发现,有些 Tool 的方法其实是挺通用的,比如一个浏览网页的工具,可能多个 Agent 都需要,总不能在每个 Agent 里面都拷贝一份相同的代码吧,太麻烦也不优雅。
于是,把 Tool 变成服务统一的托管,让所有的 Agent 来调用,这就是 MCP。 MCP 是一个通信协议,专门用来规范 Agent 和 Tool 服务之间是怎么交互的。运行 Tool 的服务叫做 MVP Server,调用它的 Agent 叫做 MCP Client。MCP 规定了 MCP Server 如何和 MCP Client 通信,以及 MCP Server 要提供哪些接口,比如用来查询 MCP Server 中有哪些 Tool:Tool 的功能描述、描述需要的参数、格式等等的的接口。
除了普通的 Tool 这种函数调用的形式,MCP Server 也可以直接提供类似文件读写的服务叫做 Resource,或者被 Agent 提供提示词的模板叫做 Prompt。MCP Server 既可以和 Agent 跑在同一台机器上,通过标准输入输出进行通信,也可以被部署在网络上,通过HTTP进行通信。
注意:虽然 MCP 是为了 Ai 而定制出来的标准,但实际上 MCP 本身却和 Ai 模型没有关系,它并不关心 Agent 用的是哪个模型,MCP只负责帮 Agent 管理工具、资源和提示词。
完成流程
背景:我听说女朋友肚子疼:
于是问 Ai Agent (或者说 MCP Client):我女朋友肚子疼怎么办?Agent会把问题包装到 User Prompt 中。
然后 Agent 通过 MCP 协议,从 MCP Server 里面获取所有 Tool 的信息。
Ai Agent 会把这些所有信息或者转化成 System Prompt 或者转化成 Function Calling 的格式。然后和用户请求 User Prompt 一起打包发送给 Ai 模型。
Ai 模型发现有一个叫做 web_browse 的网页浏览工具,于是通过普通回复或者 Funciton Calling 格式,产生一个调用这个 Tool 的请求,希望去网上搜索答案。
Agent收到这个请求之后,通过 MCP 协议,去调用 MCP Server 里的 web_browse 工具。
web_browse 访问指定的网站之后,将内容返还给 Agent,Agent 再转发给 Ai 模型。
Ai 模型再根据网页内容和自己的头脑风暴生成最终答案:“多喝热水”。
最后由 Agent 把结果展示给用户。