使用Schema Guided Reasoning实现产品分类时Pydantic Literal报错求助
问题解决:Pydantic Literal解包报错与LLM返回值限制
错误原因
你遇到的Unpacked arguments cannot be used in this context报错,是因为Python类型注解的静态特性:Literal需要显式传入字面量参数,不能通过*解包运行时定义的列表(Category属于运行时列表)。
解决方案
要让LLM仅返回预定义类别,同时解决类型注解错误,推荐两种实用方法:
方法1:显式定义Literal类型别名
如果类别列表固定且较短,可直接将所有类别值传入Literal,或提前定义类型别名复用:
from typing import Literal # 定义类型别名,集中管理可选类别 CategoryLiteral = Literal["Fruit Snacks", "Cereals", "Chocolate Bars", "Other"] def CategoriseProduct(Product): class Schema(BaseModel): ProductContent: str = Field(description="产品的成分是什么") ProductPackaging: str = Field(description="产品的包装和规格是什么") ConsumerInfo: str = Field(description="哪些人群会购买该产品") L3Category: CategoryLiteral # 使用预定义的类型别名
方法2:使用枚举(Enum)类(更推荐)
枚举类型能更清晰地约束可选值,且Pydantic对Enum的支持更完善,LLM调用时会严格遵循枚举的字符串返回值,同时便于后续维护:
from enum import Enum from typing import Literal, Annotated, List, Dict, Optional from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel, Field from langchain_openai import ChatOpenAI from langchain.output_parsers import PydanticOutputParser # 定义枚举类,固定可选类别 class CategoryEnum(str, Enum): FRUIT_SNACKS = "Fruit Snacks" CEREALS = "Cereals" CHOCOLATE_BARS = "Chocolate Bars" OTHER = "Other" def CategoriseProduct(Product): class Schema(BaseModel): ProductContent: str = Field(description="产品的成分是什么") ProductPackaging: str = Field(description="产品的包装和规格是什么") ConsumerInfo: str = Field(description="哪些人群会购买该产品") L3Category: CategoryEnum # 使用枚举类型约束返回值 # 配置输出解析器,强制LLM输出符合Schema的结构 parser = PydanticOutputParser(pydantic_object=Schema) # 构建Prompt,明确要求LLM只能选择预定义类别 prompt = ChatPromptTemplate.from_messages([ ("system", "请严格根据产品信息完成分析,返回结果必须符合格式要求:{format_instructions}\n注意:L3Category只能从[Fruit Snacks, Cereals, Chocolate Bars, Other]中选择"), ("human", "产品信息:{product}") ]).partial(format_instructions=parser.get_format_instructions()) # 调用LLM并解析结果示例 llm = ChatOpenAI(model="gpt-3.5-turbo") chain = prompt | llm | parser result = chain.invoke({"product": Product}) return result
关键说明
- 使用Enum或显式Literal后,Pydantic会自动校验返回值,若LLM返回不在预定义列表中的值,会触发解析错误,确保结果合规。
- 配合
PydanticOutputParser和包含格式说明的Prompt,能进一步引导LLM输出符合要求的结构化结果。
内容的提问来源于stack exchange,提问作者Maksim Khaitovich
相关产品推荐
相关产品推荐

