|
@@ -2,13 +2,13 @@
|
|
|
提示词获取节点
|
|
提示词获取节点
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
|
|
+from locale import currency
|
|
|
from typing import Dict, Any, Optional
|
|
from typing import Dict, Any, Optional
|
|
|
-from unittest import result
|
|
|
|
|
from src.datasets.parser.core.base import BaseNode
|
|
from src.datasets.parser.core.base import BaseNode
|
|
|
|
|
+from src.model.qwen_vl import QWenVLParser
|
|
|
from src.api.db.services.prompt_service import get_prompt_service
|
|
from src.api.db.services.prompt_service import get_prompt_service
|
|
|
from src.common.logging_config import get_logger
|
|
from src.common.logging_config import get_logger
|
|
|
|
|
|
|
|
-
|
|
|
|
|
logger = get_logger(__name__)
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
@@ -19,7 +19,7 @@ class PromptRetrievalNode(BaseNode):
|
|
|
从数据库获取指定维度的激活提示词。
|
|
从数据库获取指定维度的激活提示词。
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
- def __init__(self, dimension_id: int):
|
|
|
|
|
|
|
+ def __init__(self, dimension_id: int, use_book_image: bool = False):
|
|
|
"""
|
|
"""
|
|
|
初始化提示词获取节点
|
|
初始化提示词获取节点
|
|
|
|
|
|
|
@@ -27,6 +27,7 @@ class PromptRetrievalNode(BaseNode):
|
|
|
dimension_id: 维度ID
|
|
dimension_id: 维度ID
|
|
|
"""
|
|
"""
|
|
|
self.dimension_id = dimension_id
|
|
self.dimension_id = dimension_id
|
|
|
|
|
+ self.use_book_image = False
|
|
|
self._prompt_service = None
|
|
self._prompt_service = None
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
@@ -40,6 +41,83 @@ class PromptRetrievalNode(BaseNode):
|
|
|
if self._prompt_service is None:
|
|
if self._prompt_service is None:
|
|
|
self._prompt_service = get_prompt_service()
|
|
self._prompt_service = get_prompt_service()
|
|
|
return self._prompt_service
|
|
return self._prompt_service
|
|
|
|
|
+
|
|
|
|
|
+ def _default_prompt_template(self, is_book_image: bool = False) -> str:
|
|
|
|
|
+ """
|
|
|
|
|
+ 默认的图像解析提示词模板
|
|
|
|
|
+
|
|
|
|
|
+ Args:
|
|
|
|
|
+ is_book_image: 是否为完整书本图片模式
|
|
|
|
|
+ """
|
|
|
|
|
+ if is_book_image:
|
|
|
|
|
+ return """
|
|
|
|
|
+ 角色定位:你是一位顶尖的儿童绘本分析师与视觉工程专家,擅长将插画视觉信息转化为高精度的结构化元数据。
|
|
|
|
|
+ 任务描述:请深度解析提供的完整绘本图片(包含所有页面),提取基本要素和特征。
|
|
|
|
|
+
|
|
|
|
|
+ 输出格式:JSON
|
|
|
|
|
+ {{
|
|
|
|
|
+ "content": "完整绘本内容描述",
|
|
|
|
|
+ "elements": []
|
|
|
|
|
+ }}
|
|
|
|
|
+ """
|
|
|
|
|
+ else:
|
|
|
|
|
+ return """
|
|
|
|
|
+ 角色定位:你是一位顶尖的儿童绘本分析师与视觉工程专家,擅长将插画视觉信息转化为高精度的结构化元数据。
|
|
|
|
|
+ 任务描述:请深度解析提供的绘本页面,提取基本要素和特征。
|
|
|
|
|
+ 当前提取页码为:{page_number}
|
|
|
|
|
+
|
|
|
|
|
+ 输出格式:JSON
|
|
|
|
|
+ {{
|
|
|
|
|
+ "page_number": {page_number},
|
|
|
|
|
+ "content": "页面内容描述",
|
|
|
|
|
+ "elements": []
|
|
|
|
|
+ }}
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
|
|
+ # 提示词拼装
|
|
|
|
|
+ def _assemble_prompt(self, dimension_prompt: str, state: Any) -> str:
|
|
|
|
|
+ """
|
|
|
|
|
+ 拼装完整提示词
|
|
|
|
|
+
|
|
|
|
|
+ Args:
|
|
|
|
|
+ preceding_node: 前一节点名称
|
|
|
|
|
+ dimension_prompt: 维度提示词
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ 完整提示词字符串
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
|
|
+ decomposition_methods = getattr(state, 'decomposition_methods', None)
|
|
|
|
|
+ original_filename = getattr(state, 'original_filename', None)
|
|
|
|
|
+ preceding_node = decomposition_methods[self.dimension_id]["preced_node"]
|
|
|
|
|
+
|
|
|
|
|
+ prompt_template = dimension_prompt or self._default_prompt_template(is_book_image=self.use_book_image)
|
|
|
|
|
+
|
|
|
|
|
+ # 从temp目录下读取preceding_node中包含的markdown文件获取content列表
|
|
|
|
|
+ content = []
|
|
|
|
|
+ for node in preceding_node:
|
|
|
|
|
+ current_content = ""
|
|
|
|
|
+ with open(f"temp/{original_filename}_{node}.md", "r", encoding="utf-8") as f:
|
|
|
|
|
+ current_content = f.read()
|
|
|
|
|
+ content.append(current_content)
|
|
|
|
|
+ chat_model = QWenVLParser(self.model_name)
|
|
|
|
|
+ # 使用大语言模型对content列表中的content进行整合、压缩
|
|
|
|
|
+ system_prompt = """
|
|
|
|
|
+ 你是一个高级数据处理助手。请对输入的 内容 进行结构化压缩。
|
|
|
|
|
+
|
|
|
|
|
+ 工作流:
|
|
|
|
|
+ - 分类: 扫描所有内容,根据主题将其归类。
|
|
|
|
|
+ - 合并: 将相同主题下的不同描述合并,合并时保留所有独特的细节(如特定的数值、专有名词)。
|
|
|
|
|
+ - 精简: 使用短语或精炼的句子改写冗长的描述。
|
|
|
|
|
+
|
|
|
|
|
+ 约束条件:
|
|
|
|
|
+ - 使用 Markdown 无序列表格式输出。
|
|
|
|
|
+ - 每个要点必须是独立的知识点。
|
|
|
|
|
+ - 禁止生成模棱两可的总结,必须保留具体的技术参数或关键事实。
|
|
|
|
|
+ """
|
|
|
|
|
+ # 将content列表中的内容合并为一个字符串
|
|
|
|
|
+ compressed_content = chat_model.chat("\n".join(content), system_prompt)
|
|
|
|
|
+ return prompt_template.format(content=compressed_content)
|
|
|
|
|
|
|
|
def execute(self, state: Any) -> Dict[str, Any]:
|
|
def execute(self, state: Any) -> Dict[str, Any]:
|
|
|
"""
|
|
"""
|
|
@@ -65,9 +143,9 @@ class PromptRetrievalNode(BaseNode):
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
logger.info(f"[Prompt-{self.dimension_id}] 提示词获取成功")
|
|
logger.info(f"[Prompt-{self.dimension_id}] 提示词获取成功")
|
|
|
-
|
|
|
|
|
|
|
+ prompt_template = self._assemble_prompt(result.get('content'), state)
|
|
|
return {
|
|
return {
|
|
|
- "dimension_prompt": result.get('content'),
|
|
|
|
|
|
|
+ "dimension_prompt": prompt_template,
|
|
|
"dataset_id": result.get('dataset_id'),
|
|
"dataset_id": result.get('dataset_id'),
|
|
|
"dimension_id": self.dimension_id
|
|
"dimension_id": self.dimension_id
|
|
|
}
|
|
}
|