Skip to content

AI 概述

一切的开始:Prompt

2023年,当 OpenAI 刚刚发布 GPT 时,AI 对大多数人来说只是一个聊天框。我们通过聊天框发一条消息给 AI 模型,然后 AI 模型生成一个回复。

我们发送的消息,就叫做 User Prompt ,也就是用户提示词,通常是我们提出的问题或想说的话。

但现实生活中,当我们和不同人聊天时,即便是完全相同的话,对方也会根据自己的经验、背景、身份等信息,给出不同的回答。比如我说我肚子疼:

  • 我妈可能问我要不要去医院。
  • 我爸可能会让我去上厕所。
  • 我女朋友可能直接来一句:“滚一边去,老娘也疼。”

alt text

那么如何给 AI 模型一个特定的人设呢?

AI 没有这样的人设,就只能给出一个通用的、四平八稳的回答,显得很无趣。于是,我们希望给 AI 加上“人设”。最直接的方式,是把人设信息和用户要说的话,打包成一条 User Prompt 发过去。

但问题是,“你扮演我温柔的女朋友”这句话不是我们真正想说的内容,显得有点出戏。于是,人们干脆把人设信息单独拎出来,放到另一个 Prompt 中——这就是 System Prompt

System Prompt 主要用来描述 AI 的角色、性格、背景知识、语气等等。总之,只要不是用户直接说出来的内容,都可以放进 System Prompt。每次用户发送 User Prompt 的时候,系统会自动把 System Prompt 一起发给 AI 模型。

alt text

alt text

system-prompts-and-models-of-ai-tools 这个仓库就收集了常用了一些 AI 代码模型对应的 System Prompt

js
// 当用户输入 "我肚子疼" 时
// 系统实际发给 AI 模型的内容是这样的:

System Prompt: "你扮演我温柔的女朋友,但你今天心情不好,脾气很大。"
+
User Prompt: "我肚子疼"

// AI 模型根据这两个 Prompt 生成回复:
"滚一边去,老娘也疼。"

alt text

这样整个对话就更自然了。在网页端的聊天机器人中,System Prompt 往往是系统预设的,用户不能随便改。但通常网站会提供一些设置,比如 ChatGPT 里有一个叫 CustomizeChatGPT 的功能,用户可以在里面写下自己的偏好,这些偏好就会自动变成 System Prompt 的一部分。

alt text

让 AI 不止会聊:AI Agent 与 Agent Tool

不过,即使人设设定得再完美,说到底,AI 还是个聊天机器人。它最多是给你答案,或者告诉你该怎么做,但实际动手的,还是你自己。

那么如何让 AI 自己去完成任务呢?

第一个做出尝试的,是一个叫 AutoGPT 的开源项目。它是一个在本地运行的小程序。假如你想让 AutoGPT 帮你管理电脑里的文件,你得先为它准备好一些文件管理的函数,比如 list_files(列出目录内容)、read_file(读取文件内容)等等。

python
# 示例:为 Agent 准备的工具函数
def list_files(directory: str) -> list[str]:
    """列出指定目录下的所有文件和文件夹"""
    # ... 实现代码 ...
    pass

def read_file(file_path: str) -> str:
    """读取指定文件的内容"""
    # ... 实现代码 ...
    pass

然后你把这些函数和它们的功能描述,注册到 AutoGPT 中。AutoGPT 会用这些信息生成一个 System Prompt,告诉 AI 模型:用户给了你哪些工具、它们是干什么的、以及当你想使用它们时应该返回什么样的格式。

markdown
// AutoGPT 生成的 System Prompt (简化版)

"你是一个 AI 助手,可以使用以下工具来完成用户的请求:
- 工具1: list_files(directory: str)
  - 描述: 列出指定目录下的所有文件和文件夹。
- 工具2: read_file(file_path: str)
  - 描述: 读取指定文件的内容。

当你需要使用工具时,请按以下格式回复:
{
  "tool_name": "工具名",
  "tool_params": { "参数名": "参数值" }
}
"

如果 AI 模型足够聪明,就会按格式要求返回一个调用某个函数的消息。AutoGPT 解析后,调用对应的本地函数,再把执行结果丢回给 AI。AI 根据返回结果,再决定下一步怎么操作……这个过程就这样反复,直到任务完成。

人们把 AutoGPT 这种负责在 模型、工具和最终用户 之间“传话”的程序,叫做 AI Agent 。而那些提供给 AI 调用的函数或服务,就叫做 Agent Tool

alt text

alt text

alt text

规范与未来:Function Calling

这个架构有个小问题:虽然我们在 System Prompt 里写清楚了“AI 应该用什么格式返回”,但 AI 模型说到底是概率模型——它不一定听话,还是可能返回格式不对的内容。为了处理这些“不听话”的情况,很多 AI Agent 会在发现 AI 返回格式不对时重试。

但这种反复重试,总归让人觉得不太靠谱。于是,大模型厂商开始出手了。ChatGPT、Claude、Gemini 等等纷纷推出了一个叫 FunctionCalling 的新功能。

这个功能的核心思想就是——统一格式,规范描述 。

回到之前 AutoGPT 的例子。以前我们通过 System Prompt 告诉 AI 有哪些工具以及返回格式的样子,但这些描述是用自然语言随意写的。Function Calling 对这些描述进行了标准化,比如每个 Tool 都用一个 JSON 对象来定义:

