guantao 6 дней назад
Родитель
Сommit
3b5f889099
44 измененных файлов с 7397 добавлено и 50 удалено
  1. 409 19
      agent/core/runner.py
  2. 408 3
      agent/memory/skills/research.md
  3. 8 1
      agent/tools/builtin/__init__.py
  4. 559 0
      agent/tools/builtin/knowledge.py
  5. 3 2
      agent/tools/registry.py
  6. 8 1
      agent/trace/store.py
  7. 33 5
      examples/restore/input/person_invariant_features.json
  8. 49 19
      examples/restore/production.prompt
  9. 1 0
      examples/restore/run.py
  10. BIN
      examples/restore_old/input/images/img_1.jpg
  11. BIN
      examples/restore_old/input/images/img_2.jpg
  12. BIN
      examples/restore_old/input/images/img_3.jpg
  13. BIN
      examples/restore_old/input/images/img_5.jpg
  14. BIN
      examples/restore_old/input/images/img_6.jpg
  15. BIN
      examples/restore_old/input/images/img_7.jpg
  16. BIN
      examples/restore_old/input/images/img_8.jpg
  17. BIN
      examples/restore_old/input/images/img_9.jpg
  18. 11 0
      examples/restore_old/input/images/set_invariant_features.json
  19. 29 0
      examples/restore_old/input/paragraphs/00_基础信息.json
  20. 215 0
      examples/restore_old/input/paragraphs/01_图片分段_01_g1_户外绘画场景.json
  21. 186 0
      examples/restore_old/input/paragraphs/01_图片分段_02_g1_户外绘画场景.json
  22. 215 0
      examples/restore_old/input/paragraphs/01_图片分段_03_g1_户外绘画场景.json
  23. 185 0
      examples/restore_old/input/paragraphs/01_图片分段_04_g1_户外绘画场景.json
  24. 213 0
      examples/restore_old/input/paragraphs/01_图片分段_05_g2_户外绘画场景.json
  25. 213 0
      examples/restore_old/input/paragraphs/01_图片分段_06_g2_户外绘画场景.json
  26. 334 0
      examples/restore_old/input/paragraphs/01_图片分段_07_g3_人物与玫瑰花.json
  27. 214 0
      examples/restore_old/input/paragraphs/01_图片分段_08_g1_户外绘画场景.json
  28. 186 0
      examples/restore_old/input/paragraphs/01_图片分段_09_g1_户外绘画场景.json
  29. 249 0
      examples/restore_old/input/paragraphs/02_图片形式_01.json
  30. 231 0
      examples/restore_old/input/paragraphs/02_图片形式_02.json
  31. 265 0
      examples/restore_old/input/paragraphs/02_图片形式_03.json
  32. 203 0
      examples/restore_old/input/paragraphs/02_图片形式_04.json
  33. 255 0
      examples/restore_old/input/paragraphs/02_图片形式_05.json
  34. 267 0
      examples/restore_old/input/paragraphs/02_图片形式_06.json
  35. 353 0
      examples/restore_old/input/paragraphs/02_图片形式_07.json
  36. 228 0
      examples/restore_old/input/paragraphs/02_图片形式_08.json
  37. 236 0
      examples/restore_old/input/paragraphs/02_图片形式_09.json
  38. 137 0
      examples/restore_old/input/paragraphs/03_图片制作点实质结果.json
  39. 738 0
      examples/restore_old/input/paragraphs/04_图片制作点形式结果.json
  40. BIN
      examples/restore_old/input/person.jpg
  41. 7 0
      examples/restore_old/input/person_invariant_features.json
  42. 84 0
      examples/restore_old/input/readme.md
  43. 43 0
      examples/restore_old/production.prompt
  44. 622 0
      examples/restore_old/run.py

+ 409 - 19
agent/core/runner.py

@@ -79,8 +79,11 @@ class RunConfig:
     # --- 额外 LLM 参数(传给 llm_call 的 **kwargs)---
     extra_llm_params: Dict[str, Any] = field(default_factory=dict)
 
+    # --- 研究流程控制 ---
+    enable_research_flow: bool = True  # 是否启用自动研究流程(知识检索→经验检索→调研→计划)
 
