You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:43:21