LangDrift 实战:用 CLI 测试你的 AI Agent 在不同语言下是否行为一致
你的 AI Agent 在英语环境下完美运行:退款、下单、查询——工具调用一步到位。但当用户用法语发来同样的请求,Agent 突然沉默了;用阿拉伯语,它调用了完全错误的工具;用斯瓦希里语,它什么都没做。
这不是假设——这是 LangDrift 的核心发现。它的内置基准测试表明,同一条意图跨语言表达时,Agent 的工具选择、参数传递和响应行为都可能发生静默偏差。今天介绍的 LangDrift(GitHub 0⭐,MIT 许可证)就是一个专门检测这类「语言漂移」的评估 CLI 工具。
什么是 LangDrift
LangDrift 检查 AI Agent 在不同语言下是否保持行为一致:工具选择、工具参数、响应语言和失败模式。核心问题很直白:
当同一条用户意图以不同语言到达时,你的 Agent 是否仍然选择正确的工具?
它不是文本翻译质量检测——LangDrift 关注行为而非流畅度。它检查的是 Agent 是否在法语中正确调用了 create_refund_ticket,而不是法语回复是否写得漂亮。
安装与快速体验
npm install -g langdrift
需要 Node >= 22。安装后,先用内置的 demo 体验一下(无需 API Key):
git clone https://github.com/RubenGlez/langdrift.git cd langdrift pnpm install pnpm fake-agent
另一个终端窗口:
langdrift run ./examples/scenarios/support-routing.yaml \ --target http://127.0.0.1:3011/api/agent
fake agent 故意对斯瓦希里语(sw)和中文(zh)丢弃工具调用,输出如下:
Locale Passed Failure Detail en 1/1 - create_refund_ticket sw 0/1 no_tool_call expected create_refund_ticket, got no tool calls zh 0/1 no_tool_call expected create_refund_ticket, got no tool calls Result: failed, 2 of 12 locales failed
30 秒就能看到「语言漂移」的实际表现。
编写测试场景
用 init 命令创建你的第一个场景:
langdrift init ./refund-scenario.yaml --template support
生成的 YAML 格式如下:
id: refund_request
agent: support
locales:
en:
input: "I was charged twice for my subscription. Can you refund one charge?"
expect:
toolCall:
name: create_refund_ticket
arguments:
reason: duplicate_charge
noToolCall:
name: escalate_to_human
fr:
input: "J'ai été facturé deux fois. Pouvez-vous me rembourser un paiement?"
expect:
toolCall:
name: create_refund_ticket
arguments:
reason: duplicate_charge
responseLanguage: fr
场景文件使用严格的 2 空格缩进 YAML 子集。用 langdrift lint 验证语法。
断言技巧
- 工具参数:使用
oneOf处理同一含义的不同表达:reason: { oneOf: [duplicate_charge, double_charge] }。 - 禁止工具:用
noToolCall+anyOf防止 Agent 误调用高危工具:noToolCall: { anyOf: [escalate_to_human, contact_seller] }。 - 响应语言:
responseLanguage: fr检查回复使用法语(拉丁字母)书写。
对接到你的 Agent
LangDrift 通过 HTTP 与 Agent 通信,每次测试发送一个 POST 请求:
langdrift run ./refund-scenario.yaml \ --target http://localhost:3010/api/agent \ --format markdown \ --iterations 3
请求体包含 locale、input、scenarioId 和 agent,你的 Agent 只需返回工具调用数组和回复文本即可——无需引入特殊 SDK。
内置示例 Agent 支持 OpenAI、Anthropic、DeepSeek:
ANTHROPIC_API_KEY="$ANTHROPIC_KEY" \ MODEL_PROVIDER=anthropic \ MODEL_NAME=claude-haiku-4-5-20251001 \ pnpm agent
CI 集成
LangDrift 在设计上就是 CI-Friendly 的——测试失败时退出码非零。在 GitHub Actions 中使用 --format markdown 生成 PR 注释友好的报告:
langdrift run ./scenarios \ --target "$AGENT_URL" \ --iterations 3 \ --format markdown \ --min-pass-rate 80
--min-pass-rate N 允许设定一个通过率阈值,避免单个弱语言导致整个 pipeline 失败。--allow-fail 则可以标记某个已知弱势语言为”允许失败”,不影响构建。
设计亮点
LangDrift 的几个设计选择值得注意:
- 行为优先于文本:检查的是工具调用和结构化行为,而非回复是否流畅。
- 确定性断言:核心循环不依赖 LLM-as-Judge,失败原因可解释、可复现。
- HTTP 契约无框架锁定:任何能接受 POST 请求的 Agent 都可以测试。
- 零运行时依赖:TypeScript 源码,Node >= 22 即可运行,CLI 安装即用。
总结
当你的 AI Agent 服务全球用户时,英语测试通过不等于整体通过。LangDrift 用轻量的方式暴露了语言漂移问题——4 个 CLI 命令(init、run、lint、translate)、一个清晰的 HTTP 契约、CI 集成支持,让跨语言 Agent 行为验证变得简单可操作。
如果你的 Agent 需要处理多语言用户请求,LangDrift 是一个值得加入 CI pipeline 的工具。
相关链接