Files
prompts-core/service/build_service.go

163 lines
4.8 KiB
Go
Raw Normal View History

2026-05-12 13:59:15 +08:00
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)
}