第五单元——第4课:给工具参数加校验

发布时间:2026/10/23 2:57:15
第五单元——第4课:给工具参数加校验 上一课模型可以选择工具但模型生成的参数不一定合法。例如{book_name: 三体, quantity: -2}不能只靠提示词说“数量必须正确”还要让程序检查。这节增加一个“计算报价”工具数量必须是110之间的整数。只计算报价不下单、不扣库存。1. 复制上一课文件另存为C:\Users\Administrator\langchain-study\unit5_lesson4_tool_validation.py添加导入from pydantic import BaseModel, Field, ValidationError2. 定义参数规则和报价工具放在原来的两个工具函数后面、tools列表前面class QuoteInput(BaseModel): book_name: str Field( min_length1, description图书名称例如三体不包含书名号, ) quantity: int Field( strictTrue, ge1, le10, description购买数量必须是1到10之间的整数, ) 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: return f《{name}》的价格或库存记录不完整无法报价。 stock BOOK_STOCK[name] if quantity stock: return ( f《{name}》只有 {stock} 本库存 f不足 {quantity} 本无法满足本次现货需求。 ) # 沿用上一课的演示价格整数单位为元 unit_price BOOK_PRICES[name] total_price unit_price * quantity return ( f《{name}》单价 {unit_price} 元 f{quantity} 本合计 {total_price} 元。 这只是报价尚未下单或扣减库存。 )args_schemaQuoteInput指定工具输入的校验规则。通过工具的.invoke()调用时参数会先校验再进入函数主体。LangChain 参数模型说明3. 看懂这段语法quantity: int Field( strictTrue, ge1, le10, )写法含义quantity: int数量字段是整数strictTrue严格检查类型不把字符串2自动转换成整数ge1大于或等于1le10小于或等于10因此2 # 通过 0 # 不通过 -2 # 不通过 11 # 不通过 2.5 # 不通过 2 # 不通过这是字符串这里没有提供default所以数量是必填项。Field(...)是字段规则不是给数量赋了一个普通数值。Pydantic 字段说明4. 注册工具并更新提示词将工具列表改成tools [ get_book_stock, get_book_price, calculate_quote, ]原来的这两处继续使用同一个列表不用修改model_with_tools model.bind_tools(tools) builder.add_node(tools, ToolNode(tools))在系统提示词中补充用户要求计算指定数量的总价或报价时调用 calculate_quote。 报价工具已经检查库存并计算总价不必重复查询相同信息。 报价需要明确的书名和数量缺少时先询问。 数量必须是1到10之间的整数。 不要擅自修改用户数量也不要拆分请求来绕过数量限制。 报价不代表订单已经创建。5. 先直接测试校验再测试模型仅向模型问“买负2本”它可能直接拒绝根本不调用工具。这样不能证明程序校验真的生效。为了确定校验有效可在工具定义后、模型初始化前临时添加for quantity in [2, 0, -2, 11, 2.5, 2]: print(f\n测试数量{quantity!r}) try: result calculate_quote.invoke({ book_name: 三体, quantity: quantity, }) print(工具结果, result) except ValidationError: print(校验失败没有进入报价函数。) # 临时结束程序这次测试不调用模型 raise SystemExit运行python unit5_lesson4_tool_validation.py预期只有整数2会出现[报价工具] 参数校验通过开始执行其他测试值都应该被拦截。测试完成后删除这段临时测试代码包括raise SystemExit。再运行并提问买两本《三体》多少钱请给我报价。按原来的演示数据应该得到90元并说明没有下单。6. 参数合法不代表业务可行再问请给我9本《三体》的现货报价。假设库存仍为8本9是110之间的整数参数校验通过。但9本超过库存业务检查不通过。这两层检查职责不同参数校验检查“输入格式和范围是否正确”业务检查判断“当前条件下能不能办”。另外参数校验不能证明模型忠实提取了用户意思如果用户说12本模型擅自传入10格式仍然合法。所以测试时也要检查打印出的工具参数是否与用户要求一致。执行结果如下

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询