class ParameterHallucinationDetector:
"""参数幻觉检测"""
def __init__(self, registry):
self.registry = registry
def detect(self, tool_name: str, parameters: dict) -> List[HallucinationDetectionResult]:
"""检测参数是否存在幻觉"""
results = []
schema = self.registry.get_tool_schema(tool_name)
if schema is None:
return results
# 检查每个参数
for param_name, param_value in parameters.items():
# 未定义的参数
if param_name not in schema.get("properties", {}):
results.append(HallucinationDetectionResult(
is_hallucination=True,
confidence=0.8,
hallucination_type="parameter",
evidence=f"参数 '{param_name}' 未在工具定义中",
correction=f"允许的参数: {list(schema['properties'].keys())}"
))
continue
# 参数值范围检查
prop_def = schema["properties"][param_name]
# 数值范围
if "minimum" in prop_def or "maximum" in prop_def:
if isinstance(param_value, (int, float)):
min_val = prop_def.get("minimum")
max_val = prop_def.get("maximum")
if min_val is not None and param_value < min_val:
results.append(HallucinationDetectionResult(
is_hallucination=True,
confidence=0.9,
hallucination_type="parameter",
evidence=f"参数 '{param_name}' 值 {param_value} 小于最小值 {min_val}",
correction=f"请使用不小于 {min_val} 的值"
))
if max_val is not None and param_value > max_val:
results.append(HallucinationDetectionResult(
is_hallucination=True,
confidence=0.9,
hallucination_type="parameter",
evidence=f"参数 '{param_name}' 值 {param_value} 大于最大值 {max_val}",
correction=f"请使用不大于 {max_val} 的值"
))
# 枚举值检查
if "enum" in prop_def:
if param_value not in prop_def["enum"]:
results.append(HallucinationDetectionResult(
is_hallucination=True,
confidence=0.95,
hallucination_type="parameter",
evidence=f"参数 '{param_name}' 值 '{param_value}' 不在允许列表中",
correction=f"允许的值: {prop_def['enum']}"
))
return results