趋近智
单元测试有助于独立验证提示模板或输出解析器等单个组件,但它们不能保证这些部分能正常地协同工作。集成测试侧重于验证LLM工作流程中不同部分之间的交互和数据流动。为了整体应用可靠性,高度依赖操作序列(例如LangChain中的链或RAG管道)的系统必须确保组件之间的顺利交接。
设想一个典型的RAG工作流程:
单元测试可能会检查检索步骤是否针对已知查询返回一些文档,或者提示模板是否正确格式化输入变量。然而,集成测试会检查更大范围的片段,例如:检索器获取的文档是否在发送给LLM的提示中被正确使用?LLM生成的最终响应是否准确反映了检索到的文档信息,并且在需要时是否被正确解析?
端到端流程测试:
模拟外部依赖:
unittest.mock库常用于此。# 使用 pytest 和 unittest.mock 的示例
from unittest.mock import patch
import pytest
# 假设 'my_llm_workflow' 包含要测试的链/代理
# 假设该链内部使用名为 'llm' 的 LLM 对象
from my_llm_workflow import create_rag_chain
@pytest.fixture
def mock_llm():
# 创建一个模拟 LLM 对象,模拟其行为
class MockLLM:
def invoke(self, prompt_input):
# 根据输入结构或内容模拟响应
if "summarize" in prompt_input.lower():
return "这是一个预定义的摘要。"
return "这是一个通用的预定义响应。"
return MockLLM()
@pytest.fixture
def mock_retriever():
# 创建一个模拟检索器
class MockRetriever:
def get_relevant_documents(self, query):
# 返回固定文档用于测试
return [{"page_content": "文档片段1。"}, {"page_content": "相关事实2。"}]
return MockRetriever()
# 在测试期间打补丁(patch)实际的 LLM 和 Retriever 实例
@patch('my_llm_workflow.llm', new_callable=mock_llm)
@patch('my_llm_workflow.retriever', new_callable=mock_retriever)
def test_rag_chain_integration(mock_retriever_instance, mock_llm_instance, mock_llm, mock_retriever):
# 我们传入模拟实例是为了清晰,尽管打补丁会在测试范围内全局替换它们
rag_chain = create_rag_chain(llm=mock_llm, retriever=mock_retriever)
query = "告诉我有关主题X的文档内容。"
result = rag_chain.invoke({"query": query})
# 断言侧重于基于模拟的结构或预期内容
assert isinstance(result, str)
assert "predefined response" in result # 检查模拟 LLM 的输出
# 更高级:检查发送给模拟 LLM 的提示是否包含来自 mock_retriever 的文本
# (如果模拟已为此设置,则需要检查 mock_llm_instance 的调用)
测试特定交互点:
图表显示了一个集成测试,侧重于检索器和提示模板的交互,生成格式化提示,不涉及LLM或解析器。
集成测试充当单元测试与完整端到端评估之间的桥梁。通过验证组件如何协同工作,并可能使用模拟来控制变数,你可以在评估最终生成输出的质量之前,对LLM工作流程的结构完整性和预期行为获得信心。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
unittest.mock - mock object library, Python Software Foundation, 2024 (Python Software Foundation) - Python 标准库 unittest.mock 的官方文档,对于理解如何在集成测试中有效模拟外部依赖非常重要。© 2026 ApX Machine Learning用心打造