MCP(一种模型)旨在解决大型语言模型(LLM)应用中的一个问题,即它们与外部数据源和工具的隔绝。
在LLM应用的关键重点领域中,数据交付也是一个重点。将数据传递给LLM进行推理,这一直是RAG实现、微调和MCP的目标。也是MCP的目标。
MCP的主要目的在于标准化基于LLM的各类应用与不同系统连接的方式,如图所示。
存在这样一个难题,即如何将数据传输到AI代理,以及如何将基于AI代理/LLM的应用程序与外部数据源进行整合。
已经有过众多尝试,通过借助GUI、网页浏览器和网络搜索等方式来实现某种无缝衔接。这些方法各有优缺点。
MCP 有可能成为一个通用接口,可以把它想象成 AI 领域中的虚拟或软件版本的 USB-C。
实现顺畅、安全且可扩展的LLM和AI代理与外部资源之间的数据交换。
MCP 采用 客户端-服务器 架构,其中 MCP 主机(AI 应用)与 MCP 服务器(提供数据和工具)通信。
开发人员可以使用MCP开发模块化且可重复使用的连接器,并且可以使用预建的服务器来支持热门平台,从而构建一个由社区驱动的生态系统。
MCP的开源特性鼓励创新,让开发人员在保持安全的同时,通过如细粒度权限等特性扩展其功能范围。
最终,MCP旨在将AI机器人从孤立的聊天机器人转变为理解上下文、能相互配合的系统,并更好地融入数字环境中。
AI 代理比基于 LLM 的应用更脆弱研究显示,AI 代理比基于 LLM 的应用程序更容易受到攻击,与独立的语言模型 (LLM) 相比,详情请见…cobusgreyling.medium.com(Note: "详情请见" is added back as a hyperlink alternative, but considering expert's suggestion, "详情请看…" is removed from the body text while keeping the spirit of providing a link to more details.)
一步一个指南Anthropic的模型上下文协议(MCP)是一个开源协议,用于将大型语言模型与上下文、工具和提示连接起来。它包括一系列不断增长的服务器,用于连接多种工具或数据源。下面我们将展示如何与任何MCP服务器连接到LangGraph代理并使用这些工具……
如果你和我一样,让一个原型运行起来,不管它多么简单,都会让我感到清晰和理解;至少在我看来是这样的。
要开始,请打开终端(Terminal)……以下是在MacBook上找到它的方法。你知道在哪里可以找到它吗?
在终端窗口中,打开两个标签页;一个用来运行服务器,另一个用来运行客户端。
创建一个虚拟环境来安装和运行代码是个好做法;下面的命令来创建名为 MCP_Demo
的虚拟环境。
python3 -m venv MCP_Demo
注:此命令用于在当前目录下创建一个名为MCP_Demo的虚拟环境。
请运行以下命令进入虚拟环境目录:
source MCP_Demo/bin/activate # 此命令用于激活虚拟环境
你会看到你的命令行提示符更新为 (MCP_Demo)
。
按顺序依次运行以下代码行:
例如:
具体代码示例
pip install langchain-mcp-adapters
export OPENAI_API_KEY=<your_api_key>
将 <your_api_key
替换为你的 OpenAI 的 API 密钥:
在终端窗口中,输入 vim server.py
,创建一个名为 server.py 的文本文件。
然后粘贴如下 Python 代码:
# math_server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Math")
@mcp.tool()
def add(a: int, b: int) -> int:
"""加两个整数"""
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""将两个整数相乘"""
return a * b
if __name__ == "__main__":
mcp.run(transport="stdio")
关闭文本文件后,使用以下命令启动服务器并运行:
# 具体命令
运行 python3 math_server.py
你看不到任何东西,会是这个样子:
我们现在要来创建并运行客户端程序了。
在 MCP 服务器在一个标签页中运行的时候,转到第二个标签页就可以了。
创建一个文件来粘贴客户端代码:vim client.py
。
把下面的代码粘贴到文件里:
# 创建用于stdio连接的服务器参数
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
import asyncio
model = ChatOpenAI(model='gpt-4o')
server_params = StdioServerParameters(
command="python",
# 请确保将此更改为math_server.py文件的完整绝对路径
args=["math_server.py"],
)
async def run_agent():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# 初始化会话
await session.initialize()
# 获取工具
tools = await load_mcp_tools(session)
# 创建并运行代理
agent = create_react_agent(model, tools)
agent_response = await agent.ainvoke({'messages': '请问 (3 + 5) 乘以 12 的结果是多少?'})
return agent_response
# 运行异步函数
if __name__ == "__main__":
result = asyncio.run(run_agent())
print(result)
运行客户端的命令是:python3 client.py
程序将运行一次并结束时显示以下输出。
{'messages':
[HumanMessage(content="(3 + 5)乘以12的结果是多少?",
additional_kwargs={}, response_metadata={},
id='87a8b6b6-9add-4da7-aea5-1b197c0fc0f5'),
AIMessage(content='',
additional_kwargs={'工具调用': [{'id': 'call_1eyRzR7WpKzhMXG4ZFQAJtUD',
'函数':
{'arguments': '{"a": 3, "b": 5}', 'name': 'add'},
'type': 'function'},
{'id': 'call_q82CX807NC3T6nHMrhoHT46E',
'函数':
{'arguments': '{"a": 8, "b": 12}', 'name': 'multiply'},
'type': 'function'}],
'拒绝': None},
response_metadata={'token使用情况':
{'完成token': 51,
'提示token': 77,
'total_tokens': 128,
'completion_tokens_details':
{'accepted_prediction_tokens': 0,
'audio_tokens': 0,
'reasoning_tokens': 0,
'rejected_prediction_tokens': 0},
'prompt_tokens_details':
{'audio_tokens': 0,
'cached_tokens': 0}},
'模型名称': 'gpt-4o-2024-08-06',
'系统指纹': 'fp_eb9dce56a8',
'完成原因': 'tool_calls',
'logprobs': None},
id='run-13c01640-f92b-48b7-9340-c2ad983eb1c8-0',
工具调用=[{'name': 'add', 'args': {'a': 3, 'b': 5},
'id': 'call_1eyRzR7WpKzhMXG4ZFQAJtUD',
'type': 'tool_call'}, {'name': 'multiply',
'args': {'a': 8, 'b': 12},
'id': 'call_q82CX807NC3T6nHMrhoHT46E',
'type': 'tool_call'}],
usage_metadata={'输入token': 77,
'输出token': 51,
'total_tokens': 128,
'输入token详情': {'audio': 0,
'cache_read': 0},
'输出token详情': {'audio': 0,
'reasoning': 0}}),
ToolMessage(content='8',
name='add',
id='f8e0aba5-7a62-44c6-92a3-5fe3b07c9bd5',
工具调用ID='call_1eyRzR7WpKzhMXG4ZFQAJtUD'),
ToolMessage(content='96',
name='multiply',
id='66b9bbd9-b99a-402f-b26c-df83f5a69fa3',
工具调用ID='call_q82CX807NC3T6nHMrhoHT46E'),
AIMessage(content='(3 + 5)乘以12的结果是96.',
additional_kwargs={'拒绝': None},
response_metadata={'token使用情况': {'完成token': 22,
'提示token': 143,
'total_tokens': 165,
'completion_tokens_details': {'accepted_prediction_tokens': 0,
'audio_tokens': 0,
'reasoning_tokens': 0,
'rejected_prediction_tokens': 0},
'prompt_tokens_details': {'audio_tokens': 0,
'cached_tokens': 0}},
'模型名称': 'gpt-4o-2024-08-06',
'系统指纹': 'fp_eb9dce56a8',
'完成原因': 'stop',
'logprobs': None},
id='run-6c00a336-7d52-4917-9186-b282a5984b10-0',
usage_metadata={'输入token': 143,
'输出token': 22,
'total_tokens': 165,
'输入token详情': {'audio': 0, 'cache_read': 0},
'输出token详情': {'audio': 0,
'reasoning': 0}})]}
最后啊
MCP(一种集成AI代理的便捷方式)是将AI代理与信息和服务一起集成,提供上下文和记忆支持的便捷方法。
[首席布道师](https://www.linkedin.com/in/cobusgreyling/) @Kore.aiKore.ai _| 我热衷于探索人工智能与语言的交集。从语言模型、AI代理到代理应用,再到开发框架以及以数据为中心的生产力工具,我分享关于这些技术如何塑造未来的见解和想法,以及它们如何改变我们的生活方式。
想参与 langchain-ai/langchain-mcp-adapters 的贡献吗?你可以在 GitHub 上创建一个账户来加入我们。
GitHub - modelcontextprotocol/servers: 模型上下文协议服务器项目。加入 modelcontextprotocol/servers 的开发团队,请在 GitHub 上注册一个账户。共同学习,写下你的评论
评论加载中...
作者其他优质文章