前言
1. 高德地图MCP:高德地图MCP是一个用于高德地图的API,它提供了许多用于获取地图数据的接口。
2. SSE:SSE(Server-Sent Events)
- SSE(Server-Send Events)是基于 HTTP协议中的持久连接
- 是一种服务端向客户端推送信息的单向通信方法
3. langchain_mcp_adapters:langchain_mcp_adapters是一个用于使用langchain进行自然语言处理MCP的适配器。
这三个技术组件共同构成了系统的核心三角:MCP提供地理智能,SSE保障实时体验,LangChain适配器实现自然交互。这种架构既发挥了专业地图服务的可靠性,又融入了生成式AI的灵活性,最终打造出更人性化的智能出行解决方案。
一、高德地图MCP
高德地图MCP(Map Content Platform)是面向开发者的标准化地图能力中枢,提供路径规划、实时交通、POI搜索、地理编码等核心服务。在路线规划系统中,它承担着基础数据支撑角色:
-
通过精准的路径计算API生成多种出行方案(驾车/骑行/步行)
-
实时路况数据为动态路线优化提供决策依据
-
地理围栏与坐标转换能力保障空间计算的准确性
-
亿级POI数据库支持沿途兴趣点的智能推荐
高德地图MCP接入文档以及key申请地址:快速接入-MCP Server | 高德地图API
具体的key配置流程以及SSE配置方法可参考上面地址
二、SSE:实时交互的通信管道
Server-Sent Events(SSE)技术构建了低延迟的单向信息通道,在路线规划场景中实现:
-
渐进式结果推送:长距离路径计算的阶段性反馈
-
动态事件通知:突发路况变化时的实时路线调整建议
-
服务状态广播:后端计算资源的负载状态可视化
-
断线自动重连:移动端弱网环境的容错保障
相较于WebSocket,SSE的HTTP原生特性更易于集成到现有架构,服务端仅需维护轻量级事件流。
三、langchain_mcp_adapters
1、简介
这个库提供了一个轻量级的包装器,使人类模型上下文协议(Anthropic Model Context Protocol, MCP)工具与LangChain和LangGraph兼容。
特点:
- 将MCP工具转换为可与LangGraph代理一起使用的LangChain工具
- 一个客户端实现,允许您连接到多个MCP服务器并从中加载工具
说的直白一点,langchain-mcp-adapters 就是一个基于langchain实现的MCP客户端
2、下载库
pip install langchain-mcp-adapters
3、项目中的主要功能:
该适配器在LangChain框架与高德API间建立了语义理解层:
-
意图识别:解析"避开高速的最近路线"等模糊需求
-
上下文关联:将"上次去过的餐厅"映射为具体POI坐标
-
多模态转换:把自然语言指令转化为MCP所需的参数结构
-
对话记忆:在连续交互中保持地理位置上下文一致性
通过预训练模型与规则引擎的结合,有效解决了地理信息查询中的歧义消除和实体链接难题。
4、简单示例:
1、Client
# 创建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
model = ChatOpenAI(model="gpt-4o")
server_params = StdioServerParameters(
command="python",
args=["/path/to/math_server.py"],
)
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
agent = create_react_agent(model, tools)
agent_response = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})
2、多MCP服务的连接
项目就是用MultiServerMCPClient实现连接SSE的客户端
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")
async with MultiServerMCPClient(
{
"math": {
"command": "python",
"args": ["/path/to/math_server.py"],
"transport": "stdio",
},
"weather": {
# sse服务连接方式
"url": "http://localhost:8000/sse",
"transport": "sse",
}
}
) as client:
agent = create_react_agent(model, client.get_tools())
math_response = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})
weather_response = await agent.ainvoke({"messages": "what is the weather in nyc?"})
四、核心代码实现
1、所用到的库
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import AgentExecutor
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
import asyncio
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain.agents import create_openai_functions_agent
2、mcp客户端实现地图查询
load_dotenv(override=True)
llm_ds = init_chat_model(
"gpt-4o-mini",
api_key = os.getenv("XXXXXX_KEY"),
base_url = os.getenv("XXXXXXX_URL"),
model_provider="openai"
)
async def run_agent(query):
gaode_map_key = os.getenv("GAODE_MAP_KEY")
async with MultiServerMCPClient(
{
"search": {
"url": f"https://mcp.amap.com/sse?key={gaode_map_key}",
"transport": "sse",
}
}
) as client:
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的智能助手。请仔细分析用户问题并使用提供的工具来回答问题。"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 获取工具并修剪描述长度
tools = client.get_tools()
# for tool in tools:
# print(f"工具名称:{tool.name}\n工具描述:{tool.description}\n 工具参数:{tool.args_schema}\n ")
# 创建OpenAI函数代理
agent = create_openai_functions_agent(
llm=llm_ds,
tools=tools,
prompt=prompt
)
# 创建代理执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5,
return_intermediate_steps=True, # 返回中间步骤以便调试
handle_parsing_errors=True
)
# 运行代理
agent_response = await agent_executor.ainvoke({
"input": query
})
# 返回格式化的响应
return {
"status": "success",
"result": agent_response.get("output", ""),
"steps": len(agent_response.get("intermediate_steps", [])),
}
print(asyncio.run(run_agent("从北京到西安怎么走?以及帮我规划沿途著名的旅游景点")))
3、运行结果示例:
五、智能出行助手演示
1、页面展示
页面加载后首先获取高德MCP的工具列表,并在页面右边展示
2、数据请求
3、结果展示
4、天气情况展示
上面的就是一个简单智能出行系统的展示, 可以根据用户的提问规划你的行程路线以及沿途的旅行风景,还有天气等信息。
六、写在最后
系统还在初步完善中,但是实现的核心代码就是四中展示的,如果需要完整的前后端演示代码,可以私信我。