AI测试技能经验篇:MCP为什么有时候会让大模型产生错误结果?
在使用ai查询数据时,发现返回到的数据有时候会存在错误,于是记录下追踪该问题产生的原因以及解决方法
这是一个查询指定时间范围订单数的MCP
简化MCP如下:
注册工具代码:
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
return [
types.Tool(
name="query_order_num",
description="查询指定时间范围内的订单数",
inputSchema={
"type": "object",
"properties": {
"start_date": {
"type": "string",
"description": "开始日期,可以是YYYY-MM-DD、YYYY-MM-DD HH:mm:ss",
},
"end_date": {
"type": "string",
"description": "结束日期,可以是YYYY-MM-DD、YYYY-MM-DD HH:mm:ss",
},
},
"required": ["start_date", "end_date"],
},
)
]
工具调用代码:
if len(start_time) == 10:
start_time += " 00:00:00"
if len(end_time) == 10:
end_time += " 00:00:00"
8月14日实际有12个订单
假如你问大模型,大模型有概率返回为0个订单
为什么会这样呢?
我们仔细看mcp里的描述以及传参,这是有陷阱的设计,即后端接口实际接受的格式为 YYYY-MM-DD HH:mm:ss
而mcp里允许传入参数到Day,代码自动加上00:00:00补齐。再传给后端。
有些AI则直接传递 2026-08-14 到 2026-08-14,导致取回的订单数为0

你换个说法,或者多查询几次,AI则可能会传递 2026-08-14 00:00:00 到 2026-08-14 23:59:59
查出正确的订单数

其问题出在MCP的设计,描述不够清晰,而且主动纠正参数,这部分最好是以描述形式,详细告诉AI。
调用的工具尽可能不要自行处理参数,把参数控制在是工具定义上
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
return [
types.Tool(
name="query_order_num",
description="查询指定时间范围内的订单数",
inputSchema={
"type": "object",
"properties": {
"start_date": {
"type": "string",
"description": "开始日期,格式:YYYY-MM-DD HH:mm:ss,例如:2026-08-14 00:00:00",
},
"end_date": {
"type": "string",
"description": "结束日期,格式:YYYY-MM-DD HH:mm:ss,例如:2026-08-14 23:59:59",
},
},
"required": ["start_date", "end_date"],
},
)
]
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