Skip to content

在 OpenAI 调用中使用 MCP

在 LLM 调用中使用 MCP — 结合 OpenAI 模型

Section titled “在 LLM 调用中使用 MCP — 结合 OpenAI 模型”

OpenAI 模型,例如 GPT-4 或 GPT-3.5,正处于人工智能能力的前沿。然而,与所有大型语言模型(LLM)一样,它们的内置知识存在截止日期,并且无法直接访问实时数据、私有存储库或在外部系统中执行操作。模型上下文协议(Model Context Protocol, MCP)提供了一个强大的框架来克服这些限制,通过无缝连接 OpenAI 模型到外部数据源和工具,从而增强其准确性、相关性和执行任务的能力。

MCP 就像一个标准化的网关。您的应用程序在使用 OpenAI 模型时,可以利用 MCP 来获取必要的上下文或委托执行操作,从而使 LLM 能够以更广泛、更动态的信息集和能力进行操作。

通过 MCP 连接 OpenAI 模型到外部数据

Section titled “通过 MCP 连接 OpenAI 模型到外部数据”

MCP 允许您通过 MCP 服务器暴露“资源”(resources)。这些资源可以代表各种数据类型:服务器上的文件、数据库记录、内部 API 的内容,甚至是股票价格等实时数据流。当使用 OpenAI 模型的应用程序需要为其提供特定、最新或机密信息时,它可以求助于 MCP 客户端。

工作流程很简单:您的应用程序在准备向 OpenAI 模型发出的请求时,会识别出对外部上下文的需求。它使用 MCP 客户端从指定的 MCP 服务器(例如,从电子商务后端获取用户的购买历史记录)检索这些数据。MCP 服务器以结构化形式提供数据。您的应用程序随后将这些数据整合到发送给 OpenAI 模型的提示(prompt)中,使其能够生成更具上下文感知能力和更准确的输出。

  • 示例数据源:公司内部维基、客户关系管理(CRM)数据、代码仓库、实时传感器数据。

通过 MCP 赋予 OpenAI 模型外部工具能力

Section titled “通过 MCP 赋予 OpenAI 模型外部工具能力”

通常,与 LLM 交互不仅仅涉及信息检索;它还需要执行动作。MCP 支持定义“工具”(tools)——OpenAI 模型可以请求使用的特定能力。这些工具可能包括发送消息、创建数据库条目、与版本控制系统交互或调用自定义业务逻辑 API 等操作。当 OpenAI 模型(通常通过其函数调用(function calling)能力)指示需要执行某个动作时,您的应用程序可以使用 MCP 来实现此目的。

例如,如果用户要求一个由 OpenAI 驱动的助手查找最新的销售报告,然后通过电子邮件与销售团队分享其关键发现,模型可能会首先处理该报告(作为 MCP 资源提供)。随后,它可能会指定需要使用一个“email_tool”(电子邮件工具)(可能使用 OpenAI 的函数调用(function calling)格式)。您的应用程序会解释此意图,然后使用 MCP 客户端在 MCP 服务器上调用相应的工具(并传递发现结果和收件人列表),MCP 服务器将负责电子邮件的发送。此操作的结果可以反馈给 OpenAI 模型,以便通知用户。

  • 示例工具:API 交互模块(例如,用于 JIRA、GitHub)、代码执行环境、数据库操作工具、通信网关(电子邮件、短信)。

示例场景:MCP 与 OpenAI 模型协同工作

Section titled “示例场景:MCP 与 OpenAI 模型协同工作”

