本资料来自 langchainx(Rust)项目中关于测试的说明,主题是“FakeLLM、进程内测试替身,以及编写离线链/智能体测试”。
一、背景与问题 资料指出,当前每个链与智能体的测试都由 #[ignore] 门控,例如:
#[tokio::test] #[ignore] // requires live OPENAI_API_KEY async fn test_invoke_chain() { ... }
因此链或智能体行为没有任何自动化测试覆盖率。为解决这一问题,资料给出离线测试方案。
二、FakeLLM:进程内测试替身 src/test_utils.rs 中定义了 FakeLLM,并置于 #[cfg(any(test, feature = "test-utils"))] 之后。其结构包含 responses(Arc<Mutex<VecDeque<String>>>)与 call_count(Arc<AtomicUsize>)。new 接收响应字符串列表并初始化队列,call_count() 返回调用次数。 实现 LLM trait 时,generate 会先将 call_count 加一,再从队列弹出响应(队列为空时用 unwrap_or_default 返回空字符串),并包装为 GenerateResult;stream 则故意使用 unimplemented!,提示应改用 FakeStreamingLLM 进行流式测试。
三、使用 FakeLLM 的示例测试 在 #[cfg(test)] 模块中演示了 test_llm_chain_invoke:用 FakeLLM::new(vec!["Hello from FakeLLM!"]) 构造假模型,用 message_formatter!、fmt_template!、HumanMessagePromptTemplate::new、template_fstring! 构造提示,再用 LLMChainBuilder::new().llm(fake.clone()).prompt(prompt).build() 构建链并 invoke,断言结果等于预置响应,并断言 fake.call_count() == 1。 另一个测试 test_chain_returns_error_on_empty_responses 使用空响应队列,断言结果为 "",对应 FakeLLM 中的 unwrap_or_default 行为。
四、需要真实生成时使用 Ollama 本地模型 当测试需要实际语言模型推理(而非预置响应)时,资料建议使用 Ollama 的小型本地模型,以保持测试离线、快速且免费。 安装与拉取:
Install Ollama: https://ollama.com
ollama pull qwen2.5:0.5b # 400MB — fastest, good for basic reasoning ollama pull llama3.2:1b # 1.3GB — better quality ollama pull phi3:mini # 2.2GB — strong reasoning
测试中使用 Ollama:Cargo.toml 需启用 langchainx 的 ollama 特性;示例 test_chain_with_real_generation 通过 Ollama::default().with_model("qwen2.5:0.5b").with_base_url("http://localhost:11434") 构造模型,构建链后 invoke 输入“Say only the word 'pong'.”,并断言结果小写后包含 "pong"。该测试用 #[cfg_attr(not(feature = "local-llm-tests"), ignore)] 门控。
五、特性开关与运行方式 Cargo.toml 中定义: [features] local-llm-tests = ["ollama"] 运行本地 LLM 测试: cargo test --features local-llm-tests -- --ignored
六、断言什么 资料强调本地 LLM 测试应验证“是否完成”,而非“内容是否正确”。错误做法是断言具体字符串或短语(如断言等于 "The capital of France is Paris." 或包含 "Paris"),这依赖模型措辞、容易脆弱。正确做法包括:断言结果非空、断言长度大于 10、断言结果以句号/问号/感叹号结尾等结构性质,以及在智能体/工具测试中断言工具被调用、最终答案非空。测试失败意味着链或智能体损坏(panic、返回错误、返回空),而不是模型措辞与预期不同。
七、模型选择指南 qwen2.5:0.5b,400MB,用于基本完成度检查(非空、不 panic),默认优先使用;llama3.2:1b,1.3GB,用于链流程测试、多轮记忆;phi3:mini,2.2GB,用于智能体工具调用循环测试。应始终使用能通过测试的最小模型。
八、测试策略要点 单元测试使用 FakeLLM:无网络、无模型、确定性;需要真实生成的测试使用 Ollama 本地模型并用 #[cfg_attr(not(feature = "local-llm-tests"), ignore)] 门控;云端 API 测试保留在 tests/integration/ 并保持 #[ignore],需显式环境变量;只有在把实时 API 调用替换为 FakeLLM 或本地 Ollama 后,才移除 #[ignore];用 assert_eq!(fake.call_count(), N) 验证链的调用次数;错误路径测试可实现一个总是返回 Err(LLMError::...) 的 FailingLLM;绝不在自动化 CI 中使用 OPENAI_API_KEY 或 CLAUDE_API_KEY。
以上为资料中明确提供的内容。关于该测试方案的具体版本要求、FakeStreamingLLM 的实现细节、各模型的完整性能数据,资料暂未提供。