拓冰建站拓冰建站
首页 / 资讯中心 / 正文

LangChain DeepAgent 的 DeepMind 模型调用,走 TaoToken 通道行不行?

1. 原文的前期准备为什么卡在 DeepMind 通道上1.1 Google Cloud 账号与 DeepMind 权限这道门槛照着《实际项目中使用 LangChain DeepAgent 的完整流程落地版》往下做第一段通常不是写代码而是环境准备Python 版本对一遍、依赖清单装一遍、项目目录建一遍然后就是模型授权。原文把授权拆成了两件事——先确认 DeepMind 模型权限再准备 Google Cloud 账号并开通对应服务。真正动手的人会发现这一步的等待时间比写 Agent 本体还长账号要过审、项目要绑定、服务要逐项开启权限没下来之前后面所有代码都只能干放着。更麻烦的是这类权限往往跟账号主体、账单信息绑定个人开发者和团队共用一个测试账号时容易出现「Key 是谁的、额度算谁的、超了谁负责」的扯皮。原文是把这部分当作前置条件一笔带过的因为教程假定读者已经有可用账号但你真把项目往生产环境挪前期准备的复杂度会成倍放大。落地版的「落地」二字卡就卡在这里。所以更现实的做法是把「模型授权」和「Agent 逻辑」解耦Agent 那边继续用 LangChain 的 ChatModel 抽象模型通道换成一个统一入口换模型不动业务代码。这也是下面所有改写的出发点。1.2 步骤 2 里 DEEPMIND_API_KEY 和 gemini-pro 的写法原文步骤 2 的结构大致是这样用load_dotenv()把.env读进环境变量再用os.getenv(DEEPMIND_API_KEY)取密钥初始化 ChatDeepMind 时把model_name设成gemini-pro。这套写法本身没问题问题在于它把「密钥来源」和「模型客户端」绑死在了某个云厂商的 SDK 上。国内服务器上跑原文还额外提了一句要配代理否则请求发不出去。这一层代理既影响启动脚本也影响容器镜像和 CI 环境本地能跑、服务器上超时排查起来非常浪费时间。而且代理一旦跟着代码进仓库密钥管理和网络配置就混在一起后面做灰度、做多环境会越来越乱。这篇要改的就是这一段模型授权那一步不再走 Google Cloud 申请流程换成在 TaoToken 注册并创建一把 Key.env里保留load_dotenv()的读法但变量名和值都换成新的Base URL 统一填https://taotoken.net/api。Agent 部分的AgentExecutor、ChatPromptTemplate、ConversationBufferMemory、工具集以及max_iterations5全部原样保留。2. 准备材料依赖清单、模型 ID 和一把 Key2.1 requirements.txt 与目录结构先把依赖固定下来。原文用的是 LangChain 的 Agent 体系我们不改这一层只是把模型客户端换成走 OpenAI 兼容协议的实现所以依赖里要多一个langchain-openai。目录结构保持原文的扁平风格方便对照deepagent-demo/ ├── .env ├── requirements.txt ├── llm_factory.py ├── tools.py ├── agent_builder.py └── run_deepagent.pyrequirements.txt写上这几行就够了版本按你本地实际能装上的为准langchain langchain-core langchain-community langchain-openai python-dotenv安装命令在项目根目录执行python -m venv .venv source .venv/bin/activate pip install -r requirements.txtWindows 下激活脚本换成.venv\Scripts\activate其余不变。这一步不需要任何额外的网络配置也不需要为模型通道单独装 SDK。2.2 模型 ID 以模型广场当时列表为准原文把model_name写死成gemini-pro这是当时可用的名字。迁移到统一通道之后模型 ID 不要沿用旧值也不要自己拼日期后缀去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的模型广场看当时列表里有哪些 ID把选中的那一个原样复制进.env。同一个模型在不同通道下的命名可能不一样抄错一个字符就是 404 或者「模型不存在」。建议在项目里加一句注释写明这个 ID 是什么时候从哪个页面复制的后面换模型时能快速回溯。模型广场里同一个能力档位往往有多个候选选哪个取决于你的工具调用需求DeepAgent 要跑工具就得选支持 function calling 的那类否则AgentExecutor会一直在「模型没有发起工具调用」和「直接编答案」之间打转。确认好模型 ID 之后顺手在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建一把 API KeyKey 只在创建时完整显示一次复制完先贴进.env不要先丢进聊天窗口。3. .env 与模型客户端把 ChatDeepMind 换成兼容通道初始化3.1 .env 里只留三个变量原文的.env至少要有DEEPMIND_API_KEY可能还有区域、项目 ID 之类的字段。换成统一接入后只留三个变量就够了命名上把用途写清楚避免以后跟别的 Key 混TAOTOKEN_API_KEYYOUR_API_KEY TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODEL_ID以模型广场当时列表为准注意两点TAOTOKEN_BASE_URL末尾不要加/v1也不要在这条记录上附加任何查询参数它就是给 SDK 用的接口前缀TAOTOKEN_API_KEY用YOUR_API_KEY占位真实的 Key 从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建后替换进去。.env记得进.gitignore这是老生常谈但每年还是有人把 Key 提交上去。load_dotenv()的调用位置不变放在所有取环境变量的代码之前。原文那一行load_dotenv()可以原样保留只是它后面读的变量名要换掉。3.2 模型工厂函数按兼容通道重建客户端原文的ChatDeepMind如果是自己封装的类先看它内部有没有暴露 base_url 之类的参数有的话指向https://taotoken.net/api即可。如果它把请求端点写死在 Google 侧就不要硬改内部实现直接在业务层把模型客户端替换成走 OpenAI 兼容协议的实现其余调用签名保持一致。下面这个llm_factory.py就是替换后的版本import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() def build_llm(): model_id os.getenv(TAOTOKEN_MODEL_ID) api_key os.getenv(TAOTOKEN_API_KEY) base_url os.getenv(TAOTOKEN_BASE_URL) if not model_id or not api_key: raise RuntimeError(请先在 .env 里补全 TAOTOKEN_MODEL_ID 和 TAOTOKEN_API_KEY) return ChatOpenAI( modelmodel_id, api_keyapi_key, base_urlbase_url, temperature0.2, max_retries2, timeout60, )temperature压到 0.2 是为了让工具调用更稳定max_retries和timeout是给线上环境留的缓冲。这三个值不是硬性要求按你的业务调整但别把超时设得太短Agent 多轮工具调用本来就比单轮对话慢。替换完之后build_llm()返回的对象跟原来的ChatDeepMind实例在用法上等价都能传给create_tool_calling_agent都能绑定工具。原文后面的 Agent 组装代码因此不用改。4. 工具集、Prompt 与 AgentExecutor 保持不动4.1 两个工具函数照原文写工具集是 DeepAgent 的业务核心这一段完全按原文方式定义不因为换了模型通道而改动。下面用订单场景举例tool装饰器保留函数签名和 docstringdocstring 会作为工具描述给模型看写清楚输入是什么from langchain_core.tools import tool tool def query_order_status(order_id: str) - str: 根据订单号查询订单当前状态输入是订单号字符串。 # 这里接你自己的业务接口、ORM 查询或内部服务 return f订单 {order_id} 当前状态待发货 tool def estimate_shipping(city: str, weight_kg: float) - str: 估算运费输入城市名称和重量千克。 # 这里接你自己的运费表或计价服务 return f{city} {weight_kg}kg 的预估运费为 12 元要点是工具函数本身不要直接去连生产库或生产机器。它只是把参数整理好交给你的业务层去执行Agent 负责的是「决定调用哪个工具、传什么参数」不是「绕过业务权限直连数据」。4.2 ChatPromptTemplate 与 ConversationBufferMemoryPrompt 和记忆一起放在agent_builder.py里。系统提示词要明确要求「先调工具、再下结论」否则模型容易跳过工具直接编一个答案verbose 里看不到任何工具调用你还以为配置没生效from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.memory import ConversationBufferMemory from llm_factory import build_llm from tools import query_order_status, estimate_shipping SYSTEM_PROMPT ( 你是一个订单处理助手。需要外部信息时先调用工具不要凭记忆编造。 拿到工具结果后再给出结论回答保持简洁必要时说明依据。 ) def build_agent(): llm build_llm() tools [query_order_status, estimate_shipping] prompt ChatPromptTemplate.from_messages([ (system, SYSTEM_PROMPT), MessagesPlaceholder(chat_history, optionalTrue), (human, {input}), MessagesPlaceholder(agent_scratchpad), ]) memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue, output_keyoutput, ) agent create_tool_calling_agent(llm, tools, prompt) return AgentExecutor( agentagent, toolstools, memorymemory, verboseTrue, max_iterations5, handle_parsing_errorsTrue, return_intermediate_stepsTrue, )memory_keychat_history必须和 Prompt 里的MessagesPlaceholder(chat_history)对齐output_keyoutput则和AgentExecutor默认的输出键一致这两处写错会出现「多轮对话忘上文」或者 memory 写入报错。4.3 max_iterations5 与 AgentExecutor 的收尾max_iterations5是原文的设定保留它。这个值限制的是「模型思考 工具调用」的轮数上限防止某个工具一直返回模糊结果导致死循环。配verboseTrue和return_intermediate_stepsTrue出问题时能直接看到每一轮的动作和观察值比只看最终答案有用得多。handle_parsing_errorsTrue建议加上模型偶尔会输出格式不太规范的中间步骤开启后会把解析错误当成一条观察值回喂给模型让它自己纠正而不是直接把异常抛到调用方。到这里build_agent()就是整条链路唯一的入口run_deepagent.py里只负责调它。5. 跑 run_deepagentverbose 里看什么5.1 测试任务设计run_deepagent保持原文的单函数形态输入一句自然语言任务输出最终回答from agent_builder import build_agent def run_deepagent(task: str) - str: executor build_agent() result executor.invoke({input: task}) return result[output] if __name__ __main__: answer run_deepagent(帮我查一下订单 A10086 的状态并估算发往杭州 3 公斤的运费) print(answer)这条测试任务故意横跨两个工具先查订单状态再算运费。模型如果只回答其中一部分或者把两个工具的输入搞混verbose 里一眼就能看出来。想验证多轮记忆可以在同一个进程里连续调两次run_deepagent第二次问「刚才那个订单能加急吗」看 memory 是否带上了上文。5.2 verbose 逐段读verboseTrue打开后每次调用会按轮次打印Thought、Action、Action Input、Observation最后是Final Answer。判断通道有没有通看三个点就够了。第一有没有出现Action。如果从头到尾只有Thought和Final Answer说明模型压根没发起工具调用要么是系统提示词不够明确要么是这个模型 ID 不支持 function calling。第二Observation是不是你工具函数的真实返回值如果返回的是报错字符串先修工具。第三Final Answer里引用的订单号和城市跟工具输入是否一致不一致通常意味着 Prompt 里的占位符没对齐。只要这三步都对就说明模型请求已经通过https://taotoken.net/api正常往返max_iterations5也没有被触发。这一步通了原文后面的测试优化和部署运维就可以按原计划继续。6. 报错对照本篇会遇到的几种情况6.1 鉴权类和路径类报错401 或 Unauthorized最常见的原因是.env里的 Key 带了首尾空格或者复制时只复制了一半。也可能是容器里没读到.env实际传出去的是空字符串。先用python -c import os;from dotenv import load_dotenv;load_dotenv();print(repr(os.getenv(TAOTOKEN_API_KEY)))打印一下看repr里的值对不对。404 或路径不存在多半是TAOTOKEN_BASE_URL写错了。正确值是https://taotoken.net/api末尾不带/v1也不要写成官网落地页地址。SDK 内部会自己拼接具体路径你多加一层前缀就会 404。另一个容易忽略的点是有些环境变量文件里 URL 后面跟了空格肉眼看不出来。模型不存在报错里通常会带上你传的 model 值。检查是不是还在用原文的gemini-pro换成模型广场当时列表里的 ID一个字符一个字符对。6.2 工具与循环类问题模型不调用工具直接编答案先看模型是否在支持工具调用的列表里再看系统提示词有没有强调「先调用工具」。有些模型对工具描述很敏感把 docstring 写得更具体一点比如把「查询订单」改成「根据订单号查询订单当前状态输入必须是订单号字符串」。Reached max iterations说明 5 轮之内没收敛。常见原因是工具返回值太长、太含糊模型每轮都在重新组织信息。把工具返回裁剪成几个关键字段或者在 Prompt 里要求「拿到 Observation 后直接给结论不要继续调工具」。不要靠调大max_iterations来掩盖问题那只会让单次请求更贵。多轮对话丢上下文检查memory_key和MessagesPlaceholder的名字是否完全一致以及output_key是否设成了output。这两处是最常见的错配点。7. 测试优化与部署运维怎么接回原文7.1 回归用例与日志原文在跑通之后进入测试优化阶段这一步可以加一份很小的回归集把三到五条典型任务写进一个列表每次改动 Prompt 或换模型 ID 都跑一遍记录最终答案和工具调用次数。工具调用次数这个指标很能反映问题突然从两次变成四次通常是模型换了或者 Prompt 被改坏了。日志方面verboseTrue适合本地调试上线时建议关掉改成把intermediate_steps结构化落盘。这样既能保留工具调用轨迹又不会把大段文本刷进标准输出。注意日志里不要打印完整 Key脱敏成前四位加后四位。7.2 上线前的几项检查部署时把.env换成密钥管理服务注入不要把文件打进镜像。启动脚本里不要写任何模型通道相关的网络开关统一走https://taotoken.net/api就够了。容器健康检查建议单独放一个不触发模型的轻量接口避免每次探活都消耗额度。监控上盯两个数单位时间的请求数、单次请求的平均工具轮数。前者异常升高可能是调用方重试逻辑写错了后者升高通常意味着某类任务开始不收敛需要回看日志里的intermediate_steps。确认能稳定跑一段时间之后再去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的控制台看这一段时间的调用记录核对请求量和模型分布是否和你的预期一致。这一步能帮你提前发现「某个环境还在用旧 Key」这类问题。8. 跑通之后去控制台对一下这次调用run_deepagent的测试任务返回正常、verbose 里能看到完整的工具调用链之后剩下一件事就是对账。在 TaoToken 模型对话 里用同一把 Key 发一条简单消息确认模型 ID 和 Base URL 没有填串然后回 控制台 API Keys 把开发、测试、生产三套环境的 Key 分开别让一个 Key 跑遍所有环境。如果这个 DeepAgent 后面要长期挂着跑批处理或者接内部系统可以顺手看看 Coding Plan 的额度口径是否适合你的调用量。原文里那些测试优化和部署运维的步骤不用改模型通道这一层换完整条链路就跟原教程对齐了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门