diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/constant/AllPrompt.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/constant/AllPrompt.java index 6cb8124..b23f09a 100644 --- a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/constant/AllPrompt.java +++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/constant/AllPrompt.java @@ -26,6 +26,84 @@ public class AllPrompt { + RetryPrompt.RETRY_PROMPT; + public static final String GEN_PROMPT_AGENT_PROMPT = """ + 身份:你是一名Prompt Engineer,精通提示词开发和优化,帮助用户将大语言模型用于各场景和研究领域。同时你能针对市面上各种不同类型不同功能的大模型来进行定制化的提示词开发和优化。 + + ## 输入说明 + 你将收到两个输入: + 1. user:用户画像信息 + 2. aiModel:使用模型 + 3. userTarget:用户需求 + 4. userConversation:沟通详情 + + ## 注意事项: + ① 接下来我会为你提供"用户画像信息", "使用模型","用户需求","沟通详情" 这四个关键数据。请基于这四个关键信息,为用户生成提示词内容。 + ② 用户画像信息:用户画像信息代表着用户的身份信息,同一个需求不同用户所需要求也是不同的,你可以参考该字段来进行一些定制化的提示词生成 + ③ 使用模型:使用模型即为用户准备使用什么模型来实现该需求,不同的模型所需的提示词也是不同的。作为提示词Prompt Engineer,你需要了解当前模型的提示词格式,构建基于该模型最优的提示词。 + ④ 用户需求:用户目标需求,最终想要基于使用模型实现的目标。接下来你的提示词生成不能偏离用户需求 + ⑤ 沟通详情:用户与需求经理基于自身需求进行的沟通和补充,这是十分关键的数据,这个数据包含了更加详尽的信息。沟通详情是一个树型结构,请你基于该数据结构详细分析用户与需求经理整个沟通过程,你需要基于沟通详情来丰富,详细化,优化提示词的生成。 + - 沟通详情数据结构:我会为你返回一个数组,数组每个元素是一个沟通节点,沟通节点有多种类型,每个节点包含了"节点id:id","父节点id:parentId","提问:question","回答:answer"等四个成员属性。每棵树必然存在一个根节点,一个节点下会有0~N个子节点。节点之间的父子关系说明问题之间存在关联关系。父节点id为空则代表此节点为根节点,是一个需求沟通的开始。一个节点存在提问但是不一定会有回答请注意。 + \s + ## 沟通节点类型: + ### 单选类型 + { + "id":"节点id", + "question": "选择问题描述", + "type": "single", + "parentId": "对话ID", + "options": [ + { + "id": "选项标识", + "label": "选项显示文本" + } + ], + "desc": "问题的详细说明、引导提示或补充解释" // 可选 + } + \s + ### 多选类型 + { + "id":"节点id", + "question": "选择问题描述", + "type": "multi", + "parentId": "对话ID", + "options": [ + { + "id": "选项标识", + "label": "选项显示文本" + } + ], + "desc": "问题的详细说明、引导提示或补充解释" // 可选 + } + \s + ### 表单类型 + + { + "id":"节点id", + "question": "表单引导语", + "type": "form", + "parentId": "对话ID", + "fields": [ + { + "id": "字段标识", + "question": "字段问题描述", + "type": "input|single|multi", + "options": [ + { + "id": "选项标识", + "label": "选项显示文本" + } + ], // 仅single/multi类型需要 + "desc": "字段的详细说明或引导", // 可选 + "weight": "权重分数" + } + ], + "desc": "表单的详细说明、填写引导或补充解释" // 可选 + } + + ## 返回结果格式: + 你只需要返回生成的提示词即可,不要返回其他任何和提示词无关的额外的内容。 + """; + public static void main(String[] args) { System.out.println(GLOBAL_PROMPT); } diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/application/ConversationService.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/application/ConversationService.java index 7c98b2a..8f9e1ce 100644 --- a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/application/ConversationService.java +++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/application/ConversationService.java @@ -2,9 +2,14 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.github.timemachinelab.core.constant.AllPrompt; import com.suifeng.sfchain.core.AIService; import io.github.timemachinelab.core.session.domain.entity.ConversationSession; +import io.github.timemachinelab.core.session.infrastructure.ai.GenPromptOperation; import io.github.timemachinelab.core.session.infrastructure.ai.QuestionGenerationOperation; +import io.github.timemachinelab.sfchain.core.AIService; +import io.github.timemachinelab.util.QaTreeSerializeUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -32,7 +37,29 @@ public void processUserMessage(String userId, String userMessage, Consumer sseCallback){ + ConversationSession session = sessionManagementService.getSessionById(sessionId); + GenPromptOperation.GpRequest req = new GenPromptOperation.GpRequest(); + + try { + req.setPrompt(AllPrompt.GEN_PROMPT_AGENT_PROMPT); + req.setUser(session.getUser()); + req.setUserTarget(session.getUserTarget()); + req.setAiModel(session.getAiModel()); + req.setUserConversation(QaTreeSerializeUtil.serialize(session.getQaTree())); + + GenPromptOperation.GpResponse aiResponse = aiService.execute("PromptGenMaster", req); + sseCallback.accept(aiResponse); + }catch (Exception e){ + log.error("生成提示词失败 :{}",e.getMessage()); + GenPromptOperation.GpResponse resp = new GenPromptOperation.GpResponse(); + resp.setGenPrompt("生成提示词失败,请重试"); + sseCallback.accept(resp); + } + + } + private void processAIResponse(String userMessage, Consumer sseCallback) { try { diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/domain/entity/ConversationSession.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/domain/entity/ConversationSession.java index 29fa0b2..fd21e5a 100644 --- a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/domain/entity/ConversationSession.java +++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/domain/entity/ConversationSession.java @@ -24,6 +24,12 @@ public class ConversationSession { private QaTree qaTree; // 移除final,允许后续设置 private final LocalDateTime createTime; private LocalDateTime updateTime; + + private String user; //用户画像 + private String userTarget; // 用户目标 + private String aiModel; // AI模型 + + private String genPrompt; // 生成提示词 // 节点ID自增计数器,从1开始 private final AtomicInteger nodeIdCounter = new AtomicInteger(0); diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/ConversationOperation.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/ConversationOperation.java index 4381229..7ec6a3e 100644 --- a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/ConversationOperation.java +++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/ConversationOperation.java @@ -6,14 +6,14 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -@AIOp(value = "CONVERSATION_OP", - description = "基于QATree的智能会话操作,支持上下文理解和结构化对话", - defaultModel = "gpt-4-turbo", - requireJsonOutput = true, - supportThinking = true, - defaultMaxTokens = 2048, - defaultTemperature = 0.8) -@Component +//@AIOp(value = "CONVERSATION_OP", +// description = "基于QATree的智能会话操作,支持上下文理解和结构化对话", +// defaultModel = "gpt-4-turbo", +// requireJsonOutput = true, +// supportThinking = true, +// defaultMaxTokens = 2048, +// defaultTemperature = 0.8) +//@Component @Slf4j public class ConversationOperation extends BaseAIOperation { diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/GenPromptOperation.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/GenPromptOperation.java new file mode 100644 index 0000000..647ed1b --- /dev/null +++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/infrastructure/ai/GenPromptOperation.java @@ -0,0 +1,49 @@ +package io.github.timemachinelab.core.session.infrastructure.ai; + +import com.alibaba.fastjson2.JSONObject; +import io.github.timemachinelab.sfchain.annotation.AIOp; +import io.github.timemachinelab.sfchain.core.BaseAIOperation; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@AIOp(value = "PromptGenMaster", + description = "提示词生成大师" +) +@Component +@Slf4j +public class GenPromptOperation extends BaseAIOperation { + + + @Override + protected String buildPrompt(GpRequest gpRequest) { + + return JSONObject.toJSONString(gpRequest); + } + + @Override + protected GpResponse parseResult(String jsonContent, GpRequest gpRequest) { + GpResponse gpResponse = new GpResponse(); + gpResponse.setGenPrompt(jsonContent); + return gpResponse; + } + + @Data + public static class GpRequest { + + private String prompt; + + private String user; + + private String aiModel; + + private String userTarget; + + private String userConversation; + } + + @Data + public static class GpResponse { + private String genPrompt; + } +}