从零到 MCP:构建 LLM 工具我学到的三件事

社区文章 发布于 2025 年 7 月 30 日

image/png

在 2025 年 Gradio Agents & MCP 黑客松期间,我决定探索一些我尚不了解的东西:Anthropic 的模型上下文协议 (MCP)。我最初只是出于好奇,最终却学到了大量关于 LLM 如何使用外部工具的知识。

MCP 简单来说是什么?

LLM 擅长推理和生成文本,但它们无法执行计算两座城市之间的实际距离、获取实时数据或生成图像等操作。MCP 是一种标准方式,可让 LLM 访问外部工具。

就我而言,我构建了用于地理计算的工具。当你问 LLM “从马德里到巴塞罗那开车需要多长时间?”时,LLM 可以使用我的工具来:

  • 将城市名称转换为坐标
  • 计算最佳路线
  • 获取预计旅行时间

所有这些都无需 LLM “了解”地理知识,它只需使用我提供的工具即可。

发现其简易性

我构建了一个地理计算 MCP。我原以为会很复杂,但它的简单性让我大吃一惊。我用很少的代码就使其运行起来了。

demo.launch(mcp_server=True)

Gradio 在这方面非常简单。只需一行代码,它就能将你的 Python 函数转换为任何兼容的 LLM 都可以使用的工具。Gradio 简化了过程:它将函数转换为工具,无需复杂的设置。

第一课:你的 Docstring 就是你的 API

这让我重新思考了如何编写代码。我过去认为文档字符串只是为了其他开发者,但事实证明它们远不止如此。

def get_coords_from_address(address: str) -> str:
    """
    Converts a street address into latitude and longitude coordinates.
    
    Args:
        address (str): The address to search for (e.g., "Eiffel Tower, Paris")
        
    Returns:
        str: Formatted coordinates "Lat: XX.XXXX, Lon: YY.YYYY"
    """

LLM 读取此文档字符串并理解函数的作用、所需的参数、预期的响应类型,甚至使用示例。

我学到的:编写好的文档字符串不再仅仅是一种好的实践——它实际上是你设计 AI 理解你的工具界面的方式。基本上,你的文档字符串是 AI 的用户手册,就像 OpenAPI 规范一样。如果你的函数仅凭文档字符串无法被理解,LLM 将会失败。

第二课:注意 LLM 的上下文

我一开始犯了一个错误。我的路线返回了巨大的 JSON 文件(约 5KB),其中包含数千个完整路线的坐标。问题是 LLM 对它们可以处理的文本量有限制,我却白白浪费了大量空间。

解决方案非常简单:在我的服务器上生成地图图像,只返回文件的引用。

# Before: Massive JSON with coordinates
{"coordinates": [[lat1,lon1], [lat2,lon2], ...]} // ~5KB

# After: Compact JSON with pre-generated image
{"map_image_path": "/tmp/route_12345.webp"} // ~200 bytes

我学到的:为 LLM 构建工具时,优化响应大小与优化速度同样重要。

第三课:LLM 会自动组合工具

我完全没想到 LLM 会在您无需解释如何操作的情况下,按顺序使用多个工具。

用户:“从埃菲尔铁塔到卢浮宫需要多长时间?”

LLM 执行的操作(无需您告诉它如何操作):

  1. 使用 get_coords_from_address("Eiffel Tower, Paris")
  2. 使用 get_coords_from_address("Louvre, Paris")
  3. 使用这些坐标调用 get_route_data()
  4. 使用 extract_route_time() 获取最终答案

image/gif

所有这些都是自动发生的。LLM 理解它需要先进行地理编码,然后规划路线,最后提取时间。LLM 通过使用文档字符串中的描述(例如,如果一个函数说它“需要坐标”,LLM 就会知道它必须首先调用地理编码器)来找出这些工具之间的依赖关系。

我学到的:你不是在创建一个孤立的工具,你正在创建一个可以与其他工具巧妙组合的东西。

最棒的是,通过创建原子函数(只做一件非常明确的事情),LLM 可以以我从未想象过的方式组合它们。例如,我从未想过有人会问“在我去办公室的路线上的每个点 500 米半径内有多少家咖啡馆?”,但 LLM 可以完美地将我的地理编码 + 路线规划 + 地点搜索工具连接起来解决这个问题。这种灵活性开辟了我从未考虑过的用例。

我为何觉得这很有趣

MCP 使构建 LLM 工具变得触手可及。任何开发者都可以编写带有良好文档字符串的 Python 函数,将其放入 Gradio 应用程序中,并设置 `mcp_server=True`,这样他们就拥有了任何兼容 LLM 都可以使用的工具。

想象一下它的潜力:科学计算器、图表生成器、数据分析器、API 连接器……MCP 为 LLM 提供了访问所有这些的标准方式。

最后思考

最终,我觉得我不仅仅是在编写一个地图 MCP。这就像是教 LLM 一项新技能,几乎就像是给了它一双眼睛去看真实世界。

你还能想到其他哪些工具?我很乐意在评论区听到你的想法。


总结:

  • 清晰的文档字符串 = 愉快的 LLM
  • 紧凑的响应 > 巨大的 JSON
  • 如果文档字符串良好,LLM 会自行链接工具
  • 开始使用:一个函数 + 良好的文档字符串 + gradio.launch(mcp_server=True)

如果你想尝试,你所需要的就这些。

社区

注册登录 发表评论