10分钟让你用SpringAI接入百度地图MCP服务

一、前言

在之前的文章中SpringAI MCP技术初探 我介绍了使用SpringAI 1.0.0-M6 自建Mcp-Client和Mcp-Server的案例,本文带着各位读者在前文的基础上10分钟完成百度地图MCP服务对接,让自己的大模型具备地理位置分析和算路能力。最终实现效果如下(请忽略丑陋的界面设计,毕竟这个界面也是大模型生成的HTML代码)

二、光速对接百度地图服务

2.1 了解百度地图MCP-Server对接手段

我们查看 lbs.baidu.com/faq/api?tit... 中的文档,按照步骤先启动百度地图的MCP-Server服务端,百度地图的MCP服务端目前提供了python和NodeJS两种实现。笔者这次使用的是Python版本的代码实现,一步步按照官方教程进行设置即可。

最终执行下述命令:

java 复制代码
uv run --with mcp[cli] mcp run map.py

像上图这样无任何异常出现则说明百度地图mcp-server正常运行(本文在末尾会简单分析下map.py的代码内容),然后你需要去lbsyun.baidu.com/apiconsole/... 申请一个AK,这在后面我们编写MCP-client程序的时候会用到。

2.2 引入SpringAI+SpringAI Alibaba

依赖清单可以直接参考SpringAI MCP技术初探 文中提到的github地址中的pom文件,重点依赖有两个

xml 复制代码
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
  <version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud.ai</groupId>
  <artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>

如果依赖下载有问题可以参考SpringAI 官方demo 设置好repository 地址。

然后直接修改项目中的 mcp-server.json 如下所示(请按照你的实际路径配置,mac系统无需填写绝对路径)

json 复制代码
{
  "mcpServers": {
    "baidu-map": {
      "command": "D:\\Program Files\\python3.12.3\\Scripts\\uv.exe",
      "args": [
        "run",
        "--with",
        "mcp[cli]",
        "mcp",
        "run",
        "D:\\work-space-python\\python-baidu-map\\baidu_map_mcp_server\\map.py"
      ],
      "env": {
        "BAIDU_MAPS_API_KEY": "填写百度地图的AK"
      }
    }
  }
}

用过Claude或者cursor对这样的配置肯定不陌生,只不过不同的是我们这次是自己写代码,用qwen大模型来和这些mcp-server对接。然后打开工程中的application.yaml 文件修改如下,利用SpringAI 的自动装配能力吗,为我们自动注入McpClient

json 复制代码
server:
  port: 9999
spring:
  ai:
    mcp:
      client:
        enabled: true
        name: call-mcp-server
        stdio:
          servers-configuration: classpath:mcp-server.json
    dashscope:
      api-key: 通义千问的APIKEY

2.3 配置ChatClient

java 复制代码
private final ChatClient chatClient;
private final ChatMemory chatMemory = new InMemoryChatMemory();


public ChatController(ChatClient.Builder chatClientBuilder, 
                      List<McpSyncClient> mcpSyncClients, 
                      ToolCallbackProvider tools) {
    this.chatClient = chatClientBuilder
    // 关键在这里,断点调试处
    .defaultTools(tools)
    .defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build())
    .build();
}



@RequestMapping(value = "/generate_stream", method = RequestMethod.GET)
public Flux<ChatResponse> generateStream(HttpServletResponse response, @RequestParam("id") String id, @RequestParam("prompt") String prompt) {
    response.setCharacterEncoding("UTF-8");
    var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, id, 10);
    return this.chatClient.prompt(prompt)
    .advisors(messageChatMemoryAdvisor)
    .stream()
    .chatResponse();
}

读过笔者上一篇文章的对这些代码应该不陌生,几乎无任何改动。

2.4 启动应用测试效果

直接启动应用,笔者代码里面存在一个index.html,借助SpringBoot的thymeleaf实现了一个简单的界面,启动之后直接提问地图问题:

返回的格式是markdown的格式,观察对话响应内容可以发现其使用到了百度地图的MCP服务

三、部分细节研讨

1、大模型是怎么知道百度地图的mcp服务能提供哪些能力呢?

我们在ChatClient创建的位置打上断点即可发现:

这里定义了8个工具,如果读者细心看下百度地图map.py的代码内容的话,你就会发现其正好使用了8个@mcp.tool() 注解,使用的是Python的 FastMCP 技术方案,代码的大致内容还是去调用百度地图提供的http web服务API。

2、"黑盒"一般的大模型

仔细体验发现目前我们虽然可以做到和任何McpServer对接但是还有几个不容忽视的问题:

  • 无法追溯工具链调用细节,上面的案例中我们无法得知大模型和MCP-Server的沟通细节,无明显的数据交互日志,熟悉langChain开发的都知道,在python开发领域观察函数式调用有一个平台叫做langfuse(langfuse.com/docs) 目前SpringAI 暂时还不能很直观的获取大模型与McpServer的沟通细节,也不能获取大模型的调用细节,这点还得等待相关工具完善
  • 我们无法去评估大模型生成内容的准确性,简单来说我们不好评估大模型生成效果,评估大模型的生成效果是一门技术,目前SpringAI提供了Evaluator 它的思路是用另一个大模型来评估目标模型的生成效果。
相关推荐
自由鬼2 分钟前
Google开源机器学习框架TensorFlow探索更多ViT优化
人工智能·python·深度学习·机器学习·tensorflow·机器训练
青花瓷3 分钟前
Yolo_v8的安装测试
人工智能·python·yolo
-一杯为品-7 分钟前
【动手学深度学习】#6 卷积神经网络
人工智能·深度学习·cnn
老友@16 分钟前
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换
java·后端·性能优化·html·word·aspose·格式转换
sunbin20 分钟前
doc文档转换为html文档
后端
Asthenia041221 分钟前
面试复习:游标是什么?什么是深度分页?如何用游标解决深度分页?(以 InnoDB 为例)
后端
xfq23 分钟前
[ai] cline使用总结(包括mcp)
前端·后端·ai编程
weiran199923 分钟前
手把手的建站思路和dev-ops方案
前端·后端·架构
tzc_fly26 分钟前
TextGrad:案例
人工智能
点我头像干啥36 分钟前
乳腺超声图像结节分割
人工智能·深度学习·opencv·计算机视觉