diff --git a/apps/chat/serializers/chat.py b/apps/chat/serializers/chat.py index 0851235ae2e..c59d2b6043d 100644 --- a/apps/chat/serializers/chat.py +++ b/apps/chat/serializers/chat.py @@ -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.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 @@ def is_valid(self, *, raise_exception=False): 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 @@ def chat(self, instance: dict, base_to_response: BaseToResponse = SystemToRespon "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 @@ def is_valid(self, *, raise_exception=False): 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 @@ def generate_prompt(self, instance: dict, with_valid=True): 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()) diff --git a/apps/chat/template/generate_prompt_system b/apps/chat/template/generate_prompt_system new file mode 100644 index 00000000000..971b3e86534 --- /dev/null +++ b/apps/chat/template/generate_prompt_system @@ -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} \ No newline at end of file diff --git a/apps/models_provider/impl/xf_model_provider/credential/zh_en_stt.py b/apps/models_provider/impl/xf_model_provider/credential/zh_en_stt.py index 05c0e4e1712..ebf5ce29cdf 100644 --- a/apps/models_provider/impl/xf_model_provider/credential/zh_en_stt.py +++ b/apps/models_provider/impl/xf_model_provider/credential/zh_en_stt.py @@ -35,7 +35,7 @@ def is_valid(self, 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()