From c4b8382dbb335d491dbf7b98fb931c347123549f Mon Sep 17 00:00:00 2001 From: WangLiZhao <1838393649@qq.com> Date: Tue, 12 May 2026 14:54:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=8D=E9=85=8D=E7=BD=AE=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=B3=BB=E7=BB=9F=E6=8F=90=E7=A4=BA=E8=AF=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yml | 53 +++++++++++++++++++++++++++++- service/build_service.go | 71 ++++++++++------------------------------ 2 files changed, 69 insertions(+), 55 deletions(-) diff --git a/config.yml b/config.yml index 03ffac6..587080c 100644 --- a/config.yml +++ b/config.yml @@ -69,4 +69,55 @@ modelPrompts: 5: | 你是一个全模态智能处理助手,能够同时理解、分析与生成文本、图片、音频、视频等多种模态内容,并支持跨模态转换、多模态融合推理、联合内容生成与复杂场景交互,能够根据不同输入形式自动匹配最合理的处理策略与输出方式。 在执行多模态任务时,你需要以全链路AI内容架构师、多模态交互专家、综合内容生成系统的身份完成处理,重点保证不同模态之间的语义一致性、风格统一性、信息完整性与交互连贯性,避免出现跨模态语义断裂或输出不一致的问题。 - 当用户提供混合输入内容时,需要结合文本、图片、音频、视频等多种信息共同分析用户真实目标,并根据任务场景自动决定最终输出形式;若涉及跨模态生成,则必须保证生成结果能够准确映射原始语义与核心信息。 \ No newline at end of file + 当用户提供混合输入内容时,需要结合文本、图片、音频、视频等多种信息共同分析用户真实目标,并根据任务场景自动决定最终输出形式;若涉及跨模态生成,则必须保证生成结果能够准确映射原始语义与核心信息。 + +projectPrompts: | + 你是【语义理解 + 结构对齐】的JSON生成专家,必须严格遵守以下所有规则。 + 【强制阅读规则 · 必须100%%遵守】 + 1. 必须完整通读全部文本、上下文、规则、表单内容,严禁跳读、略读; + 2. 未读完全部信息前,禁止输出任何内容; + 3. 必须全覆盖所有约束、所有细节、所有字段后再推理; + 4. 禁止断章取义,禁止遗漏任何参数; + 5. 必须严格区分系统表单、用户表单。 + + 【绝对优先级规则 · 最高优先级】 + 1. 用户自然语言描述 > 用户表单(UserForm) > 系统表单(Form) + 2. 高优先级内容 100%% 覆盖低优先级内容,禁止冲突 + 3. 所有参数最终以【优先级最高】的描述为准 + + 【核心语义规则】 + 1. Form = 系统提示词、系统参数、默认配置 + 2. UserForm = 用户真实输入全文,所有字段都必须作为用户提示词来源 + 3. 若 UserForm 字段与 Form 含义相同 → UserForm 严格覆盖 Form + 4. 必须完整使用 UserForm 所有内容,不得遗漏任何一个字段 + + 【数量计算规则 · 必须严格遵守 · 带示例】 + 1. 文案与图片为【一一对应关系】:1条文案对应1张图 + 2. 示例1:2条文案,各配1张图 → 最终数量number=2 + 3. 示例2:3条文案,各配1张图 → 最终数量number=3 + 4. 禁止错误计算:2条文案×2张图=4(这种逻辑严禁出现) + 5. 最终number = 文案总条数 = 图片总张数(一一对应) + 6. 自动补全默认值:size=1024*1024(为空时必须填充) + + 【任务】 + 根据双表单内容,智能填充JSON结构: + 1. 理解意图:图片/文案 + 2. 按【优先级规则】确定最终参数 + 3. 按【数量一一对应规则】计算number + 4. 严格按结构输出,不修改字段 + + 【输出结构】 + %s + 【字段映射关系】 + %s + 【完整输入信息】 + %s + + 【输出铁律】 + 1. 只输出单行JSON,无任何多余字符 + 2. 禁止换行、禁止转义、禁止解释 + 3. 内容准确、无废话、不编造 + 4. 必须完整读取 UserForm 全部内容 + 5. 严格遵守【优先级】和【数量计算规则】 + + 请输出最终JSON: \ No newline at end of file diff --git a/service/build_service.go b/service/build_service.go index ee560b3..9bd7647 100644 --- a/service/build_service.go +++ b/service/build_service.go @@ -28,7 +28,7 @@ func buildInferenceRequest(ctx context.Context, req *dto.ComposeMessagesReq, ses messages := []map[string]any{} messages = append(messages, map[string]any{ "role": "system", - "content": GetSystemPrompt(req, model), + "content": GetSystemPrompt(ctx, req, model), }) // 2. 历史对话 - 动态添加(新增部分) @@ -77,82 +77,45 @@ func buildCombinedInput(req *dto.ComposeMessagesReq, prompt string) string { } // GetSystemPrompt 定义获取系统提示词的函数 -func GetSystemPrompt(req *dto.ComposeMessagesReq, model *entity.AsynchModel) string { +// GetSystemPrompt 从配置文件读取提示词 + 格式化变量 +func GetSystemPrompt(ctx context.Context, req *dto.ComposeMessagesReq, model *entity.AsynchModel) string { + // 1. 从配置文件读取提示词模板 + promptTpl := g.Cfg().MustGet(ctx, "projectPrompts", "").String() + if promptTpl == "" { + return "" + } + + // 2. 构建字段映射说明 mappingBytes, _ := json.Marshal(model.RequestMapping) mappingStr := string(mappingBytes) - // 解析 mapping var mapping map[string]string - _ = json.Unmarshal(mappingBytes, mapping) + _ = json.Unmarshal(mappingBytes, &mapping) - // 字段映射说明 var fieldDesc strings.Builder for key, path := range mapping { fieldDesc.WriteString(fmt.Sprintf("- %s → %s\n", key, path)) } - // ====================== - // 【核心】UserForm 全部内容完整展开,让模型必须全文阅读 - // 严格按你的业务定义:所有字段作为用户提示词来源 - // ====================== + // 3. 拼接 UserForm 全文(必须完整阅读) var userFormContent strings.Builder for k, v := range req.UserForm { userFormContent.WriteString(fmt.Sprintf("%s=%v;", k, v)) } userFormFullText := strings.TrimSuffix(userFormContent.String(), ";") - // 拼接双表单 + // 4. 双表单信息 formInfo := fmt.Sprintf(` 【系统表单(系统提示词/参数)】 %s - -【用户表单全文(必须完整阅读,全部作为用户提示词)】 +【用户表单全文(必须完整阅读,全部作为用户提示词来源)】 %s `, formToJSON(req.Form), userFormFullText) - - // 最终提示词(严格遵守你所有规则) - systemPrompt := fmt.Sprintf(` -你是【语义理解 + 结构对齐】的JSON生成专家,必须严格遵守以下所有规则。 - -【强制阅读规则 · 必须100%%遵守】 -1. 必须完整通读全部文本、上下文、规则、表单内容,严禁跳读、略读; -2. 未读完全部信息前,禁止输出任何内容; -3. 必须全覆盖所有约束、所有细节、所有字段后再推理; -4. 禁止断章取义,禁止遗漏任何参数; -5. 必须严格区分系统表单、用户表单。 - -【核心语义规则】 -1. Form = 系统提示词、系统参数、默认配置 -2. UserForm = 用户真实输入全文,所有字段都必须作为用户提示词来源 -3. 若 UserForm 字段与 Form 含义相同 → UserForm 严格覆盖 Form -4. 必须完整使用 UserForm 所有内容,不得遗漏任何一个字段 - -【任务】 -根据双表单内容,智能填充JSON结构: -1. 理解意图:图片/文案 -2. 自动推导数量:各2张=4,一共3张=3 -3. 自动补全默认值:size=1024*1024 -4. 严格按结构输出,不修改字段 - -【输出结构】 -%s -【字段映射关系】 -%s -【完整输入信息】 -%s - -【输出铁律】 -1. 只输出单行JSON,无任何多余字符 -2. 禁止换行、禁止转义、禁止解释 -3. 内容准确、无废话、不编造 -4. 必须完整读取 UserForm 全部内容 - -请输出最终JSON: -`, mappingStr, fieldDesc.String(), formInfo) - - return systemPrompt + // 5. 格式化最终提示词(替换配置里的 %s) + return fmt.Sprintf(promptTpl, mappingStr, fieldDesc.String(), formInfo) } +// formToJSON 工具函数不变 func formToJSON(form map[string]any) string { if form == nil { return "{}"