feat:意图识别优化
This commit is contained in:
@@ -14,5 +14,12 @@ DATA_BINDING_GUIDE = (
|
||||
# 校验不通过时返回的说明
|
||||
DATA_BINDING_ERROR = "当前尚未接入数据绑定,不能生成 dataId,请使用物料示例数据"
|
||||
|
||||
# 目前唯一能查询的资源是物料目录,进入规划前已完整获取;业务数据、模板、素材等查询尚未接入
|
||||
# 模型提出的资源需求在接入前不阻塞执行:组件类已由目录满足,其余缺口使用物料示例数据并写入假设
|
||||
RESOURCE_QUERY_SUPPORTED = False
|
||||
RESOURCE_FALLBACK_ASSUMPTION = (
|
||||
"尚未接入物料目录之外的资源查询,所需内容使用物料默认配置和示例数据"
|
||||
)
|
||||
|
||||
# 面向用户的失败说明,不暴露内部校验术语
|
||||
USER_FAILURE_MESSAGE = "抱歉,这次没能完成修改,请换个说法或稍后再试"
|
||||
|
||||
@@ -15,6 +15,7 @@ class Turn(BaseModel):
|
||||
prompt: str # 用户原始输入
|
||||
outcome: Literal["completed", "waiting_for_input", "failed", "cancelled"]
|
||||
summary: str # 助手侧摘要,只描述后端生成了什么,不代表前端已执行
|
||||
offer: str | None = None # 助手提出、等待用户确认的修改指令,下一轮同意时直接执行
|
||||
created_at: datetime
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
"""助手提出的待确认修改,下一轮用户同意时直接执行,不再从历史文本里猜"""
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from app.schemas.base import ExtensibleModel, NonBlankString
|
||||
|
||||
# 提议字段的定义只写一次,直接生成和从回答中提取共用
|
||||
OFFER_DESCRIPTION = (
|
||||
"用户同意后要执行的独立完整修改指令,写明目标组件和修改内容,例如“把销售额统计从柱状图改成折线图”;"
|
||||
"回复没有询问用户是否需要执行某个具体修改时为 null"
|
||||
)
|
||||
|
||||
|
||||
class InformReply(ExtensibleModel):
|
||||
answer: NonBlankString = Field(
|
||||
description="面向用户的回复:说明原因;提供 offer 时以询问是否需要执行的问句结尾"
|
||||
)
|
||||
offer: NonBlankString | None = Field(default=None, description=OFFER_DESCRIPTION)
|
||||
|
||||
|
||||
class ExtractedOffer(ExtensibleModel):
|
||||
"""从已经流式输出的普通回答中提取的提议"""
|
||||
|
||||
offer: NonBlankString | None = Field(default=None, description=OFFER_DESCRIPTION)
|
||||
@@ -18,6 +18,9 @@ PLAN_ADJUST_OPERATIONS: tuple[str, ...] = (
|
||||
"layout",
|
||||
)
|
||||
|
||||
# 只能通过规划完成的操作:新增要从物料目录选型并安排位置,重排要整体布局
|
||||
PLAN_ONLY_OPERATIONS: tuple[str, ...] = ("add", "reflow", "layout")
|
||||
|
||||
# 写进协议描述和提示词的操作说明,词表变化时自动同步
|
||||
OPERATION_GUIDE = (
|
||||
f"修改已有组件用 {'、'.join(NODE_OPERATIONS)},"
|
||||
@@ -40,6 +43,13 @@ def is_direct_operation(target_scope: str, operation: str) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def requires_planning(target_scope: str, operation: str) -> bool:
|
||||
"""判断是否必须先规划;未登记的操作不在此列,由能力检查判为不支持"""
|
||||
return not is_direct_operation(target_scope, operation) and (
|
||||
operation in PLAN_ONLY_OPERATIONS
|
||||
)
|
||||
|
||||
|
||||
def is_canvas_operation(target_scope: str, operation: str) -> bool:
|
||||
"""判断是否为画布属性修改"""
|
||||
return target_scope == "canvas" and operation in CANVAS_OPERATIONS
|
||||
|
||||
@@ -23,6 +23,10 @@ class RequirementChange(ExtensibleModel):
|
||||
target_description: NonBlankString | None = Field(
|
||||
default=None, description="目标的自然语言描述,例如右侧区域、用户所说的那个图"
|
||||
)
|
||||
candidate_ids: list[NonBlankString] = Field(
|
||||
default_factory=list,
|
||||
description="仅 unresolved 时填写:当前大屏中可能是该目标的真实组件 ID;没有可能的组件时留空,不虚构",
|
||||
)
|
||||
operation: NonBlankString = Field(description=f"需求操作。{OPERATION_GUIDE}")
|
||||
parameters: JsonObject = Field(
|
||||
default_factory=dict,
|
||||
@@ -46,6 +50,9 @@ class RequirementChange(ExtensibleModel):
|
||||
raise ValueError("只有 nodes 范围可以提供 target_ids")
|
||||
if self.target_scope == "unresolved" and self.target_description is None:
|
||||
raise ValueError("目标待确认时必须提供 target_description")
|
||||
# 目标已确定时候选没有意义,直接丢弃,避免模型多填字段导致整份需求失效
|
||||
if self.target_scope != "unresolved" and self.candidate_ids:
|
||||
self.candidate_ids = []
|
||||
return self
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user