如今,AI 模型,尤其是 ChatGPT 这类大型语言模型(LLM,Large Language Model),变得越来越强。但要知道模型在何时、何处、基于哪些信息工作,仍不容易。例如,模型依据什么上下文继续对话,又参考了哪里的数据?对用户而言,这些过程有时像一个看不见的“黑箱”。
为解决这一问题,出现了
Model Context Protocol
,简称 MCP。简单来说,可以把它理解为“一套用于整理和传递模型工作所依据的上下文的约定”。
本文将依次介绍 MCP 是什么、为什么需要它、怎样组织上下文,以及如何在实际应用中实现。
AI 模型生成文本或回答问题时,会综合考虑已有上下文、用户意图和当前环境。上下文(Context)的来源比想象中丰富。
例如:
- 用户之前的对话内容
- 对话主题或明确指定的任务目标
- 从外部文档或数据源获取的信息
- 当前项目的配置值
模型可能收到各种信息,因此需要有一套
一致地管理和连接这些信息的规则
。MCP 正是一种
协议
,也就是约定的结构,用来以标准化的方式组织这些信息并传给模型。
👨💻
上下文类似于 ChatGPT 记得之前的对话。MCP 可以帮助更有条理、更一致地管理这些信息。
原文将 MCP(Model Context Protocol)描述为 OpenAI 提出的一种结构,用于按层次组织交给大型语言模型的上下文。将用户信息、对话历史、外部文档和系统指令等内容按约定结构整理后传给模型,可以使模型的表现更加一致、准确。
原文举出的主要组成如下。
system
:模型应遵循的基本规则或角色,例如“请以友善的 TypeScript 专家的身份回答”。
tools
:可以使用的功能,例如代码解释器和搜索工具。
files
:用于参考的外部文档,例如 PDF、代码文件和笔记。
threads
:对话历史和上下文。
user
:用户信息,例如姓名、角色和目标。
根据这些信息,模型就能理解“我正在和谁对话、处于什么情境、扮演什么角色”。
以往,这些信息可能被一股脑放进系统提示词,或者混在对话日志中。这种方式存在一些问题。
- 难以复用。
- 上下文容易混乱。
- 团队之间难以共享和协作。
MCP
可以弥补这些不足,特别适用于
GPTs
、
AI 助手
和
工作流自动化
等场景。
在实际服务中,对话模型通常在客户端与服务器架构下运行。原文用以下结构说明 MCP 的工作方式。
- 从客户端收集用户输入、设置和上传的文件等。
- 在内部组织 system、tools、user、files 和 thread,并调用模型。
- 将这些信息交给 OpenAI API 或其他 LLM 引擎。
- 提供用户界面,例如聊天输入、文件上传和设置。
- 处理更改上下文的请求。
- 维护与服务器的连接并管理状态。
通过 OpenAI 的 GPT Builder,可以直接在界面中设置系统提示词、工具、文件和知识。原文将这些设置描述为在内部以 MCP 形式处理。
创建 GPT 时,可以配置以下内容。
- 基本行为指令(system)
- 上传的外部知识(files)
- 是否允许使用工具(tools)
企业可以使用 OpenAI API 创建基于内部文档或政策运行的 AI 助手。原文用以下配置示意如何组织上下文。
- system:“遵守公司内部政策和指导原则。”
- files:上传内部文档。
- user:各员工的角色或权限信息。
如此配置后,AI 可以理解不同用户或情境所对应的上下文,给出更准确、更一致的回答。
在 OpenAI 平台上创建 GPTs(自定义 GPT)时,原文把平台自动创建和管理的配置称为 MCP。也可以自己定义这些上下文要素,下面用两个例子说明。
const mcp = {
system: "당신은 친절한 TypeScript 전문가입니다. 코드를 자세히 설명해 주세요.",
tools: ["code_interpreter"],
files: ["ts-guide.pdf", "my-project/index.ts"],
user: {
name: "Lee",
role: "학생",
goal: "타입스크립트 학습을 돕는 코드 리뷰",
},
threads: [
{
role: "user",
content: "제 제너릭 함수에서 타입이 왜 추론되지 않는지 모르겠어요"
}
]
}
按这种方式组织上下文后,模型就能依据这些信息,持续给出友善而具体的解释。
- system:“像硅谷产品经理一样,从用户角度思考。”
- tools: ["browser", "web-search"]
- files: ["market-research.xlsx", "user-feedback.txt"]
- user: { name: "Hana", role: "产品策划" }
按这种方式配置后,模型可以根据用户目标调整自己的行为和回答风格。
下面是一个简单示例,用 Node.js + Express 服务端和 React 客户端实现基于上下文配置的 AI 代码审查服务。
// server/mcpRouter.ts
import express from 'express'
import { OpenAI } from 'openai'
const router = express.Router()
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! })
router.post('/ask', async (req, res) => {
const { question, fileContent } = req.body
const context = {
system: '당신은 친절하고 꼼꼼한 TypeScript 코드 리뷰어입니다.',
tools: ['code_interpreter'],
files: [
{
name: 'index.ts',
content: fileContent
}
],
user: {
name: 'Lee',
role: '학생'
},
threads: [
{ role: 'user', content: question }
]
}
const completion = await openai.chat.completions.create({
model: 'gpt-4',
messages: [
{ role: 'system', content: context.system },
{ role: 'user', content: `파일 내용:
${fileContent}` },
...context.threads
]
})
res.json({ answer: completion.choices[0].message.content })
})
export default router
// client/components/Ask.tsx
import { useState } from 'react'
import axios from 'axios'
export default function Ask() {
const [question, setQuestion] = useState('')
const [file, setFile] = useState<File | null>(null)
const [answer, setAnswer] = useState('')
const handleSubmit = async () => {
const text = await file?.text()
const res = await axios.post('/api/ask', {
question,
fileContent: text
})
setAnswer(res.data.answer)
}
return (
<div className="space-y-4">
<input type="file" onChange={e => setFile(e.target.files?.[0] || null)} />
<input
value={question}
onChange={e => setQuestion(e.target.value)}
placeholder="질문을 입력하세요"
className="border px-2 py-1"
/>
<button onClick={handleSubmit} className="bg-blue-500 text-white px-4 py-2">요청하기</button>
<pre className="bg-gray-100 p-2 whitespace-pre-wrap">{answer}</pre>
</div>
)
}
MCP 也可以看成一种
把 AI 用到实际工作中的设计思路
。它有助于明确分离上下文,让上下文可以复用,并提高模型行为的透明度。
无论是个人开发者还是团队,理解并使用这种上下文组织方式,都有助于实现更稳定、更一致的 AI 服务。
- 能否用 JSON Schema 保存 MCP 配置并进行版本管理?
- 与 React 和 LangChain 集成后,会怎样运行?
- 动态切换不同的 role 和 user 设置会有什么效果?