如何向Pydantic Langchain工具函数传入字典列表?解决验证错误
解决LangChain Agent工具的ValidationError:input_data字段缺失问题
问题根源
出现ValidationError: input_data field required的原因有两点:
- 参数传递格式错误:调用工具时直接传入了列表数据,没有按照
InputData模型的要求,将数据包装在以input_data为键的字典中。 - 输入模型类型定义不匹配:原模型中
List[Dict[str, int]]的类型约束不符合实际数据——Junk_Food_name是字符串类型,该约束会导致隐性的类型校验问题。
修复步骤
1. 修正输入模型的类型定义
推荐使用更精确的Pydantic子模型来定义单个菜品结构,既保证类型安全,也让工具的参数描述更清晰:
from typing import List from pydantic import BaseModel, Field from langchain.agents import tool # 定义单个菜品的结构模型 class FoodItem(BaseModel): Junk_Food_name: str = Field(description="垃圾食品名称") price: int = Field(description="单品价格") # 定义工具的输入模型 class InputData(BaseModel): input_data: List[FoodItem] = Field(description="包含菜品名称和价格的订单列表")
如果不想定义子模型,也可以用Union[str, int]兼容字符串和整数类型:
from typing import List, Dict, Union class InputData(BaseModel): input_data: List[Dict[str, Union[str, int]]] = Field(description="包含菜品名称和价格的订单列表")
2. 按正确格式调用工具
调用工具时,必须将数据包装成符合InputData结构的字典,即顶级键为input_data:
# 示例输入数据 input_data = [ {'Junk_Food_name': 'Meat Lovers Pizza', 'price': 800}, {'Junk_Food_name': 'Chicken Alfredo Pizza', 'price': 800}, {'Junk_Food_name': 'Cheeseburger Pizza', 'price': 800}, {'Junk_Food_name': 'Chicken Bacon Ranch Pizza', 'price': 800}, {'Junk_Food_name': 'Chicken Pesto Pizza', 'price': 800} ] # 正确调用方式 result = calc_price({"input_data": input_data}) print(result) # 输出:4000
完整可运行代码
from typing import List from pydantic import BaseModel, Field from langchain.agents import tool # 定义单个菜品模型 class FoodItem(BaseModel): Junk_Food_name: str = Field(description="垃圾食品名称") price: int = Field(description="单品价格") # 定义工具输入模型 class InputData(BaseModel): input_data: List[FoodItem] = Field(description="订单菜品列表") # 定义求和工具 @tool(args_schema=InputData) def calc_price(input_data: List[FoodItem])-> int: """计算订单总金额""" return sum(item.price for item in input_data) # 测试调用 if __name__ == "__main__": input_data = [ {'Junk_Food_name': 'Meat Lovers Pizza', 'price': 800}, {'Junk_Food_name': 'Chicken Alfredo Pizza', 'price': 800}, {'Junk_Food_name': 'Cheeseburger Pizza', 'price': 800}, {'Junk_Food_name': 'Chicken Bacon Ranch Pizza', 'price': 800}, {'Junk_Food_name': 'Chicken Pesto Pizza', 'price': 800} ] total = calc_price({"input_data": input_data}) print(f"订单总金额:{total}") # 输出:订单总金额:4000
内容的提问来源于stack exchange,提问作者sarthak kaushik
相关产品推荐
相关产品推荐

