
上一课给参数加了校验。这节处理下一步参数不合法、库存不足时怎样把问题交回模型让它向用户说明我们使用ToolNode的错误处理功能把指定异常转换成错误类型的工具消息再交给模型。其他未指定的代码错误仍然向外抛出方便排查。1. 复制上一课文件另存为C:\Users\Administrator\langchain-study\unit5_lesson5_tool_errors.py添加导入from langchain_core.tools import ToolException上一课的ValidationError导入继续保留。2. 将报价失败改成明确的异常上一课在库存不足时返回普通字符串。这种方式也可以但它在消息层面仍是一次正常返回。本课用ToolException明确表示“本次工具操作没有成功”。将calculate_quote函数替换为tool(args_schemaQuoteInput) def calculate_quote(book_name: str, quantity: int) - str: 检查指定图书的库存并计算报价不下单、不扣库存。 print([报价工具] 参数校验通过开始执行) name book_name.strip().replace(《, ).replace(》, ) if name not in BOOK_PRICES or name not in BOOK_STOCK: raise ToolException( f《{name}》的价格或库存记录不完整无法报价。 请用户确认书名不要编造价格。 ) stock BOOK_STOCK[name] if quantity stock: raise ToolException( f《{name}》当前只有 {stock} 本 f无法满足 {quantity} 本的现货需求。 请向用户说明不要擅自减少数量或声称下单成功。 ) unit_price BOOK_PRICES[name] total_price unit_price * quantity return ( f《{name}》单价 {unit_price} 元 f{quantity} 本合计 {total_price} 元。 这只是报价尚未下单或扣减库存。 )raise会立即结束当前函数的正常执行不会继续计算下面的报价。3. 指定哪些错误交给模型处理将原来的builder.add_node(tools, ToolNode(tools))替换为tool_node ToolNode( tools, handle_tool_errors( ToolException, ValidationError, ), ) builder.add_node(tools, tool_node)这里配置的是异常类型的元组不是调用这两个类。它的含义是预期的工具问题、参数校验问题转换成错误消息交回模型。未包含的异常例如NameError继续报错不伪装成正常业务问题。部分版本会把参数校验错误包装为ToolException的子类这个配置也包含这些子类。错误消息会带上对应的工具调用编号。官方实现与说明原来的这条边不变builder.add_edge(tools, assistant)所以模型拿到错误结果后可以解释原因而不是继续假装报价成功。4. 补充系统提示词在SystemMessage中追加工具返回错误时说明具体原因。 参数缺失或超出允许范围时请用户提供合法参数。 库存不足或记录缺失时不要反复调用相同工具。 不得为了通过校验而擅自修改用户要求的数量。注意这些提示是在指导模型不能保证它绝不重复调用。上一课设置的recursion_limit继续保留。5. 打印工具消息的状态在程序最后找到if isinstance(message, ToolMessage): print(工具结果, message.content)改成if isinstance(message, ToolMessage): print(工具状态, message.status) print(工具结果, message.content)现在可以区分工具状态 success和工具状态 error图正常运行结束不代表其中每次工具调用都成功。6. 做三个测试运行python unit5_lesson5_tool_errors.py每个问题单独重新运行一次问题观察重点请给我2本《三体》的报价。库存充足时返回success请给我9本《三体》的现货报价。若库存仍为8本应返回error说明库存不足请给我2本《不存在的测试书》的报价。返回error说明没有记录第一项按原来的演示价格应为90元后两项不应声称已经下单。如果你输入“买负2本”模型可能直接要求你修改数量没有调用工具。这是合理行为但不能用它证明参数校验已执行校验本身仍用上一课的直接调用测试来验证。本课要分清的三件事参数校验输入格式和范围是否合法。工具错误处理失败后如何把原因交回模型。自动重试同一个操作是否再执行一次。本课没有增加自动重试。库存不足不是临时网络故障重复查询通常解决不了。另外错误内容会被发给模型所以只放必要的业务说明不要把 API Key、数据库连接串或完整内部日志放进去。