为了账号安全,请及时绑定邮箱和手机立即绑定

使用LangChain实现模型上下文协议(MCP)

MCP(模型上下文协议)是由Anthropic开发的一个开源协议,专注于安全和可解释的生成式AI模型。

MCP(一种模型)旨在解决大型语言模型(LLM)应用中的一个问题,即它们与外部数据源和工具的隔绝。

在LLM应用的关键重点领域中,数据交付也是一个重点。将数据传递给LLM进行推理,这一直是RAG实现、微调和MCP的目标。也是MCP的目标。

MCP的主要目的在于标准化基于LLM的各类应用与不同系统连接的方式,如图所示。

来源链接

AI代理计算机界面(ACI)中的对抗性攻击…代理应用程序在与操作系统交互时面临的对抗性攻击…cobusgreyling.medium.com
减少自定义整合

存在这样一个难题,即如何将数据传输到AI代理,以及如何将基于AI代理/LLM的应用程序与外部数据源进行整合。

已经有过众多尝试,通过借助GUI、网页浏览器和网络搜索等方式来实现某种无缝衔接。这些方法各有优缺点。

如果你喜欢这篇文章,可以点赞哦 ❤️
- 拍手50次,效果超乎你想象哦!👏
- 关注我在 Medium,并点击这里免费订阅。 🫶
快来关注我!你可以在LinkedInX(即Twitter)上找到我哦!

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代理到代理应用,再到开发框架以及以数据为中心的生产力工具,我分享关于这些技术如何塑造未来的见解和想法,以及它们如何改变我们的生活方式。

科布斯·格雷林(Cobus Greyling)AI与语言的交汇 | 语言模型、AI代理、代理应用、开发框架及数据为中心的方法…www.cobusgreyling.com
模型上下文协议(Model Context Protocol)一个开放的协议,使LLM应用与外部数据源和工具之间实现无缝集成。github.com
GitHub - langchain-ai/langchain-mcp-adapters

想参与 langchain-ai/langchain-mcp-adapters 的贡献吗?你可以在 GitHub 上创建一个账户来加入我们。

GitHub - modelcontextprotocol/servers: 模型上下文协议服务器项目。加入 modelcontextprotocol/servers 的开发团队,请在 GitHub 上注册一个账户。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消