一、前言
在之前的文章中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 它的思路是用另一个大模型来评估目标模型的生成效果。