compliance/test_llm_smart_generation.py
2025-08-07 22:44:57 +08:00

302 lines
9.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
测试基于LLM的智能数据生成
"""
import sys
import json
from unittest.mock import Mock
from ddms_compliance_suite.utils.data_generator import DataGenerator
def test_llm_prompt_building():
"""测试LLM提示构建功能"""
print("🧪 测试LLM提示构建")
print("=" * 60)
# 模拟包含bsflag的schema
schema = {
"type": "object",
"properties": {
"bsflag": {
"type": "number",
"title": "删除标识",
"description": "逻辑删除标识表示该条记录在用或者已经失效1表示正常数据、-5表示废弃数据"
},
"siteId": {
"type": "string",
"title": "物探工区ID",
"description": "物探工区ID"
},
"siteName": {
"type": "string",
"title": "物探工区名称",
"description": "物探工区名称"
},
"dataRegion": {
"type": "string",
"title": "油田标识",
"description": "油田标识"
}
},
"required": ["bsflag", "siteId"]
}
generator = DataGenerator()
# 测试是否应该使用LLM
should_use_llm = generator._should_use_llm_for_schema(schema)
print(f"是否应该使用LLM: {should_use_llm}")
if should_use_llm:
print("✅ 检测到包含描述信息的schema应该使用LLM")
# 构建LLM提示
prompt = generator._build_llm_prompt(schema, "create_payload", "CREATE_SITE")
print("\n📝 生成的LLM提示:")
print("-" * 40)
print(prompt)
print("-" * 40)
# 检查提示是否包含关键信息
if "bsflag" in prompt and "1表示正常数据、-5表示废弃数据" in prompt:
print("✅ 提示包含bsflag的业务规则描述")
return True
else:
print("❌ 提示缺少关键的业务规则信息")
return False
else:
print("❌ 未检测到应该使用LLM的条件")
return False
def test_mock_llm_generation():
"""测试模拟LLM数据生成"""
print("\n🧪 测试模拟LLM数据生成")
print("=" * 60)
# 创建模拟的LLM服务
mock_llm_service = Mock()
# 模拟LLM返回符合业务规则的数据
mock_llm_service.generate_data_from_schema.return_value = {
"bsflag": 1, # 正确的业务值
"siteId": "SITE_001",
"siteName": "大庆油田勘探工区",
"dataRegion": "华北"
}
schema = {
"type": "object",
"properties": {
"bsflag": {
"type": "number",
"title": "删除标识",
"description": "1表示正常数据、-5表示废弃数据"
},
"siteId": {
"type": "string",
"title": "物探工区ID"
},
"siteName": {
"type": "string",
"title": "物探工区名称"
},
"dataRegion": {
"type": "string",
"title": "油田标识"
}
}
}
generator = DataGenerator()
# 使用模拟的LLM服务生成数据
generated_data = generator.generate_data_from_schema(
schema,
context_name="create_payload",
operation_id="CREATE_SITE",
llm_service=mock_llm_service
)
print(f"生成的数据: {generated_data}")
if generated_data and isinstance(generated_data, dict):
bsflag_value = generated_data.get('bsflag')
site_name = generated_data.get('siteName')
print(f"bsflag值: {bsflag_value}")
print(f"siteName: {site_name}")
# 检查LLM是否被调用
if mock_llm_service.generate_data_from_schema.called:
print("✅ LLM服务被成功调用")
# 检查调用参数
call_args = mock_llm_service.generate_data_from_schema.call_args
if call_args and 'prompt_instruction' in call_args.kwargs:
prompt = call_args.kwargs['prompt_instruction']
if "1表示正常数据、-5表示废弃数据" in prompt:
print("✅ LLM调用时传递了正确的业务规则描述")
else:
print("❌ LLM调用时缺少业务规则描述")
return False
# 检查生成的数据是否符合业务规则
if bsflag_value in [1, -5]:
print(f"✅ 生成的bsflag值符合业务规则: {bsflag_value}")
return True
else:
print(f"❌ 生成的bsflag值不符合业务规则: {bsflag_value}")
return False
else:
print("❌ LLM服务未被调用")
return False
else:
print(f"❌ 生成的数据格式不正确: {generated_data}")
return False
def test_fallback_to_traditional():
"""测试回退到传统生成的情况"""
print("\n🧪 测试回退到传统生成")
print("=" * 60)
# 创建一个会抛出异常的模拟LLM服务
mock_llm_service = Mock()
mock_llm_service.generate_data_from_schema.side_effect = Exception("LLM服务不可用")
schema = {
"type": "object",
"properties": {
"bsflag": {
"type": "number",
"description": "1表示正常数据、-5表示废弃数据"
},
"testField": {
"type": "string"
}
}
}
generator = DataGenerator()
# 尝试生成数据,应该回退到传统方式
generated_data = generator.generate_data_from_schema(
schema,
context_name="create_payload",
operation_id="CREATE_SITE",
llm_service=mock_llm_service
)
print(f"回退生成的数据: {generated_data}")
if generated_data and isinstance(generated_data, dict):
print("✅ 成功回退到传统数据生成")
# 检查是否包含基本字段
if 'bsflag' in generated_data and 'testField' in generated_data:
print("✅ 传统生成包含所有必要字段")
return True
else:
print("❌ 传统生成缺少字段")
return False
else:
print(f"❌ 回退生成失败: {generated_data}")
return False
def test_no_description_schema():
"""测试没有描述信息的schema"""
print("\n🧪 测试没有描述信息的schema")
print("=" * 60)
# 没有描述信息的简单schema
schema = {
"type": "object",
"properties": {
"id": {"type": "string"},
"count": {"type": "number"}
}
}
generator = DataGenerator()
# 检查是否应该使用LLM
should_use_llm = generator._should_use_llm_for_schema(schema)
print(f"是否应该使用LLM: {should_use_llm}")
if not should_use_llm:
print("✅ 正确识别出不需要使用LLM的schema")
# 生成数据应该直接使用传统方式
generated_data = generator.generate_data_from_schema(schema)
print(f"传统生成的数据: {generated_data}")
if generated_data and isinstance(generated_data, dict):
print("✅ 传统生成工作正常")
return True
else:
print("❌ 传统生成失败")
return False
else:
print("❌ 错误地认为应该使用LLM")
return False
def main():
"""主函数"""
print("🚀 基于LLM的智能数据生成测试")
print("=" * 80)
success_count = 0
total_tests = 4
# 测试1: LLM提示构建
if test_llm_prompt_building():
success_count += 1
# 测试2: 模拟LLM生成
if test_mock_llm_generation():
success_count += 1
# 测试3: 回退机制
if test_fallback_to_traditional():
success_count += 1
# 测试4: 无描述schema
if test_no_description_schema():
success_count += 1
# 总结
print("\n" + "=" * 80)
print("📋 测试总结")
print("=" * 80)
print(f"通过测试: {success_count}/{total_tests}")
if success_count == total_tests:
print("🎉 智能数据生成测试通过!")
print("\n✅ 实现的功能:")
print("- LLM根据字段描述智能生成数据")
print("- 自动检测是否需要使用LLM")
print("- 构建包含业务规则的详细提示")
print("- 优雅的回退到传统生成方式")
print("- 支持复杂的业务规则理解")
print("\n💡 优势:")
print("- 不需要硬编码业务规则")
print("- LLM可以理解自然语言描述")
print("- 自动适应新的业务字段")
print("- 生成更真实的测试数据")
print("\n🔧 使用方法:")
print("在schema中添加详细的description字段LLM会自动理解并生成合适的数据")
sys.exit(0)
else:
print("❌ 部分测试失败")
sys.exit(1)
if __name__ == "__main__":
main()