ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

使用LangChain调用高德MCP并生成网页:TaoToken统一Key配置实战

使用LangChain调用高德MCP并生成网页:TaoToken统一Key配置实战 1. 从一次「地图 大模型」的踩坑说起如果你正在做 LangChain 智能体又想让它具备真实的地图能力——查路线、算通勤时间、看天气、生成一张能直接打开的行程网页那高德 MCP 服务基本是绕不开的一环。MCP 全称 Model Context Protocol你可以把它理解成「给大模型插上外部工具的标准化插座」模型不用自己写 HTTP 请求只要按协议声明要调用哪个工具、传什么参数MCP 服务端就会把结果回传。高德官方提供的 MCP 服务把地理编码、路径规划、天气查询这些能力封装成了标准工具LangChain 通过langchain-mcp-adapters就能把它们注册进 Agent。但真正动手时问题往往不在「会不会写 Agent」而在 Key 的管理上。高德 MCP 的 SSE 地址需要带key参数LangChain 侧调用模型又需要另一套 API Key如果你还接了别的模型或工具环境变量会迅速膨胀成一团乱麻。这篇就聚焦一条完整链路用 TaoToken 统一管理模型 Key通过config.toml骨架集中配置再用 LangChain 接入高德 MCP最后让 Agent 自动生成一个可运行的地图行程网页。适合已经会写基础 LangChain 代码、想把地图能力真正落到项目里的开发者。我试过把 Key 散落在.env、代码常量、甚至命令行参数里结果换台机器就要重新翻一遍。统一配置这件事越早做越省心。2. TaoToken 统一 Keyconfig.toml 骨架与前置准备TaoToken 在这里扮演的角色是「模型调用的统一入口」。你不需要在代码里硬编码模型地址和密钥而是把模型相关的配置收敛到一份config.toml里LangChain 读取这份配置来初始化 LLM。这样做的好处很直接模型换供应商、换版本、换并发参数只改配置文件业务代码一行不动。先看配置骨架。下面这份config.toml把模型接入信息集中管理字段含义我在注释里标清楚了# config.toml [llm] # 模型服务的基础地址统一走 TaoToken 的 API 入口 base_url https://taotoken.net/api # 模型名称按你实际开通的填写 model claude-3-5-sonnet # 温度行程规划这类任务建议低一点减少胡编 temperature 0.2 # 单次请求超时秒 timeout 60 [llm.auth] # 从环境变量读取避免密钥进版本库 api_key_env TAOTOKEN_API_KEY [amap] # 高德 MCP 的 SSE 地址前缀key 在运行时拼接 mcp_sse_base https://mcp.amap.com/sse amap_key_env AMAP_KEY这里有两个 Key 要区分TAOTOKEN_API_KEY用于模型调用AMAP_KEY用于高德 MCP 服务。两者都通过环境变量注入配置文件里只存「去哪个环境变量取」不存明文。你可以先在 TaoToken 控制台创建 API Key路径是控制台里的 API Keys 页面创建后复制保存然后写进你的 shell 环境或.env# .env不要提交到 git TAOTOKEN_API_KEY你的_taotoken_key AMAP_KEY你的_高德_key读取配置我用 Python 标准库tomllib3.11或tomli避免额外依赖。下面这段负责把config.toml解析成字典并校验环境变量是否存在# app/config_loader.py import os import tomllib from pathlib import Path def load_config(path: str config.toml) - dict: with open(Path(path), rb) as f: cfg tomllib.load(f) # 校验模型 Key llm_key_env cfg[llm][auth][api_key_env] if not os.environ.get(llm_key_env): raise RuntimeError(f环境变量 {llm_key_env} 未设置) # 校验高德 Key amap_key_env cfg[amap][amap_key_env] if not os.environ.get(amap_key_env): raise RuntimeError(f环境变量 {amap_key_env} 未设置) return cfg注意config.toml可以进版本库.env一定不要。团队协作时把.env.example提交上去里面只写变量名不写值新人照着填即可。前置准备到这里就够了一份配置文件、两个环境变量、一个加载函数。接下来才是把 LangChain、MCP、文件工具串起来。3. 可复制配置LangChain 接入高德 MCP 与工具注册这一节是核心。我们要做三件事初始化 LLM、拉取高德 MCP 工具、把文件管理工具一起注册进 Agent。先装依赖pip install langchain langchain-mcp-adapters langchain-community python-dotenv初始化 LLM 时把config.toml里的base_url、model、temperature传进去。不同模型供应商的类名不一样这里以兼容 OpenAI 接口的写法为例TaoToken 的 API 入口是https://taotoken.net/api# app/llm_factory.py import os from langchain_openai import ChatOpenAI from app.config_loader import load_config def build_llm(cfg: dict): auth cfg[llm][auth] api_key os.environ[auth[api_key_env]] return ChatOpenAI( base_urlcfg[llm][base_url], api_keyapi_key, modelcfg[llm][model], temperaturecfg[llm][temperature], timeoutcfg[llm][timeout], )接着是 MCP 客户端。高德 MCP 走 SSE 传输MultiServerMCPClient支持在一个客户端里挂多个 MCP 服务这里先挂高德一个# app/amap_mcp.py import os from langchain_mcp_adapters.client import MultiServerMCPClient from app.config_loader import load_config async def build_amap_client(cfg: dict): amap_key os.environ[cfg[amap][amap_key_env]] mcp_config { amap: { url: f{cfg[amap][mcp_sse_base]}?key{amap_key}, transport: sse, } } client MultiServerMCPClient(mcp_config) tools await client.get_tools() print(f已加载高德 MCP 工具 {len(tools)} 个) return client, tools文件工具用FileManagementToolkit指定一个临时目录作为 Agent 写网页的落盘位置。这一步很关键——Agent 生成的 HTML 需要有地方存否则你只能从日志里复制# app/file_tools.py from langchain_community.agent_toolkits import FileManagementToolkit def build_file_tools(root_dir: str ./.temp): toolkit FileManagementToolkit(root_dirroot_dir) return toolkit.get_tools()最后把它们组装成 Agent。注意工具列表是「高德 MCP 工具 文件工具」两个数组相加模型才能既查地图又写文件# app/agent_factory.py from langchain.agents import create_agent from app.llm_factory import build_llm from app.amap_mcp import build_amap_client from app.file_tools import build_file_tools from app.config_loader import load_config async def build_agent(): cfg load_config() llm build_llm(cfg) client, amap_tools await build_amap_client(cfg) file_tools build_file_tools(./.temp) agent create_agent( toolsamap_tools file_tools, modelllm, ) return agent, client到这里配置层就齐了。你可以把build_agent理解成一个「装配线」配置从config.toml来模型从 TaoToken 来地图能力从高德 MCP 来写文件能力从本地工具来。任何一环要换只动对应模块。4. 验证请求跑通一次行程规划并生成网页配置写完必须验证否则你不知道是 MCP 没连上、还是模型没返回、还是文件没写成功。我建议分两步先单独验证 MCP 工具能拉到再跑完整 Agent。第一步验证 MCP 连接# verify_mcp.py import asyncio from app.config_loader import load_config from app.amap_mcp import build_amap_client async def main(): cfg load_config() client, tools await build_amap_client(cfg) for t in tools: print(-, t.name) asyncio.run(main())正常输出会列出高德 MCP 暴露的工具名比如地理编码、路径规划、天气查询相关的工具。如果这里报连接错误先检查AMAP_KEY是否有效、SSE 地址是否被网络策略拦截。第二步跑完整链路。提示词要写清楚「目标 约束 输出形式」否则模型容易只给文字不给网页# run_agent.py import asyncio from app.agent_factory import build_agent PROMPT 目标 - 明天去大连早上7点下飞机从周水子机场到星海广场 - 线路选择公交地铁或打车 - 需要考虑早高峰出行时间和路线以及天气情况、穿衣建议 要求 - 制作网页展示出行线路和位置输出一个 HTML 页面 - 网页使用简约美观的卡片风格 - 行程规划结果要能在高德 APP 中展示并集成到 H5 页面 async def main(): agent, client await build_agent() resp await agent.ainvoke({ messages: [{role: user, content: PROMPT}] }) final_answer resp[messages][-1].content print(最终回答, final_answer) asyncio.run(main())关于resp[messages][-1]为什么取最后一条这里值得展开消息序列依次是「用户提问 → AI 思考并发出工具调用指令 → 工具执行结果回传 → AI 基于结果做最终总结」。前面几条是过程最后一条才是给用户看的结论。如果你取错了拿到的可能是一段工具调用参数而不是答案。跑通后Agent 会调用高德 MCP 拿到路线和天气再调用文件工具把 HTML 写到./.temp目录。你可以直接用浏览器打开那个文件看到卡片式的行程页面。如果想让页面里的地图可交互可以在提示词里要求它嵌入高德 H5 的展示方式这样在手机高德 APP 里也能打开对应行程。提示生成网页这类任务模型偶尔会「只描述不落盘」。如果.temp目录没文件检查提示词里是否明确写了「输出一个 HTML 页面」以及文件工具是否真的注册进了tools列表。5. 本篇常见错排查实际跑的时候报错基本集中在下面几类我按出现频率排一下。第一类是 Key 相关。RuntimeError: 环境变量 TAOTOKEN_API_KEY 未设置说明.env没被加载。load_dotenv()要在读取环境变量之前调用且.env要在当前工作目录。如果你在子目录跑脚本路径对不上就会读不到。第二类是 MCP 连接失败。表现是build_amap_client卡住或抛连接异常。先确认AMAP_KEY拼进 URL 后没有多余空格再确认transport写的是sse。高德 MCP 的地址是https://mcp.amap.com/sse参数拼接用?key别写成key。第三类是工具没生效。Agent 回答里说「我无法查询地图」通常是amap_tools为空。回到第 4 节的第一步单独验证如果工具列表是空的说明get_tools()没拿到东西检查 MCP 客户端配置的键名是否和mcp_config一致。第四类是文件没写出来。FileManagementToolkit的root_dir如果不存在部分版本不会自动创建。手动mkdir -p ./.temp一下最稳妥。另外注意 Agent 写文件的路径是相对root_dir的提示词里别让它写绝对路径。第五类是模型返回被截断。行程规划 网页生成输出较长timeout设太小会中途断掉。把config.toml里的timeout调到 60 以上temperature保持低位减少跑偏。现象可能原因处理环境变量未设置.env未加载或路径不对确认load_dotenv()调用位置MCP 连接异常Key 无效或 URL 拼接错误检查?key与 transport工具列表为空MCP 配置键名不一致核对mcp_config结构网页未生成文件工具未注册或目录不存在检查 tools 相加、创建.temp回答被截断timeout 过小调大timeout6. 把 Key 和工具都收进配置链路才算稳走到这里你已经有一条能跑的链路config.toml管模型和高德两套 KeyLangChain 通过 MCP 适配器拉取高德工具文件工具负责落盘Agent 一次调用就能产出可打开的行程网页。真正让这条链路稳定的不是某段代码写得多巧而是配置和代码分离——换模型只改config.toml换地图服务只改 MCP 配置块。如果你接下来要长期做编码类或 Agent 类项目建议把模型调用统一走 TaoToken 的 Coding Plan配合 API Keys 页面管理密钥接入细节可以对照接入文档想先验证模型返回效果直接在模型对话里试提示词最省事。把 Key 收进配置、把工具注册标准化后面无论加多少个 MCP 服务装配线都不用重写。
返回列表