Files
prompts-core/service/build_service.go
2026-05-12 13:59:15 +08:00

163 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"context"
"encoding/json"
"fmt"
"prompts-core/model/dto"
"prompts-core/model/entity"
"strings"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
// 获取系统模型提示词
func getConfPrompt(ctx context.Context, modelType int) string {
return g.Cfg().MustGet(ctx, "modelPrompts.types."+gconv.String(modelType), "").String()
}
func buildInferenceRequest(ctx context.Context, req *dto.ComposeMessagesReq, sessionModel *entity.AsynchModel, model *entity.AsynchModel, historyMessages []Message) (map[string]any, error) {
// 读取 task 相关的配置
// 构建消息数组
// 1. 系统提示词(不动)
fmt.Println("打印sessionModel结果", sessionModel)
fmt.Println("打印model结果", model)
messages := []map[string]any{}
messages = append(messages, map[string]any{
"role": "system",
"content": GetSystemPrompt(req, model),
})
// 2. 历史对话 - 动态添加(新增部分)
for _, msg := range historyMessages {
messages = append(messages, map[string]any{
"role": msg.Role,
"content": msg.GetContentString(),
})
}
// 3. 当前用户问题(原来的最后一条)
messages = append(messages, map[string]any{
"role": "user",
"content": buildCombinedInput(req, getConfPrompt(ctx, model.ModelsType)),
})
// 构建请求体
return map[string]any{
"modelName": sessionModel.ModelName,
"bizName": "prompts-core",
"callbackUrl": "/prompt/callback",
"requestPayload": map[string]any{
"model": sessionModel.ModelName,
"messages": messages,
"stream": false,
},
}, nil
}
// ============================================
// 输入构建
// ============================================
func buildCombinedInput(req *dto.ComposeMessagesReq, prompt string) string {
payload := map[string]any{
//数据库提示信息
"promptInfo": prompt,
// 系统表单
"form": req.Form,
// 用户表单
"userForm": req.UserForm,
//文件url
"userFiles": req.UserFiles,
//解读文件(只支持可读类型 如xmljson,yaml
"userFilesText": fetchFileTexts(context.Background(), req.UserFiles),
}
return mustMarshal(payload)
}
// GetSystemPrompt 定义获取系统提示词的函数
func GetSystemPrompt(req *dto.ComposeMessagesReq, model *entity.AsynchModel) string {
mappingBytes, _ := json.Marshal(model.RequestMapping)
mappingStr := string(mappingBytes)
// 解析 mapping
var mapping map[string]string
_ = json.Unmarshal(mappingBytes, mapping)
// 字段映射说明
var fieldDesc strings.Builder
for key, path := range mapping {
fieldDesc.WriteString(fmt.Sprintf("- %s → %s\n", key, path))
}
// ======================
// 【核心】UserForm 全部内容完整展开,让模型必须全文阅读
// 严格按你的业务定义:所有字段作为用户提示词来源
// ======================
var userFormContent strings.Builder
for k, v := range req.UserForm {
userFormContent.WriteString(fmt.Sprintf("%s=%v", k, v))
}
userFormFullText := strings.TrimSuffix(userFormContent.String(), "")
// 拼接双表单
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
}
func formToJSON(form map[string]any) string {
if form == nil {
return "{}"
}
b, _ := json.Marshal(form)
return string(b)
}