pref: Generate prompt

v3.2
zhangzhanwei 2025-09-28 09:35:41 +08:00 committed by zhanweizhang7
parent d466d0f512
commit 684b86f197
3 changed files with 88 additions and 15 deletions

View File

@ -7,13 +7,14 @@
@desc:
"""
import json
import os
from gettext import gettext
from typing import List, Dict
import uuid_utils.compat as uuid
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from rest_framework import serializers
from application.chat_pipeline.pipeline_manage import PipelineManage
@ -36,8 +37,9 @@ from common.exception.app_exception import AppApiException, AppChatNumOutOfBound
from common.handle.base_to_response import BaseToResponse
from common.handle.impl.response.openai_to_response import OpenaiToResponse
from common.handle.impl.response.system_to_response import SystemToResponse
from common.utils.common import flat_map
from common.utils.common import flat_map, get_file_content
from knowledge.models import Document, Paragraph
from maxkb.conf import PROJECT_DIR
from models_provider.models import Model, Status
from models_provider.tools import get_model_instance_by_model_workspace_id
@ -67,6 +69,7 @@ class GeneratePromptSerializers(serializers.Serializer):
if role not in ['user', 'ai']:
raise AppApiException(400, _("Authentication failed. Please verify that the parameters are correct."))
class ChatMessageSerializers(serializers.Serializer):
message = serializers.CharField(required=True, label=_("User Questions"))
stream = serializers.BooleanField(required=True,
@ -140,6 +143,7 @@ class DebugChatSerializers(serializers.Serializer):
"application_id": chat_info.application.id, "debug": True
}).chat(instance, base_to_response)
SYSTEM_ROLE = get_file_content(os.path.join(PROJECT_DIR, "apps", "chat", 'template', 'generate_prompt_system'))
class PromptGenerateSerializer(serializers.Serializer):
workspace_id = serializers.CharField(required=False, label=_('Workspace ID'))
@ -152,13 +156,14 @@ class PromptGenerateSerializer(serializers.Serializer):
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
if workspace_id:
query_set = query_set.filter(workspace_id=workspace_id)
if not query_set.exists():
application=query_set.first()
if application is None:
raise AppApiException(500, _('Application id does not exist'))
return application
def generate_prompt(self, instance: dict, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
GeneratePromptSerializers(data=instance).is_valid(raise_exception=True)
def generate_prompt(self, instance: dict):
application=self.is_valid(raise_exception=True)
GeneratePromptSerializers(data=instance).is_valid(raise_exception=True)
workspace_id = self.data.get('workspace_id')
model_id = self.data.get('model_id')
prompt = instance.get('prompt')
@ -169,17 +174,19 @@ class PromptGenerateSerializer(serializers.Serializer):
messages[-1]['content'] = q
model_exist = QuerySet(Model).filter(
id=model_id,
model_type = "LLM"
).exists()
id=model_id,
model_type="LLM"
).exists()
if not model_exist:
raise Exception(_("Model does not exists or is not an LLM model"))
def process():
model = get_model_instance_by_model_workspace_id(model_id=model_id, workspace_id=workspace_id)
system_content = SYSTEM_ROLE.format(application_name=application.name, detail=application.desc)
for r in model.stream([HumanMessage(content=m.get('content')) if m.get('role') == 'user' else AIMessage(
content=m.get('content')) for m in messages]):
def process():
model = get_model_instance_by_model_workspace_id(model_id=model_id, workspace_id=workspace_id,**application.model_params_setting)
for r in model.stream([SystemMessage(content=system_content),
*[HumanMessage(content=m.get('content')) if m.get('role') == 'user' else AIMessage(
content=m.get('content')) for m in messages]]):
yield 'data: ' + json.dumps({'content': r.content}) + '\n\n'
return to_stream_response_simple(process())

View File

@ -0,0 +1,66 @@
## 人设
你是一个专业的提示词生成优化专家擅长为各种智能体应用场景创建高质量的系统角色设定。你具有深厚的AI应用理解能力和丰富的提示词工程经验。
## 技能
1. 深度分析用户提供的智能体名称和功能描述
2. 根据应用场景生成结构化的系统角色设定
3. 优化提示词的逻辑结构和语言表达
4. 确保生成的角色设定具有清晰的人物设定、功能流程、约束限制和回复格式
当用户提供智能体信息时,你需要按照标准格式生成包含人物设定、功能和流程、约束与限制、回复格式四个核心模块的完整系统角色设定。
## 限制
1. 严格按照人物设定、功能和流程、约束与限制、回复格式的结构输出
2. 不输出与角色设定生成无关的内容
3. 如果用户输入信息不够明确,基于智能体名称和已有描述进行合理推测
## 回复格式
请严格按照以下格式输出:
# 角色:
角色简短描述一句话
## 目标:
角色的工作目标,如果有多目标可以分点列出,但建议更聚焦1-2个目标
## 核心技能:
### 技能 1: [技能名称,如作品推荐/信息查询/专业分析等]
1. [执行步骤1 - 描述该技能的第一个具体操作步骤,包括条件判断和处理方式]
2. [执行步骤2 - 描述该技能的第二个具体操作步骤,包括如何获取或处理信息]
3. [执行步骤3 - 描述该技能的最终输出步骤,说明如何呈现结果]
===回复示例===
- 📋 [标识符]: <具体内容格式说明>
- 🎯 [标识符]: <具体内容格式说明>
- 💡 [标识符]: <具体内容格式说明>
===示例结束===
### 技能 2: [技能名称]
1. [执行步骤1 - 描述触发条件和初始处理方式]
2. [执行步骤2 - 描述信息获取和深化处理的具体方法]
3. [执行步骤3 - 描述最终输出的具体要求和格式]
### 技能 3: [技能名称]
- [核心能力描述 - 说明该技能的主要作用和知识基础]
- [应用方法 - 描述如何运用该技能为用户提供服务,包括具体的实施方式]
## 工作流:
1. 描述角色工作流程的第一步
2. 描述角色工作流程的第二步
3. 描述角色工作流程的第三步
## 输出格式:
如果对角色的输出格式有特定要求,可以在这里强调并举例说明想要的输出格式
## 限制:
1. **严格限制回答范围**:仅回答与角色设定相关的问题。
- 如果用户提问与角色无关,必须使用以下固定格式回复:
“对不起,我只能回答与【角色设定】相关的问题,您的问题不在服务范围内。”
- 不得提供任何与角色设定无关的回答。
2. 描述角色在互动过程中需要遵循的限制条件2
3. 描述角色在互动过程中需要遵循的限制条件3
输出时不得包含任何解释或附加说明,只能返回符合以上格式的内容。
智能体名称: {application_name}
功能描述: {detail}

View File

@ -35,7 +35,7 @@ class ZhEnXunFeiSTTModelCredential(BaseForm, BaseModelCredential):
else:
return False
try:
model = provider.get_model(model_type, model_name, model_credential)
model = provider.get_model(model_type, model_name, model_credential, **model_params)
model.check_auth()
except Exception as e:
traceback.print_exc()