4.0 KiB
4.0 KiB
会话 Prompt 动态路由
会话的普通发送 POST /api/v1/conversations/{id}/messages 与流式发送 POST /api/v1/conversations/{id}/stream 共用同一条模型调用链:
- 保存本轮用户消息。
- 用
app/prompts/semantic_router.md结合本轮问题、近期聊天文字和上一轮主题,提取业务字段并选择prompt_key。路由复用现有语义识别调用,不单独增加一次模型请求。 - 读取通用角色文件,以及本轮选中的一个环节专家文件;补充运行约束、语义 JSON 和最近 20 条消息,调用模型回复。
- SSE 发送
semantic、delta、done;普通发送等待完成后返回相同的会话数据。 - 将最终主题与助手回复一起存入
conversation_messages.structured_data.semantic,下一次请求从数据库恢复主题。
文件与主题
六份原始业务 Prompt 保存在 app/prompts/product_development/:
| prompt_key | 文件 | 适用问题 |
|---|---|---|
| product_manager | 开品产品经理-美妆护肤-角色Prompt.md | 通用咨询、综合规划、原有供应商/物料/质量风险查询 |
| selection_insight | 01-选品洞察.md | 值不值得开、需求、市场机会、竞争 |
| project_review | 02-立项评审.md | 立项书、定位、可行性、评审条件 |
| cost_pricing | 03-成本定价.md | 成本、售价、毛利、投产比 |
| compliance_risk | 04-合规风控.md | 成分、资质、备案、功效宣称、广告合规 |
| listing_selling_points | 05-上架卖点.md | 标题、主图、详情页、卖点文案 |
通用角色每轮加载,环节专家按需加载一个。专家环节采用该专家的输出结构,避免把五类模板一起输出。文件使用 UTF-8,每次调用时读取,修改后下一次请求生效。
app/prompts/conversation_runtime.md 维护统一的对话节奏、历史信息承接和实际能力边界;OCR 字段抽取及后台预防建议仍使用 LLMClient 内各自的 Prompt。
追问承接与主题切换
- 用户补充“抖音,89 元”、回答上一轮问题或说“继续”时,模型选择
inherit。后端把它解析为最近一条助手消息持久化的主题。 - 用户明确转问新任务,例如从“值不值得做”改问“毛利怎么算”,应重新选择
cost_pricing,不能一律继承上一主题。 - 第一次请求、旧记录没有主题,或模型返回未知主题时,回退到
product_manager。模型返回的文件路径不会参与文件读取。 - 开品专家环节以文字回复及 Prompt 内的追问为主,避免短答被旧供应商规则误识别,或附上无关的历史风险卡片。原有明确的快捷查询指令仍保留卡片路由。
- 本次只保存主题,不维护独立的完整产品字段状态;产品事实仍从近期聊天中理解,超出上下文窗口的材料需要用户补充。
语义事件及历史消息中的路由信息示例:
{
"prompt_key": "cost_pricing",
"prompt_name": "成本定价",
"prompt_file": "03-成本定价.md",
"prompt_route_source": "semantic"
}
prompt_route_source 为 semantic(模型选择)、inherited(追问承接)或 fallback(默认角色)。这些字段复用已有 JSONB,不需要数据库迁移。
部署与能力
pyproject.toml 已将 Markdown 文件加入安装包;部署源码时也需要同步整个 app/prompts/ 目录。会话路由只使用固定白名单内的文件。
业务 Prompt 中要求的实时检索与确定性计算,并不会因为加载文件而自动获得工具能力。目前文字会话没有联网检索或计算工具;上下文没有实际工具结果时,回复应标记 MISSING_MATERIAL、追问必要材料或说明待计算项,不得声称已检索或完成精确测算。接入工具后,需要同步更新运行约束并传入真实工具结果。
普通发送现在也依赖真实模型配置和响应时间;未配置模型或模型失败时返回错误,不再生成固定模板回复。