python
// 使用 Function Calling 标准定义的工具
{
  "name": "read_file",
  "description": "读取指定文件的内容",
  "parameters": {
    "type": "object",
    "properties": {
      "file_path": {
        "type": "string",
        "description": "要读取的文件的完整路径"
      }
    },
    "required": ["file_path"]
  }
}

alt text

这些 JSON 对象也从 System Prompt 中被“剥离”了出来,单独放在 API 请求的一个字段里。同时,Function Calling 也规定了 AI 使用工具时返回的格式。这么一来,System Prompt 中的格式定义也可以删掉了。

这样做的好处是:

  • 描述统一 : 所有的工具描述都放在相同地方,且都依照相同的格式。

  • 回复统一 : AI 使用工具时的回复也依照相同的格式。

于是人们就能更有针对性地训练 AI 模型,让它更好地理解这种调用场景。甚至如果 AI 依然生成了错误的回复,因为格式是固定的,AI 服务端自己就可以检测到并重试,用户根本感受不到。这不仅降低了用户端开发的难度,也节省了重试带来的 Token 开销。

正是由于这些好处,现在越来越多的 AI Agent 开始从 System Prompt 转向 Function Calling。但 Function Calling 也有自己的问题——没有统一标准。每家大厂的 API 都不一样,而且很多开源模型根本不支持。所以要写一个跨模型通用的 AI Agent,依然挺麻烦的。因此,System PromptFunction Calling 这两种方式,目前在市面上是并存的。

alt text

工具的解耦:MCP 协议

以上我们讲的,都是 AI AgentAI模型 之间的通信方式 。接下来我们再看另一边:AI Agent 是怎么跟 Agent Tool 通信的?

最简单的做法是:把 Agent ToolAI Agent 写在同一个程序里,直接通过函数调用搞定。这也是现在大多数 Agent 的做法。

但后来人们发现,有些 Tool 的功能其实挺通用的。比如一个浏览网页的工具,多个 Agent 都可能需要。总不能每个 Agent 都各拷一份代码吧?于是大家想到了一个办法:把 Tool 变成服务,统一托管 ,让所有 Agent 都来调用。

这就是 MCP.

MCP 是一个通信协议,专门用来规范 Agent 和 Tool 服务之间怎么交互。

运行 Tool 服务的程序叫 MCP Server

调用它的 Agent 则叫 MCP Client

MCP 规定了 MCP Server 要提供哪些接口,比如用来查询 Server 中有哪些 Tool、Tool 的功能描述、需要的参数格式等等。除了普通的 Tool,MCP Server 也可以直接提供数据(Resource)或提示词模板(Prompt)。

MCP Server 既可以和 Agent 一起跑在同一台机器上,通过标准输入输出 stdio 进行通信,也可以被部署在网络上通过 HTTP 进行通信。

需要注意的是,虽说 MCP 是为 AI 而制定的标准,但实际上 MCP 本身却和AI模型没有关系。它只负责帮 Agent 管理工具、资源和提示词,并不关心 Agent 用的是哪个模型。

最简单的办法就是把 AI AgentAgent Tools 写在同一个程序里,直接函数调用就可以了。

User Prompt 太多了如何管理?

skills 本身只是一个用来管理提示词 Prompt 的工具, 我们通过把 metadata 也就是 Prompt 的介绍发送给 AI, 让 AI 了解哪些提示词可以用, AI 再根据用户的问题按需读取完整的提示词 Prompt. 这个功能本身是平平无奇的, 但是配合执行命令的能力, AI 就可以按照提示词的指示执行用户提前创建的脚本, 甚至直接生成代码完成用户的请求, 这极大扩展了 AI 的灵活性, 执行能力给了 AI 行动力, skills 为 AI 指明了方向. 当 AI 终于学会在 skills 的边界内谨慎地使用执行的权利的时候, 它才实现了属于它自己的知行合一.

串联一切:一个完整的流程

现在,我们把所有概念串起来,看一个完整的例子:

  1. 用户请求 : 我听说了女朋友肚子疼,于是问 AI Agent(MCP Client):“我女朋友肚子疼,怎么办?”
  2. Agent准备 : Agent 将问题包装在 User Prompt 中。同时,它通过 MCP 协议从 MCP Server 获取所有可用 Tool 的信息。
  3. 与AI通信 : Agent 把这些 Tool 的信息,通过 System PromptFunctionCalling的格式,连同User Prompt` 一起打包发给 AI 模型。
  4. AI决策 : AI 模型分析后,发现有个叫 web_browse 的浏览网页的工具,于是回复一个调用该工具的请求,希望去网上搜索答案。
  5. 工具执行 : Agent 收到 AI 的回复后,通过 MCP 协议调用 MCP Server 里的 web_browse 工具。
  6. 结果返回 : web_browse 工具访问指定的网站后,将内容返回给 Agent``,Agent 再把这个结果转发给 AI 模型。
  7. 生成最终答案 : AI 模型根据网页内容和自己的知识进行头脑风暴,生成最终答案:“多喝热水”。
  8. 展示给用户 : 最后,AI Agent 把这个答案展示给我。

alt textalt text

总之,System Prompt、User Prompt、AI Agent、Agent Tool、Function Calling、MCP、AI 模型——它们不是彼此取代的关系,而是像齿轮一样,一起构成了 AI 自动化协作的完整体系。

Thanks

10分钟讲清楚 Prompt, Agent, MCP 是什么

Prompt, Agent, MCP 究竟是什么