-# 内置工具列表(始终自动加载)
+
+    # 内置工具列表(始终自动加载)
 BUILTIN_TOOLS = [
     # 文件操作工具
     "read_file",
@@ -104,6 +107,13 @@ BUILTIN_TOOLS = [
     "get_experience",
     "get_search_suggestions",
 
+    # 知识管理工具
+    "search_knowledge",
+    "save_knowledge",
+    "update_knowledge",
+    "list_knowledge",
+    
+
     # 沙箱工具
     # "sandbox_create_environment",
     # "sandbox_run_shell",
@@ -230,6 +240,9 @@ class AgentRunner:
         self._cancel_events: Dict[str, asyncio.Event] = {}  # trace_id → cancel event
         self.used_ex_ids: List[str] = []  # 当前运行中使用过的经验 ID
 
+        # 研究流程状态管理(每个 trace 独立)
+        self._research_states: Dict[str, Dict[str, Any]] = {}  # trace_id → research_state
+
     # ===== 核心公开方法 =====
 
     async def run(
@@ -641,8 +654,308 @@ class AgentRunner:
         if self.trace_store and head_seq is not None:
             await self.trace_store.update_trace(trace_id, head_sequence=head_seq)
 
+        # 6. 初始化研究流程(仅在新建 trace 且启用研究流程时)
+        if config.enable_research_flow and not config.trace_id:
+            await self._init_research_flow(trace_id, new_messages, goal_tree, config)
+
         return history, sequence, created_messages, head_seq or 0
 
+    async def _init_research_flow(
+        self,
+        trace_id: str,
+        messages: List[Dict],
+        goal_tree: Optional[GoalTree],
+        config: RunConfig,
+    ):
+        """
+        初始化研究流程状态
+
+        研究流程阶段:
+        1. knowledge_search: 知识库检索
+        2. experience_search: 经验库检索
+        3. research_decision: 决定是否需要调研
+        4. research: 执行调研(如果需要)
+        5. planning: 制定计划
+        6. execution: 正常执行
+        """
+        # 提取任务描述
+        task_desc = self._extract_task_description(messages)
+
+        # 初始化研究状态
+        self._research_states[trace_id] = {
+            "stage": "knowledge_search",  # 当前阶段
+            "task_desc": task_desc,
+            "knowledge_found": False,
+            "experience_found": False,
+            "need_research": False,
+            "research_completed": False,
+            "planning_completed": False,
+            "knowledge_results": [],
+            "experience_results": [],
+        }
+
+        logger.info(f"[Research Flow] 初始化研究流程: {task_desc[:50]}...")
+
+    def _extract_task_description(self, messages: List[Dict]) -> str:
+        """从消息中提取任务描述"""
+        for msg in messages:
+            if msg.get("role") == "user":
+                content = msg.get("content", "")
+                if isinstance(content, str):
+                    return content
+                elif isinstance(content, list):
+                    for part in content:
+                        if isinstance(part, dict) and part.get("type") == "text":
+                            return part.get("text", "")
+        return "未知任务"
+
+    def _get_research_state(self, trace_id: str) -> Optional[Dict[str, Any]]:
+        """获取研究流程状态"""
+        return self._research_states.get(trace_id)
+
+    def _update_research_stage(self, trace_id: str, stage: str, **kwargs):
+        """更新研究流程阶段"""
+        if trace_id in self._research_states:
+            self._research_states[trace_id]["stage"] = stage
+            self._research_states[trace_id].update(kwargs)
+            logger.info(f"[Research Flow] 阶段切换: {stage}")
+
+    def _build_research_guide(self, research_state: Dict[str, Any]) -> str:
+        """根据研究流程状态构建引导消息"""
+        stage = research_state["stage"]
+        task_desc = research_state["task_desc"]
+
+        if stage == "knowledge_search":
+            return f"""
+## 🔍 研究流程 - 阶段 1: 知识库检索
+
+当前任务: {task_desc}
+
+**请立即执行以下操作**:
+1. 使用 `search_knowledge(query="{task_desc[:100]}")` 检索知识库
+2. 检查返回的知识是否足够完成任务
+3. 如果找到相关知识,记录下来并继续下一阶段
+
+注意:这是强制步骤,必须先检索知识库再继续。
+"""
+
+        elif stage == "experience_search":
+            knowledge_results = research_state.get("knowledge_results", [])
+            knowledge_summary = f"找到 {len(knowledge_results)} 条相关知识" if knowledge_results else "未找到相关知识"
+
+            return f"""
+## 🔍 研究流程 - 阶段 2: 经验库检索
+
+知识库检索结果: {knowledge_summary}
+
+**请立即执行以下操作**:
+1. 使用 `get_experience(query="{task_desc[:100]}", k=3)` 检索经验库
+2. 结合知识库和经验库的结果,评估是否需要进行调研
+3. 如果知识+经验足够,可以跳过调研直接进入计划阶段
+
+注意:这是强制步骤,必须检索经验库。
+"""
+
+        elif stage == "research_decision":
+            knowledge_results = research_state.get("knowledge_results", [])
+            experience_results = research_state.get("experience_results", [])
+
+            # 构建知识库摘要
+            knowledge_summary = "### 知识库检索结果\n\n"
+            if knowledge_results:
+                knowledge_summary += f"找到 {len(knowledge_results)} 条相关知识:\n\n"
+                for i, item in enumerate(knowledge_results[:5], 1):  # 最多显示 5 条
+                    tags = item.get("tags", [])
+                    summary = item.get("summary", "")
+                    knowledge_summary += f"{i}. [{', '.join(tags)}] {summary[:150]}...\n"
+                if len(knowledge_results) > 5:
+                    knowledge_summary += f"\n(还有 {len(knowledge_results) - 5} 条知识未显示)\n"
+            else:
+                knowledge_summary += "❌ 未找到相关知识\n"
+
+            # 构建经验库摘要
+            experience_summary = "\n### 经验库检索结果\n\n"
+            if experience_results:
+                experience_summary += f"找到 {len(experience_results)} 条相关经验:\n\n"
+                for i, item in enumerate(experience_results[:5], 1):  # 最多显示 5 条
+                    exp_id = item.get("id", "unknown")
+                    content = item.get("content", "")
+                    # 提取第一行作为摘要
+                    first_line = content.split('\n')[0] if content else ""
+                    experience_summary += f"{i}. [{exp_id}] {first_line[:150]}...\n"
+                if len(experience_results) > 5:
+                    experience_summary += f"\n(还有 {len(experience_results) - 5} 条经验未显示)\n"
+            else:
+                experience_summary += "❌ 未找到相关经验\n"
+
+            return f"""
+## 🤔 研究流程 - 阶段 3: 决定是否调研
+
+当前任务: {task_desc}
+
+{knowledge_summary}
+{experience_summary}
+
+---
+
+**现在请你评估并明确回答以下问题**:
+
+1. **现有信息是否足够完成任务?**
+   - 如果知识库和经验库的信息已经足够,请回答:"无需调研,现有信息充足"
+   - 如果信息不足或缺少关键知识,请回答:"需要调研"
+
+2. **如果需要调研,请列出具体需要调研的问题**:
+   - 缺少哪些工具或方法的信息?
+   - 缺少哪些案例或最佳实践?
+   - 需要了解哪些定义或原理?
+
+**重要**:
+- 请在回复中明确包含"无需调研"或"需要调研"这几个字,以便系统自动判断下一步操作
+- **本阶段只需要回复判断结果,不要调用任何工具(包括 goal 工具)**
+- 系统会根据你的判断自动进入下一阶段(调研或计划)
+
+根据你的判断,系统会自动进入下一阶段(调研或计划)。
+"""
+
+        elif stage == "research":
+            # 读取 research.md 的内容
+            research_skill_content = ""
+            research_skill_path = os.path.join(
+                os.path.dirname(__file__),
+                "..", "memory", "skills", "research.md"
+            )
+            try:
+                with open(research_skill_path, "r", encoding="utf-8") as f:
+                    research_skill_content = f.read()
+            except Exception as e:
+                logger.warning(f"无法读取 research.md: {e}")
+                research_skill_content = "(无法加载 research.md 内容)"
+
+            return f"""
+## 📚 研究流程 - 阶段 4: 执行调研
+
+现有信息不足,需要进行调研。
+
+---
+
+{research_skill_content}
+
+---
+
+**请按照上述 research.md 中的方法执行调研**:
+
+1. **拆解搜索维度**:使用 `goal(add="...")` 创建调研子目标
+2. **多维度搜索**:使用 `search_posts` 搜索相关信息
+3. **结构化记录**:使用 `save_knowledge` 保存每条有价值的知识
+4. **完成标记**:调研完成后,使用 `goal(done="...")` 标记完成
+
+**注意**:
+- 每发现一条有价值的信息,立即使用 `save_knowledge` 保存
+- 调研完成后会自动进入计划阶段
+"""
+
+        elif stage == "planning":
+            return f"""
+## 📋 研究流程 - 阶段 5: 制定计划
+
+调研已完成,现在需要制定执行计划。
+
+**请使用 goal 工具制定计划**:
+1. 参考 `agent/memory/skills/planning.md` 中的计划方法
+2. 使用 `goal(add="...")` 创建目标树
+3. 将任务拆解为可执行的子目标
+4. 使用 `goal(focus="...")` 聚焦到第一个目标
+
+计划完成后会自动打印 goal tree 并进入执行阶段。
+"""
+
+        return ""
+
+    async def _handle_research_flow_transition(
+        self,
+        trace_id: str,
+        tool_name: str,
+        tool_result: Any,
+        goal_tree: Optional[GoalTree],
+    ):
+        """处理研究流程的状态转换"""
+        research_state = self._get_research_state(trace_id)
+        if not research_state:
+            return
+
+        stage = research_state["stage"]
+
+        # 阶段 1: 知识库检索完成
+        if stage == "knowledge_search" and tool_name == "search_knowledge":
+            # 提取知识检索结果
+            # tool_result 现在总是 dict,包含 {"text": ..., "metadata": ...}
+            items = []
+            if isinstance(tool_result, dict):
+                metadata = tool_result.get("metadata", {})
+                items = metadata.get("items", [])
+
+            self._update_research_stage(
+                trace_id,
+                "experience_search",
+                knowledge_found=len(items) > 0,
+                knowledge_results=items
+            )
+            logger.info(f"[Research Flow] 知识检索完成,找到 {len(items)} 条知识")
+
+        # 阶段 2: 经验库检索完成
+        elif stage == "experience_search" and tool_name == "get_experience":
+            # 提取经验检索结果
+            experience_items = []
+            if isinstance(tool_result, dict):
+                experience_items = tool_result.get("items", [])
+            elif isinstance(tool_result, str):
+                # 解析字符串结果
+                try:
+                    import json
+                    parsed = json.loads(tool_result)
+                    experience_items = parsed.get("items", [])
+                except:
+                    pass
+
+            self._update_research_stage(
+                trace_id,
+                "research_decision",
+                experience_found=len(experience_items) > 0,
+                experience_results=experience_items
+            )
+            logger.info(f"[Research Flow] 经验检索完成,找到 {len(experience_items)} 条经验")
+
+        # 阶段 3: 调研决策(通过 assistant 的文本回复判断)
+        # 这个阶段的转换在 assistant 回复后处理,不在这里
+
+        # 阶段 4: 调研完成(检测到 save_knowledge 调用)
+        elif stage == "research" and tool_name == "save_knowledge":
+            # 标记调研完成,进入计划阶段
+            self._update_research_stage(
+                trace_id,
+                "planning",
+                research_completed=True
+            )
+            logger.info(f"[Research Flow] 调研完成,进入计划阶段")
+
+        # 阶段 5: 计划完成(检测到 goal 工具调用)
+        elif stage == "planning" and tool_name == "goal":
+            # 检查是否创建了 goal tree
+            if goal_tree and goal_tree.goals:
+                self._update_research_stage(
+                    trace_id,
+                    "execution",
+                    planning_completed=True
+                )
+                logger.info(f"[Research Flow] 计划完成,进入执行阶段")
+
+                # 打印 goal tree
+                print("\n" + "="*60)
+                print("📋 Goal Tree 已创建:")
+                print("="*60)
+                print(goal_tree.to_prompt())
+                print("="*60 + "\n")
+
     # ===== Phase 3: AGENT LOOP =====
 
     async def _agent_loop(
@@ -788,11 +1101,25 @@ class AgentRunner:
             # 构建 LLM messages(注入上下文)
             llm_messages = list(history)
 
+            # 收集需要持久化的 system 消息
+            system_messages_to_persist = []
+
+            # 研究流程引导(仅在启用且处于研究阶段时)
+            research_state = self._get_research_state(trace_id)
+            if research_state and research_state["stage"] != "execution":
+                research_guide = self._build_research_guide(research_state)
+                if research_guide:
+                    system_msg = {"role": "system", "content": research_guide}
+                    llm_messages.append(system_msg)
+                    system_messages_to_persist.append(("研究流程引导", system_msg))
+
             # 周期性注入 GoalTree + Collaborators
             if iteration % CONTEXT_INJECTION_INTERVAL == 0:
                 context_injection = self._build_context_injection(trace, goal_tree)
                 if context_injection:
-                    llm_messages.append({"role": "system", "content": context_injection})
+                    system_msg = {"role": "system", "content": context_injection}
+                    llm_messages.append(system_msg)
+                    system_messages_to_persist.append(("上下文注入", system_msg))
 
             # 经验检索:goal 切换时重新检索,注入为 system message
             current_goal_id = goal_tree.current_id if goal_tree else None
@@ -823,7 +1150,31 @@ class AgentRunner:
                         _cached_exp_text = ""
 
             if _cached_exp_text:
-                llm_messages.append({"role": "system", "content": _cached_exp_text})
+                system_msg = {"role": "system", "content": _cached_exp_text}
+                llm_messages.append(system_msg)
+                system_messages_to_persist.append(("经验检索", system_msg))
+
+            # 持久化 system 消息到 trace 和 history
+            for label, sys_msg in system_messages_to_persist:
+                # 添加到 history(这样会被包含在后续的对话中)
+                history.append(sys_msg)
+
+                # 保存到 trace store
+                if self.trace_store:
+                    system_message = Message.create(
+                        trace_id=trace_id,
+                        role="system",
+                        sequence=sequence,
+                        goal_id=current_goal_id,
+                        parent_sequence=head_seq if head_seq > 0 else None,
+                        content=sys_msg["content"],
+                        description=f"[{label}]"  # 添加标签说明这是什么类型的 system 消息
+                    )
+                    await self.trace_store.add_message(system_message)
+                    yield system_message
+                    head_seq = sequence
+                    sequence += 1
+
             # 应用 Prompt Caching(不修改原始 history,只在发送给 LLM 时添加缓存标记)
             llm_messages = self._add_cache_control(
                 llm_messages,
@@ -849,6 +1200,29 @@ class AgentRunner:
             cache_creation_tokens = result.get("cache_creation_tokens")
             cache_read_tokens = result.get("cache_read_tokens")
 
+            # 研究流程:处理 research_decision 阶段的转换
+            research_state = self._get_research_state(trace_id)
+            research_decision_handled = False
+            if research_state and research_state["stage"] == "research_decision":
+                # 根据 assistant 的回复判断是否需要调研
+                response_lower = response_content.lower()
+                if "需要调研" in response_content or "need research" in response_lower:
+                    self._update_research_stage(trace_id, "research", need_research=True)
+                    logger.info(f"[Research Flow] 决定需要调研,进入调研阶段")
+                    research_decision_handled = True
+                    # 如果 Agent 错误地调用了工具,忽略它们
+                    if tool_calls:
+                        logger.warning(f"[Research Flow] 在 research_decision 阶段不应调用工具,已忽略 {len(tool_calls)} 个工具调用")
+                        tool_calls = None
+                elif "无需调研" in response_content or "不需要调研" in response_content or "信息充足" in response_content:
+                    self._update_research_stage(trace_id, "planning", need_research=False)
+                    logger.info(f"[Research Flow] 决定无需调研,直接进入计划阶段")
+                    research_decision_handled = True
+                    # 如果 Agent 错误地调用了工具,忽略它们
+                    if tool_calls:
+                        logger.warning(f"[Research Flow] 在 research_decision 阶段不应调用工具,已忽略 {len(tool_calls)} 个工具调用")
+                        tool_calls = None
+
             # 按需自动创建 root goal
             if goal_tree and not goal_tree.goals and tool_calls:
                 has_goal_call = any(
@@ -953,22 +1327,28 @@ class AgentRunner:
                     )
 
                     # --- 支持多模态工具反馈 ---
-                    # execute() 返回 dict{"text","images"} 或 str
-                    if isinstance(tool_result, dict) and tool_result.get("images"):
-                        tool_result_text = tool_result["text"]
-                        # 构建多模态消息格式
-                        tool_content_for_llm = [{"type": "text", "text": tool_result_text}]
-                        for img in tool_result["images"]:
-                            if img.get("type") == "base64" and img.get("data"):
-                                media_type = img.get("media_type", "image/png")
-                                tool_content_for_llm.append({
-                                    "type": "image_url",
-                                    "image_url": {
-                                        "url": f"data:{media_type};base64,{img['data']}"
-                                    }
-                                })
-                        img_count = len(tool_content_for_llm) - 1  # 减去 text 块
-                        print(f"[Runner] 多模态工具反馈: tool={tool_name}, images={img_count}, text_len={len(tool_result_text)}")
+                    # execute() 返回 dict{"text", "images", "metadata"} 或 str
+                    if isinstance(tool_result, dict):
+                        tool_result_text = tool_result.get("text", str(tool_result))
+
+                        # 处理图片
+                        if tool_result.get("images"):
+                            # 构建多模态消息格式
+                            tool_content_for_llm = [{"type": "text", "text": tool_result_text}]
+                            for img in tool_result["images"]:
+                                if img.get("type") == "base64" and img.get("data"):
+                                    media_type = img.get("media_type", "image/png")
+                                    tool_content_for_llm.append({
+                                        "type": "image_url",
+                                        "image_url": {
+                                            "url": f"data:{media_type};base64,{img['data']}"
+                                        }
+                                    })
+                            img_count = len(tool_content_for_llm) - 1  # 减去 text 块
+                            print(f"[Runner] 多模态工具反馈: tool={tool_name}, images={img_count}, text_len={len(tool_result_text)}")
+                        else:
+                            # 无图片,只有文本
+                            tool_content_for_llm = tool_result_text
                     else:
                         tool_result_text = str(tool_result)
                         tool_content_for_llm = tool_result_text
@@ -1008,8 +1388,18 @@ class AgentRunner:
                     })
                     # ------------------------------------------
 
+                    # 研究流程状态转换
+                    await self._handle_research_flow_transition(
+                        trace_id, tool_name, tool_result, goal_tree
+                    )
+
                 continue  # 继续循环
 
+            # 研究流程决策阶段:即使没有工具调用也要继续
+            if research_decision_handled:
+                logger.info(f"[Research Flow] 研究决策完成,继续下一轮循环")
+                continue
+
             # 无工具调用,任务完成
             break
 

+ 408 - 3
agent/memory/skills/research.md

@@ -1,10 +1,415 @@
 ---
-name: research
-description: 信息调研,使用搜索工具和浏览器获取外部信息
+name: atomic_research
+description: 知识调研 - 根据目标和任务自动执行搜索,返回结构化知识列表
 ---
 
 ## 信息调研
 
 你可以通过联网搜索工具 `search_posts` 获取来自 Github、小红书、微信公众号、知乎等渠道的信息。对于需要深度交互的网页内容,使用浏览器工具进行操作。
 
-调研过程可能需要多次搜索,比如基于搜索结果中获得的启发或信息启动新的搜索,直到得到令人满意的答案。你可以使用 `goal` 工具管理搜索的过程,或者使用文档记录搜索的中间或最终结果。
+## 调研过程可能需要多次搜索,比如基于搜索结果中获得的启发或信息启动新的搜索,直到得到令人满意的答案。你可以使用 `goal` 工具管理搜索的过程,或者使用文档记录搜索的中间或最终结果。(可以着重参考browser的工具来辅助搜索)
+
+## 工作流程
+
+### 输入
+
+- **目标**:要达成的目标(如"找到 PDF 表格提取的最佳方案")
+- **任务**:具体的任务描述(如"从复杂 PDF 中提取表格数据")
+
+### 执行流程
+
+**Step 1: 拆解搜索维度**
+
+```
+goal(add="搜索工具, 搜索案例, 搜索方法论")
+```
+
+**Step 2: 多维度搜索**
+
+- 搜索工具:`search_posts(query="PDF table extraction tool")`
+- 搜索案例:`search_posts(query="PDF table extraction usercase site:github.com")`
+- 搜索定义:`search_posts(query="PDF table extraction definition")`
+- 搜索方法:`search_posts(query="PDF table extraction best practice")`
+
+**Step 3: 结构化记录**
+每发现一条有价值的信息,立即保存为结构化知识:
+
+```python
+save_knowledge(
+    tags_type=["tool"],  # tool/usercase/definition/plan
+    scenario="在什么情景下,要完成什么目标,得到能达成一个什么结果",
+    content="这条知识实际的核心内容",
+    urls=["参考的论文/github/博客等"],
+    agent_id="当前 agent ID",
+    score=5,
+    helpful_count=1,
+    harmful_count=0
+)
+```
+
+**Step 4: 输出知识列表**
+
+```
+goal(done="已完成调研,共记录 N 条知识")
+```
+
+### 输出
+
+- 保存到 `.cache/knowledge_atoms/` 目录,每条知识一个 JSON 文件
+- 文件名格式:`atom-YYYYMMDD-HHMMSS-XXXX.json`
+- 返回知识列表摘要
+
+---
+
+## 知识结构
+
+每条知识原子包含以下字段:
+
+### ① id(唯一标识)
+
+格式:`atom-YYYYMMDD-NNN`
+
+示例:`atom-20260302-001`
+
+### ② tags(知识类型)
+
+单条知识可以包含多个标签:
+
+| 类型           | 说明                                       | 示例                                |
+| -------------- | ------------------------------------------ | ----------------------------------- |
+| **tool**       | 工具相关信息,包含使用案例和使用方法       | pdfplumber 库的使用方法             |
+| **usercase**   | 针对任务的用户案例,某个用户完成任务的方法 | 某用户如何提取 PDF 表格的完整流程   |
+| **definition** | 内容的具体定义,或任务的问题定义           | 什么是 PDF 表格提取,有哪些技术挑战 |
+| **plan**       | 完成任务的通用计划、方法论或流程           | PDF 表格提取的标准流程和最佳实践    |
+
+### ③ summary(摘要)
+
+**格式**:在 [情景] 下,完成 [目标],得到 [预期结果]。
+
+**示例**:
+
+```
+在 Python 3.11 环境下,需要从结构复杂的 PDF(包含多列、嵌套表格)中提取表格数据,
+并保留单元格坐标信息,最终得到可用于数据分析的结构化数据。
+```
+
+### ④ content(核心内容)
+
+这条知识实际的核心内容,使用 Markdown 格式,根据类型不同包含不同信息:
+
+**tool 类型**:
+
+- 工具名称和简介
+- 核心 API 和使用方法
+- 适用场景
+- 优缺点对比
+- 代码示例
+
+**usercase 类型**:
+
+- 用户背景和需求
+- 采用的方案
+- 实现步骤
+- 遇到的问题和解决方法
+- 最终效果
+
+**definition 类型**:
+
+- 概念定义
+- 技术原理
+- 应用场景
+- 与相关概念的区别
+
+**plan 类型**:
+
+- 完整流程步骤
+- 关键决策点
+- 常见陷阱和避坑指南
+- 评估标准
+
+### ⑤ tips(避坑指南)
+
+⚠️ 具体的避坑指南或核心建议。
+
+**示例**:
+
+```
+⚠️ 如果 PDF 包含隐形表格线,务必开启 explicit_horizontal_lines 参数
+⚠️ 使用 page.crop() 先裁剪区域再提取,可提升 3-5 倍速度
+```
+
+### ⑥ trace(回溯)
+
+**包含**:
+
+- `urls`: 参考的论文、GitHub、博客等(URL 列表)
+- `agent_id`: 执行此调研的 agent ID
+- `timestamp`: 记录时间
+
+**示例**:
+
+```json
+{
+  "urls": ["https://github.com/jsvine/pdfplumber"],
+  "agent_id": "research_agent_001",
+  "timestamp": "2026-03-02T12:45:41Z"
+}
+```
+
+### ⑦ eval(评估反馈)
+
+**包含**:
+
+- `helpful`: 好用的使用次数(初始值为 1)
+- `harmful`: 不好用的使用次数(初始值为 0)
+
+**示例**:
+
+```json
+{
+  "helpful": 1,
+  "harmful": 0
+}
+```
+
+### ⑧ execute_history(执行历史)
+
+**包含**:
+
+- `helpful`: 好用的使用案例描述列表(字符串数组,初始为空)
+- `harmful`: 不好用的使用案例描述列表(字符串数组,初始为空)
+
+**示例**:
+
+```json
+{
+  "helpful": [],
+  "harmful": []
+}
+```
+
+---
+
+## 完整示例
+
+````json
+{
+  "research_report": {
+    "goal": "找到 PDF 表格提取的最佳方案",
+    "task": "从复杂 PDF 中提取表格数据",
+    "summary": "共记录 3 条核心知识原子,涵盖工具选型与实战 SOP",
+    "atoms": [
+      {
+        "id": "atom-20260302-001",
+        "tags": ["tool", "plan", "usercase"],
+        "summary": "在 Python 3.11 环境下,从结构复杂的 PDF(包含多列、嵌套表格)中提取表格数据,并保留单元格坐标信息,最终得到可用于数据分析的结构化数据。",
+        "content": "## 推荐工具\npdfplumber - 专注于 PDF 表格提取\n\n## 核心 API\n使用 extract_tables() 方法\n\n## 代码示例\n```python\nimport pdfplumber\nwith pdfplumber.open('file.pdf') as pdf:\n    tables = pdf.pages[0].extract_tables()\n```",
+        "tips": "⚠️ 如果 PDF 包含隐形表格线,务必开启 explicit_horizontal_lines 参数\n⚠️ 使用 page.crop() 先裁剪区域再提取,可提升 3-5 倍速度",
+        "trace": {
+          "urls": ["https://github.com/jsvine/pdfplumber"],
+          "agent_id": "research_agent_001",
+          "timestamp": "2026-03-02T12:45:41Z"
+        },
+        "eval": {
+          "helpful": 1,
+          "harmful": 0
+        },
+        "execute_history": {
+          "helpful": [],
+          "harmful": []
+        }
+      },
+      {
+        "id": "atom-20260302-002",
+        "tags": ["usercase"],
+        "summary": "针对 500MB 以上的大型扫描版 PDF 进行自动化处理。",
+        "content": "使用纯 Python 库(如 pdfplumber/PyMuPDF)性能极差且准确率低。",
+        "tips": "建议方案:先使用 PaddleOCR 进行版面分析,再提取坐标区域。",
+        "trace": {
+          "urls": ["https://reddit.com/r/python/comments/..."],
+          "agent_id": "research_agent_01",
+          "timestamp": "2026-03-02T13:00:00Z"
+        },
+        "eval": {
+          "helpful": 1,
+          "harmful": 0
+        },
+        "execute_history": {
+          "helpful": [],
+          "harmful": []
+        }
+      }
+    ]
+  }
+}
+````
+
+---
+
+## 适用场景
+
+- 需要从多个来源收集和整理知识
+- 需要持续积累和评估知识的有效性
+- 需要追溯知识来源和使用历史
+
+---
+
+## 使用工具
+
+### 保存知识
+
+````python
+save_knowledge(
+    tags=["tool", "plan"],
+    summary="在 Python 3.11 环境下,从复杂 PDF 中提取表格数据,并保留单元格坐标信息。",
+    content="""
+## 推荐工具
+pdfplumber - 专注于 PDF 表格提取
+
+## 核心 API
+使用 extract_tables() 方法
+
+## 代码示例
+```python
+import pdfplumber
+with pdfplumber.open('file.pdf') as pdf:
+    tables = pdf.pages[0].extract_tables()
+````
+
+""",
+tips="⚠️ 必须设置 explicit_horizontal_lines=True 以识别隐形表格线",
+urls=["https://github.com/jsvine/pdfplumber"],
+agent_id="research_agent_001"
+)
+
+````
+
+### 更新评估反馈
+
+```python
+update_knowledge(
+    knowledge_id="atom-20260302-001",
+    add_helpful_case="在解析 2025 年报 PDF 时,通过配置 explicit_lines 成功提取了 100+ 嵌套表格。"
+)
+````
+
+或添加失败案例:
+
+```python
+update_knowledge(
+    knowledge_id="atom-20260302-001",
+    add_harmful_case="在处理 300MB 的扫描版 PDF 时,该方案因缺乏 OCR 能力导致提取结果为空。"
+)
+```
+
+---
+
+## 调研策略
+
+### 1. 工具调研(tool)
+
+**搜索关键词**:
+
+- `[任务] tool python`
+- `[任务] library comparison`
+- `[任务] vs site:reddit.com`
+
+**记录重点**:
+
+- 工具名称和链接
+- 核心 API
+- 适用场景
+- 优缺点对比
+- 避坑指南
+
+### 2. 案例调研(usercase)
+
+**搜索关键词**:
+
+- `[任务] example site:github.com`
+- `[任务] tutorial`
+- `how to [任务]`
+
+**记录重点**:
+
+- 用户背景
+- 采用方案
+- 实现步骤
+- 遇到的问题
+- 最终效果
+
+### 3. 定义调研(definition)
+
+**搜索关键词**:
+
+- `what is [任务]`
+- `[任务] definition`
+- `[任务] explained`
+
+**记录重点**:
+
+- 概念定义
+- 技术原理
+- 应用场景
+- 相关概念区别
+
+### 4. 方法论调研(plan)
+
+**搜索关键词**:
+
+- `[任务] best practice`
+- `[任务] workflow`
+- `[任务] step by step`
+
+**记录重点**:
+
+- 完整流程
+- 关键决策点
+- 常见陷阱
+- 评估标准
+
+---
+
+## 输出格式
+
+调研完成后,输出知识列表摘要:
+
+```
+📚 调研完成报告
+
+目标:找到 PDF 表格提取的最佳方案
+任务:从复杂 PDF 中提取表格数据
+
+共记录 5 条知识:
+
+1. [tool] pdfplumber - PDF 表格提取工具
+   评分:⭐⭐⭐⭐⭐ (5/5)
+   反馈:helpful: 1, harmful: 0
+
+2. [usercase] 财报 PDF 表格提取案例
+   评分:⭐⭐⭐⭐ (4/5)
+   反馈:helpful: 1, harmful: 0
+
+3. [definition] PDF 表格提取技术原理
+   评分:⭐⭐⭐⭐ (4/5)
+   反馈:helpful: 1, harmful: 0
+
+4. [plan] PDF 表格提取标准流程
+   评分:⭐⭐⭐⭐⭐ (5/5)
+   反馈:helpful: 1, harmful: 0
+
+5. [tool] tabula-py - 替代方案
+   评分:⭐⭐⭐ (3/5)
+   反馈:helpful: 1, harmful: 0
+
+知识文件保存在:.cache/knowledge_atoms/
+```
+
+---
+
+## 记住
+
+- **边搜边记**:发现有价值的信息立即保存
+- **结构化**:严格按照 5 个维度记录
+- **可追溯**:记录所有参考来源
+- **可评估**:初始评分 + 持续反馈

+ 8 - 1
agent/tools/builtin/__init__.py

@@ -19,7 +19,8 @@ from agent.tools.builtin.experience import get_experience
 from agent.tools.builtin.search import search_posts, get_search_suggestions
 from agent.tools.builtin.sandbox import (sandbox_create_environment, sandbox_run_shell,
                                          sandbox_rebuild_with_ports,sandbox_destroy_environment)
-
+from agent.tools.builtin.knowledge import(search_knowledge,save_knowledge,list_knowledge,update_knowledge)
+from agent.trace.goal_tool import goal
 # 导入浏览器工具以触发注册
 import agent.tools.builtin.browser  # noqa: F401
 
@@ -36,6 +37,10 @@ __all__ = [
     "bash_command",
     "skill",
     "get_experience",
+    "search_knowledge",
+    "save_knowledge",
+    "list_knowledge",
+    "update_knowledge",
     "list_skills",
     "agent",
     "evaluate",
@@ -45,4 +50,6 @@ __all__ = [
     "sandbox_run_shell",
     "sandbox_rebuild_with_ports",
     "sandbox_destroy_environment",
+    # Goal 管理
+    "goal",
 ]

+ 559 - 0
agent/tools/builtin/knowledge.py

@@ -0,0 +1,559 @@
+"""
+原子知识保存工具
+
+提供便捷的 API 让 Agent 快速保存结构化的原子知识
+"""
+
+import os
+import re
+import json
+import yaml
+import logging
+from datetime import datetime
+from pathlib import Path
+from typing import List, Dict, Optional, Any
+from agent.tools import tool, ToolResult, ToolContext
+from ...llm.openrouter import openrouter_llm_call
+
+logger = logging.getLogger(__name__)
+
+
+def _generate_knowledge_id() -> str:
+    """生成知识原子 ID"""
+    return f"research-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
+
+
+def _format_yaml_list(items: List[str], indent: int = 2) -> str:
+    """格式化 YAML 列表"""
+    if not items:
+        return "[]"
+    indent_str = " " * indent
+    return "\n" + "\n".join(f"{indent_str}- {item}" for item in items)
+
+
+@tool()
+async def save_knowledge(
+    scenario: str,
+    content: str,
+    tags_type: List[str],
+    urls: List[str] = None,
+    agent_id: str = "research_agent",
+    score: int = 3,
+    trace_id: str = "",
+) -> ToolResult:
+    """
+    保存原子知识到本地文件(JSON 格式)
+
+    Args:
+        scenario: 任务描述(在什么情景下 + 要完成什么目标 + 得到能达成一个什么结果)
+        content: 核心内容
+        tags_type: 知识类型标签,可选:tool, usercase, definition, plan
+        urls: 参考来源链接列表(论文/GitHub/博客等)
+        agent_id: 执行此调研的 agent ID
+        score: 初始评分 1-5(默认 3)
+        trace_id: 当前 trace ID(可选)
+
+    Returns:
+        保存结果
+    """
+    try:
+        # 生成 ID
+        knowledge_id = _generate_knowledge_id()
+
+        # 准备目录
+        knowledge_dir = Path(".cache/knowledge_atoms")
+        knowledge_dir.mkdir(parents=True, exist_ok=True)
+
+        # 构建文件路径(使用 .json 扩展名)
+        file_path = knowledge_dir / f"{knowledge_id}.json"
+
+        # 构建 JSON 数据结构
+        knowledge_data = {
+            "id": knowledge_id,
+            "trace_id": trace_id or "N/A",
+            "tags": {
+                "type": tags_type
+            },
+            "scenario": scenario,
+            "content": content,
+            "trace": {
+                "urls": urls or [],
+                "agent_id": agent_id,
+                "timestamp": datetime.now().isoformat()
+            },
+            "eval": {
+                "score": score,
+                "helpful": 0,
+                "harmful": 0,
+                "helpful_history": [],
+                "harmful_history": []
+            },
+            "metrics": {
+                "helpful": 1,
+                "harmful": 0
+            },
+            "created_at": datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+        }
+
+        # 保存为 JSON 文件
+        with open(file_path, "w", encoding="utf-8") as f:
+            json.dump(knowledge_data, f, ensure_ascii=False, indent=2)
+
+        return ToolResult(
+            title="✅ 原子知识已保存",
+            output=f"知识 ID: {knowledge_id}\n文件路径: {file_path}\n\n场景:\n{scenario[:100]}...",
+            long_term_memory=f"保存原子知识: {knowledge_id} - {scenario[:50]}",
+            metadata={"knowledge_id": knowledge_id, "file_path": str(file_path)}
+        )
+
+    except Exception as e:
+        return ToolResult(
+            title="❌ 保存失败",
+            output=f"错误: {str(e)}",
+            error=str(e)
+        )
+
+
+@tool()
+async def update_knowledge(
+    knowledge_id: str,
+    add_helpful_case: Optional[Dict[str, str]] = None,
+    add_harmful_case: Optional[Dict[str, str]] = None,
+    update_score: Optional[int] = None,
+) -> ToolResult:
+    """
+    更新已有的原子知识的评估反馈
+
+    Args:
+        knowledge_id: 知识 ID(如 research-20260302-001)
+        add_helpful_case: 添加好用的案例 {"case_id": "...", "scenario": "...", "result": "...", "timestamp": "..."}
+        add_harmful_case: 添加不好用的案例 {"case_id": "...", "scenario": "...", "result": "...", "timestamp": "..."}
+        update_score: 更新评分(1-5)
+
+    Returns:
+        更新结果
+    """
+    try:
+        # 查找文件
+        knowledge_dir = Path(".cache/knowledge_atoms")
+        file_path = knowledge_dir / f"{knowledge_id}.md"
+
+        if not file_path.exists():
+            return ToolResult(
+                title="❌ 文件不存在",
+                output=f"未找到知识文件: {file_path}",
+                error="文件不存在"
+            )
+
+        # 读取现有内容
+        with open(file_path, "r", encoding="utf-8") as f:
+            content = f.read()
+
+        # 更新内容
+        updated = False
+        import re
+
+        if add_helpful_case:
+            # 增加 helpful 计数
+            helpful_match = re.search(r"helpful: (\d+)", content)
+            current_helpful = int(helpful_match.group(1)) if helpful_match else 0
+            content = re.sub(
+                r"helpful: \d+",
+                f"helpful: {current_helpful + 1}",
+                content
+            )
+
+            # 添加案例到 helpful_history
+            case_yaml = f"""    - case_id: {add_helpful_case.get('case_id', 'unknown')}
+      scenario: "{add_helpful_case.get('scenario', '')}"
+      result: "{add_helpful_case.get('result', '')}"
+      timestamp: {add_helpful_case.get('timestamp', datetime.now().isoformat())}"""
+
+            if "helpful_history: []" in content:
+                content = content.replace(
+                    "helpful_history: []",
+                    f"helpful_history:\n{case_yaml}"
+                )
+            else:
+                # 在 helpful_history 后追加
+                content = re.sub(
+                    r"(helpful_history:.*?)(\n  harmful)",
+                    f"\\1\n{case_yaml}\\2",
+                    content,
+                    flags=re.DOTALL
+                )
+            updated = True
+
+        if add_harmful_case:
+            # 增加 harmful 计数
+            harmful_match = re.search(r"harmful: (\d+)", content)
+            current_harmful = int(harmful_match.group(1)) if harmful_match else 0
+            content = re.sub(
+                r"harmful: \d+",
+                f"harmful: {current_harmful + 1}",
+                content
+            )
+
+            # 添加案例到 harmful_history
+            case_yaml = f"""    - case_id: {add_harmful_case.get('case_id', 'unknown')}
+      scenario: "{add_harmful_case.get('scenario', '')}"
+      result: "{add_harmful_case.get('result', '')}"
+      timestamp: {add_harmful_case.get('timestamp', datetime.now().isoformat())}"""
+
+            if "harmful_history: []" in content:
+                content = content.replace(
+                    "harmful_history: []",
+                    f"harmful_history:\n{case_yaml}"
+                )
+            else:
+                # 在 harmful_history 后追加
+                content = re.sub(
+                    r"(harmful_history:.*?)(\nmetrics)",
+                    f"\\1\n{case_yaml}\\2",
+                    content,
+                    flags=re.DOTALL
+                )
+            updated = True
+
+        if update_score is not None:
+            content = re.sub(
+                r"score: \d+",
+                f"score: {update_score}",
+                content
+            )
+            updated = True
+
+        if not updated:
+            return ToolResult(
+                title="⚠️ 无更新",
+                output="未指定任何更新内容",
+                long_term_memory="尝试更新原子知识但未指定更新内容"
+            )
+
+        # 保存更新
+        with open(file_path, "w", encoding="utf-8") as f:
+            f.write(content)
+
+        summary = []
+        if add_helpful_case:
+            summary.append(f"添加 helpful 案例: {add_helpful_case.get('case_id')}")
+        if add_harmful_case:
+            summary.append(f"添加 harmful 案例: {add_harmful_case.get('case_id')}")
+        if update_score:
+            summary.append(f"更新评分: {update_score}")
+
+        return ToolResult(
+            title="✅ 原子知识已更新",
+            output=f"知识 ID: {knowledge_id}\n文件路径: {file_path}\n\n更新内容:\n" + "\n".join(f"- {s}" for s in summary),
+            long_term_memory=f"更新原子知识: {knowledge_id}"
+        )
+
+    except Exception as e:
+        return ToolResult(
+            title="❌ 更新失败",
+            output=f"错误: {str(e)}",
+            error=str(e)
+        )
+
+
+@tool()
+async def list_knowledge(
+    limit: int = 10,
+    tags_type: Optional[List[str]] = None,
+) -> ToolResult:
+    """
+    列出已保存的原子知识
+
+    Args:
+        limit: 返回数量限制(默认 10)
+        tags_type: 按类型过滤(可选)
+
+    Returns:
+        知识列表
+    """
+    try:
+        knowledge_dir = Path(".cache/knowledge_atoms")
+
+        if not knowledge_dir.exists():
+            return ToolResult(
+                title="📂 知识库为空",
+                output="还没有保存任何原子知识",
+                long_term_memory="知识库为空"
+            )
+
+        # 获取所有文件
+        files = sorted(knowledge_dir.glob("*.md"), key=lambda x: x.stat().st_mtime, reverse=True)
+
+        if not files:
+            return ToolResult(
+                title="📂 知识库为空",
+                output="还没有保存任何原子知识",
+                long_term_memory="知识库为空"
+            )
+
+        # 读取并过滤
+        results = []
+        for file_path in files[:limit]:
+            with open(file_path, "r", encoding="utf-8") as f:
+                content = f.read()
+
+            # 提取关键信息
+            import re
+            id_match = re.search(r"id: (.+)", content)
+            scenario_match = re.search(r"scenario: \|\n  (.+)", content)
+            score_match = re.search(r"score: (\d+)", content)
+
+            knowledge_id = id_match.group(1) if id_match else "unknown"
+            scenario = scenario_match.group(1) if scenario_match else "N/A"
+            score = score_match.group(1) if score_match else "N/A"
+
+            results.append(f"- [{knowledge_id}] (⭐{score}) {scenario[:60]}...")
+
+        output = f"共找到 {len(files)} 条原子知识,显示最近 {len(results)} 条:\n\n" + "\n".join(results)
+
+        return ToolResult(
+            title="📚 原子知识列表",
+            output=output,
+            long_term_memory=f"列出 {len(results)} 条原子知识"
+        )
+
+    except Exception as e:
+        return ToolResult(
+            title="❌ 列表失败",
+            output=f"错误: {str(e)}",
+            error=str(e)
+        )
+
+
+# ===== 语义检索功能 =====
+
+async def _route_knowledge_by_llm(query_text: str, metadata_list: List[Dict], k: int = 5) -> List[str]:
+    """
+    第一阶段:语义路由。
+    让 LLM 挑选出 2*k 个语义相关的 ID。
+    """
+    if not metadata_list:
+        return []
+
+    # 扩大筛选范围到 2*k
+    routing_k = k * 2
+
+    routing_data = [
+        {
+            "id": m["id"],
+            "tags": m["tags"],
+            "scenario": m["scenario"][:100]  # 只取前100字符
+        } for m in metadata_list
+    ]
+
+    prompt = f"""
+你是一个知识检索专家。根据用户的当前任务需求,从下列原子知识元数据中挑选出最相关的最多 {routing_k} 个知识 ID。
+任务需求:"{query_text}"
+
+可选知识列表:
+{json.dumps(routing_data, ensure_ascii=False, indent=1)}
+
+请直接输出 ID 列表,用逗号分隔(例如: research-20260302-001, research-20260302-002)。若无相关项请输出 "None"。
+"""
+
+    try:
+        print(f"\n[Step 1: 知识语义路由] 任务: '{query_text}' | 候选总数: {len(metadata_list)} | 目标提取数: {routing_k}")
+
+        response = await openrouter_llm_call(
+            messages=[{"role": "user", "content": prompt}],
+            model="google/gemini-2.0-flash-001"
+        )
+
+        content = response.get("content", "").strip()
+        selected_ids = [idx.strip() for idx in re.split(r'[,\s]+', content) if idx.strip().startswith("research-")]
+
+        print(f"[Step 1: 知识语义路由] LLM 初选 ID ({len(selected_ids)}个): {selected_ids}")
+        return selected_ids
+    except Exception as e:
+        logger.error(f"LLM 知识路由失败: {e}")
+        return []
+
+
+async def _get_structured_knowledge(query_text: str, top_k: int = 5, min_score: int = 3) -> List[Dict]:
+    """
+    语义检索原子知识
+
+    1. 解析知识库文件(支持 JSON 和 YAML 格式)
+    2. 语义路由:提取 2*k 个 ID
+    3. 质量精排:基于评分筛选出最终的 k 个
+    """
+    knowledge_dir = Path(".cache/knowledge_atoms")
+
+    if not knowledge_dir.exists():
+        print(f"[Knowledge System] 警告: 知识库目录不存在 ({knowledge_dir})")
+        return []
+
+    # 同时支持 .json 和 .md 文件
+    json_files = list(knowledge_dir.glob("*.json"))
+    md_files = list(knowledge_dir.glob("*.md"))
+    files = json_files + md_files
+
+    if not files:
+        print(f"[Knowledge System] 警告: 知识库为空")
+        return []
+
+    # --- 阶段 1: 解析所有知识文件 ---
+    content_map = {}
+    metadata_list = []
+
+    for file_path in files:
+        try:
+            with open(file_path, "r", encoding="utf-8") as f:
+                content = f.read()
+
+            # 根据文件扩展名选择解析方式
+            if file_path.suffix == ".json":
+                # 解析 JSON 格式
+                metadata = json.loads(content)
+            else:
+                # 解析 YAML frontmatter(兼容旧格式)
+                yaml_match = re.search(r'^---\n(.*?)\n---', content, re.DOTALL)
+                if not yaml_match:
+                    logger.warning(f"跳过无效文件: {file_path}")
+                    continue
+                metadata = yaml.safe_load(yaml_match.group(1))
+
+            if not isinstance(metadata, dict):
+                logger.warning(f"跳过损坏的知识文件: {file_path}")
+                continue
+
+            kid = metadata.get("id")
+            if not kid:
+                logger.warning(f"跳过缺少 id 的知识文件: {file_path}")
+                continue
+
+            # 提取 scenario 和 content
+            scenario = metadata.get("scenario", "").strip()
+            content_text = metadata.get("content", "").strip()
+
+            meta_item = {
+                "id": kid,
+                "tags": metadata.get("tags", {}),
+                "scenario": scenario,
+                "score": metadata.get("eval", {}).get("score", 3),
+                "helpful": metadata.get("metrics", {}).get("helpful", 0),
+                "harmful": metadata.get("metrics", {}).get("harmful", 0),
+            }
+            metadata_list.append(meta_item)
+            content_map[kid] = {
+                "scenario": scenario,
+                "content": content_text,
+                "score": meta_item["score"],
+                "helpful": meta_item["helpful"],
+                "harmful": meta_item["harmful"],
+            }
+        except Exception as e:
+            logger.error(f"解析知识文件失败 {file_path}: {e}")
+            continue
+
+    if not metadata_list:
+        print(f"[Knowledge System] 警告: 没有有效的知识条目")
+        return []
+
+    # --- 阶段 2: 语义路由 (取 2*k) ---
+    candidate_ids = await _route_knowledge_by_llm(query_text, metadata_list, k=top_k)
+
+    # --- 阶段 3: 质量精排 (根据评分和反馈选出最终的 k) ---
+    print(f"[Step 2: 知识质量精排] 正在根据评分和反馈进行打分...")
+    scored_items = []
+
+    for kid in candidate_ids:
+        if kid in content_map:
+            item = content_map[kid]
+            score = item["score"]
+            helpful = item["helpful"]
+            harmful = item["harmful"]
+
+            # 计算综合分:基础分 + helpful - harmful*2
+            quality_score = score + helpful - (harmful * 2.0)
+
+            # 过滤门槛:评分低于 min_score 或质量分过低
+            if score < min_score or quality_score < 0:
+                print(f"  - 剔除低质量知识: {kid} (Score: {score}, Helpful: {helpful}, Harmful: {harmful})")
+                continue
+
+            scored_items.append({
+                "id": kid,
+                "scenario": item["scenario"],
+                "content": item["content"],
+                "score": score,
+                "quality_score": quality_score
+            })
+
+    # 按照质量分排序
+    final_sorted = sorted(scored_items, key=lambda x: x["quality_score"], reverse=True)
+
+    # 截取最终的 top_k
+    result = final_sorted[:top_k]
+
+    print(f"[Step 2: 知识质量精排] 最终选定知识: {[it['id'] for it in result]}")
+    print(f"[Knowledge System] 检索结束。\n")
+    return result
+
+
+@tool()
+async def search_knowledge(
+    query: str,
+    top_k: int = 5,
+    min_score: int = 3,
+    tags_type: Optional[List[str]] = None,
+    context: Optional[ToolContext] = None,
+) -> ToolResult:
+    """
+    语义检索原子知识库
+
+    Args:
+        query: 搜索查询(任务描述)
+        top_k: 返回数量(默认 5)
+        min_score: 最低评分过滤(默认 3)
+        tags_type: 按类型过滤(tool/usercase/definition/plan)
+        context: 工具上下文
+
+    Returns:
+        相关知识列表
+    """
+    try:
+        relevant_items = await _get_structured_knowledge(
+            query_text=query,
+            top_k=top_k,
+            min_score=min_score
+        )
+
+        if not relevant_items:
+            return ToolResult(
+                title="🔍 未找到相关知识",
+                output=f"查询: {query}\n\n知识库中暂无相关的高质量知识。建议进行调研。",
+                long_term_memory=f"知识检索: 未找到相关知识 - {query[:50]}"
+            )
+
+        # 格式化输出
+        output_lines = [f"查询: {query}\n", f"找到 {len(relevant_items)} 条相关知识:\n"]
+
+        for idx, item in enumerate(relevant_items, 1):
+            output_lines.append(f"\n### {idx}. [{item['id']}] (⭐ {item['score']})")
+            output_lines.append(f"**场景**: {item['scenario'][:150]}...")
+            output_lines.append(f"**内容**: {item['content'][:200]}...")
+
+        return ToolResult(
+            title="✅ 知识检索成功",
+            output="\n".join(output_lines),
+            long_term_memory=f"知识检索: 找到 {len(relevant_items)} 条相关知识 - {query[:50]}",
+            metadata={
+                "count": len(relevant_items),
+                "knowledge_ids": [item["id"] for item in relevant_items],
+                "items": relevant_items
+            }
+        )
+
+    except Exception as e:
+        logger.error(f"知识检索失败: {e}")
+        return ToolResult(
+            title="❌ 检索失败",
+            output=f"错误: {str(e)}",
+            error=str(e)
+        )

+ 3 - 2
agent/tools/registry.py

@@ -243,8 +243,9 @@ class ToolRegistry:
 			if isinstance(result, ToolResult):
 				# 有图片时返回 dict 以便 runner 构建多模态消息
 				if result.images:
-					return {"text": result.to_llm_message(), "images": result.images}
-				return result.to_llm_message()
+					return {"text": result.to_llm_message(), "images": result.images, "metadata": result.metadata}
+				# 无图片时也返回 dict,保留 metadata
+				return {"text": result.to_llm_message(), "metadata": result.metadata}
 
 			return json.dumps(result, ensure_ascii=False, indent=2)
 

+ 8 - 1
agent/trace/store.py

@@ -197,7 +197,14 @@ class FileSystemTraceStore:
             "parent_id": goal.parent_id
         }
         await self.append_event(trace_id, "goal_added", event_data)
-        print(f"[DEBUG] Pushed goal_added event: goal_id={goal.id}, parent_id={goal.parent_id}")
+
+        # 打印详细的 goal 信息
+        desc_preview = goal.description[:80] + "..." if len(goal.description) > 80 else goal.description
+        print(f"[Goal Added] ID={goal.id}, Parent={goal.parent_id or 'root'}")
+        print(f"  📝 {desc_preview}")
+        if goal.reason:
+            reason_preview = goal.reason[:60] + "..." if len(goal.reason) > 60 else goal.reason
+            print(f"  💡 {reason_preview}")
 
     async def update_goal(self, trace_id: str, goal_id: str, **updates) -> None:
         """更新 Goal 字段"""

+ 33 - 5
examples/restore/input/person_invariant_features.json

@@ -1,7 +1,35 @@
 {
-  "appearance": "The person has fair skin, defined eyebrows, and red lipstick. She is wearing a delicate necklace and earrings.",
-  "hair": "Her hair is long, brown, and styled straight, falling over her shoulders.",
-  "clothing": "She is wearing a loose-fitting white top with three-quarter sleeves and a long, flowing white skirt.",
-  "pose": "She is standing, holding a paintbrush in her right hand and a colorful artist's palette in her left hand. Her head is slightly tilted upwards and to the right, as if looking at something in the distance.",
-  "viewing_angle": "Three-quarter"
+  "人物姿态特征": {
+    "身体姿势": "身体略微侧向右方,上半身挺直。",
+    "头部朝向": "头部向左上方微抬,视线望向远方。",
+    "手臂位置": "左手自然下垂,右手抬起,手持画笔,手腕微弯,手掌朝向前方。左手托着调色板,调色板略微倾斜。",
+    "腿部姿势": "未完全展示,但从裙摆看,可能站立或轻微侧身站立。"
+  },
+  "面部特征": {
+    "脸型": "鹅蛋脸,下巴尖细。",
+    "五官": "眉毛自然,眼睛细长,眼尾略上扬,双眼皮明显,眼妆精致。鼻梁高挺,鼻头小巧。嘴唇饱满,唇形优美,涂有红色口红。",
+    "表情": "神情专注,略带沉思,眼神温柔。"
+  },
+  "发型特征": {
+    "长度": "长发及腰。",
+    "颜色": "深棕色,带有自然光泽。",
+    "质感": "发质柔顺,有光泽。",
+    "造型": "中分,大部分头发自然垂落在身体两侧,少量发丝散落在额头和脸颊旁。"
+  },
+  "着装特征": {
+    "服装款式": "白色连衣裙,上衣部分宽松,袖子为七分袖,袖口有褶皱。裙摆为A字形长裙,材质轻盈。",
+    "颜色": "纯白色。",
+    "材质": "看起来是棉麻或雪纺等轻薄透气的面料,有自然垂坠感。",
+    "细节": "上衣腰部有收腰设计,裙摆有自然褶皱。"
+  },
+  "肤色特征": {
+    "色调": "白皙偏暖调。",
+    "质感": "皮肤细腻,有光泽。"
+  },
+  "配饰特征": {
+    "耳环": "佩戴一对小巧的银色或白色耳环,形状为环状。",
+    "项链": "佩戴一条细长的银色项链,吊坠为圆形或椭圆形。",
+    "手链": "右手腕佩戴一条细手链。"
+  },
+  "整体气质和风格": "优雅、艺术、知性、温柔。整体风格清新自然,充满艺术气息,仿佛一位正在户外写生的画家。"
 }

+ 49 - 19
examples/restore/production.prompt

@@ -1,15 +1,16 @@
 ---
-model: sonnet-4.6
+model: sonnet-4.5
 temperature: 0.3
 ---
 
 $system$
-你是一个顶尖的多模态内容还原专家。你的核心任务是:基于已有的内容解构数据(图片分段、形式分析、制作点提取),驱动生成模型逐图还原出与原帖视觉一致的图片,并通过”生成-评估-修正”的自驱迭代循环不断逼近原图效果。
+你是一个顶尖的多模态内容还原专家。你的核心任务是:基于已有的内容解构数据(图片分段、形式分析、制作点提取),驱动生成模型逐图还原出与原帖视觉一致的图片,并通过"生成-评估-修正"的自驱迭代循环不断逼近原图效果。
+
 你的行动准则:
-数据驱动还原:你手中已有完整的解构数据(分段坐标、形式特征、制作点权重),必须充分利用这些结构化信息构建生成指令,而非凭空描述。
-大模型原生思维:优先使用大模型自身的视觉理解能力。你可以让 Gemini Pro 模型直接分析原图与解构数据的对应关系,提取控制特征(如姿势骨架坐标、色彩分布),配合基础绘图脚本生成控制图,最后调用 Nano Banana 模型进行图像生成。
-大模型驱动评估:在还原测试阶段,不需要编写像素级对比代码。你必须制定明确的评估标准,将原图与生成图一并提交给 Gemini Pro 模型进行语义级视觉比对。
-工程化交付:严格遵守给定的工程目录规范,输出可执行脚本、结构化特征文件、评估标准以及每一轮的迭代资产
+- **数据驱动还原**:你手中已有完整的解构数据(分段坐标、形式特征、制作点权重),必须充分利用这些结构化信息构建生成指令,而非凭空描述。
+- **大模型原生思维**:优先使用大模型自身的视觉理解能力。你可以让 Gemini Pro 模型直接分析原图与解构数据的对应关系,提取控制特征(如姿势骨架坐标、色彩分布),配合基础绘图脚本生成控制图,最后调用 Nano Banana 模型进行图像生成。
+- **大模型驱动评估**:在还原测试阶段,不需要编写像素级对比代码。你必须制定明确的评估标准,将原图与生成图一并提交给 Gemini Pro 模型进行语义级视觉比对。
+- **Goal 驱动执行**:使用 goal 工具将任务拆解为清晰的子目标,按 goal 顺序执行,确保每个阶段都有明确的交付物
 
 $user$
 **任务目标**
@@ -25,19 +26,48 @@ $user$
   - `03_图片制作点实质结果.json`:6个跨图片聚合的实质制作点(人物 95分、画布 80分、调色板 75分、背景 70分)
   - `04_图片制作点形式结果.json`:32个跨图片聚合的形式特征(姿态、着装、发型、肤色、构图、色彩、光影等)
 
-**执行工序与交付清单**
-请在 `examples/restore/output_1` 下严格按照以下流程执行:
+**执行要求**
+
+请使用 goal 工具制定执行计划,将任务拆解为以下阶段,并按 goal 顺序执行:
+
+**阶段 1: 数据分析与规划**
+- 读取并分析所有解构数据文件
+- 理解图片分组结构(g1/g2/g3)和制作点权重
+- 制定评估标准(基于制作点权重)
+- 规划迭代策略(按 group 分批生成)
+
+**阶段 2: 特征提取与控制图生成**
+- 使用 Gemini Pro 分析 `person.jpg`,提取人物姿势骨架坐标
+- 结合解构数据中的分段坐标,生成控制图
+- 输出到 `output_1/resource/` 目录
+
+**阶段 3: 迭代生成与评估**
+- 按 group 分批执行(g1 → g2 → g3)
+- 每个 Round 包含:
+  - **生成**:调用 Nano Banana 生成图像,输出到 `round_N/cache/`
+  - **评估**:使用 Gemini Pro 对比原图与生成图,按制作点权重评分
+  - **修正**:根据评估反馈更新生成指令,输出到 `round_N/evaluation/`
+- 如果评估未达标,自动进入下一个 Round
 
-1. **初始化提取与标准制定 (Initialization)**
-   * **特征提取与控制图生成:** 读取解构数据中的分段坐标和形式特征,结合 Gemini Pro 视觉模型分析 `input/images/person.jpg`,提取目标维度的控制特征(如人物姿势骨架坐标、场景构图线框)。在 `resource/` 目录下编写基础绘图脚本生成控制图。
-   * 输出 `method.md`:记录特征解析逻辑、控制图生成方式以及调用 Nano Banana 时的关键参数设定。
-   * 输出 `feature.json`:存储提取出的结构化特征数据(如归一化坐标等),禁止自然语言。
-   * 输出 `resource/evaluation_criteria.md`:根据解构数据中的制作点权重,编写评估标准指南(例如:人物姿态一致性权重 95、画架/调色板位置权重 75-80、背景色调权重 70)。
+**输出目录结构**
+```
+output_1/
+├── resource/
+│   ├── evaluation_criteria.md  # 评估标准
+│   ├── control_images/         # 控制图
+│   └── features.json           # 提取的特征数据
+├── round_1/
+│   ├── cache/                  # 生成的图片
+│   └── evaluation/             # 评估报告
+├── round_2/
+│   └── ...
+└── plan.md                     # 执行计划记录
+```
 
-2. **迭代循环 (Round Loop)**
-   * **Round N (从 round_1 开始):**
-     * **Cache (生成):** 基于解构数据中的分段描述和形式特征构建生成指令,结合控制图和 `input/images/person.jpg` 人物参考,调用 **Nano Banana** 模型生成图像。按 group 分批生成(优先从 g1 户外绘画全景开始)。在 `round_N/cache/` 中输出 `reduction.jpg`(三段式对比:原图 | 控制图 | 生成图)。
-     * **Evaluation (评估):** 读取 `resource/evaluation_criteria.md` 中的标准,从 `input/images/` 读取对应的原图(仅用于对比,严禁修改),将原图与生成图共同交给 **Gemini Pro** 模型,按制作点权重逐项评估差异。
-     * **Update (修正):** 根据评估反馈,在 `round_N/evaluation/` 中输出 `evaluation_report.md`(记录具体视觉偏差与量化修正方案),并输出更新后的生成指令 `description_v(N+1).txt`。
+**重要提示**
+1. 使用 `goal(add="...")` 创建子目标,使用 `goal(focus="...")` 切换当前目标
+2. 每个 goal 完成后使用 `goal(done="...")` 标记完成
+3. 严格按照 goal 顺序执行,不要跳过任何阶段
+4. 所有输出文件必须保存到 `examples/restore/output_1` 目录下
 
-如果评估认为还原效果尚未达标,则使用新指令自动进入下一个 Round;直至评估结果满意为止。请立即开始执行。
+请立即开始执行。

+ 1 - 0
examples/restore/run.py

@@ -392,6 +392,7 @@ async def main():
                 temperature=float(prompt.config.get('temperature', 0.3)),
                 max_iterations=1000,
                 name="社交媒体内容解构、建构、评估任务",
+                enable_research_flow=True,  # 显式启用研究流程
             )
 
         while not should_exit:

BIN
examples/restore_old/input/images/img_1.jpg


BIN
examples/restore_old/input/images/img_2.jpg


BIN
examples/restore_old/input/images/img_3.jpg


BIN
examples/restore_old/input/images/img_5.jpg


BIN
examples/restore_old/input/images/img_6.jpg


BIN
examples/restore_old/input/images/img_7.jpg


BIN
examples/restore_old/input/images/img_8.jpg


BIN
examples/restore_old/input/images/img_9.jpg


+ 11 - 0
examples/restore_old/input/images/set_invariant_features.json

@@ -0,0 +1,11 @@
+{
+  "viewing_angle": 90,
+  "person_restoration": 90,
+  "props_restoration": 90,
+  "background": 80,
+  "composition": 90,
+  "weighted_total": 89,
+  "main_issues": [
+    "The background bokeh is present but the circular light spots are not as prominent or well-defined as in the original images."
+  ]
+}

+ 29 - 0
examples/restore_old/input/paragraphs/00_基础信息.json

@@ -0,0 +1,29 @@
+{
+  "帖子ID": "616192600000000021034642",
+  "原始文本": {
+    "title": "《秋日际遇》写生油画",
+    "body": "听闻秋日是倒放的春天 于是我心中有一座秋日的花园 栽种着一簇簇淡却温暖的花 风沿着远边的山吹来 热情的阳光里秋风微凉 与颜料一起酝酿出的画面 白裙是一抹无暇 迎着光绘画出 那片在我心上开满 限定的浪漫 被画架支起 绿草坪还驻留了匆匆而过的热闹 再添一笔白 为我画一枝玫瑰的奇遇 ———@万淮"
+  },
+  "内容过滤结果": {
+    "filtered_body": "听闻秋日是倒放的春天 于是我心中有一座秋日的花园 栽种着一簇簇淡却温暖的花 风沿着远边的山吹来 热情的阳光里秋风微凉 与颜料一起酝酿出的画面 白裙是一抹无暇 迎着光绘画出 那片在我心上开满 限定的浪漫 被画架支起 绿草坪还驻留了匆匆而过的热闹 再添一笔白 为我画一枝玫瑰的奇遇 ———@万淮",
+    "original_body": "听闻秋日是倒放的春天 于是我心中有一座秋日的花园 栽种着一簇簇淡却温暖的花 风沿着远边的山吹来 热情的阳光里秋风微凉 与颜料一起酝酿出的画面 白裙是一抹无暇 迎着光绘画出 那片在我心上开满 限定的浪漫 被画架支起 绿草坪还驻留了匆匆而过的热闹 再添一笔白 为我画一枝玫瑰的奇遇 ———@万淮",
+    "removed_hashtags": [],
+    "kept_hashtags": [],
+    "filter_details": []
+  },
+  "元信息": {
+    "执行时间": "2026-01-27T13:42:43.026726",
+    "模型提供商": "google_genai",
+    "最大递归深度": 10,
+    "图片数量": 9,
+    "文本元素数量": 2,
+    "跳过步骤": {
+      "图片分段": false,
+      "图片实质": true,
+      "图片形式": false,
+      "段内关系": true,
+      "段间关系": true,
+      "文本解构": false
+    }
+  }
+}

+ 215 - 0
examples/restore_old/input/paragraphs/01_图片分段_01_g1_户外绘画场景.json

@@ -0,0 +1,215 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性在户外草地上使用画架和调色板进行绘画,背景是绿色的树木和草地。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心内容是户外绘画场景,因此将其拆分为人物、画架、调色板和背景等独立元素。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一名长发女性,身穿白色长裙,侧身站立,右手持画笔,左手持调色板,正在画布上绘画。",
+          "顶点坐标": [
+            [
+              290,
+              100
+            ],
+            [
+              1200,
+              1599
+            ],
+            [
+              290,
+              1599
+            ],
+            [
+              1200,
+              100
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象,需要独立拆分。其姿态、衣着和动作是其主要特征,因此不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落1.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素3"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "木质三脚画架,支撑着一块画布,画布上有一幅未完成的画作。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              900,
+              1599
+            ],
+            [
+              300,
+              1599
+            ],
+            [
+              900,
+              0
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要组成部分,具有物理独立性,因此作为独立节点。画布是画架的附着物,但作为核心展示对象的一部分,需要进一步拆分。",
+          "子段落": [
+            {
+              "名称": "画布",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "白色画布,上面绘制着一幅以绿色植物和白色裙子人物为主题的油画,画作未完成。",
+              "顶点坐标": [
+                [
+                  450,
+                  300
+                ],
+                [
+                  850,
+                  900
+                ],
+                [
+                  450,
+                  900
+                ],
+                [
+                  850,
+                  300
+                ]
+              ],
+              "拆分推理": "画布是画架上承载画作的核心部分,是绘画行为的直接对象,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落1.2.1",
+              "实质分类": "艺术载体",
+              "形式分类": "绘画",
+              "元素ID": "元素4"
+            },
+            {
+              "名称": "玫瑰花",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "一朵白色玫瑰花,放置在画架的横梁上。",
+              "顶点坐标": [
+                [
+                  300,
+                  1000
+                ],
+                [
+                  400,
+                  1100
+                ],
+                [
+                  300,
+                  1100
+                ],
+                [
+                  400,
+                  1000
+                ]
+              ],
+              "拆分推理": "玫瑰花是画架上的一个独立装饰物,具有物理独立性,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落1.2.2",
+              "实质分类": "植物装饰",
+              "形式分类": "种植"
+            }
+          ],
+          "段落ID": "段落1.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "椭圆形木质调色板,上面沾有多种颜色的颜料。",
+          "顶点坐标": [
+            [
+              550,
+              1050
+            ],
+            [
+              950,
+              1450
+            ],
+            [
+              550,
+              1450
+            ],
+            [
+              950,
+              1050
+            ]
+          ],
+          "拆分推理": "调色板是绘画工具,具有物理独立性,是人物手持的核心对象,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落1.3",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "户外草地和树木,草地呈绿色,树木茂盛。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,不属于核心展示对象,因此作为一个整体节点,不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落1.4",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落1",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 1
+}

+ 186 - 0
examples/restore_old/input/paragraphs/01_图片分段_02_g1_户外绘画场景.json

@@ -0,0 +1,186 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性在户外草地上使用画架和调色板进行绘画,背景是绿色的树木和草地,阳光透过树叶洒下。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心内容是户外绘画场景,因此将其拆分为人物、画架、调色板和背景等独立元素。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一名长发女性,身穿白色长裙,背对镜头,右手持画笔,左手持调色板,正在画布上绘画。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象,需要独立拆分。其姿态、衣着和动作是其主要特征,因此不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落2.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素3"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "木质三脚画架,支撑着一块画布,画布上有一幅未完成的画作。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              900,
+              1600
+            ],
+            [
+              300,
+              1600
+            ],
+            [
+              900,
+              0
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要组成部分,具有物理独立性,因此作为独立节点。画布是画架的附着物,但作为核心展示对象的一部分,需要进一步拆分。",
+          "子段落": [
+            {
+              "名称": "画布",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "白色画布,上面绘制着一幅以绿色植物和白色裙子人物为主题的油画,画作未完成。",
+              "顶点坐标": [
+                [
+                  450,
+                  300
+                ],
+                [
+                  850,
+                  900
+                ],
+                [
+                  450,
+                  900
+                ],
+                [
+                  850,
+                  300
+                ]
+              ],
+              "拆分推理": "画布是画架上承载画作的核心部分,是绘画行为的直接对象,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落2.2.1",
+              "实质分类": "艺术载体",
+              "形式分类": "绘画",
+              "元素ID": "元素4"
+            }
+          ],
+          "段落ID": "段落2.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "椭圆形木质调色板,上面沾有多种颜色的颜料。",
+          "顶点坐标": [
+            [
+              400,
+              1000
+            ],
+            [
+              600,
+              1200
+            ],
+            [
+              400,
+              1200
+            ],
+            [
+              600,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画工具,具有物理独立性,是人物手持的核心对象,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落2.3",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "户外草地和树木,草地呈绿色,树木茂盛,阳光从左上方透过树叶洒下,形成光斑。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,不属于核心展示对象,因此作为一个整体节点,不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落2.4",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落2",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 1
+}

+ 215 - 0
examples/restore_old/input/paragraphs/01_图片分段_03_g1_户外绘画场景.json

@@ -0,0 +1,215 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性在户外草地上使用画架和调色板进行绘画,背景是绿色的树木和草地,阳光透过树叶洒下。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心内容是户外绘画场景,因此将其拆分为人物、画架、调色板和背景等独立元素。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一名长发女性,身穿白色长裙,背对镜头,跪坐在草地上,正在画布上绘画。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象,需要独立拆分。其姿态、衣着和动作是其主要特征,因此不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落3.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素3"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "木质三脚画架,支撑着一块画布,画布上有一幅未完成的画作。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              900,
+              1600
+            ],
+            [
+              300,
+              1600
+            ],
+            [
+              900,
+              0
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要组成部分,具有物理独立性,因此作为独立节点。画布是画架的附着物,但作为核心展示对象的一部分,需要进一步拆分。",
+          "子段落": [
+            {
+              "名称": "画布",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "白色画布,上面绘制着一幅以绿色植物和白色裙子人物为主题的油画,画作未完成。",
+              "顶点坐标": [
+                [
+                  450,
+                  300
+                ],
+                [
+                  850,
+                  900
+                ],
+                [
+                  450,
+                  900
+                ],
+                [
+                  850,
+                  300
+                ]
+              ],
+              "拆分推理": "画布是画架上承载画作的核心部分,是绘画行为的直接对象,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落3.2.1",
+              "实质分类": "艺术载体",
+              "形式分类": "绘画",
+              "元素ID": "元素4"
+            }
+          ],
+          "段落ID": "段落3.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "椭圆形木质调色板,上面沾有多种颜色的颜料,放置在草地上。",
+          "顶点坐标": [
+            [
+              400,
+              1000
+            ],
+            [
+              600,
+              1200
+            ],
+            [
+              400,
+              1200
+            ],
+            [
+              600,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画工具,具有物理独立性,是人物手持的核心对象,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落3.3",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "水桶",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "白色水桶,放置在草地上,旁边有画笔。",
+          "顶点坐标": [
+            [
+              700,
+              1200
+            ],
+            [
+              850,
+              1400
+            ],
+            [
+              700,
+              1400
+            ],
+            [
+              850,
+              1200
+            ]
+          ],
+          "拆分推理": "水桶是绘画辅助工具,具有物理独立性,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落3.4",
+          "实质分类": "绘画辅助用品",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "户外草地和树木,草地呈绿色,树木茂盛,阳光从左上方透过树叶洒下,形成光斑。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,不属于核心展示对象,因此作为一个整体节点,不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落3.5",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落3",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 1
+}

+ 185 - 0
examples/restore_old/input/paragraphs/01_图片分段_04_g1_户外绘画场景.json

@@ -0,0 +1,185 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性在户外草地上使用画架和调色板进行绘画,背景是绿色的树木和草地。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心内容是户外绘画场景,因此将其拆分为人物、画架、调色板和背景等独立元素。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一名长发女性,身穿白色长裙,侧身站立,右手持画笔,左手持调色板,正在画布上绘画。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              300,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象,需要独立拆分。其姿态、衣着和动作是其主要特征,因此不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落4.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素3"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "木质三脚画架,支撑着一块空白画布。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              700,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              700,
+              0
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要组成部分,具有物理独立性,因此作为独立节点。画布是画架的附着物,但作为核心展示对象的一部分,需要进一步拆分。",
+          "子段落": [
+            {
+              "名称": "画布",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "空白的白色画布。",
+              "顶点坐标": [
+                [
+                  200,
+                  400
+                ],
+                [
+                  600,
+                  900
+                ],
+                [
+                  200,
+                  900
+                ],
+                [
+                  600,
+                  400
+                ]
+              ],
+              "拆分推理": "画布是画架上承载画作的核心部分,是绘画行为的直接对象,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落4.2.1",
+              "实质分类": "艺术载体",
+              "形式分类": "拍摄"
+            }
+          ],
+          "段落ID": "段落4.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "椭圆形木质调色板,上面沾有多种颜色的颜料。",
+          "顶点坐标": [
+            [
+              600,
+              1000
+            ],
+            [
+              1000,
+              1400
+            ],
+            [
+              600,
+              1400
+            ],
+            [
+              1000,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画工具,具有物理独立性,是人物手持的核心对象,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落4.3",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "户外草地和树木,草地呈绿色,树木茂盛。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,不属于核心展示对象,因此作为一个整体节点,不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落4.4",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落4",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 1
+}

+ 213 - 0
examples/restore_old/input/paragraphs/01_图片分段_05_g2_户外绘画场景.json

@@ -0,0 +1,213 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": null,
+      "描述": "一名身穿白色衬衫的女性在户外草地上绘画,手持调色板和画笔,画面聚焦于女性上半身和绘画工具。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1000,
+          0
+        ],
+        [
+          1000,
+          1500
+        ],
+        [
+          0,
+          1500
+        ]
+      ],
+      "拆分推理": "该段落是整个图像的根节点,代表了图像的整体场景。根据核心原则,首先识别内容品类为户外绘画场景,并将其作为根节点。拆分维度是场景中的核心独立物体。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "一名身穿白色长袖衬衫的女性,仅展示上半身,左手拿着调色板,右手拿着画笔,正在进行绘画。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1000,
+              0
+            ],
+            [
+              1000,
+              1500
+            ],
+            [
+              0,
+              1500
+            ]
+          ],
+          "拆分推理": "人物是场景中的核心展示对象之一,具有物理独立性和空间独立性,因此作为独立节点拆分。不继续拆分人物的身体部位,因为本创作的核心展示内容是绘画行为和工具,而非人物本身的细节。",
+          "子段落": null,
+          "段落ID": "段落5.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素6"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "木质画架,部分可见,支撑着画布。",
+          "顶点坐标": [
+            [
+              0,
+              600
+            ],
+            [
+              300,
+              600
+            ],
+            [
+              300,
+              1000
+            ],
+            [
+              0,
+              1000
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要辅助工具,具有物理独立性,因此作为独立节点拆分。画架本身不是核心展示对象,不需进一步拆分其组成部分。",
+          "子段落": null,
+          "段落ID": "段落5.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "画布",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "白色空白画布,部分可见,位于画架上。",
+          "顶点坐标": [
+            [
+              0,
+              400
+            ],
+            [
+              300,
+              400
+            ],
+            [
+              300,
+              700
+            ],
+            [
+              0,
+              700
+            ]
+          ],
+          "拆分推理": "画布是绘画的核心载体,具有物理独立性,是核心展示对象之一,因此作为独立节点拆分。画布目前是空白状态,没有需要进一步拆分的附着物。",
+          "子段落": null,
+          "段落ID": "段落5.3",
+          "实质分类": "艺术载体",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "椭圆形木质调色板,上面沾满了各种颜色的油彩,以绿色、蓝色和红色为主,被人物左手握持。",
+          "顶点坐标": [
+            [
+              290,
+              600
+            ],
+            [
+              990,
+              600
+            ],
+            [
+              990,
+              1000
+            ],
+            [
+              290,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画场景中的核心工具,具有物理独立性,是核心展示对象之一,因此作为独立节点拆分。调色板上的颜料是其附着物,但颜料本身不具备独立性,且本创作不侧重颜料的细节,因此不进一步拆分。",
+          "子段落": null,
+          "段落ID": "段落5.4",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "画笔",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "画笔笔尖部分可见,被人物右手握持,正在画布上方。",
+          "顶点坐标": [
+            [
+              200,
+              0
+            ],
+            [
+              300,
+              0
+            ],
+            [
+              300,
+              100
+            ],
+            [
+              200,
+              100
+            ]
+          ],
+          "拆分推理": "画笔是绘画场景中的核心工具,具有物理独立性,是核心展示对象之一,因此作为独立节点拆分。画笔本身不需进一步拆分。",
+          "子段落": null,
+          "段落ID": "段落5.5",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "模糊的绿色草地背景,暗示户外环境。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1000,
+              0
+            ],
+            [
+              1000,
+              1500
+            ],
+            [
+              0,
+              1500
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,但不是核心展示对象,且不具备独立性,因此作为叶子节点不继续拆分。它为核心对象提供了环境信息。",
+          "子段落": null,
+          "段落ID": "段落5.6",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落5",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 2
+}

+ 213 - 0
examples/restore_old/input/paragraphs/01_图片分段_06_g2_户外绘画场景.json

@@ -0,0 +1,213 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": null,
+      "描述": "一名身穿白色衬衫的女性在户外草地上绘画,从背后视角展示,手持调色板和画笔,正在画布上作画。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1000,
+          0
+        ],
+        [
+          1000,
+          1500
+        ],
+        [
+          0,
+          1500
+        ]
+      ],
+      "拆分推理": "该段落是整个图像的根节点,代表了图像的整体场景。根据核心原则,首先识别内容品类为户外绘画场景,并将其作为根节点。拆分维度是场景中的核心独立物体。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "一名身穿白色长袖衬衫的女性,从背后视角展示,露出部分背部,左手拿着调色板,右手拿着画笔,正在画布上作画。佩戴金色耳环和项链。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1000,
+              0
+            ],
+            [
+              1000,
+              1500
+            ],
+            [
+              0,
+              1500
+            ]
+          ],
+          "拆分推理": "人物是场景中的核心展示对象之一,具有物理独立性和空间独立性,因此作为独立节点拆分。不继续拆分人物的身体部位,因为本创作的核心展示内容是绘画行为和工具,而非人物本身的细节。",
+          "子段落": null,
+          "段落ID": "段落6.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素6"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "木质画架,支撑着画布。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              700,
+              0
+            ],
+            [
+              700,
+              400
+            ],
+            [
+              300,
+              400
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要辅助工具,具有物理独立性,因此作为独立节点拆分。画架本身不是核心展示对象,不需进一步拆分其组成部分。",
+          "子段落": null,
+          "段落ID": "段落6.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "画布",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "画布上已绘有绿色和蓝色为主的风景画,位于画架上。",
+          "顶点坐标": [
+            [
+              300,
+              200
+            ],
+            [
+              800,
+              200
+            ],
+            [
+              800,
+              800
+            ],
+            [
+              300,
+              800
+            ]
+          ],
+          "拆分推理": "画布是绘画的核心载体,具有物理独立性,是核心展示对象之一,因此作为独立节点拆分。画布上已有画作,但画作本身不具备独立性,且本创作不侧重画作的细节,因此不进一步拆分。",
+          "子段落": null,
+          "段落ID": "段落6.3",
+          "实质分类": "艺术载体",
+          "形式分类": "绘画"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "椭圆形木质调色板,上面沾满了各种颜色的油彩,以绿色、蓝色和红色为主,被人物左手握持。",
+          "顶点坐标": [
+            [
+              200,
+              600
+            ],
+            [
+              700,
+              600
+            ],
+            [
+              700,
+              1000
+            ],
+            [
+              200,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画场景中的核心工具,具有物理独立性,是核心展示对象之一,因此作为独立节点拆分。调色板上的颜料是其附着物,但颜料本身不具备独立性,且本创作不侧重颜料的细节,因此不进一步拆分。",
+          "子段落": null,
+          "段落ID": "段落6.4",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "画笔",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "画笔被人物右手握持,正在画布上作画。",
+          "顶点坐标": [
+            [
+              500,
+              400
+            ],
+            [
+              600,
+              400
+            ],
+            [
+              600,
+              500
+            ],
+            [
+              500,
+              500
+            ]
+          ],
+          "拆分推理": "画笔是绘画场景中的核心工具,具有物理独立性,是核心展示对象之一,因此作为独立节点拆分。画笔本身不需进一步拆分。",
+          "子段落": null,
+          "段落ID": "段落6.5",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": null,
+          "描述": "模糊的绿色草地和树木背景,暗示户外环境。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1000,
+              0
+            ],
+            [
+              1000,
+              1500
+            ],
+            [
+              0,
+              1500
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,但不是核心展示对象,且不具备独立性,因此作为叶子节点不继续拆分。它为核心对象提供了环境信息。",
+          "子段落": null,
+          "段落ID": "段落6.6",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落6",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 2
+}

+ 334 - 0
examples/restore_old/input/paragraphs/01_图片分段_07_g3_人物与玫瑰花.json

@@ -0,0 +1,334 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg",
+  "sections": [
+    {
+      "名称": "人物与玫瑰花",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性侧身闭眼,闻着手中的白色玫瑰花,背景是绿色的草地。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心展示内容是人物和玫瑰花,以及它们所处的环境。因此,将图片拆分为人物、玫瑰花和背景这三个主要组成部分。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "画面右侧的女性,侧脸闭眼,表情陶醉,棕色长发,佩戴金色耳环和银色项链,身穿白色上衣,双手拿着玫瑰花,指甲涂有蓝色指甲油。",
+          "顶点坐标": [
+            [
+              248,
+              20
+            ],
+            [
+              1200,
+              20
+            ],
+            [
+              1200,
+              1599
+            ],
+            [
+              248,
+              1599
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象之一,需要进一步拆分其主要组成部分,如头部、手部和服饰,以详细描述其特征。",
+          "子段落": [
+            {
+              "名称": "头部",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "女性的侧脸,闭着眼睛,鼻子高挺,嘴唇涂有红色口红,表情陶醉,棕色长发披散。",
+              "顶点坐标": [
+                [
+                  448,
+                  20
+                ],
+                [
+                  1200,
+                  20
+                ],
+                [
+                  1200,
+                  772
+                ],
+                [
+                  448,
+                  772
+                ]
+              ],
+              "拆分推理": "头部是人物的重要组成部分,包含面部特征、发型和佩饰,需要独立拆分以进行详细描述。",
+              "子段落": [
+                {
+                  "名称": "耳环",
+                  "内容类型": "图片",
+                  "内容实质": "",
+                  "描述": "女性右耳佩戴的金色几何形状耳环。",
+                  "顶点坐标": [
+                    [
+                      900,
+                      396
+                    ],
+                    [
+                      1040,
+                      396
+                    ],
+                    [
+                      1040,
+                      500
+                    ],
+                    [
+                      900,
+                      500
+                    ]
+                  ],
+                  "拆分推理": "耳环是人物头部的独立装饰物,具有物理独立性,且是视觉焦点之一,因此作为叶子节点进行描述。",
+                  "子段落": null,
+                  "段落ID": "段落7.1.1.1",
+                  "实质分类": "饰品",
+                  "形式分类": "制作",
+                  "元素ID": "元素5"
+                },
+                {
+                  "名称": "项链",
+                  "内容类型": "图片",
+                  "内容实质": "",
+                  "描述": "女性颈部佩戴的银色细链项链。",
+                  "顶点坐标": [
+                    [
+                      700,
+                      500
+                    ],
+                    [
+                      1000,
+                      500
+                    ],
+                    [
+                      1000,
+                      580
+                    ],
+                    [
+                      700,
+                      580
+                    ]
+                  ],
+                  "拆分推理": "项链是人物颈部的独立装饰物,具有物理独立性,因此作为叶子节点进行描述。",
+                  "子段落": null,
+                  "段落ID": "段落7.1.1.2",
+                  "实质分类": "饰品",
+                  "形式分类": "制作",
+                  "元素ID": "元素5"
+                }
+              ],
+              "段落ID": "段落7.1.1",
+              "实质分类": "人物身体部位",
+              "形式分类": "拍摄"
+            },
+            {
+              "名称": "手部",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "女性的双手,指甲涂有蓝色指甲油,轻轻握住玫瑰花的茎部。",
+              "顶点坐标": [
+                [
+                  248,
+                  800
+                ],
+                [
+                  680,
+                  800
+                ],
+                [
+                  680,
+                  1200
+                ],
+                [
+                  248,
+                  1200
+                ]
+              ],
+              "拆分推理": "手部是人物与玫瑰花互动的重要部分,需要独立拆分以描述其姿态和细节。",
+              "子段落": null,
+              "段落ID": "段落7.1.2",
+              "实质分类": "人物身体部位",
+              "形式分类": "拍摄",
+              "元素ID": "元素5"
+            },
+            {
+              "名称": "服饰",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "女性身穿的白色宽松上衣,领口和袖口设计独特。",
+              "顶点坐标": [
+                [
+                  400,
+                  500
+                ],
+                [
+                  1200,
+                  500
+                ],
+                [
+                  1200,
+                  1599
+                ],
+                [
+                  400,
+                  1599
+                ]
+              ],
+              "拆分推理": "服饰是人物整体形象的重要组成部分,需要独立拆分以描述其款式和颜色。",
+              "子段落": null,
+              "段落ID": "段落7.1.3",
+              "实质分类": "服装",
+              "形式分类": "制作",
+              "元素ID": "元素5"
+            }
+          ],
+          "段落ID": "段落7.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "玫瑰花",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一朵盛开的白色玫瑰花,带有绿色的茎和叶子,被女性双手握持。",
+          "顶点坐标": [
+            [
+              0,
+              300
+            ],
+            [
+              600,
+              300
+            ],
+            [
+              600,
+              1000
+            ],
+            [
+              0,
+              1000
+            ]
+          ],
+          "拆分推理": "玫瑰花是图片的核心展示对象之一,需要进一步拆分其花朵和茎叶部分,以详细描述其形态。",
+          "子段落": [
+            {
+              "名称": "花朵",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "白色玫瑰花的盛开部分,花瓣层叠。",
+              "顶点坐标": [
+                [
+                  0,
+                  300
+                ],
+                [
+                  400,
+                  300
+                ],
+                [
+                  400,
+                  600
+                ],
+                [
+                  0,
+                  600
+                ]
+              ],
+              "拆分推理": "花朵是玫瑰花的主体,是视觉焦点,因此作为叶子节点进行描述。",
+              "子段落": null,
+              "段落ID": "段落7.2.1",
+              "实质分类": "植物器官",
+              "形式分类": "种植"
+            },
+            {
+              "名称": "茎叶",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "玫瑰花的绿色茎部和叶子,叶片完整。",
+              "顶点坐标": [
+                [
+                  0,
+                  500
+                ],
+                [
+                  600,
+                  500
+                ],
+                [
+                  600,
+                  1000
+                ],
+                [
+                  0,
+                  1000
+                ]
+              ],
+              "拆分推理": "茎叶是玫瑰花的组成部分,与花朵共同构成完整的玫瑰花,因此作为叶子节点进行描述。",
+              "子段落": null,
+              "段落ID": "段落7.2.2",
+              "实质分类": "植物器官",
+              "形式分类": "种植"
+            }
+          ],
+          "段落ID": "段落7.2",
+          "实质分类": "植物",
+          "形式分类": "种植"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "模糊的绿色草地,作为人物和玫瑰花的背景。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ]
+          ],
+          "拆分推理": "背景是场景的重要组成部分,但不是核心展示对象,无需进一步拆分,作为叶子节点。",
+          "子段落": null,
+          "段落ID": "段落7.3",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落7",
+      "实质分类": "人物特写",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 3
+}

+ 214 - 0
examples/restore_old/input/paragraphs/01_图片分段_08_g1_户外绘画场景.json

@@ -0,0 +1,214 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性在户外草地上使用画架和调色板进行绘画,背景是绿色的树木和草地。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心内容是户外绘画场景,因此将其拆分为人物、画架、调色板和背景等独立元素。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一名长发女性,身穿白色长裙,侧身站立,右手持画笔,左手持调色板,正在画布上绘画。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              300,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象,需要独立拆分。其姿态、衣着和动作是其主要特征,因此不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落8.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素3"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "木质三脚画架,支撑着一块空白画布。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              700,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              700,
+              0
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要组成部分,具有物理独立性,因此作为独立节点。画布是画架的附着物,但作为核心展示对象的一部分,需要进一步拆分。",
+          "子段落": [
+            {
+              "名称": "画布",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "空白的白色画布。",
+              "顶点坐标": [
+                [
+                  200,
+                  400
+                ],
+                [
+                  600,
+                  900
+                ],
+                [
+                  200,
+                  900
+                ],
+                [
+                  600,
+                  400
+                ]
+              ],
+              "拆分推理": "画布是画架上承载画作的核心部分,是绘画行为的直接对象,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落8.2.1",
+              "实质分类": "艺术载体",
+              "形式分类": "拍摄"
+            },
+            {
+              "名称": "玫瑰花",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "一朵白色玫瑰花,放置在画架的横梁上。",
+              "顶点坐标": [
+                [
+                  300,
+                  1000
+                ],
+                [
+                  400,
+                  1100
+                ],
+                [
+                  300,
+                  1100
+                ],
+                [
+                  400,
+                  1000
+                ]
+              ],
+              "拆分推理": "玫瑰花是画架上的一个独立装饰物,具有物理独立性,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落8.2.2",
+              "实质分类": "植物装饰",
+              "形式分类": "种植"
+            }
+          ],
+          "段落ID": "段落8.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "椭圆形木质调色板,上面沾有多种颜色的颜料。",
+          "顶点坐标": [
+            [
+              600,
+              1000
+            ],
+            [
+              1000,
+              1400
+            ],
+            [
+              600,
+              1400
+            ],
+            [
+              1000,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画工具,具有物理独立性,是人物手持的核心对象,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落8.3",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "户外草地和树木,草地呈绿色,树木茂盛。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,不属于核心展示对象,因此作为一个整体节点,不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落8.4",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落8",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 1
+}

+ 186 - 0
examples/restore_old/input/paragraphs/01_图片分段_09_g1_户外绘画场景.json

@@ -0,0 +1,186 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg",
+  "sections": [
+    {
+      "名称": "户外绘画场景",
+      "内容类型": "图片",
+      "内容实质": "",
+      "描述": "一名女性在户外草地上使用画架和调色板进行绘画,背景是绿色的树木和草地,阳光透过树叶洒下。",
+      "顶点坐标": [
+        [
+          0,
+          0
+        ],
+        [
+          1200,
+          0
+        ],
+        [
+          1200,
+          1600
+        ],
+        [
+          0,
+          1600
+        ]
+      ],
+      "拆分推理": "这张图片的核心内容是户外绘画场景,因此将其拆分为人物、画架、调色板和背景等独立元素。",
+      "子段落": [
+        {
+          "名称": "人物",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "一名长发女性,身穿白色长裙,背对镜头,站立在草地上,正在画布上绘画。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "人物是图片的核心展示对象,需要独立拆分。其姿态、衣着和动作是其主要特征,因此不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落9.1",
+          "实质分类": "人物主体",
+          "形式分类": "拍摄",
+          "元素ID": "元素3"
+        },
+        {
+          "名称": "画架",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "木质三脚画架,支撑着一块画布,画布上有一幅未完成的画作。",
+          "顶点坐标": [
+            [
+              300,
+              0
+            ],
+            [
+              900,
+              1600
+            ],
+            [
+              300,
+              1600
+            ],
+            [
+              900,
+              0
+            ]
+          ],
+          "拆分推理": "画架是绘画场景中的重要组成部分,具有物理独立性,因此作为独立节点。画布是画架的附着物,但作为核心展示对象的一部分,需要进一步拆分。",
+          "子段落": [
+            {
+              "名称": "画布",
+              "内容类型": "图片",
+              "内容实质": "",
+              "描述": "白色画布,上面绘制着一幅以绿色植物和白色裙子人物为主题的油画,画作未完成。",
+              "顶点坐标": [
+                [
+                  450,
+                  300
+                ],
+                [
+                  850,
+                  900
+                ],
+                [
+                  450,
+                  900
+                ],
+                [
+                  850,
+                  300
+                ]
+              ],
+              "拆分推理": "画布是画架上承载画作的核心部分,是绘画行为的直接对象,因此作为画架的子节点独立拆分。",
+              "子段落": [],
+              "段落ID": "段落9.2.1",
+              "实质分类": "艺术载体",
+              "形式分类": "绘画",
+              "元素ID": "元素4"
+            }
+          ],
+          "段落ID": "段落9.2",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄"
+        },
+        {
+          "名称": "调色板",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "椭圆形木质调色板,上面沾有多种颜色的颜料,放置在草地上。",
+          "顶点坐标": [
+            [
+              400,
+              1000
+            ],
+            [
+              600,
+              1200
+            ],
+            [
+              400,
+              1200
+            ],
+            [
+              600,
+              1000
+            ]
+          ],
+          "拆分推理": "调色板是绘画工具,具有物理独立性,是人物手持的核心对象,因此作为独立节点。",
+          "子段落": [],
+          "段落ID": "段落9.3",
+          "实质分类": "绘画工具",
+          "形式分类": "拍摄",
+          "元素ID": "元素2"
+        },
+        {
+          "名称": "背景",
+          "内容类型": "图片",
+          "内容实质": "",
+          "描述": "户外草地和树木,草地呈绿色,树木茂盛,阳光从左上方透过树叶洒下,形成光斑。远处有一个木质凉亭。",
+          "顶点坐标": [
+            [
+              0,
+              0
+            ],
+            [
+              1200,
+              1600
+            ],
+            [
+              0,
+              1600
+            ],
+            [
+              1200,
+              0
+            ]
+          ],
+          "拆分推理": "背景是场景的组成部分,不属于核心展示对象,因此作为一个整体节点,不进一步拆分。",
+          "子段落": [],
+          "段落ID": "段落9.4",
+          "实质分类": "自然环境",
+          "形式分类": "拍摄",
+          "元素ID": "元素1"
+        }
+      ],
+      "段落ID": "段落9",
+      "实质分类": "艺术创作场景",
+      "形式分类": "拍摄"
+    }
+  ],
+  "group_id": 1
+}

+ 249 - 0
examples/restore_old/input/paragraphs/02_图片形式_01.json

@@ -0,0 +1,249 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落1",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面右侧偏中位置,一名长发女性,身穿白色长裙,侧身站立,面向左前方,右手持画笔,左手持调色板,正在画布上绘画。人物区域为从左侧290像素到右侧1200像素,从顶部100像素到底部1599像素。",
+          "是否可定量": true,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画面左侧偏中位置,一个木质三脚画架,呈浅棕色,支撑着一块画布。画架的外接矩形区域为从左侧300像素到右侧900像素,从顶部0像素到底部1599像素。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "调色板",
+          "描述": "画面右下角,女性左手持有一个椭圆形木质调色板,上面沾有多种颜色的颜料。调色板的外接矩形区域为从左侧550像素到右侧950像素,从顶部1050像素到底部1450像素。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "背景",
+          "描述": "背景占据了整个画面,其范围为从左侧0像素到右侧1200像素,从顶部0像素到底部1600像素。主要由户外草地和树木组成,草地呈绿色,树木茂盛,位于人物和画架后方。",
+          "是否可定量": true,
+          "类型": "背景",
+          "形式ID": "形式3"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落1.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性身体略微向左前方倾斜,头部向左转,目光聚焦在画布上。右手持画笔,笔尖触及画布,左手托举调色板,手臂自然弯曲。身体呈侧身站立姿态,右腿略微弯曲,左腿伸直,裙摆略微向右后方飘动,呈现出轻盈感。",
+          "是否可定量": false,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一件白色长袖连衣裙,材质轻薄,有垂坠感。裙子领口为V字形,袖子宽松,裙摆较长,覆盖至小腿或脚踝处。裙子背面有两条与裙子同色同材质的细带,位于背部上方,连接领口,呈平行状。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "女性留有长发,发色为深棕色,发丝柔顺,自然披散在背部和右肩。右侧耳后发丝向右上方轻微飘起。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "女性的肤色呈现自然健康的浅米色调,手臂和颈部皮肤质感细腻。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": true,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "视觉估计人物年龄为20-30岁之间。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物面部特征",
+          "描述": "女性面部侧向画布,仅能看到右侧脸颊和部分下颌线。右耳佩戴一个金色几何形状耳环,耳环呈开口向下的半圆形,两端略微向内弯曲。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式29"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "女性右手持一支细长的黑色画笔,笔尖为深色。左手托举一个椭圆形木质调色板。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落1.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架由木材制成,呈现浅棕色木纹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "画架为三脚架结构,由三根木质支架组成,其中两根支架在前方支撑画布,一根支架在后方提供稳定性。画架顶部有一个可调节高度的木质横梁,用于固定画布上方。画架中部有一个黑色旋钮,用于调节画布的倾斜角度和高度。画架左侧支架上挂有一个黑色条状布带,松散地垂下。",
+          "是否可定量": false,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架颜色",
+          "描述": "画架主体为浅棕色木质原色,调节旋钮为黑色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式23"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落1.2.1",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布呈矩形,垂直放置,长边垂直于地面。画布的顶点坐标为[450, 300](左上), [850, 300](右上), [850, 900](右下), [450, 900](左下)。",
+          "是否可定量": true,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布底色为白色,但大部分区域已被颜料覆盖,呈现出绿色、蓝色、白色等多种颜色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        },
+        {
+          "名称": "画作内容",
+          "描述": "画作描绘了一个以绿色植物和蓝色花朵为背景的场景,画面中央有一位身穿白色裙子的女性背影,背对观众,头部略微向左转,长发披肩,裙摆飘逸,与正在绘画的女性着装相似。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式24"
+        },
+        {
+          "名称": "画作风格",
+          "描述": "画作笔触粗犷,色彩饱和度高,通过明暗对比表现光影,具有印象派的典型特征。",
+          "是否可定量": false,
+          "类型": "风格",
+          "形式ID": "形式25"
+        },
+        {
+          "名称": "画作完成度",
+          "描述": "画作已完成大部分,画布左上角和右下角有少量留白,笔触未完全覆盖,显示为未完成状态。",
+          "是否可定量": false,
+          "类型": "状态",
+          "形式ID": "形式26"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落1.2.2",
+      "形式": [
+        {
+          "名称": "花朵颜色",
+          "描述": "花朵为纯白色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式28"
+        },
+        {
+          "名称": "花朵形态",
+          "描述": "花朵为一朵盛开的玫瑰花,花瓣层叠,形态饱满,花茎带有绿色叶片。",
+          "是否可定量": false,
+          "类型": "形态",
+          "形式ID": "形式27"
+        },
+        {
+          "名称": "花朵位置",
+          "描述": "花朵放置在画架左侧的横梁上,花头朝向左下方,花茎和叶片沿着横梁延伸。花朵的外接矩形区域为从左侧300像素到右侧400像素,从顶部1000像素到底部1100像素。",
+          "是否可定量": true,
+          "类型": "位置"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落1.3",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板呈不规则的椭圆形,边缘圆润,左侧有一个直径约2厘米的圆形拇指孔。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板由木材制成,呈现浅棕色木纹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上沾有多种颜色的颜料,包括绿色、蓝色、白色、粉色、黄色、红色、棕色等,颜色鲜艳。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料以块状或条状分布在调色板的边缘和中央区域。调色板中央区域有一大块混合的浅绿色颜料,边缘区域有混合的灰蓝色颜料。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落1.4",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景主要由大面积的绿色草地和茂密的树木组成。草地平坦,树木高大,枝叶繁茂,形成自然的绿色屏障。画面左侧远处有一片模糊的蓝色区域,可能是水面或天空。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "草地呈鲜亮的绿色,树木的叶子呈深浅不一的绿色。远处背景颜色轻微模糊,呈现偏蓝的灰绿色调。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景的清晰度低于前景的人物和画架,呈现出一定的景深模糊效果,使得前景主体更加突出。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        }
+      ]
+    }
+  ]
+}

+ 231 - 0
examples/restore_old/input/paragraphs/02_图片形式_02.json

@@ -0,0 +1,231 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落2",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "人物主体占据画面左侧约1/3区域,其中心线位于画面中心线左侧约1/8处,背对镜头,正在进行绘画活动。",
+          "是否可定量": true,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画架位于画面右侧约1/3区域,其中心线位于画面中心线右侧约1/8处,木质三脚架结构,支撑着一块画布。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "调色板",
+          "描述": "调色板位于人物左手下方,紧贴其左侧大腿外侧,部分被裙摆遮挡,椭圆形,上面沾有多种颜色的颜料。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "背景",
+          "描述": "草地占据画面下方约1/3区域,树木占据画面上方约2/3区域,整体呈现户外自然环境。",
+          "是否可定量": true,
+          "类型": "背景",
+          "形式ID": "形式3"
+        },
+        {
+          "名称": "光照效果",
+          "描述": "阳光从画面左上方约1/4区域透过树叶洒下,形成明亮的光斑和光晕效果,使画面整体呈现逆光和温暖的氛围。",
+          "是否可定量": true,
+          "类型": "效果",
+          "形式ID": "形式30"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落2.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性站立,身体向右倾斜约15度,背对镜头,头部向右转约30度,面向画架和画布,右手持画笔伸向画布,左手持调色板。",
+          "是否可定量": true,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "身穿一件白色长裙,裙子款式宽松,背部有V字形开口,开口深度约至腰部,腰部有系带,裙摆自然垂坠,长度及小腿中部。",
+          "是否可定量": true,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "长发,发色为棕色,长度及腰部,自然垂落在背部,发尾有轻微的内扣卷曲。",
+          "是否可定量": true,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "手臂和颈部露出的皮肤呈现浅麦色,在阳光下反射出柔和的光泽。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": true,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "无法从画面中精确判断人物年龄,但其身形和着装显示为成年女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "右手持一支细长的画笔,笔杆为黑色,笔尖沾有颜料;左手持一块椭圆形调色板。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落2.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "木质,呈现原木的浅棕色,带有木纹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "三脚架结构,由三根木杆通过金属铰链连接支撑,顶部有可调节高度的画板托,画板托上放置着画布。",
+          "是否可定量": false,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架颜色",
+          "描述": "浅棕色木质原色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式23"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落2.2.1",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "矩形,长宽比约为4:3,长边垂直于地面,宽边平行于地面。",
+          "是否可定量": true,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布大部分区域被颜料覆盖,仅在边缘和局部细节处可见少量白色底色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        },
+        {
+          "名称": "画作内容",
+          "描述": "画作描绘了一个穿着白色裙子、背对观众的女性人物形象,背景是绿色植物和零星的紫色小花,整体风格偏向印象派,色彩明亮。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式24"
+        },
+        {
+          "名称": "画作风格",
+          "描述": "印象派风格,笔触粗犷可见,色彩鲜明且饱和度较高,注重光影效果。",
+          "是否可定量": false,
+          "类型": "风格",
+          "形式ID": "形式25"
+        },
+        {
+          "名称": "画作完成度",
+          "描述": "画作已初具雏形,人物和背景的轮廓和主要色彩已完成,但人物面部和背景植物的纹理细节仍有待完善,属于未完成状态。",
+          "是否可定量": false,
+          "类型": "状态",
+          "形式ID": "形式26"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落2.3",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "椭圆形,边缘经过打磨,触感光滑。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "木质,呈现深棕色,表面有使用颜料留下的痕迹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上沾有多种颜料,主要包括草绿色、天蓝色、柠檬黄、赭石色等,颜色混合在一起,形成不规则的色块。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料不规则地分布在调色板的表面,呈现出多处颜料堆积和混合的痕迹,表明其已被频繁使用。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落2.4",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "画面下半部分是修剪整齐、平坦的绿色草地,画面上半部分是茂盛的、叶片繁密的绿色树木,树木之间可见明亮的天空。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "草地呈现鲜亮的翠绿色,树木呈现深浅不一的墨绿色和橄榄绿,天空呈现明亮的乳白色和淡黄色,整体色调以绿色为主。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景整体呈现明显的虚化效果,尤其是树木和远处的景物,焦点集中在人物和画架上,背景景物轮廓模糊。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        },
+        {
+          "名称": "光斑效果",
+          "描述": "画面左上方和中央偏上区域有多个明显的圆形和不规则形状的光斑,大小不一,呈现明亮的白色和黄色,是阳光透过树叶形成的散射光。",
+          "是否可定量": false,
+          "类型": "效果",
+          "形式ID": "形式32"
+        }
+      ]
+    }
+  ]
+}

+ 265 - 0
examples/restore_old/input/paragraphs/02_图片形式_03.json

@@ -0,0 +1,265 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落3",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "人物主体位于画面下半部分,占据画面高度约1/2,宽度约1/3,其中心点偏向画面左侧。",
+          "是否可定量": true,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画架位于画面中央偏右,其底部约在画面高度的1/3处,顶部接近画面顶部,宽度约占画面1/5。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "调色板",
+          "描述": "调色板位于画面左下角,紧邻人物左侧,其最宽处约占画面宽度的1/8。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "水桶",
+          "描述": "水桶位于画面右下角,紧邻画架右侧底部,其高度约占画面高度的1/10。",
+          "是否可定量": true,
+          "类型": "物件"
+        },
+        {
+          "名称": "背景",
+          "描述": "近处的绿色草地占据画面下半部分约1/3,远处的绿色树木占据画面上半部分约2/3。",
+          "是否可定量": true,
+          "类型": "背景",
+          "形式ID": "形式3"
+        },
+        {
+          "名称": "光照效果",
+          "描述": "阳光从画面左上方透过树叶洒下,在草地和树叶上形成约5-7个圆形或不规则形状的明亮光斑,直径约占画面宽度的1/20到1/10,主要分布在画面左侧和中央区域。",
+          "是否可定量": true,
+          "类型": "效果",
+          "形式ID": "形式30"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落3.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性背对镜头,双膝跪坐在草地上,身体略微前倾,与地面形成约70-80度的夹角,头部和上半身朝向画架,双手似乎正在进行绘画动作。",
+          "是否可定量": true,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "身穿一件白色长袖连衣裙,裙子材质轻薄,有自然垂坠感,后背呈深V字形开口,开口延伸至腰部上方约10-15厘米处,露出大部分背部,腰部有系带设计。",
+          "是否可定量": true,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "长发,呈深棕色,自然披散在背部,发尾微卷,长度及腰部下方约5-10厘米处。",
+          "是否可定量": true,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "从露出的背部和手臂部分看,肤色呈中等偏深的暖棕色调。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "无法从画面中精确判断人物年龄。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落3.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架主体为木质,呈现原木色,表面纹理细腻。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "采用经典的三脚架结构,由三根木质支架支撑,顶部有两根可调节的画板支撑杆,通过旋钮固定,画板放置在两根横向支撑条上。",
+          "是否可定量": true,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架颜色",
+          "描述": "画架整体呈浅棕色木质原色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式23"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落3.2.1",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布呈长方形,长宽比约为3:2,竖向放置,长边垂直于地面。",
+          "是否可定量": true,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布底色为白色,但大部分区域已被颜料覆盖。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        },
+        {
+          "名称": "画作内容",
+          "描述": "画作描绘了一名身穿白色裙子的女性背影,站在一片绿色植物和蓝色花朵的田野中,女性右手持一把白色遮阳伞,左手似乎拿着一个白色或浅色圆形物体,形状类似帽子或花束。背景有模糊的绿色树木和白色建筑轮廓。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式24"
+        },
+        {
+          "名称": "画作风格",
+          "描述": "画作笔触明显,色彩饱和度较高,光影表现突出。",
+          "是否可定量": false,
+          "类型": "风格",
+          "形式ID": "形式25"
+        },
+        {
+          "名称": "画作完成度",
+          "描述": "画作主体形象清晰,背景细节模糊,整体画面已具雏形。",
+          "是否可定量": false,
+          "类型": "状态",
+          "形式ID": "形式26"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落3.3",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板呈不规则的椭圆形,一侧边缘略有凹陷,另一侧较为平直,边缘圆润。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板为木质,表面可见木纹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上沾有多种颜料,包括天蓝色、草绿色、柠檬黄、朱红色等,颜色鲜艳饱和。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料呈不规则的块状分布在调色板的边缘和中央区域,约有5-7个主要色块,部分颜色相互混合形成过渡色。",
+          "是否可定量": true,
+          "类型": "分布",
+          "形式ID": "形式14"
+        },
+        {
+          "名称": "调色板位置",
+          "描述": "调色板放置在人物左手边的草地上,靠近人物身体,位于画面左下角区域。",
+          "是否可定量": false,
+          "类型": "位置"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落3.4",
+      "形式": [
+        {
+          "名称": "水桶颜色",
+          "描述": "水桶主体呈白色,桶身印有黑色手写体英文字母,内容为“For the love of flowers”,字体大小适中,占据桶身高度约1/3。",
+          "是否可定量": true,
+          "类型": "颜色"
+        },
+        {
+          "名称": "水桶形状",
+          "描述": "水桶呈圆柱形,带有提手,桶口直径约比桶底直径宽1/5。",
+          "是否可定量": true,
+          "类型": "形状"
+        },
+        {
+          "名称": "水桶位置",
+          "描述": "水桶放置在人物右侧的草地上,靠近画架右下角,位于画面右下角区域。",
+          "是否可定量": false,
+          "类型": "位置"
+        },
+        {
+          "名称": "画笔存在",
+          "描述": "水桶旁边可见两根画笔,笔杆呈深棕色,其中一根笔头浸入水桶中,另一根笔头靠近水桶边缘。",
+          "是否可定量": true,
+          "类型": "存在性"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落3.5",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景由近处的绿色草地和远处的茂盛树木组成。草地平坦,覆盖画面下半部分。树木高大,枝叶繁茂,形成一道绿色的屏障,占据画面上半部分。远景右侧可见约2-3个模糊的白色建筑轮廓,呈长方形或方形。",
+          "是否可定量": true,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "草地呈翠绿色,树木呈墨绿、橄榄绿等深浅不一的绿色,整体色调以绿色为主,与阳光形成暖色调对比。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景整体呈现明显的虚化效果,景深较浅,远处的树木和建筑细节模糊不清,突出前景人物和画作。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        },
+        {
+          "名称": "光斑效果",
+          "描述": "阳光从画面左上方透过树叶缝隙洒下,在草地和树叶上形成约5-7个圆形或不规则形状的明亮光斑,光斑直径约占画面宽度的1/20到1/10,主要分布在画面左侧和中央区域,光斑边缘柔和,呈现出温暖的光线氛围。",
+          "是否可定量": true,
+          "类型": "效果",
+          "形式ID": "形式32"
+        }
+      ]
+    }
+  ]
+}

+ 203 - 0
examples/restore_old/input/paragraphs/02_图片形式_04.json

@@ -0,0 +1,203 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落4",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面右侧偏中位置,一名长发女性,身穿白色长裙,侧身站立,面向左侧,右手持画笔,左手持调色板,正在画布上绘画。人物头部位于画面上方约1/4处,脚部位于画面下方约1/5处。身体躯干占据画面中央偏右区域。女性身体略微向左倾斜,头部微抬,目光看向左前方画布方向。右手持画笔,手臂微弯,画笔尖端指向画布。左手托举调色板,手臂自然弯曲。双腿被长裙遮挡,但从整体姿态判断,应为站立姿态。",
+          "是否可定量": true,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画面左侧偏中位置,一个木质三脚画架,支撑着一块空白画布。画架呈浅棕色,由三根支架构成,其中两根支架从画面左下角延伸至画面中部,另一根支架在画面左侧中部。画架左侧边缘位于画面左侧约1/10处,右侧边缘位于画面中央偏左。画架顶部位于画面上方约1/5处,底部位于画面下方约1/10处。画架为三脚架结构,由三根主支架构成,其中两根支架从地面向上倾斜支撑画布,另一根支架在后方提供稳定。画架中部有一个可调节高度的横杆,用于放置画布,横杆下方有一个木质托盘。画架中部有一个黑色皮质绑带,用于收纳或携带。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "调色板",
+          "描述": "人物左手持有的椭圆形木质调色板,位于画面右侧中部偏下,上面沾有多种颜色的颜料,包括绿色、蓝色、红色、黄色、白色等,颜料呈不规则块状分布。调色板最长直径约为人物头部宽度的1.5倍。调色板呈不规则椭圆形,边缘圆润。颜料呈不规则块状分布在调色板表面,绿色颜料集中在调色板中央,其他颜色颜料散布在边缘。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "背景",
+          "描述": "画面后方是户外草地和树木。草地呈绿色,覆盖画面底部约1/3的区域,草地平坦。树木茂盛,呈深浅不一的绿色,占据画面顶部约2/3的区域,树木之间有少量空隙可见远处的模糊建筑轮廓,呈灰色或浅色,无法辨认具体结构。",
+          "是否可定量": true,
+          "类型": "背景",
+          "形式ID": "形式3"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落4.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性身体略微向左倾斜,头部微抬,目光看向左前方画布方向。右手持画笔,手臂微弯,画笔尖端指向画布。左手托举调色板,手臂自然弯曲。双腿被长裙遮挡,无法判断具体姿态,但从裙摆看,应为站立姿态。",
+          "是否可定量": false,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一件白色长袖连衣裙,裙子款式宽松,袖子为泡泡袖设计,裙摆接近及地,略高于地面,有自然褶皱。领口为圆领。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "女性留有深棕色长发,发丝柔顺,自然垂落在肩部和背部,发尾自然垂落,略带弧度。额头前无刘海,露出完整额头。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "女性面部和手臂的肤色呈现健康的浅米色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "目测年龄在20-30岁之间。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物面部特征",
+          "描述": "女性面部轮廓柔和,眼睛呈杏仁状,眉毛弯曲,鼻梁挺拔,嘴唇饱满,涂有红色口红。右耳佩戴金色圆形耳环,耳环表面光滑,有反光。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式29"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "右手持一支细长的画笔,笔杆为黑色,笔尖为绿色。左手托举一个椭圆形木质调色板。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落4.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架由浅棕色木材制成,表面光滑,有木质纹理。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "画架为三脚架结构,由三根主支架构成,其中两根支架从地面向上倾斜支撑画布,另一根支架在后方提供稳定。画架中部有一个可调节高度的横杆,用于放置画布,横杆下方有一个木质托盘。画架中部有一个黑色皮质绑带,用于收纳或携带。",
+          "是否可定量": false,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架颜色",
+          "描述": "画架整体呈浅棕色,木质原色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式23"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落4.2.1",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布呈长方形,垂直放置在画架上,长边垂直于地面。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布表面为纯白色,无任何图案或颜色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落4.3",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板呈不规则椭圆形,边缘圆润。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板由木材制成,表面光滑,呈浅棕色。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上沾有多种颜色的颜料,主要包括深绿色、浅绿色、蓝色、红色、黄色、白色,以及少量橙色和紫色。绿色颜料占据调色板大部分区域。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料呈不规则块状分布在调色板表面,绿色颜料集中在调色板中央,其他颜色颜料散布在边缘。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落4.4",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景由近处的绿色草地和远处的茂盛树木构成。草地平坦,树木高大,树冠浓密。树木后方隐约可见模糊的建筑轮廓,无法辨认具体类型。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "背景颜色以绿色为主,草地呈鲜绿色,树木呈深浅不一的绿色,部分树叶在阳光下呈现亮绿色。天空颜色为浅蓝色或白色,占据画面顶部边缘极小部分,几乎不可见。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景整体呈现浅景深效果,草地和树木的细节相对模糊,远处的建筑轮廓更加模糊,与前景人物和画架形成对比,突出主体。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        }
+      ]
+    }
+  ]
+}

+ 255 - 0
examples/restore_old/input/paragraphs/02_图片形式_05.json

@@ -0,0 +1,255 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落5",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面主体为一名女性,仅展示其上半身,身穿白色长袖衬衫,左手握持调色板,右手握持画笔,正在进行绘画动作。人物从画面右侧中部延伸至画面左侧中部,占据画面约60%的宽度和70%的高度。",
+          "是否可定量": true,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画面左侧可见一个木质画架的局部,其支架部分呈棕色,支撑着画布。画架从画面左下角延伸至画面左侧中部,顶点坐标为[0, 700]到[300, 1000]。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "画布",
+          "描述": "画面左侧画架上放置着一块白色空白画布的局部,呈矩形,位于画架的上方。画布的顶点坐标为[0, 400]到[300, 700]。",
+          "是否可定量": true,
+          "类型": "物件"
+        },
+        {
+          "名称": "调色板",
+          "描述": "一个椭圆形木质调色板,颜色为深棕色,上面沾满了多种颜色的油彩,主要包括大面积的绿色、蓝色、红色、黄色、白色和少量其他颜色。调色板被人物的左手握持,位于画面中央偏下,顶点坐标为[290, 600]到[990, 1000]。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "画笔",
+          "描述": "一根细长的画笔,笔尖部分可见,呈绿色,被人物的右手握持,位于画布的上方,正在进行绘画动作。画笔的顶点坐标为[200, 0]到[300, 100]。",
+          "是否可定量": true,
+          "类型": "物件"
+        },
+        {
+          "名称": "背景",
+          "描述": "背景为模糊的绿色草地,光线明亮,暗示户外环境。背景占据了画面大部分区域,从画面顶部延伸至底部,顶点坐标为[0, 0]到[1000, 1500]。",
+          "是否可定量": true,
+          "类型": "背景",
+          "形式ID": "形式3"
+        },
+        {
+          "名称": "构图方式",
+          "描述": "画面采用特写构图,聚焦于人物的上半身及其绘画工具,背景虚化,突出主体。",
+          "是否可定量": false,
+          "类型": "构图",
+          "形式ID": "形式31"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落5.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性身体向左侧倾斜约15-20度,左手自然弯曲握持调色板,右手向上抬起,手肘弯曲,握持画笔,笔尖朝向画布,呈现正在绘画的专注姿态。",
+          "是否可定量": true,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一件白色长袖衬衫,材质呈现丝绸般的光泽和垂坠感,袖口有纽扣,腰部有收腰设计,衣物在手臂弯曲处和腰部形成数道柔和的弧形褶皱,整体风格简洁。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "人物发型不可见,被衣物和拍摄角度遮挡。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "人物手臂和手部肤色呈现自然健康的米色或浅棕色调。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "根据身体特征和着装判断为女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "手部和手臂皮肤细腻,无明显皱纹或斑点,表明人物处于青年或中年早期,年龄约为20-35岁之间。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "人物左手握持一个椭圆形木质调色板,右手握持一支绿色笔尖的画笔。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        },
+        {
+          "名称": "人物身体部位可见性",
+          "描述": "仅可见人物的上半身,包括手臂、手部和部分躯干,头部和下半身不可见。",
+          "是否可定量": false,
+          "类型": "可见性"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落5.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架为木质结构,呈现棕色木纹,表面经过打磨,呈现出木材特有的光泽和细腻触感。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "画架为三脚架式结构,画面中可见其左侧的两根支架,呈约70-80度角倾斜,稳定支撑画布。",
+          "是否可定量": true,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架可见性",
+          "描述": "画架仅可见左侧部分,从画面左下角延伸至画面左侧中部,顶点坐标为[0, 700]到[300, 1000],占据画面约30%的宽度和20%的高度。",
+          "是否可定量": true,
+          "类型": "可见性"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落5.3",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布呈矩形,边缘笔直,无毛边或破损。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布表面为纯白色,未有任何颜料覆盖。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        },
+        {
+          "名称": "画布可见性",
+          "描述": "画布仅可见左侧部分,位于画架上方,顶点坐标为[0, 400]到[300, 700],占据画面约30%的宽度和20%的高度。",
+          "是否可定量": true,
+          "类型": "可见性"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落5.4",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板呈不规则的椭圆形,边缘呈平滑的弧线,无尖锐角度,中间有一个拇指孔。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板为木质,表面经过打磨,呈现出木材特有的光泽和细腻触感,颜色为深棕色。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上的颜料颜色丰富,主要包括深绿色、草绿色、湖蓝色、天蓝色、紫罗兰色、鲜红色、橘红色、柠檬黄色、纯白色、煤黑色和土棕色等多种色彩。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料以块状和涂抹状分布在调色板表面,其中绿色颜料占据了调色板中央的大部分区域,蓝色、红色、黄色和白色颜料分布在边缘和绿色颜料周围,部分颜料边缘相互渗透,形成渐变或斑驳的混合区域。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        },
+        {
+          "名称": "调色板手持方式",
+          "描述": "调色板被人物的左手从下方托起,拇指穿过调色板中间的孔洞,其余手指自然弯曲支撑调色板边缘。",
+          "是否可定量": false,
+          "类型": "方式"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落5.5",
+      "形式": [
+        {
+          "名称": "画笔可见性",
+          "描述": "画笔仅可见笔尖部分和部分笔杆,笔尖呈绿色,笔杆为深棕色或黑色木质,其余部分被人物手部遮挡。",
+          "是否可定量": false,
+          "类型": "可见性"
+        },
+        {
+          "名称": "画笔手持方式",
+          "描述": "画笔被人物的右手以食指和拇指轻捏笔杆中上部,中指在下方提供支撑,无名指和小指自然弯曲的姿势握持,笔尖朝向画布。",
+          "是否可定量": false,
+          "类型": "方式"
+        },
+        {
+          "名称": "画笔位置",
+          "描述": "画笔位于画布的上方,笔尖正对着画布,准备进行绘画。画笔的顶点坐标为[200, 0]到[300, 100]。",
+          "是否可定量": false,
+          "类型": "位置"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落5.6",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景内容为户外草地,可见模糊的绿色植物和数个圆形或椭圆形的光斑,大小不一,暗示阳光透过树叶的缝隙洒落。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "背景以绿色为主,背景中绿色从前景的深绿色逐渐过渡到远景的浅绿色,并夹杂着少量黄绿色和蓝绿色调,呈现出草地的自然色彩。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景呈现明显的虚化效果,景深较浅,使主体人物和绘画工具更加突出。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        }
+      ]
+    }
+  ]
+}

+ 267 - 0
examples/restore_old/input/paragraphs/02_图片形式_06.json

@@ -0,0 +1,267 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落6",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面主体为一名女性,从画面左下角延伸至画面中央偏上,占据画面约1/2的面积,其背部和左臂构成画面的主要视觉重心。",
+          "是否可定量": false,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画面中上部偏右侧有一个木质画架,呈棕色,由两根向后倾斜的垂直支架和一根连接两支架中部的横向支撑杆构成,形成一个稳定的A字形结构,顶部有可调节的画板固定装置,支撑着画布。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "画布",
+          "描述": "画面中央偏左侧有一块矩形画布,尺寸约为画面高度的2/3,宽度约为画面宽度的1/2,垂直放置在画架上,略微向后倾斜,其下边缘与画架的横向支撑杆齐平,上边缘接近画架顶部,上面已绘有以绿色和蓝色为主的风景画,笔触粗犷,色彩鲜艳。",
+          "是否可定量": false,
+          "类型": "物件"
+        },
+        {
+          "名称": "调色板",
+          "描述": "画面左下角,人物左手握持一个椭圆形木质调色板,上面沾满了厚重的、呈块状堆积的油彩,颜料表面呈现出湿润的光泽,主要有深绿色、浅绿色、蓝色、红色、黄色、白色等。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "画笔",
+          "描述": "画面中央,人物右手握持一支笔杆为深棕色、笔毛为扁平状的画笔,笔尖沾有少量绿色颜料,正在画布上进行绘画。",
+          "是否可定量": false,
+          "类型": "物件"
+        },
+        {
+          "名称": "背景",
+          "描述": "画面右侧和上方为模糊的绿色草地和树木背景,光线明亮,从画面右上方照射过来,使得背景的绿色草地和树木呈现出柔和的光影效果,暗示户外环境。",
+          "是否可定量": false,
+          "类型": "背景",
+          "形式ID": "形式3"
+        },
+        {
+          "名称": "构图方式",
+          "描述": "画面采用近景构图,人物背影和绘画工具占据画面大部分区域,背景虚化,突出主体。",
+          "是否可定量": false,
+          "类型": "构图",
+          "形式ID": "形式31"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落6.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性身体略微前倾,头部向右侧转动约45度,视线聚焦在画布上,双臂抬起,左手持调色板,右手持画笔,呈绘画姿态。",
+          "是否可定量": false,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一件白色长袖衬衫,材质轻薄,领口和背部呈深V字形开口,背部开口延伸至肩胛骨中部,露出大部分背部皮肤。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "女性留有棕色长发,发丝柔顺,自然垂落至肩部以下,部分头发遮盖住右耳,无明显发饰。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "女性颈部和背部皮肤呈健康自然的暖白色肤色,在光线照射下略带光泽。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "人物皮肤光滑,无明显皱纹,发质良好,推测年龄在25-30岁之间。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "人物左手握持一个带有拇指孔的椭圆形木质调色板,右手握持一支笔杆为深棕色的画笔。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        },
+        {
+          "名称": "人物身体部位可见性",
+          "描述": "可见人物的背部、右侧颈部、右耳、右臂、左臂(部分)、左手、右手。",
+          "是否可定量": false,
+          "类型": "可见性"
+        },
+        {
+          "名称": "饰品类型",
+          "描述": "人物佩戴一对几何形状的金色耳环(呈不规则三角形),以及一条细长的银色项链,项链上无明显吊坠。",
+          "是否可定量": false,
+          "类型": "类型"
+        },
+        {
+          "名称": "饰品颜色",
+          "描述": "耳环为金色,项链为银色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落6.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架为浅棕色木质,表面可见清晰的天然木材纹理,无明显漆面。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "画架由两根垂直支架和一根水平支撑杆组成,形成一个约60度角的A字形结构,看起来非常稳定,支撑着画布。",
+          "是否可定量": false,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架可见性",
+          "描述": "画架大部分可见,位于画布后方,其左侧支架被人物的左臂和身体部分遮挡,右侧支架被画布遮挡了下半部分。",
+          "是否可定量": false,
+          "类型": "可见性"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落6.3",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布呈矩形。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画作内容",
+          "描述": "画布上已绘有以绿色和蓝色为主的印象派风格风景画,笔触粗犷有力,色彩鲜艳,描绘了模糊的树木和草地,画面中央似乎有一个模糊的人形轮廓。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式24"
+        },
+        {
+          "名称": "画作颜色",
+          "描述": "画作主要颜色为绿色和蓝色,辅以少量白色用于提亮,黄色用于点缀,紫色用于增加画面层次感,这些颜色以不规则的笔触分布在画面中。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "画布可见性",
+          "描述": "画布大部分可见,位于画面中央偏左侧,其右侧边缘和右上方区域被人物的右手和画笔部分遮挡。",
+          "是否可定量": false,
+          "类型": "可见性"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落6.4",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板呈椭圆形。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板为木质。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上的颜料颜色包括墨绿色、草绿色、天蓝色、普鲁士蓝、朱红色、柠檬黄、纯白色、薰衣草紫和橘红色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料呈大小不一的块状堆积在调色板表面,分布不均匀,其中深绿色和浅绿色颜料占据了调色板中央和左侧的较大面积,其他颜色如蓝色、红色、黄色、白色等则分散在边缘区域。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        },
+        {
+          "名称": "调色板手持方式",
+          "描述": "调色板被人物左手握持,拇指穿过调色板左侧边缘的椭圆形孔洞,其余四指自然弯曲,托住调色板的底部,使其保持稳定。",
+          "是否可定量": false,
+          "类型": "方式"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落6.5",
+      "形式": [
+        {
+          "名称": "画笔手持方式",
+          "描述": "画笔被人物右手以正常握笔姿势握持,食指和拇指轻轻捏住笔杆中下部,中指、无名指和小指自然弯曲,辅助支撑笔杆,笔尖朝向画布。",
+          "是否可定量": false,
+          "类型": "方式"
+        },
+        {
+          "名称": "画笔位置",
+          "描述": "画笔位于画布的右上方区域,笔尖轻触画布表面,正在画布上绘制一笔绿色颜料,笔尖略微压扁。",
+          "是否可定量": false,
+          "类型": "位置"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落6.6",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景内容为模糊的绿色草地和树木,呈现出大面积的绿色块状,树木的轮廓依稀可见,但无法辨认具体叶片或树干细节。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "背景颜色以深浅不一的绿色为主,夹杂少量棕色用于表现树干或泥土,黄色用于表现阳光照射下的高光区域,这些颜色以柔和的过渡方式融合在一起。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景呈高度虚化状态,景深模糊效果明显,使得背景景物完全模糊不清,与前景清晰的人物和绘画工具形成强烈的对比,突出了主体。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        }
+      ]
+    }
+  ]
+}

+ 353 - 0
examples/restore_old/input/paragraphs/02_图片形式_07.json

@@ -0,0 +1,353 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落7",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面右侧偏中,女性的侧脸、颈部、肩部及部分手臂占据了画面右侧约三分之二的区域,她侧身面向左侧,头部微仰,闭着眼睛,正在闻手中的白色玫瑰花。",
+          "是否可定量": false,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "玫瑰花",
+          "描述": "画面左侧偏中,一朵盛开的白色玫瑰花位于女性面部前方,花朵直径约8-10厘米,被女性双手握持,带有绿色的茎和叶子。",
+          "是否可定量": false,
+          "类型": "植物"
+        },
+        {
+          "名称": "背景",
+          "描述": "背景是模糊的深绿色草地,呈现出柔和的虚化效果,作为人物和玫瑰花的衬托,使得主体更加突出。",
+          "是否可定量": false,
+          "类型": "背景",
+          "形式ID": "形式3"
+        },
+        {
+          "名称": "构图方式",
+          "描述": "采用特写构图,将人物的侧脸、手部和玫瑰花作为主要表现对象,背景虚化,突出主体。",
+          "是否可定量": false,
+          "类型": "构图",
+          "形式ID": "形式31"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性侧身,头部微仰,闭眼,双手捧着玫瑰花靠近鼻子,呈现出陶醉、享受的姿态。",
+          "是否可定量": false,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物表情",
+          "描述": "女性闭着眼睛,嘴角微扬,面部放松,呈现出陶醉、满足的表情。",
+          "是否可定量": false,
+          "类型": "表情"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "女性留有棕色长发,发丝柔顺,大部分发丝披散在右侧肩部和背部,长度及腰。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "女性肤色白皙,略带暖调,面部和手部皮肤光滑细腻。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "目测为青年女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一件白色宽松上衣,领口为V字形设计,袖口为宽松的喇叭袖设计,材质看起来轻薄飘逸。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "女性双手握持一朵白色玫瑰花。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        },
+        {
+          "名称": "指甲油颜色",
+          "描述": "女性指甲涂有亮蓝色指甲油。",
+          "是否可定量": false,
+          "类型": "颜色"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.1.1",
+      "形式": [
+        {
+          "名称": "面部朝向",
+          "描述": "女性面部朝向左侧,呈现侧脸。",
+          "是否可定量": false,
+          "类型": "朝向"
+        },
+        {
+          "名称": "眼睛状态",
+          "描述": "女性双眼紧闭。",
+          "是否可定量": false,
+          "类型": "状态"
+        },
+        {
+          "名称": "鼻子形态",
+          "描述": "女性鼻子高挺,鼻梁笔直。",
+          "是否可定量": false,
+          "类型": "形态"
+        },
+        {
+          "名称": "嘴唇颜色",
+          "描述": "女性嘴唇涂有红色口红,颜色鲜艳。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "发型",
+          "描述": "女性留有棕色长发,发丝柔顺,部分发丝从耳后自然垂落至颈部,其余发丝向后披散。",
+          "是否可定量": false,
+          "类型": "样式"
+        },
+        {
+          "名称": "表情",
+          "描述": "女性闭着眼睛,嘴角微扬,面部放松,呈现出陶醉、享受的表情。",
+          "是否可定量": false,
+          "类型": "表情"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.1.1.1",
+      "形式": [
+        {
+          "名称": "耳环颜色",
+          "描述": "耳环为金色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "耳环形状",
+          "描述": "耳环呈不规则的C形或半环形,边缘圆润,开口朝向下方。",
+          "是否可定量": false,
+          "类型": "形状"
+        },
+        {
+          "名称": "耳环材质",
+          "描述": "耳环材质看起来是金属。",
+          "是否可定量": false,
+          "类型": "材质"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.1.1.2",
+      "形式": [
+        {
+          "名称": "项链颜色",
+          "描述": "项链为银色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "项链材质",
+          "描述": "项链材质看起来是金属。",
+          "是否可定量": false,
+          "类型": "材质"
+        },
+        {
+          "名称": "项链款式",
+          "描述": "项链为细链款式,链条由多个细小的椭圆形环扣紧密连接而成,佩戴在颈部,长度适中,刚好贴合锁骨。",
+          "是否可定量": false,
+          "类型": "款式"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.1.2",
+      "形式": [
+        {
+          "名称": "手部姿态",
+          "描述": "女性双手轻轻握住玫瑰花的茎部,手指修长,指甲涂有蓝色指甲油。",
+          "是否可定量": false,
+          "类型": "姿态"
+        },
+        {
+          "名称": "指甲油颜色",
+          "描述": "女性指甲涂有亮蓝色指甲油。",
+          "是否可定量": false,
+          "类型": "颜色"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.1.3",
+      "形式": [
+        {
+          "名称": "服装颜色",
+          "描述": "上衣为白色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "服装款式",
+          "描述": "上衣为宽松款式,领口和袖口设计独特,整体剪裁流畅,线条简洁。",
+          "是否可定量": false,
+          "类型": "款式"
+        },
+        {
+          "名称": "服装材质",
+          "描述": "上衣材质看起来轻薄、柔软,具有一定的垂坠感,表面略带光泽,推测为丝绸或仿真丝面料。",
+          "是否可定量": false,
+          "类型": "材质"
+        },
+        {
+          "名称": "领口设计",
+          "描述": "上衣领口为V字形设计,领口边缘有与衣身同色的细致缝线,线条流畅。",
+          "是否可定量": false,
+          "类型": "设计"
+        },
+        {
+          "名称": "袖口设计",
+          "描述": "上衣袖口为宽松的喇叭袖设计,袖口处有均匀分布的细密褶皱,增加了袖子的蓬松感。",
+          "是否可定量": false,
+          "类型": "设计"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.2",
+      "形式": [
+        {
+          "名称": "花朵颜色",
+          "描述": "玫瑰花朵为白色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式28"
+        },
+        {
+          "名称": "花朵形态",
+          "描述": "玫瑰花朵盛开,花瓣层叠,形态饱满。",
+          "是否可定量": false,
+          "类型": "形态",
+          "形式ID": "形式27"
+        },
+        {
+          "名称": "茎叶颜色",
+          "描述": "玫瑰花的茎和叶子为绿色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "茎叶形态",
+          "描述": "玫瑰花的茎部细长,叶片完整,呈椭圆形,叶脉清晰可见,颜色略深于叶片本身,呈羽状分布。",
+          "是否可定量": false,
+          "类型": "形态"
+        },
+        {
+          "名称": "手持方式",
+          "描述": "玫瑰花被女性双手轻轻握住茎部,靠近女性面部。",
+          "是否可定量": false,
+          "类型": "方式"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.2.1",
+      "形式": [
+        {
+          "名称": "花朵颜色",
+          "描述": "花朵为白色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式28"
+        },
+        {
+          "名称": "花朵形态",
+          "描述": "花朵盛开,花瓣向外舒展,形态饱满。",
+          "是否可定量": false,
+          "类型": "形态",
+          "形式ID": "形式27"
+        },
+        {
+          "名称": "花瓣层叠",
+          "描述": "花瓣层层叠叠,约有数十片,由内向外螺旋状排列,形成饱满的花型。",
+          "是否可定量": false,
+          "类型": "结构"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.2.2",
+      "形式": [
+        {
+          "名称": "茎颜色",
+          "描述": "茎部为绿色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "叶子颜色",
+          "描述": "叶子为绿色。",
+          "是否可定量": false,
+          "类型": "颜色"
+        },
+        {
+          "名称": "叶片完整性",
+          "描述": "叶片完整无缺,表面光滑,边缘无锯齿状破损,呈现出健康的生长状态。",
+          "是否可定量": false,
+          "类型": "状态"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落7.3",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景内容为草地。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "背景颜色为绿色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景模糊,呈现出虚化的效果,突出前景的人物和玫瑰花。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        }
+      ]
+    }
+  ]
+}

+ 228 - 0
examples/restore_old/input/paragraphs/02_图片形式_08.json

@@ -0,0 +1,228 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落8",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面右侧偏中位置,一名女性正在进行绘画,人物从画面底部向上延伸至画面约60%的高度,从画面右侧边缘向左延伸至画面约40%的宽度,其身体朝向左侧,头部略微向右转动,视线看向画布。",
+          "是否可定量": true,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画面左侧偏中位置,一个木质三脚画架,支撑着一块白色画布,画架的左侧支架从画面底部延伸至画面顶部约65%处,右侧支架从画面底部延伸至画面中部约50%处。画架整体宽度占据画面约20%,呈A字形。",
+          "是否可定量": true,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "调色板",
+          "描述": "画面右下角,女性左手持有一个椭圆形木质调色板,调色板上沾有多种颜色的颜料,包括绿色、蓝色、黄色、红色、紫色、棕色和白色,其中绿色和蓝色颜料面积较大,分布在调色板的中央和左侧区域,呈不规则块状。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "背景",
+          "描述": "画面主体人物和画架后方是绿色的草地和茂密的树木,草地占据画面底部约40%的高度,树木占据画面顶部约60%的高度。树木种类为灌木和乔木,枝干交错,叶片茂密,部分树木可见红色小花,呈现出自然、户外的环境。",
+          "是否可定量": true,
+          "类型": "背景",
+          "形式ID": "形式3"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落8.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性身体侧向左前方,头部略微向右转动,视线看向画布。右手持画笔,手肘弯曲,手腕抬起,画笔尖端触及画布。左手自然下垂,手肘微弯,调色板位于左侧大腿外侧,与地面平行。双腿站立,身体重心略微偏向左侧。",
+          "是否可定量": false,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一套白色长裙,上衣为宽松的蝙蝠袖设计,腰部有数条细密的横向褶皱,形成收紧效果。下半身是垂坠感强的A字形长裙,裙摆及地,有自然形成的竖向褶皱。整体服装风格简约优雅。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "女性留有棕色长发,发丝柔顺,中分,自然垂落在肩部和背部,部分发丝被耳后佩戴的金色圆形耳饰遮挡。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "女性面部、颈部和手臂的肤色呈现出均匀的浅米色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "视觉判断年龄在25-35岁之间。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        },
+        {
+          "名称": "人物面部特征",
+          "描述": "女性面部轮廓柔和,眉毛细长,眼睛呈杏仁状,双眼皮,眼线细致,鼻梁挺拔,嘴唇饱满,涂有淡粉色唇彩。右耳佩戴一个金色圆形耳饰,耳饰上镶嵌有白色小珠。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式29"
+        },
+        {
+          "名称": "人物手持物",
+          "描述": "右手持一支细长的画笔,笔杆为深色木质,笔尖为白色合成纤维毛刷,沾有少量白色颜料。左手持一个椭圆形木质调色板。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式19"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落8.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架由浅棕色木材制成,表面光滑,呈现出细密的竖向木纹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "画架为三脚架结构,由三根主支架构成,其中两根支架在前方中部交叉,一根支架在后方支撑。画架中部有一个可调节高度的横梁,横梁上有一个凹槽用于放置画布。横梁下方悬挂着一条黑色帆布背带。",
+          "是否可定量": false,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架颜色",
+          "描述": "画架整体呈现浅棕色,与木材的自然颜色一致。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式23"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落8.2.1",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布呈长方形,长宽比约为3:2,垂直放置在画架上,其长边垂直于地面,短边平行于地面。",
+          "是否可定量": true,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布表面为纯白色,未有任何颜料覆盖。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落8.2.2",
+      "形式": [
+        {
+          "名称": "花朵颜色",
+          "描述": "花朵为纯白色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式28"
+        },
+        {
+          "名称": "花朵形态",
+          "描述": "花朵为一朵盛开的玫瑰花,花瓣约有20-30片,层叠紧密,边缘略微卷曲,花朵直径约5-7厘米,饱满圆润。",
+          "是否可定量": true,
+          "类型": "形态",
+          "形式ID": "形式27"
+        },
+        {
+          "名称": "花朵位置",
+          "描述": "花朵放置在画架右侧横梁的右端,距离画布右下角约2厘米。",
+          "是否可定量": true,
+          "类型": "位置"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落8.3",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板呈椭圆形,长轴约30厘米,短轴约20厘米,边缘光滑。",
+          "是否可定量": true,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板为木质,表面呈现出细密的环形木纹。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上沾有多种颜色的颜料,包括鲜绿色、天蓝色、柠檬黄、大红色、紫罗兰色、深棕色和纯白色,其中鲜绿色和天蓝色颜料面积较大,分布在调色板的中央和左侧区域。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料呈不规则的块状分布在调色板的表面,没有明显的规律性,各种颜色相互交错,部分绿色和黄色颜料混合形成黄绿色,部分蓝色和红色颜料混合形成紫色。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落8.4",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景由两部分组成:前景是修剪整齐的绿色草地,占据画面下半部分;后景是茂密的绿色树木,占据画面上半部分。树木的枝干和叶片清晰可见,部分树木之间有少量空隙,露出远处的模糊建筑轮廓或山峦。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "草地呈现鲜亮的翠绿色,树木呈现墨绿色、橄榄绿等深浅不一的绿色,整体色调以绿色为主。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景的草地和近处树木较为清晰,远处的树木和景物略显模糊,细节难以辨认,呈现出明显的景深效果。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        }
+      ]
+    }
+  ]
+}

+ 236 - 0
examples/restore_old/input/paragraphs/02_图片形式_09.json

@@ -0,0 +1,236 @@
+{
+  "image_url": "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg",
+  "form_elements": [
+    {
+      "段落ID": "段落9",
+      "形式": [
+        {
+          "名称": "人物",
+          "描述": "画面中有一名女性,背对镜头,其中心点位于画面右侧约1/3处,距离画面底部约1/4高度,正在进行绘画活动。",
+          "是否可定量": false,
+          "类型": "主体",
+          "形式ID": "形式1"
+        },
+        {
+          "名称": "画架",
+          "描述": "画面中有一个木质三脚画架,其中心点位于画面左侧约1/3处,距离画面底部约1/3高度,支撑着一块画布。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式8"
+        },
+        {
+          "名称": "调色板",
+          "描述": "画面中有一个椭圆形木质调色板,位于画架右侧支撑杆上,紧邻画布底部边缘,其左侧约1/3被人物右手遮挡,上面沾有多种颜色的颜料。",
+          "是否可定量": false,
+          "类型": "物件",
+          "形式ID": "形式12"
+        },
+        {
+          "名称": "背景",
+          "描述": "背景是户外草地和树木,草地呈绿色,树木茂盛,远处左侧约1/4处有一个木质凉亭,其顶部与画面中线齐平,凉亭大部分被树木遮挡,仅可见其部分结构,整体环境明亮。",
+          "是否可定量": false,
+          "类型": "背景",
+          "形式ID": "形式3"
+        },
+        {
+          "名称": "光照效果",
+          "描述": "画面整体光线明亮,阳光从画面左上角约45度方向射入,在画面左侧和中心区域的草地和树叶上形成多个不规则形状的明亮光斑,其中最大的光斑位于画面左下角,直径约占画面宽度的1/10。",
+          "是否可定量": false,
+          "类型": "效果",
+          "形式ID": "形式30"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落9.1",
+      "形式": [
+        {
+          "名称": "人物姿态",
+          "描述": "女性背对镜头,身体向右侧倾斜约5-10度,头部向左侧倾斜约3-5度,双手抬起,似乎正在用右手持画笔在画布上绘画。",
+          "是否可定量": false,
+          "类型": "姿态",
+          "形式ID": "形式2"
+        },
+        {
+          "名称": "人物着装",
+          "描述": "女性身穿一件白色长裙,裙子为深V领设计,V领延伸至背部中线,露背范围从肩胛骨下方延伸至腰部,裙摆宽松,垂至脚踝,腰部有系带。",
+          "是否可定量": false,
+          "类型": "服饰",
+          "形式ID": "形式4"
+        },
+        {
+          "名称": "人物发型",
+          "描述": "女性留有深棕色长发,发量浓密,发长及腰,发尾在腰部以下约10厘米处呈现自然的大波浪微卷,自然垂落在背部。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式6"
+        },
+        {
+          "名称": "人物肤色",
+          "描述": "女性的肤色呈现暖调的浅棕色,类似于小麦色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式10"
+        },
+        {
+          "名称": "人物性别",
+          "描述": "人物为女性。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式15"
+        },
+        {
+          "名称": "人物年龄",
+          "描述": "根据人物的体态和发型,估计年龄在25-30岁之间。",
+          "是否可定量": false,
+          "类型": "特征",
+          "形式ID": "形式18"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落9.2",
+      "形式": [
+        {
+          "名称": "画架材质",
+          "描述": "画架由木材制成,呈现原木色泽。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式20"
+        },
+        {
+          "名称": "画架结构",
+          "描述": "画架为三脚支撑结构,顶部有两根可调节的画板支撑杆,呈V字形向上延伸,底部有两根横向支撑杆,分别位于画架下部约1/3和2/3处,用于增加稳定性。",
+          "是否可定量": false,
+          "类型": "结构",
+          "形式ID": "形式16"
+        },
+        {
+          "名称": "画架颜色",
+          "描述": "画架呈现浅棕色木质原色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式23"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落9.2.1",
+      "形式": [
+        {
+          "名称": "画布形状",
+          "描述": "画布为矩形,长宽比约为1:1.45,垂直放置。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式13"
+        },
+        {
+          "名称": "画布颜色",
+          "描述": "画布底色为白色,上面覆盖有颜料。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式22"
+        },
+        {
+          "名称": "画作内容",
+          "描述": "画作内容以绿色和蓝色为主色调,呈现出流动的、模糊的自然风景轮廓,画面右侧可见一团白色颜料,隐约勾勒出人物的头部和肩部轮廓。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式24"
+        },
+        {
+          "名称": "画作风格",
+          "描述": "画作风格融合了印象派的色彩运用和抽象派的笔触,呈现出半抽象的视觉效果。",
+          "是否可定量": false,
+          "类型": "风格",
+          "形式ID": "形式25"
+        },
+        {
+          "名称": "画作完成度",
+          "描述": "画作尚未完成,画布左上角和右下角仍有约1/4的空白区域,画面中央的景物也仅是初步上色,缺乏细节刻画。",
+          "是否可定量": false,
+          "类型": "状态",
+          "形式ID": "形式26"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落9.3",
+      "形式": [
+        {
+          "名称": "调色板形状",
+          "描述": "调色板为不规则椭圆形,边缘圆润。",
+          "是否可定量": false,
+          "类型": "形状",
+          "形式ID": "形式17"
+        },
+        {
+          "名称": "调色板材质",
+          "描述": "调色板为木质。",
+          "是否可定量": false,
+          "类型": "材质",
+          "形式ID": "形式21"
+        },
+        {
+          "名称": "颜料颜色",
+          "描述": "调色板上沾有多种颜色的颜料,主要包括绿色、蓝色、黄色、红色和白色。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式9"
+        },
+        {
+          "名称": "颜料分布",
+          "描述": "颜料呈大小不一的不规则块状分布,其中绿色和蓝色颜料块较大,位于调色板中心区域,部分已混合成新的色调,边缘散布着较小的黄色、红色和白色颜料点。",
+          "是否可定量": false,
+          "类型": "分布",
+          "形式ID": "形式14"
+        },
+        {
+          "名称": "调色板位置",
+          "描述": "调色板位于画架中部偏右的一个小型木质托盘上,该托盘位于画布底部下方约10厘米处,被人物右手部分遮挡。",
+          "是否可定量": false,
+          "类型": "位置"
+        }
+      ]
+    },
+    {
+      "段落ID": "段落9.4",
+      "形式": [
+        {
+          "名称": "背景内容",
+          "描述": "背景主要由大面积的绿色草地和茂盛的树木构成,远处可见一个木质凉亭,更远处,在画面左上角树木的缝隙中,隐约可见几栋高层城市建筑的模糊轮廓,呈浅灰色。",
+          "是否可定量": false,
+          "类型": "内容",
+          "形式ID": "形式5"
+        },
+        {
+          "名称": "背景颜色",
+          "描述": "背景颜色以绿色为主,草地呈鲜绿色,树木叶片呈深浅不一的绿色和黄绿色,天空呈明亮的浅白色,占据画面上半部分约1/3的区域,颜色均匀,无明显云朵。",
+          "是否可定量": false,
+          "类型": "颜色",
+          "形式ID": "形式7"
+        },
+        {
+          "名称": "背景清晰度",
+          "描述": "背景景深较浅,远处的树木和城市建筑呈现明显的虚化效果,细节模糊不清;近处的草地纹理清晰可见,凉亭的木质结构也较为锐利。",
+          "是否可定量": false,
+          "类型": "清晰度",
+          "形式ID": "形式11"
+        },
+        {
+          "名称": "光斑效果",
+          "描述": "画面中共有约5-7个主要光斑,集中分布在画面左侧和中央的草地上,最大的光斑位于画面左下角,亮度极高,呈椭圆形,其余光斑较小,亮度稍低,呈不规则圆形或条状。",
+          "是否可定量": false,
+          "类型": "效果",
+          "形式ID": "形式32"
+        },
+        {
+          "名称": "建筑存在",
+          "描述": "背景中存在一个木质凉亭,位于画面左侧偏中位置,结构为四柱支撑的方形顶棚,凉亭内可见一张木质长凳,位于凉亭内部的左侧,长凳的细节因距离较远而略显模糊。",
+          "是否可定量": false,
+          "类型": "存在性"
+        }
+      ]
+    }
+  ]
+}

+ 137 - 0
examples/restore_old/input/paragraphs/03_图片制作点实质结果.json

@@ -0,0 +1,137 @@
+[
+  {
+    "元素ID": "元素1",
+    "元素名称": "背景",
+    "元素描述": "户外草地背景,有树木和灌木,光线明亮,自然环境",
+    "段落数量": 9,
+    "段落列表": [
+      "段落1.4",
+      "段落2.4",
+      "段落3.5",
+      "段落4.4",
+      "段落5.6",
+      "段落6.6",
+      "段落7.3",
+      "段落8.4",
+      "段落9.4"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 70.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 91.0
+  },
+  {
+    "元素ID": "元素2",
+    "元素名称": "调色板",
+    "元素描述": "椭圆形调色板,上面有多种颜色的颜料,色彩丰富,有绿色、蓝色、黄色、红色等",
+    "段落数量": 8,
+    "段落列表": [
+      "段落1.3",
+      "段落2.3",
+      "段落3.3",
+      "段落4.3",
+      "段落5.4",
+      "段落6.4",
+      "段落8.3",
+      "段落9.3"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 75.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 87.83
+  },
+  {
+    "元素ID": "元素3",
+    "元素名称": "人物",
+    "元素描述": "女性,长发,穿着白色连衣裙,正在绘画,姿态多样(站立、侧身、背对、蹲坐),手持画笔和调色板",
+    "段落数量": 6,
+    "段落列表": [
+      "段落1.1",
+      "段落2.1",
+      "段落3.1",
+      "段落4.1",
+      "段落8.1",
+      "段落9.1"
+    ],
+    "覆盖图片数": 6,
+    "出现总次数": 6,
+    "重要性得分": 95.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 66.67,
+    "覆盖率得分": 40.0,
+    "频率权重": 80.0,
+    "综合权重": 84.5
+  },
+  {
+    "元素ID": "元素4",
+    "元素名称": "画布",
+    "元素描述": "画架上的画布,上面有未完成的画作,画作内容为穿着白色连衣裙的女性背影,背景是绿色植物和蓝色花朵",
+    "段落数量": 4,
+    "段落列表": [
+      "段落1.2.1",
+      "段落2.2.1",
+      "段落3.2.1",
+      "段落9.2.1"
+    ],
+    "覆盖图片数": 4,
+    "出现总次数": 4,
+    "重要性得分": 80.0,
+    "频次基础分": 60,
+    "频次得分": 24.0,
+    "覆盖率基础分": 44.44,
+    "覆盖率得分": 26.67,
+    "频率权重": 50.67,
+    "综合权重": 59.47
+  },
+  {
+    "元素ID": "元素5",
+    "元素名称": "人物细节",
+    "元素描述": "女性的手部,指甲涂有蓝色指甲油;白色连衣裙;耳环;项链",
+    "段落数量": 4,
+    "段落列表": [
+      "段落7.1.2",
+      "段落7.1.3",
+      "段落7.1.1.1",
+      "段落7.1.1.2"
+    ],
+    "覆盖图片数": 1,
+    "出现总次数": 4,
+    "重要性得分": 95.0,
+    "频次基础分": 60,
+    "频次得分": 24.0,
+    "覆盖率基础分": 11.11,
+    "覆盖率得分": 6.67,
+    "频率权重": 30.67,
+    "综合权重": 49.97
+  },
+  {
+    "元素ID": "元素6",
+    "元素名称": "人物",
+    "元素描述": "女性,穿着白色连衣裙,手持调色板和画笔,正在绘画",
+    "段落数量": 2,
+    "段落列表": [
+      "段落5.1",
+      "段落6.1"
+    ],
+    "覆盖图片数": 2,
+    "出现总次数": 2,
+    "重要性得分": 95.0,
+    "频次基础分": 20,
+    "频次得分": 8.0,
+    "覆盖率基础分": 22.22,
+    "覆盖率得分": 13.33,
+    "频率权重": 21.33,
+    "综合权重": 43.43
+  }
+]

+ 738 - 0
examples/restore_old/input/paragraphs/04_图片制作点形式结果.json

@@ -0,0 +1,738 @@
+[
+  {
+    "形式ID": "形式1",
+    "形式名称": "人物",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1|人物",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2|人物",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3|人物",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4|人物",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5|人物",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6|人物",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7|人物",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8|人物",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9|人物"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 95.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 98.5
+  },
+  {
+    "形式ID": "形式2",
+    "形式名称": "人物姿态",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物姿态",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.1|人物姿态"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 85.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 95.5
+  },
+  {
+    "形式ID": "形式3",
+    "形式名称": "背景",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1|背景",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2|背景",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3|背景",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4|背景",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5|背景",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6|背景",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7|背景",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8|背景",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9|背景"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 70.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 91.0
+  },
+  {
+    "形式ID": "形式4",
+    "形式名称": "人物着装",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物着装",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.1|人物着装"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 70.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 91.0
+  },
+  {
+    "形式ID": "形式5",
+    "形式名称": "背景内容",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.4|背景内容",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.4|背景内容",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.5|背景内容",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.4|背景内容",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.6|背景内容",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.6|背景内容",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.3|背景内容",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.4|背景内容",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.4|背景内容"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 70.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 91.0
+  },
+  {
+    "形式ID": "形式6",
+    "形式名称": "人物发型",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物发型",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.1|人物发型"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 65.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 89.5
+  },
+  {
+    "形式ID": "形式7",
+    "形式名称": "背景颜色",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.4|背景颜色",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.4|背景颜色",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.5|背景颜色",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.4|背景颜色",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.6|背景颜色",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.6|背景颜色",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.3|背景颜色",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.4|背景颜色",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.4|背景颜色"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 65.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 89.5
+  },
+  {
+    "形式ID": "形式8",
+    "形式名称": "画架",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1|画架",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2|画架",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3|画架",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4|画架",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5|画架",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6|画架",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8|画架",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9|画架"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 80.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 89.33
+  },
+  {
+    "形式ID": "形式9",
+    "形式名称": "颜料颜色",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.3|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.3|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.3|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.3|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.4|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.4|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.3|颜料颜色",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.3|颜料颜色"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 80.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 89.33
+  },
+  {
+    "形式ID": "形式10",
+    "形式名称": "人物肤色",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物肤色",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.1|人物肤色"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 60.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 88.0
+  },
+  {
+    "形式ID": "形式11",
+    "形式名称": "背景清晰度",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.4|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.4|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.5|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.4|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.6|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.6|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.3|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.4|背景清晰度",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.4|背景清晰度"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 60.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 88.0
+  },
+  {
+    "形式ID": "形式12",
+    "形式名称": "调色板",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1|调色板",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2|调色板",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3|调色板",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4|调色板",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5|调色板",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6|调色板",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8|调色板",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9|调色板"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 75.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 87.83
+  },
+  {
+    "形式ID": "形式13",
+    "形式名称": "画布形状",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.1|画布形状",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2.1|画布形状",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2.1|画布形状",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.2.1|画布形状",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.3|画布形状",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.3|画布形状",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2.1|画布形状",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2.1|画布形状"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 75.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 87.83
+  },
+  {
+    "形式ID": "形式14",
+    "形式名称": "颜料分布",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.3|颜料分布",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.3|颜料分布",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.3|颜料分布",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.3|颜料分布",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.4|颜料分布",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.4|颜料分布",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.3|颜料分布",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.3|颜料分布"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 75.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 87.83
+  },
+  {
+    "形式ID": "形式15",
+    "形式名称": "人物性别",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物性别",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.1|人物性别"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 55.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 86.5
+  },
+  {
+    "形式ID": "形式16",
+    "形式名称": "画架结构",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2|画架结构",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2|画架结构"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 70.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 86.33
+  },
+  {
+    "形式ID": "形式17",
+    "形式名称": "调色板形状",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.3|调色板形状",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.3|调色板形状",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.3|调色板形状",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.3|调色板形状",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.4|调色板形状",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.4|调色板形状",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.3|调色板形状",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.3|调色板形状"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 70.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 86.33
+  },
+  {
+    "形式ID": "形式18",
+    "形式名称": "人物年龄",
+    "出现次数": 9,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物年龄",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.1|人物年龄"
+    ],
+    "覆盖图片数": 9,
+    "出现总次数": 9,
+    "重要性得分": 50.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 100.0,
+    "覆盖率得分": 60.0,
+    "频率权重": 100.0,
+    "综合权重": 85.0
+  },
+  {
+    "形式ID": "形式19",
+    "形式名称": "人物手持物",
+    "出现次数": 7,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物手持物",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.1|人物手持物",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物手持物",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.1|人物手持物",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.1|人物手持物",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.1|人物手持物",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物手持物"
+    ],
+    "覆盖图片数": 7,
+    "出现总次数": 7,
+    "重要性得分": 78.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 77.78,
+    "覆盖率得分": 46.67,
+    "频率权重": 86.67,
+    "综合权重": 84.07
+  },
+  {
+    "形式ID": "形式20",
+    "形式名称": "画架材质",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2|画架材质",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2|画架材质"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 60.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 83.33
+  },
+  {
+    "形式ID": "形式21",
+    "形式名称": "调色板材质",
+    "出现次数": 8,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.3|调色板材质",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.3|调色板材质",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.3|调色板材质",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.3|调色板材质",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.4|调色板材质",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.4|调色板材质",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.3|调色板材质",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.3|调色板材质"
+    ],
+    "覆盖图片数": 8,
+    "出现总次数": 8,
+    "重要性得分": 60.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 88.89,
+    "覆盖率得分": 53.33,
+    "频率权重": 93.33,
+    "综合权重": 83.33
+  },
+  {
+    "形式ID": "形式22",
+    "形式名称": "画布颜色",
+    "出现次数": 7,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.1|画布颜色",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2.1|画布颜色",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2.1|画布颜色",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.2.1|画布颜色",
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5.3|画布颜色",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2.1|画布颜色",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2.1|画布颜色"
+    ],
+    "覆盖图片数": 7,
+    "出现总次数": 7,
+    "重要性得分": 65.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 77.78,
+    "覆盖率得分": 46.67,
+    "频率权重": 86.67,
+    "综合权重": 80.17
+  },
+  {
+    "形式ID": "形式23",
+    "形式名称": "画架颜色",
+    "出现次数": 6,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2|画架颜色",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2|画架颜色",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2|画架颜色",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.2|画架颜色",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2|画架颜色",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2|画架颜色"
+    ],
+    "覆盖图片数": 6,
+    "出现总次数": 6,
+    "重要性得分": 55.0,
+    "频次基础分": 100,
+    "频次得分": 40.0,
+    "覆盖率基础分": 66.67,
+    "覆盖率得分": 40.0,
+    "频率权重": 80.0,
+    "综合权重": 72.5
+  },
+  {
+    "形式ID": "形式24",
+    "形式名称": "画作内容",
+    "出现次数": 5,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.1|画作内容",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2.1|画作内容",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2.1|画作内容",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6.3|画作内容",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2.1|画作内容"
+    ],
+    "覆盖图片数": 5,
+    "出现总次数": 5,
+    "重要性得分": 85.0,
+    "频次基础分": 80,
+    "频次得分": 32.0,
+    "覆盖率基础分": 55.56,
+    "覆盖率得分": 33.33,
+    "频率权重": 65.33,
+    "综合权重": 71.23
+  },
+  {
+    "形式ID": "形式25",
+    "形式名称": "画作风格",
+    "出现次数": 4,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.1|画作风格",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2.1|画作风格",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2.1|画作风格",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2.1|画作风格"
+    ],
+    "覆盖图片数": 4,
+    "出现总次数": 4,
+    "重要性得分": 70.0,
+    "频次基础分": 60,
+    "频次得分": 24.0,
+    "覆盖率基础分": 44.44,
+    "覆盖率得分": 26.67,
+    "频率权重": 50.67,
+    "综合权重": 56.47
+  },
+  {
+    "形式ID": "形式26",
+    "形式名称": "画作完成度",
+    "出现次数": 4,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.1|画作完成度",
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.2.1|画作完成度",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.2.1|画作完成度",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.2.1|画作完成度"
+    ],
+    "覆盖图片数": 4,
+    "出现总次数": 4,
+    "重要性得分": 60.0,
+    "频次基础分": 60,
+    "频次得分": 24.0,
+    "覆盖率基础分": 44.44,
+    "覆盖率得分": 26.67,
+    "频率权重": 50.67,
+    "综合权重": 53.47
+  },
+  {
+    "形式ID": "形式27",
+    "形式名称": "花朵形态",
+    "出现次数": 4,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.2|花朵形态",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.2|花朵形态",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.2.1|花朵形态",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2.2|花朵形态"
+    ],
+    "覆盖图片数": 3,
+    "出现总次数": 4,
+    "重要性得分": 75.0,
+    "频次基础分": 60,
+    "频次得分": 24.0,
+    "覆盖率基础分": 33.33,
+    "覆盖率得分": 20.0,
+    "频率权重": 44.0,
+    "综合权重": 53.3
+  },
+  {
+    "形式ID": "形式28",
+    "形式名称": "花朵颜色",
+    "出现次数": 4,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.2.2|花朵颜色",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.2|花朵颜色",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7.2.1|花朵颜色",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.2.2|花朵颜色"
+    ],
+    "覆盖图片数": 3,
+    "出现总次数": 4,
+    "重要性得分": 70.0,
+    "频次基础分": 60,
+    "频次得分": 24.0,
+    "覆盖率基础分": 33.33,
+    "覆盖率得分": 20.0,
+    "频率权重": 44.0,
+    "综合权重": 51.8
+  },
+  {
+    "形式ID": "形式29",
+    "形式名称": "人物面部特征",
+    "出现次数": 3,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/5b94399f3bdef0a80b98e2734e110ca2.jpeg|段落1.1|人物面部特征",
+      "http://res.cybertogether.net/crawler/image/8187a1ad4e56295ab13d881d0ef7c934.jpeg|段落4.1|人物面部特征",
+      "http://res.cybertogether.net/crawler/image/d20b73ad445c7dce64983159bc6cdae0.jpeg|段落8.1|人物面部特征"
+    ],
+    "覆盖图片数": 3,
+    "出现总次数": 3,
+    "重要性得分": 88.0,
+    "频次基础分": 40,
+    "频次得分": 16.0,
+    "覆盖率基础分": 33.33,
+    "覆盖率得分": 20.0,
+    "频率权重": 36.0,
+    "综合权重": 51.6
+  },
+  {
+    "形式ID": "形式30",
+    "形式名称": "光照效果",
+    "出现次数": 3,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2|光照效果",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3|光照效果",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9|光照效果"
+    ],
+    "覆盖图片数": 3,
+    "出现总次数": 3,
+    "重要性得分": 75.0,
+    "频次基础分": 40,
+    "频次得分": 16.0,
+    "覆盖率基础分": 33.33,
+    "覆盖率得分": 20.0,
+    "频率权重": 36.0,
+    "综合权重": 47.7
+  },
+  {
+    "形式ID": "形式31",
+    "形式名称": "构图方式",
+    "出现次数": 3,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/16fc8596b7c12031e910eb517859045c.jpeg|段落5|构图方式",
+      "http://res.cybertogether.net/crawler/image/15a29cb486344bc10e90402371e21c92.jpeg|段落6|构图方式",
+      "http://res.cybertogether.net/crawler/image/e70bbea964cfcf0225744da00e8e7939.jpeg|段落7|构图方式"
+    ],
+    "覆盖图片数": 3,
+    "出现总次数": 3,
+    "重要性得分": 70.0,
+    "频次基础分": 40,
+    "频次得分": 16.0,
+    "覆盖率基础分": 33.33,
+    "覆盖率得分": 20.0,
+    "频率权重": 36.0,
+    "综合权重": 46.2
+  },
+  {
+    "形式ID": "形式32",
+    "形式名称": "光斑效果",
+    "出现次数": 3,
+    "形式标识列表": [
+      "http://res.cybertogether.net/crawler/image/6d80c193ccd0b047e0f3354ed6aca355.jpeg|段落2.4|光斑效果",
+      "http://res.cybertogether.net/crawler/image/2ba333062a7370ce229696fc36b9a060.jpeg|段落3.5|光斑效果",
+      "http://res.cybertogether.net/crawler/image/c4c73c1b32f8066cc40a43ce61f61364.jpeg|段落9.4|光斑效果"
+    ],
+    "覆盖图片数": 3,
+    "出现总次数": 3,
+    "重要性得分": 68.0,
+    "频次基础分": 40,
+    "频次得分": 16.0,
+    "覆盖率基础分": 33.33,
+    "覆盖率得分": 20.0,
+    "频率权重": 36.0,
+    "综合权重": 45.6
+  }
+]

BIN
examples/restore_old/input/person.jpg


+ 7 - 0
examples/restore_old/input/person_invariant_features.json

@@ -0,0 +1,7 @@
+{
+  "appearance": "The person has fair skin, defined eyebrows, and red lipstick. She is wearing a delicate necklace and earrings.",
+  "hair": "Her hair is long, brown, and styled straight, falling over her shoulders.",
+  "clothing": "She is wearing a loose-fitting white top with three-quarter sleeves and a long, flowing white skirt.",
+  "pose": "She is standing, holding a paintbrush in her right hand and a colorful artist's palette in her left hand. Her head is slightly tilted upwards and to the right, as if looking at something in the distance.",
+  "viewing_angle": "Three-quarter"
+}

+ 84 - 0
examples/restore_old/input/readme.md

@@ -0,0 +1,84 @@
+# restore/input 目录说明
+
+本目录存放内容还原任务的输入数据,来源于帖子 `616192600000000021034642`(《秋日际遇》写生油画)的解构结果。
+
+## 文件结构
+
+```
+input/
+├── readme.md                                                    # 本文件
+├── images/                                                      # 原始图片(仅用于评估对比,严禁修改)
+│   ├── person.jpg                                               # 人物参考图
+│   ├── image_01.jpg                                             # 图片1(对应 01_图片分段_01)
+│   ├── image_02.jpg                                             # 图片2(对应 01_图片分段_02)
+│   ├── image_03.jpg                                             # 图片3(对应 01_图片分段_03)
+│   ├── image_04.jpg                                             # 图片4(对应 01_图片分段_04)
+│   ├── image_05.jpg                                             # 图片5(对应 01_图片分段_05)
+│   ├── image_06.jpg                                             # 图片6(对应 01_图片分段_06)
+│   ├── image_07.jpg                                             # 图片7(对应 01_图片分段_07)
+│   ├── image_08.jpg                                             # 图片8(对应 01_图片分段_08)
+│   └── image_09.jpg                                             # 图片9(对应 01_图片分段_09)
+├── production_script_deconstruction_20260127_134243.json         # 完整解构结果(原始文件)
+└── paragraphs/                                                  # 按段落拆分后的文件
+    ├── 00_基础信息.json                                          # 帖子ID、原始文本、内容过滤结果、元信息
+    ├── 01_图片分段_01_g1_户外绘画场景.json                        # 图片1 分段结果(group 1)
+    ├── 01_图片分段_02_g1_户外绘画场景.json                        # 图片2 分段结果(group 1)
+    ├── 01_图片分段_03_g1_户外绘画场景.json                        # 图片3 分段结果(group 1)
+    ├── 01_图片分段_04_g1_户外绘画场景.json                        # 图片4 分段结果(group 1)
+    ├── 01_图片分段_05_g2_户外绘画场景.json                        # 图片5 分段结果(group 2)
+    ├── 01_图片分段_06_g2_户外绘画场景.json                        # 图片6 分段结果(group 2)
+    ├── 01_图片分段_07_g3_人物与玫瑰花.json                        # 图片7 分段结果(group 3)
+    ├── 01_图片分段_08_g1_户外绘画场景.json                        # 图片8 分段结果(group 1)
+    ├── 01_图片分段_09_g1_户外绘画场景.json                        # 图片9 分段结果(group 1)
+    ├── 02_图片形式_01.json ~ 02_图片形式_09.json                  # 9张图片各自的形式分析(构图、色彩、光影等)
+    ├── 03_图片制作点实质结果.json                                  # 6个实质制作点(人物、背景、调色板、画布等)
+    ├── 04_图片制作点形式结果.json                                  # 32个形式制作点(姿态、着装、发型、肤色等)
+    └── 05_其他结果.json                                           # 空结果字段(段内/段间关系、文本解构等)
+```
+
+## 字段说明
+
+### 图片编号对应关系
+
+`images/` 目录中的图片编号与 `paragraphs/` 中的分段文件一一对应:
+- `image_01.jpg` ↔ `01_图片分段_01_g1_户外绘画场景.json` + `02_图片形式_01.json`
+- `image_02.jpg` ↔ `01_图片分段_02_g1_户外绘画场景.json` + `02_图片形式_02.json`
+- `image_03.jpg` ↔ `01_图片分段_03_g1_户外绘画场景.json` + `02_图片形式_03.json`
+- `image_04.jpg` ↔ `01_图片分段_04_g1_户外绘画场景.json` + `02_图片形式_04.json`
+- `image_05.jpg` ↔ `01_图片分段_05_g2_户外绘画场景.json` + `02_图片形式_05.json`
+- `image_06.jpg` ↔ `01_图片分段_06_g2_户外绘画场景.json` + `02_图片形式_06.json`
+- `image_07.jpg` ↔ `01_图片分段_07_g3_人物与玫瑰花.json` + `02_图片形式_07.json`
+- `image_08.jpg` ↔ `01_图片分段_08_g1_户外绘画场景.json` + `02_图片形式_08.json`
+- `image_09.jpg` ↔ `01_图片分段_09_g1_户外绘画场景.json` + `02_图片形式_09.json`
+
+**重要提示**:`images/` 目录中的图片仅用于评估对比,严禁修改。生成的图片应保存在 `output_*/` 目录中。
+
+### 图片分段结果(01_图片分段_*.json)
+
+每个文件对应一张图片,包含:
+- `image_url`: 图片地址
+- `group_id`: 分组编号(相似构图的图片归为同组)
+- `sections`: 分段列表,每段包含名称、描述、顶点坐标、子段落
+
+共 3 个分组:
+- group 1(7张): 户外绘画全景
+- group 2(2张): 户外绘画近景
+- group 3(1张): 人物与玫瑰花特写
+
+### 图片形式结果(02_图片形式_*.json)
+
+每个文件对应一张图片的形式分析,包含:
+- `image_url`: 图片地址
+- `form_elements`: 形式元素列表(构图方式、色彩分布、光影方向、景深等)
+
+### 图片制作点实质结果(03_图片制作点实质结果.json)
+
+跨图片聚合的实质元素,按重要性排序:
+- 人物(95分)、人物细节(95分)、画布(80分)、调色板(75分)、背景(70分)
+
+### 图片制作点形式结果(04_图片制作点形式结果.json)
+
+跨图片聚合的形式特征,共 32 项,包括:
+- 人物相关:姿态、着装、发型、肤色
+- 画面相关:构图、色彩、光影、景深
+- 道具相关:画架、颜料、调色板

+ 43 - 0
examples/restore_old/production.prompt

@@ -0,0 +1,43 @@
+---
+model: sonnet-4.5
+temperature: 0.3
+---
+
+$system$
+你是一个顶尖的多模态内容还原专家。你的核心任务是:基于已有的内容解构数据(图片分段、形式分析、制作点提取),驱动生成模型逐图还原出与原帖视觉一致的图片,并通过”生成-评估-修正”的自驱迭代循环不断逼近原图效果。
+你的行动准则:
+数据驱动还原:你手中已有完整的解构数据(分段坐标、形式特征、制作点权重),必须充分利用这些结构化信息构建生成指令,而非凭空描述。
+大模型原生思维:优先使用大模型自身的视觉理解能力。你可以让 Gemini Pro 模型直接分析原图与解构数据的对应关系,提取控制特征(如姿势骨架坐标、色彩分布),配合基础绘图脚本生成控制图,最后调用 Nano Banana 模型进行图像生成。
+大模型驱动评估:在还原测试阶段,不需要编写像素级对比代码。你必须制定明确的评估标准,将原图与生成图一并提交给 Gemini Pro 模型进行语义级视觉比对。
+工程化交付:严格遵守给定的工程目录规范,输出可执行脚本、结构化特征文件、评估标准以及每一轮的迭代资产。
+
+$user$
+**任务目标**
+基于 `examples/restore/input/` 中的解构数据,还原帖子「《秋日际遇》写生油画」的图片内容。
+
+**输入数据说明**
+- `input/images/`:原始图片(仅用于评估对比,严禁修改)
+  - `person.jpg`:人物参考图
+  - `image_01.jpg` ~ `image_09.jpg`:9张原始图片,用于与生成图进行视觉对比评分
+- `input/paragraphs/`:按段落拆分后的解构数据
+  - `01_图片分段_*.json`:9张图片的分段结果(含子段落名称、描述、顶点坐标),按 group_id 分为 3 组(g1 户外绘画全景 7张、g2 户外绘画近景 2张、g3 人物与玫瑰花特写 1张)
+  - `02_图片形式_*.json`:9张图片各自的形式分析(构图方式、色彩分布、光影方向、景深等)
+  - `03_图片制作点实质结果.json`:6个跨图片聚合的实质制作点(人物 95分、画布 80分、调色板 75分、背景 70分)
+  - `04_图片制作点形式结果.json`:32个跨图片聚合的形式特征(姿态、着装、发型、肤色、构图、色彩、光影等)
+
+**执行工序与交付清单**
+请在 `examples/restore/output_1` 下严格按照以下流程执行:
+
+1. **初始化提取与标准制定 (Initialization)**
+   * **特征提取与控制图生成:** 读取解构数据中的分段坐标和形式特征,结合 Gemini Pro 视觉模型分析 `input/images/person.jpg`,提取目标维度的控制特征(如人物姿势骨架坐标、场景构图线框)。在 `resource/` 目录下编写基础绘图脚本生成控制图。
+   * 输出 `method.md`:记录特征解析逻辑、控制图生成方式以及调用 Nano Banana 时的关键参数设定。
+   * 输出 `feature.json`:存储提取出的结构化特征数据(如归一化坐标等),禁止自然语言。
+   * 输出 `resource/evaluation_criteria.md`:根据解构数据中的制作点权重,编写评估标准指南(例如:人物姿态一致性权重 95、画架/调色板位置权重 75-80、背景色调权重 70)。
+
+2. **迭代循环 (Round Loop)**
+   * **Round N (从 round_1 开始):**
+     * **Cache (生成):** 基于解构数据中的分段描述和形式特征构建生成指令,结合控制图和 `input/images/person.jpg` 人物参考,调用 **Nano Banana** 模型生成图像。按 group 分批生成(优先从 g1 户外绘画全景开始)。在 `round_N/cache/` 中输出 `reduction.jpg`(三段式对比:原图 | 控制图 | 生成图)。
+     * **Evaluation (评估):** 读取 `resource/evaluation_criteria.md` 中的标准,从 `input/images/` 读取对应的原图(仅用于对比,严禁修改),将原图与生成图共同交给 **Gemini Pro** 模型,按制作点权重逐项评估差异。
+     * **Update (修正):** 根据评估反馈,在 `round_N/evaluation/` 中输出 `evaluation_report.md`(记录具体视觉偏差与量化修正方案),并输出更新后的生成指令 `description_v(N+1).txt`。
+
+如果评估认为还原效果尚未达标,则使用新指令自动进入下一个 Round;直至评估结果满意为止。请立即开始执行。

+ 622 - 0
examples/restore_old/run.py

@@ -0,0 +1,622 @@
+"""
+示例(增强版)
+
+使用 Agent 模式 + Skills
+
+新增功能:
+1. 支持命令行随时打断(输入 'p' 暂停,'q' 退出)
+2. 暂停后可插入干预消息
+3. 支持触发经验总结
+4. 查看当前 GoalTree
+5. 框架层自动清理不完整的工具调用
+6. 支持通过 --trace <ID> 恢复已有 Trace 继续执行
+"""
+
+import argparse
+import os
+import sys
+import select
+import asyncio
+from pathlib import Path
+
+# Clash Verge TUN 模式兼容:禁止 httpx/urllib 自动检测系统 HTTP 代理
+# TUN 虚拟网卡已在网络层接管所有流量,不需要应用层再走 HTTP 代理,
+# 否则 httpx 检测到 macOS 系统代理 (127.0.0.1:7897) 会导致 ConnectError
+os.environ.setdefault("no_proxy", "*")
+
+# 添加项目根目录到 Python 路径
+sys.path.insert(0, str(Path(__file__).parent.parent.parent))
+
+from dotenv import load_dotenv
+load_dotenv()
+
+from agent.llm.prompts import SimplePrompt
+from agent.core.runner import AgentRunner, RunConfig
+from agent.core.presets import AgentPreset, register_preset
+from agent.trace import (
+    FileSystemTraceStore,
+    Trace,
+    Message,
+)
+from agent.llm import create_openrouter_llm_call
+from agent.tools import get_tool_registry
+
+
+# ===== 非阻塞 stdin 检测 =====
+if sys.platform == 'win32':
+    import msvcrt
+
+def check_stdin() -> str | None:
+    """
+    跨平台非阻塞检查 stdin 输入。
+    Windows: 使用 msvcrt.kbhit()
+    macOS/Linux: 使用 select.select()
+    """
+    if sys.platform == 'win32':
+        # 检查是否有按键按下
+        if msvcrt.kbhit():
+            # 读取按下的字符(msvcrt.getwch 是非阻塞读取宽字符)
+            ch = msvcrt.getwch().lower()
+            if ch == 'p':
+                return 'pause'
+            if ch == 'q':
+                return 'quit'
+            # 如果是其他按键,可以选择消耗掉或者忽略
+        return None
+    else:
+        # Unix/Mac 逻辑
+        ready, _, _ = select.select([sys.stdin], [], [], 0)
+        if ready:
+            line = sys.stdin.readline().strip().lower()
+            if line in ('p', 'pause'):
+                return 'pause'
+            if line in ('q', 'quit'):
+                return 'quit'
+        return None
+
+
+# ===== 交互菜单 =====
+
+def _read_multiline() -> str:
+    """
+    读取多行输入,以连续两次回车(空行)结束。
+
+    单次回车只是换行,不会提前终止输入。
+    """
+    print("\n请输入干预消息(连续输入两次回车结束):")
+    lines: list[str] = []
+    blank_count = 0
+    while True:
+        line = input()
+        if line == "":
+            blank_count += 1
+            if blank_count >= 2:
+                break
+            lines.append("")          # 保留单个空行
+        else:
+            blank_count = 0
+            lines.append(line)
+
+    # 去掉尾部多余空行
+    while lines and lines[-1] == "":
+        lines.pop()
+    return "\n".join(lines)
+
+
+async def show_interactive_menu(
+    runner: AgentRunner,
+    trace_id: str,
+    current_sequence: int,
+    store: FileSystemTraceStore,
+):
+    """
+    显示交互式菜单,让用户选择操作。
+
+    进入本函数前不再有后台线程占用 stdin,所以 input() 能正常工作。
+    """
+    print("\n" + "=" * 60)
+    print("  执行已暂停")
+    print("=" * 60)
+    print("请选择操作:")
+    print("  1. 插入干预消息并继续")
+    print("  2. 触发经验总结(reflect)")
+    print("  3. 查看当前 GoalTree")
+    print("  4. 手动压缩上下文(compact)")
+    print("  5. 继续执行")
+    print("  6. 停止执行")
+    print("  7. 经验库瘦身(合并相似经验)")
+    print("=" * 60)
+
+    while True:
+        choice = input("请输入选项 (1-7): ").strip()
+
+        if choice == "1":
+            text = _read_multiline()
+            if not text:
+                print("未输入任何内容,取消操作")
+                continue
+
+            print(f"\n将插入干预消息并继续执行...")
+            # 从 store 读取实际的 last_sequence,避免本地 current_sequence 过时
+            live_trace = await store.get_trace(trace_id)
+            actual_sequence = live_trace.last_sequence if live_trace and live_trace.last_sequence else current_sequence
+            return {
+                "action": "continue",
+                "messages": [{"role": "user", "content": text}],
+                "after_sequence": actual_sequence,
+            }
+
+        elif choice == "2":
+            # 触发经验总结
+            print("\n触发经验总结...")
+            focus = input("请输入反思重点(可选,直接回车跳过): ").strip()
+
+            # 触发反思
+            await perform_reflection(runner, store, trace_id, focus=focus)
+            continue
+
+        elif choice == "3":
+            goal_tree = await store.get_goal_tree(trace_id)
+            if goal_tree and goal_tree.goals:
+                print("\n当前 GoalTree:")
+                print(goal_tree.to_prompt())
+            else:
+                print("\n当前没有 Goal")
+            continue
+
+        elif choice == "4":
+            # 手动压缩上下文
+            print("\n正在执行上下文压缩(compact)...")
+            try:
+                goal_tree = await store.get_goal_tree(trace_id)
+                trace = await store.get_trace(trace_id)
+                if not trace:
+                    print("未找到 Trace,无法压缩")
+                    continue
+
+                # 重建当前 history
+                main_path = await store.get_main_path_messages(trace_id, trace.head_sequence)
+                history = [msg.to_llm_dict() for msg in main_path]
+                head_seq = main_path[-1].sequence if main_path else 0
+                next_seq = head_seq + 1
+
+                compact_config = RunConfig(trace_id=trace_id)
+                new_history, new_head, new_seq = await runner._compress_history(
+                    trace_id=trace_id,
+                    history=history,
+                    goal_tree=goal_tree,
+                    config=compact_config,
+                    sequence=next_seq,
+                    head_seq=head_seq,
+                )
+                print(f"\n✅ 压缩完成: {len(history)} 条消息 → {len(new_history)} 条")
+            except Exception as e:
+                print(f"\n❌ 压缩失败: {e}")
+            continue
+
+        elif choice == "5":
+            print("\n继续执行...")
+            return {"action": "continue"}
+
+        elif choice == "6":
+            print("\n停止执行...")
+            return {"action": "stop"}
+
+        elif choice == "7":
+            # 经验库瘦身
+            print("\n正在执行经验库瘦身...")
+            from agent.tools.builtin.experience import slim_experiences
+            try:
+                result = await slim_experiences()
+                print(f"\n{result}")
+            except Exception as e:
+                print(f"\n经验库瘦身失败: {e}")
+            continue
+
+        else:
+            print("无效选项,请重新输入")
+
+async def perform_reflection(runner: AgentRunner, store: FileSystemTraceStore, trace_id: str, focus: str = ""):
+    """执行经验总结并保存(带结构化 YAML 解析)"""
+    from agent.trace.compaction import build_reflect_prompt
+    import re as _re2
+    import uuid as _uuid2
+    from datetime import datetime
+    
+    trace = await store.get_trace(trace_id)
+    if not trace:
+        return
+    saved_head = trace.head_sequence
+
+    prompt = build_reflect_prompt()
+    if focus:
+        prompt += f"\n\n请特别关注:{focus}"
+
+    print("正在生成反思...")
+    reflect_cfg = RunConfig(trace_id=trace_id, max_iterations=1, tools=[])
+    reflection_text = ""
+    
+    try:
+        result = await runner.run_result(
+            messages=[{"role": "user", "content": prompt}],
+            config=reflect_cfg,
+        )
+        reflection_text = result.get("summary", "")
+    finally:
+        # 恢复 head_sequence(反思消息成为侧枝,不污染主对话)
+        await store.update_trace(trace_id, head_sequence=saved_head)
+
+    # 追加到 experiences 文件
+    if reflection_text:
+        experiences_path = runner.experiences_path or "./.cache/experiences_restore.md"
+        os.makedirs(os.path.dirname(experiences_path), exist_ok=True)
+
+        pattern = r"-\s*\[(?P<tags>.*?)\]\s*(?P<content>.*)"
+        matches = list(_re2.finditer(pattern, reflection_text))
+
+        structured_entries = []
+        for match in matches:
+            tags_str = match.group("tags")
+            content = match.group("content")
+
+            intent_match = _re2.search(r"intent:\s*(.*?)(?:,|$)", tags_str, _re2.IGNORECASE)
+            state_match = _re2.search(r"state:\s*(.*?)(?:,|$)", tags_str, _re2.IGNORECASE)
+
+            intents = [i.strip() for i in intent_match.group(1).split(",")] if intent_match and intent_match.group(1) else []
+            states = [s.strip() for s in state_match.group(1).split(",")] if state_match and state_match.group(1) else []
+
+            ex_id = f"ex_{datetime.now().strftime('%m%d%H%M')}_{_uuid2.uuid4().hex[:4]}"
+            
+            entry = f"---\nid: {ex_id}\ntrace_id: {trace_id}\ntags: {{intent: {intents}, state: {states}}}\nmetrics: {{helpful: 1, harmful: 0}}\ncreated_at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n---\n- {content}\n- 经验ID: [{ex_id}]"
+            structured_entries.append(entry)
+
+        if structured_entries:
+            final_output = "\n\n" + "\n\n".join(structured_entries)
+            with open(experiences_path, "a", encoding="utf-8") as f:
+                f.write(final_output)
+            print(f"\n✅ 提取了 {len(structured_entries)} 条经验,已结构化并保存到: {experiences_path}")
+            print("\n--- 反思内容(结构化后) ---")
+            print(final_output.strip())
+            print("--- 结束 ---\n")
+        else:
+            print("\n⚠️ 未能解析出符合格式的经验条目,已保存原始纯文本以供检查。")
+            header = f"\n\n---\n\n## [Raw] {trace_id} ({datetime.now().strftime('%Y-%m-%d %H:%M')})\n\n"
+            with open(experiences_path, "a", encoding="utf-8") as f:
+                f.write(header + reflection_text + "\n")
+            print(reflection_text)
+    else:
+        print("未生成反思内容")
+
+async def main():
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description="任务 (Agent 模式 + 交互增强)")
+    parser.add_argument(
+        "--trace", type=str, default=None,
+        help="已有的 Trace ID,用于恢复继续执行(不指定则新建)",
+    )
+    args = parser.parse_args()
+
+    # 路径配置
+    base_dir = Path(__file__).parent
+    project_root = base_dir.parent.parent
+    prompt_path = base_dir / "production.prompt"
+    output_dir = base_dir / "output_1"
+    output_dir.mkdir(exist_ok=True)
+
+    # 加载项目级 presets(examples/restore/presets.json)
+    presets_path = base_dir / "presets.json"
+    if presets_path.exists():
+        import json
+        with open(presets_path, "r", encoding="utf-8") as f:
+            project_presets = json.load(f)
+        for name, cfg in project_presets.items():
+            register_preset(name, AgentPreset(**cfg))
+        print(f"   - 已加载项目 presets: {list(project_presets.keys())}")
+
+    # Skills 目录(可选:用户自定义 skills)
+    # 注意:内置 skills(agent/memory/skills/)会自动加载
+    skills_dir = str(base_dir / "skills")
+
+    print("=" * 60)
+    print("mcp/skills 发现、获取、评价 分析任务 (Agent 模式 + 交互增强)")
+    print("=" * 60)
+    print()
+    print("💡 交互提示:")
+    print("   - 执行过程中输入 'p' 或 'pause' 暂停并进入交互模式")
+    print("   - 执行过程中输入 'q' 或 'quit' 停止执行")
+    print("=" * 60)
+    print()
+
+    # 1. 加载 prompt
+    print("1. 加载 prompt 配置...")
+    prompt = SimplePrompt(prompt_path)
+
+    # 2. 构建消息(仅新建时使用,恢复时消息已在 trace 中)
+    print("2. 构建任务消息...")
+    messages = prompt.build_messages()
+
+    # 3. 创建 Agent Runner(配置 skills)
+    print("3. 创建 Agent Runner...")
+    print(f"   - Skills 目录: {skills_dir}")
+    print(f"   - 模型: {prompt.config.get('model', 'sonnet-4.5')}")
+
+    # 加载自定义工具
+    print("   - 加载自定义工具: nanobanana")
+    import examples.how.tool  # 导入自定义工具模块,触发 @tool 装饰器注册
+
+    store = FileSystemTraceStore(base_path=".trace")
+    runner = AgentRunner(
+        trace_store=store,
+        llm_call=create_openrouter_llm_call(model=f"anthropic/claude-{prompt.config.get('model', 'sonnet-4.5')}"),
+        skills_dir=skills_dir,
+        experiences_path="./.cache/experiences_restore.md",
+        debug=True
+    )
+
+    # 4. 判断是新建还是恢复
+    resume_trace_id = args.trace
+    if resume_trace_id:
+        # 验证 trace 存在
+        existing_trace = await store.get_trace(resume_trace_id)
+        if not existing_trace:
+            print(f"\n错误: Trace 不存在: {resume_trace_id}")
+            sys.exit(1)
+        print(f"4. 恢复已有 Trace: {resume_trace_id[:8]}...")
+        print(f"   - 状态: {existing_trace.status}")
+        print(f"   - 消息数: {existing_trace.total_messages}")
+        print(f"   - 任务: {existing_trace.task}")
+    else:
+        print(f"4. 启动新 Agent 模式...")
+
+    print()
+
+    final_response = ""
+    current_trace_id = resume_trace_id
+    current_sequence = 0
+    should_exit = False
+
+    try:
+        # 恢复模式:不发送初始消息,只指定 trace_id 续跑
+        if resume_trace_id:
+            initial_messages = None  # None = 未设置,触发早期菜单检查
+            config = RunConfig(
+                model=f"claude-{prompt.config.get('model', 'sonnet-4.5')}",
+                temperature=float(prompt.config.get('temperature', 0.3)),
+                max_iterations=1000,
+                trace_id=resume_trace_id,
+            )
+        else:
+            initial_messages = messages
+            config = RunConfig(
+                model=f"claude-{prompt.config.get('model', 'sonnet-4.5')}",
+                temperature=float(prompt.config.get('temperature', 0.3)),
+                max_iterations=1000,
+                name="社交媒体内容解构、建构、评估任务",
+            )
+
+        while not should_exit:
+            # 如果是续跑,需要指定 trace_id
+            if current_trace_id:
+                config.trace_id = current_trace_id
+
+            # 清理上一轮的响应,避免失败后显示旧内容
+            final_response = ""
+
+            # 如果 trace 已完成/失败且没有新消息,直接进入交互菜单
+            # 注意:initial_messages 为 None 表示未设置(首次加载),[] 表示有意为空(用户选择"继续")
+            if current_trace_id and initial_messages is None:
+                check_trace = await store.get_trace(current_trace_id)
+                if check_trace and check_trace.status in ("completed", "failed"):
+                    if check_trace.status == "completed":
+                        print(f"\n[Trace] ✅ 已完成")
+                        print(f"  - Total messages: {check_trace.total_messages}")
+                        print(f"  - Total cost: ${check_trace.total_cost:.4f}")
+                    else:
+                        print(f"\n[Trace] ❌ 已失败: {check_trace.error_message}")
+                    current_sequence = check_trace.head_sequence
+
+                    menu_result = await show_interactive_menu(
+                        runner, current_trace_id, current_sequence, store
+                    )
+
+                    if menu_result["action"] == "stop":
+                        break
+                    elif menu_result["action"] == "continue":
+                        new_messages = menu_result.get("messages", [])
+                        if new_messages:
+                            initial_messages = new_messages
+                            config.after_sequence = menu_result.get("after_sequence")
+                        else:
+                            # 无新消息:对 failed trace 意味着重试,对 completed 意味着继续
+                            initial_messages = []
+                            config.after_sequence = None
+                        continue
+                    break
+
+                # 对 stopped/running 等非终态的 trace,直接续跑
+                initial_messages = []
+
+            print(f"{'▶️ 开始执行...' if not current_trace_id else '▶️ 继续执行...'}")
+
+            # 执行 Agent
+            paused = False
+            try:
+                async for item in runner.run(messages=initial_messages, config=config):
+                    # 检查用户中断
+                    cmd = check_stdin()
+                    if cmd == 'pause':
+                        # 暂停执行
+                        print("\n⏸️ 正在暂停执行...")
+                        if current_trace_id:
+                            await runner.stop(current_trace_id)
+
+                        # 等待一小段时间让 runner 处理 stop 信号
+                        await asyncio.sleep(0.5)
+
+                        # 显示交互菜单
+                        menu_result = await show_interactive_menu(
+                            runner, current_trace_id, current_sequence, store
+                        )
+
+                        if menu_result["action"] == "stop":
+                            should_exit = True
+                            paused = True
+                            break
+                        elif menu_result["action"] == "continue":
+                            # 检查是否有新消息需要插入
+                            new_messages = menu_result.get("messages", [])
+                            if new_messages:
+                                # 有干预消息,需要重新启动循环
+                                initial_messages = new_messages
+                                after_seq = menu_result.get("after_sequence")
+                                if after_seq is not None:
+                                    config.after_sequence = after_seq
+                                paused = True
+                                break
+                            else:
+                                # 没有新消息,需要重启执行
+                                initial_messages = []
+                                config.after_sequence = None
+                                paused = True
+                                break
+
+                    elif cmd == 'quit':
+                        print("\n🛑 用户请求停止...")
+                        if current_trace_id:
+                            await runner.stop(current_trace_id)
+                        should_exit = True
+                        break
+
+                    # 处理 Trace 对象(整体状态变化)
+                    if isinstance(item, Trace):
+                        current_trace_id = item.trace_id
+                        if item.status == "running":
+                            print(f"[Trace] 开始: {item.trace_id[:8]}...")
+                        elif item.status == "completed":
+                            print(f"\n[Trace] ✅ 完成")
+                            print(f"  - Total messages: {item.total_messages}")
+                            print(f"  - Total tokens: {item.total_tokens}")
+                            print(f"  - Total cost: ${item.total_cost:.4f}")
+                        elif item.status == "failed":
+                            print(f"\n[Trace] ❌ 失败: {item.error_message}")
+                        elif item.status == "stopped":
+                            print(f"\n[Trace] ⏸️ 已停止")
+
+                    # 处理 Message 对象(执行过程)
+                    elif isinstance(item, Message):
+                        current_sequence = item.sequence
+
+                        if item.role == "assistant":
+                            content = item.content
+                            if isinstance(content, dict):
+                                text = content.get("text", "")
+                                tool_calls = content.get("tool_calls")
+
+                                if text and not tool_calls:
+                                    # 纯文本回复(最终响应)
+                                    final_response = text
+                                    print(f"\n[Response] Agent 回复:")
+                                    print(text)
+                                elif text:
+                                    preview = text[:150] + "..." if len(text) > 150 else text
+                                    print(f"[Assistant] {preview}")
+
+                                if tool_calls:
+                                    for tc in tool_calls:
+                                        tool_name = tc.get("function", {}).get("name", "unknown")
+                                        print(f"[Tool Call] 🛠️  {tool_name}")
+
+                        elif item.role == "tool":
+                            content = item.content
+                            if isinstance(content, dict):
+                                tool_name = content.get("tool_name", "unknown")
+                                print(f"[Tool Result] ✅ {tool_name}")
+                            if item.description:
+                                desc = item.description[:80] if len(item.description) > 80 else item.description
+                                print(f"  {desc}...")
+
+            except Exception as e:
+                print(f"\n执行出错: {e}")
+                import traceback
+                traceback.print_exc()
+
+            # paused → 菜单已在暂停时内联显示过
+            if paused:
+                if should_exit:
+                    break
+                continue
+
+            # quit → 直接退出
+            if should_exit:
+                break
+
+            # Runner 退出(完成/失败/停止/异常)→ 显示交互菜单
+            if current_trace_id:
+                # 🌟 新增:自动触发反思的生命周期钩子
+                check_trace = await store.get_trace(current_trace_id)
+                if check_trace and check_trace.status in ("completed", "failed"):
+                    print(f"\n⚙️ 任务已结束 (状态: {check_trace.status}),正在自动触发经验总结...")
+                    
+                    # 如果是失败状态,自动带上针对性的 focus 提示
+                    auto_focus = "本次任务执行失败了,请重点反思失败的原因、踩坑点以及未来应如何避免。" if check_trace.status == "failed" else ""
+                    
+                    await perform_reflection(runner, store, current_trace_id, focus=auto_focus)
+
+                # 自动反思结束后,依然弹出菜单,让用户决定是彻底退出(6)还是查看总结(3)
+                menu_result = await show_interactive_menu(
+                    runner, current_trace_id, current_sequence, store
+                )
+
+                if menu_result["action"] == "stop":
+                    break
+                elif menu_result["action"] == "continue":
+                    new_messages = menu_result.get("messages", [])
+                    if new_messages:
+                        initial_messages = new_messages
+                        config.after_sequence = menu_result.get("after_sequence")
+                    else:
+                        initial_messages = []
+                        config.after_sequence = None
+                    continue
+            break
+
+    except KeyboardInterrupt:
+        print("\n\n用户中断 (Ctrl+C)")
+        if current_trace_id:
+            await runner.stop(current_trace_id)
+
+    # 6. 输出结果
+    if final_response:
+        print()
+        print("=" * 60)
+        print("Agent 响应:")
+        print("=" * 60)
+        print(final_response)
+        print("=" * 60)
+        print()
+
+        # 7. 保存结果
+        output_file = output_dir / "result.txt"
+        with open(output_file, 'w', encoding='utf-8') as f:
+            f.write(final_response)
+
+        print(f"✓ 结果已保存到: {output_file}")
+        print()
+
+    # 可视化提示
+    if current_trace_id:
+        print("=" * 60)
+        print("可视化 Step Tree:")
+        print("=" * 60)
+        print("1. 启动 API Server:")
+        print("   python3 api_server.py")
+        print()
+        print("2. 浏览器访问:")
+        print("   http://localhost:8000/api/traces")
+        print()
+        print(f"3. Trace ID: {current_trace_id}")
+        print("=" * 60)
+
+
+if __name__ == "__main__":
+    asyncio.run(main())