设想一个使用 OpenAI 模型(例如 GPT-4)构建的 AI 驱动研究助手。该助手可以帮助用户收集信息和起草文档。以下是 MCP 如何增强其效果的示例:

  1. 用户请求:用户请求:“查找上个月发表的关于量子计算进展的最新文章,将其总结,并将摘要保存到我的‘研究笔记’文件夹中。”

  2. 数据检索(MCP 资源 - 模拟):应用程序可能首先使用常规搜索工具(或作为搜索 API 包装器的 MCP 工具)来查找最新文章。假设它找到了几篇相关的在线文章。要访问可能存储在公司服务器上的专有研究论文,它会使用 MCP 客户端:mcp_client.get_resource(server_id='internal_research_db', resource_path='/papers?topic=quantum&since=last_month')。

  3. OpenAI 模型上下文提示(Prompt):检索到的文章/论文内容(或其摘要)被编译并包含在发送给 OpenAI 模型的提示中:“以下是关于量子计算的最新文章内容:[…文章内容…]。请将这些信息综合成一份全面的摘要。然后,准备保存这份摘要。”

  4. OpenAI 模型处理与工具指示(函数调用):OpenAI 模型处理这些文章并生成摘要。然后,它会指示需要使用“save_document”工具(保存文档工具),可能通过其原生函数调用(function calling)功能,输出一个类似这样的 JSON:{"function_name": "save_document_tool", "arguments": {"file_path": "Research Notes/quantum_summary.txt", "content": "...generated summary..."}}。

  5. 工具执行(MCP 工具):您的应用程序收到来自 OpenAI 模型的这个结构化请求。随后,它使用 MCP 客户端在管理文件系统操作或与文档管理系统集成的 MCP 服务器上调用“save_document”工具。MCP 调用示例(概念性):mcp_client.execute_tool(server_id='file_storage_service', tool_id='save_file_to_user_drive', params={'path': 'Research Notes/quantum_summary.txt', 'data': '...generated summary...'})。

  6. 结果与最终响应:MCP 服务器执行该工具(保存文件),并将结果(例如,{'status': 'success', 'file_id': 'doc_xyz789'})返回给您的应用程序。然后将此结果反馈给 OpenAI 模型,由其为用户生成最终响应:“我已经总结了量子计算的最新进展,并将摘要保存为‘quantum_summary.txt’到您的‘研究笔记’文件夹中。”

# 应用程序逻辑的Python概念性示例
# 假设 mcp_client 和 openai_client 已初始化
# --- 阶段 1:使用 MCP 为 OpenAI 模型获取数据 ---
def get_research_data_for_openai(topic, period):
try:
# 这可能是网络搜索和 MCP 资源的组合
# 为简单起见,假设 MCP 资源提供了精选数据
research_data = mcp_client.get_resource(
server_id='internal_research_db',
resource_path=f'/papers?topic={topic}&since={period}'
)
return f"Relevant research data on {topic} from {period}: {research_data}"
except MCPError as e:
print(f"MCP Error fetching research data: {e}")
return f"Sorry, I couldn't retrieve research data on {topic}."
user_prompt_details = "Find recent articles on advancements in quantum computing published in the last month, summarize them, and save the summary to my 'Research Notes' folder."
# 应用程序提取主题和时间段
topic = "quantum computing"
period = "last_month"
context_from_mcp = get_research_data_for_openai(topic, period)
# messages_for_openai = [
# {"role": "system", "content": "您是一个乐于助人的研究助手。当被要求保存文件时,请使用'save_document_tool'。"},
# {"role": "user", "content": f"{context_from_mcp}\n\n用户指令: {user_prompt_details}"}
# ]
# tools_definition_for_openai = [
# {
# "type": "function",
# "function": {
# "name": "save_document_tool",
# "description": "将文档保存到指定路径并包含给定内容。",
# "parameters": {
# "type": "object",
# "properties": {
# "file_path": {"type": "string", "description": "文件应保存的路径,例如,'Research Notes/summary.txt'"},
# "content": {"type": "string", "description": "要保存的文档内容。"}
# },
# "required": ["file_path", "content"]
# }
# }
# }
# ]
# openai_response = openai_client.chat.completions.create(
# model="gpt-4",
# messages=messages_for_openai,
# tools=tools_definition_for_openai,
# tool_choice="auto"
# )
# response_message = openai_response.choices[0].message
# tool_calls = response_message.tool_calls
# --- 阶段 2:OpenAI 模型指示工具使用,通过 MCP 执行 ---
# if tool_calls:
# for tool_call in tool_calls:
# if tool_call.function.name == 'save_document_tool':
# function_args = json.loads(tool_call.function.arguments)
# try:
# mcp_tool_result = mcp_client.execute_tool(
# server_id='file_storage_service',
# tool_id='save_file_to_user_drive', # MCP server's tool ID
# params=function_args
# )
# print(f"MCP Tool execution result: {mcp_tool_result}")
# # 将结果反馈给 OpenAI 模型以生成最终用户响应
# # messages_for_openai.append(response_message) # 添加助手的回复
# # messages_for_openai.append(
# # {
# # "tool_call_id": tool_call.id,
# # "role": "tool",
# # "name": 'save_document_tool',
# # "content": json.dumps(mcp_tool_result)
# # }
# # )
# # final_user_response = openai_client.chat.completions.create(
# # model="gpt-4",
# # messages=messages_for_openai
# # ).choices[0].message.content
# # print(final_user_response)
# except MCPError as e:
# print(f"MCP Tool Error: {e}")
# 处理错误,可能通知 OpenAI 模型或用户

本示例说明了 MCP 如何通过标准化对外部数据和工具的访问,显著增强 OpenAI 模型的能力,使其能够参与更复杂、更有用的工作流程,尤其是在利用其函数调用(function calling)功能时。