ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

3步!用 Doris MCP + LangChain 搭建 AI 问数系统:TaoToken 统一 Key 配置与验证

3步!用 Doris MCP + LangChain 搭建 AI 问数系统:TaoToken 统一 Key 配置与验证 1. 为什么 Doris MCP LangChain 值得你花一个下午跑通如果你手上已经有一套 Apache Doris 集群TPC-H 或者业务表都躺在里面但每次取数还得写 SQL、找字段注释、跟业务方来回确认口径那 Doris MCP LangChain 这套组合就是为你准备的。它要做的事情很直接把「自然语言 → Doris SQL → 执行 → 带业务解读的结果」这条链路串起来让你用一句话就能问出「哪个客户下单最多」这种问题而不是先翻三张表的 schema。Doris 本身是 MPP 架构的实时分析数据库向量化执行引擎在 PB 级数据上也能做到秒级响应这是它能扛住 AI 问数背后高频查询的前提。LangChain 负责的是 Agent 编排把大模型、工具调用、提示词模板拼成一个可执行链路。而 MCPModel Context Protocol是中间那层标准化接口让 LangChain 不用为 Doris 单独写一堆 Connector直接通过 MCP Server 暴露的工具就能拿到库表信息、执行 SQL。这套方案适合谁三类人最合适一是已有 Doris 数据源、想快速验证 AI 问数可行性的数据开发二是正在学 LangChain Agent、想找一个真实数据库场景练手的工程师三是团队里负责数据平台、想给业务方做一个「能对话的取数入口」的人。整条链路跑通不需要你改 Doris 源码也不需要自己维护元数据映射配置量集中在两个文件和一个 Key 上。我试过把这套流程从零搭一遍卡点基本都在 Key 配置和 MCP 连通性上所以下面会把 TaoToken 统一 Key 的配置骨架、三步验证动作写清楚你照着复制就能复现。2. TaoToken 统一 Key一处配置LangChain 与 MCP 共用在原始方案里LangChain 侧要配 DeepSeek 或其它模型的 API KeyMCP Server 侧要配 Doris 的连接信息两边 Key 管理是分开的。如果你后面还要接 Claude Code、Cursor 或者别的 Agent 工具Key 会散落在多个配置文件里换一次 Key 要改一圈。TaoToken 在这里的角色是统一入口它提供兼容 OpenAI 协议的 API 端点LangChain 的init_chat_model可以直接指向它MCP 侧如果涉及模型调用也能复用同一个 Key。这样你只需要维护一份 Key配置集中在config.toml和settings.json两个文件里。先拿 Key。访问控制台创建 API Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole创建后在 API Keys 页面复制格式通常是sk-开头的一串。这个 Key 同时用于 LangChain 的模型调用和后续 MCP 工具链里的模型请求。接入文档在这里配置项含义可以对照查https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocAPI 基础地址是https://taotoken.net/api注意这个地址不加 UTM 参数直接作为base_url使用。LangChain 的 OpenAI 兼容接口会在这个地址后面拼/v1/chat/completions所以你在配置里填https://taotoken.net/api即可不要手动加/v1。2.1 config.toml 配置骨架config.toml放在项目根目录用于 LangChain 侧读取模型配置[llm] provider openai model claude-3-5-sonnet base_url https://taotoken.net/api api_key sk-你的TaoTokenKey temperature 0.2 max_tokens 4096 [mcp] server_name doris_mcp_server transport streamable_http url http://localhost:3000/mcp timeout 30 [doris] host 127.0.0.1 port 9030 user root password 你的Doris密码 database tpchtemperature设 0.2 是为了让 SQL 生成更稳定问数场景不需要太高的创造性。max_tokens给 4096 是因为 Doris 表结构信息加上查询结果可能比较长。2.2 settings.json 配置骨架settings.json用于 MCP Server 侧和部分工具链读取字段和config.toml对应但格式是 JSON{ llm: { provider: openai, model: claude-3-5-sonnet, base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey }, mcp: { server_name: doris_mcp_server, transport: streamable_http, url: http://localhost:3000/mcp }, doris: { host: 127.0.0.1, port: 9030, user: root, password: 你的Doris密码, database: tpch } }两个文件里的api_key填同一个 TaoToken Key。如果你用环境变量管理可以把 Key 写成${TAOTOKEN_API_KEY}然后在.env里定义避免明文提交到仓库。注意base_url只填到https://taotoken.net/api不要写成https://taotoken.net/api/v1否则 LangChain 会拼出/api/v1/v1/chat/completions导致 404。3. 可复制配置Doris MCP Server 与 LangChain 链路搭建配置骨架有了接下来把 MCP Server 跑起来再写 LangChain 侧的调用代码。这一步的目标是让 MCP 工具能被 LangChain 发现并调用。3.1 启动 Doris MCP Server先把 MCP Server 克隆到本地并安装依赖git clone https://github.com/apache/doris-mcp-server.git cd doris-mcp-server pip install -r requirements.txt配置 Doris 连接信息编辑.envcp .env.example .env vim .env填入DORIS_HOST127.0.0.1 DORIS_PORT9030 DORIS_USERroot DORIS_PASSWORD你的Doris密码 DORIS_DATABASEtpch启动服务./start_server.sh 看到Uvicorn running on http://0.0.0.0:3000就说明 MCP Server 起来了。这个 3000 端口就是config.toml里mcp.url对应的地址。3.2 LangChain 侧读取配置并初始化 AgentPython 版本需要 3.12。依赖装这些pip install langchain langchain-community langchain-openai langchain-mcp-adapters python-dotenv aiohttp aiofiles tomli下面是读取config.toml并初始化 Agent 的核心代码import asyncio import tomli from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain.chat_models import init_chat_model from langchain.prompts import ChatPromptTemplate from langchain_mcp_adapters.client import MultiServerMCPClient def load_config(pathconfig.toml): with open(path, rb) as f: return tomli.load(f) async def build_agent(): cfg load_config() llm_cfg cfg[llm] mcp_cfg cfg[mcp] mcp_client MultiServerMCPClient({ mcp_cfg[server_name]: { transport: mcp_cfg[transport], url: mcp_cfg[url], } }) tools await mcp_client.get_tools() if not tools: raise RuntimeError(MCP 工具加载为空检查 MCP Server 是否启动) llm init_chat_model( modelllm_cfg[model], model_providerllm_cfg[provider], api_keyllm_cfg[api_key], base_urlllm_cfg[base_url], temperaturellm_cfg[temperature], ) prompt ChatPromptTemplate.from_messages([ (system, 你是 Doris 问数助手先调用工具获取库表信息再生成 SQL 并执行最后给出业务解读。), (human, {input}), (placeholder, {agent_scratchpad}), ]) agent create_openai_tools_agent(llm, tools, prompt) return AgentExecutor(agentagent, toolstools, verboseTrue, max_iterations3) async def main(): executor await build_agent() result await executor.ainvoke({input: 当前 Doris 有哪些库表}) print(result[output]) if __name__ __main__: asyncio.run(main())这段代码和原始方案的区别在于模型配置从config.toml读取base_url指向 TaoTokenKey 只维护一份。max_iterations3是防止 Agent 在工具调用上死循环问数场景一般两轮内就能出结果。3.3 关键参数对照参数作用建议值transportMCP 通信方式streamable_httpurlMCP Server 地址http://localhost:3000/mcptemperature模型随机性0.2max_iterationsAgent 最大工具调用轮数3base_urlTaoToken API 地址https://taotoken.net/api4. 三步验证从 MCP 连通性到问数结果比对配置写完不代表链路通了按下面三步验证每步都有明确的成功标志。4.1 第一步MCP 工具连通性检查先单独验证 MCP Server 是否暴露了工具。写一个最小脚本import asyncio from langchain_mcp_adapters.client import MultiServerMCPClient async def check(): client MultiServerMCPClient({ doris_mcp_server: { transport: streamable_http, url: http://localhost:3000/mcp, } }) tools await client.get_tools() print(f发现 {len(tools)} 个工具) for t in tools: print(-, t.name) asyncio.run(check())成功标志输出工具数量大于 0且能看到类似get_db_list、execute_sql这样的工具名。如果输出 0 个工具先检查 MCP Server 日志里有没有报 Doris 连接失败。4.2 第二步LangChain 链路调用用 3.2 的代码跑一次当前 Doris 有哪些库表。成功标志控制台打印出库表列表且verboseTrue下能看到 Agent 调用了 MCP 工具。这一步验证的是 LangChain → TaoToken → 模型 → MCP 工具这条完整链路。如果报401检查api_key是否填对如果报404检查base_url是否多写了/v1如果报Connection refused检查 MCP Server 是否还在运行。4.3 第三步问数结果比对最后用一句自然语言查询验证端到端效果result await executor.ainvoke({ input: 请切换到 tpch 库分析哪个客户下单最多 }) print(result[output])成功标志Agent 自动生成 Doris SQL、执行查询、返回客户名称和订单数并附带业务解读。为了确认结果可信你可以手动在 Doris 里跑一遍对应的 SQL 比对SELECT c_name, COUNT(*) AS order_count FROM tpch.orders o JOIN tpch.customer c ON o.o_custkey c.c_custkey GROUP BY c_name ORDER BY order_count DESC LIMIT 1;两边结果一致说明问数链路从配置到出数全程可复现。5. 本篇常见错排查5.1 MCP Server 启动后工具列表为空最常见的原因是.env里 Doris 连接信息不对。MCP Server 启动时如果连不上 Doris工具注册会失败但进程不一定退出。检查DORIS_HOST、DORIS_PORT、DORIS_USER、DORIS_PASSWORD四项确认 Doris FE 的 9030 端口可以从本机访问。5.2 LangChain 报 base_url 相关 404TaoToken 的 API 地址是https://taotoken.net/apiLangChain 的 OpenAI 兼容层会自动拼/v1/chat/completions。如果你在config.toml里写成https://taotoken.net/api/v1最终请求路径会变成/api/v1/v1/chat/completions返回 404。改回不带/v1的地址即可。5.3 Agent 不调用工具直接回答如果模型没有调用 MCP 工具而是直接编造了一个答案通常是 system prompt 不够明确。把 system prompt 改成「必须先调用工具获取库表信息再生成 SQL禁止凭记忆回答」并把temperature降到 0.1。另外确认tools列表非空空工具列表下 Agent 只能靠模型自身知识回答。5.4 查询结果与手动 SQL 不一致先确认 Agent 生成的 SQL 里库名和表名是否正确。Doris 里跨库查询需要写全库名.表名如果 Agent 只写了表名可能查到了默认库。可以在 system prompt 里加上「生成 SQL 时必须带库名前缀」。另外检查tpch数据是否完整导入TPC-H 的orders和customer表数据量对不上会导致结果偏差。5.5 长时间无响应或超时MCP 的timeout默认 30 秒如果 Doris 查询本身较慢可以调到 60。LangChain 侧如果max_iterations设得过大Agent 可能反复调用工具建议保持 3。TaoToken 侧如果模型响应慢可以在config.toml里换一个更轻量的模型做问数场景。6. 继续往下走从跑通到日常使用三步验证跑通之后这套系统就可以进入日常使用了。如果你主要用它做交互式问数可以直接在模型对话页面测试不同问法观察 Agent 的工具调用策略https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat如果你打算把问数能力接到长期运行的编码或 Agent 工作流里比如让 Claude Code 通过 MCP 直接查 Doris那 Key 的稳定性和额度管理就比单次调用更重要可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-planKey 管理和新建入口在控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsoleAPI Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocClaude Code 接入说明https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentClaudeCodeAnthropic最后留一个实操建议把config.toml和settings.json里的 Key 换成环境变量引用然后在.gitignore里加上.env。问数系统跑通只是第一步Key 不泄露、配置可复现才能让这套链路在团队里真正用起来。
返回列表