Просмотр исходного кода

update: restore example and bash with virtual env

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

+ 42 - 17
agent/core/runner.py

@@ -105,10 +105,10 @@ BUILTIN_TOOLS = [
     "get_search_suggestions",
     "get_search_suggestions",
 
 
     # 沙箱工具
     # 沙箱工具
-    "sandbox_create_environment",
-    "sandbox_run_shell",
-    "sandbox_rebuild_with_ports",
-    "sandbox_destroy_environment",
+    # "sandbox_create_environment",
+    # "sandbox_run_shell",
+    # "sandbox_rebuild_with_ports",
+    # "sandbox_destroy_environment",
 
 
     # 浏览器工具
     # 浏览器工具
     "browser_navigate_to_url",
     "browser_navigate_to_url",
@@ -695,14 +695,26 @@ class AgentRunner:
                 for part in msg["content"]
                 for part in msg["content"]
                 if isinstance(part, dict) and part.get("type") in ("image", "image_url")
                 if isinstance(part, dict) and part.get("type") in ("image", "image_url")
             )
             )
-            print(f"\n[压缩评估] 消息数: {msg_count} | 图片数: {img_count} | Token: {token_count:,} / {max_tokens:,} ({progress_pct:.1f}%)")
 
 
-            if token_count > max_tokens:
-                print(f"[压缩评估] ⚠️  超过阈值,触发压缩流程")
+            # 检查是否需要压缩(token 或消息数量超限)
+            needs_compression_by_tokens = token_count > max_tokens
+            needs_compression_by_count = (
+                compression_config.max_messages > 0 and
+                msg_count > compression_config.max_messages
+            )
+            needs_compression = needs_compression_by_tokens or needs_compression_by_count
+
+            print(f"\n[压缩评估] 消息数: {msg_count} / {compression_config.max_messages} | 图片数: {img_count} | Token: {token_count:,} / {max_tokens:,} ({progress_pct:.1f}%)")
+
+            if needs_compression:
+                if needs_compression_by_count:
+                    print(f"[压缩评估] ⚠️  消息数超过阈值 ({msg_count} > {compression_config.max_messages}),触发压缩流程")
+                if needs_compression_by_tokens:
+                    print(f"[压缩评估] ⚠️  Token 数超过阈值,触发压缩流程")
             else:
             else:
                 print(f"[压缩评估] ✅ 未超阈值,无需压缩")
                 print(f"[压缩评估] ✅ 未超阈值,无需压缩")
 
 
-            if token_count > max_tokens and self.trace_store and goal_tree:
+            if needs_compression and self.trace_store and goal_tree:
                 # 使用本地 head_seq(store 中的 head_sequence 在 loop 期间未更新,是过时的)
                 # 使用本地 head_seq(store 中的 head_sequence 在 loop 期间未更新,是过时的)
                 if head_seq > 0:
                 if head_seq > 0:
                     main_path_msgs = await self.trace_store.get_main_path_messages(
                     main_path_msgs = await self.trace_store.get_main_path_messages(
@@ -731,33 +743,46 @@ class AgentRunner:
                             sum(1 for g in goal_tree.goals
                             sum(1 for g in goal_tree.goals
                                 if g.status in ("completed", "abandoned")),
                                 if g.status in ("completed", "abandoned")),
                         )
                         )
-            elif token_count > max_tokens:
+            elif needs_compression:
                 print("[压缩评估] ⚠️  无法执行 Level 1 压缩(缺少 store 或 goal_tree)")
                 print("[压缩评估] ⚠️  无法执行 Level 1 压缩(缺少 store 或 goal_tree)")
                 logger.warning(
                 logger.warning(
-                    "消息 token 数 (%d) 超过阈值 (%d),但无法执行 Level 1 压缩(缺少 store 或 goal_tree)",
-                    token_count, max_tokens,
+                    "消息数 (%d) 或 token 数 (%d) 超过阈值 (max_messages=%d, max_tokens=%d),但无法执行 Level 1 压缩(缺少 store 或 goal_tree)",
+                    msg_count, token_count, compression_config.max_messages, max_tokens,
                 )
                 )
 
 
             # Level 2 压缩:LLM 总结(Level 1 后仍超阈值时触发)
             # Level 2 压缩:LLM 总结(Level 1 后仍超阈值时触发)
             token_count_after = estimate_tokens(history)
             token_count_after = estimate_tokens(history)
-            if token_count_after > max_tokens:
+            msg_count_after = len(history)
+            needs_level2_by_tokens = token_count_after > max_tokens
+            needs_level2_by_count = (
+                compression_config.max_messages > 0 and
+                msg_count_after > compression_config.max_messages
+            )
+            needs_level2 = needs_level2_by_tokens or needs_level2_by_count
+
+            if needs_level2:
                 progress_pct_after = (token_count_after / max_tokens * 100) if max_tokens > 0 else 0
                 progress_pct_after = (token_count_after / max_tokens * 100) if max_tokens > 0 else 0
+                reason = []
+                if needs_level2_by_count:
+                    reason.append(f"消息数 {msg_count_after} > {compression_config.max_messages}")
+                if needs_level2_by_tokens:
+                    reason.append(f"Token {token_count_after:,} > {max_tokens:,} ({progress_pct_after:.1f}%)")
                 print(
                 print(
-                    f"[Level 2 压缩] Level 1 后仍超阈值: {token_count_after:,} / {max_tokens:,} ({progress_pct_after:.1f}%) "
+                    f"[Level 2 压缩] Level 1 后仍超阈值: {' | '.join(reason)} "
                     f"→ 触发 LLM 总结"
                     f"→ 触发 LLM 总结"
                 )
                 )
                 logger.info(
                 logger.info(
-                    "Level 1 后 token 仍超阈值 (%d > %d),触发 Level 2 压缩",
-                    token_count_after, max_tokens,
+                    "Level 1 后仍超阈值 (消息数=%d/%d, token=%d/%d),触发 Level 2 压缩",
+                    msg_count_after, compression_config.max_messages, token_count_after, max_tokens,
                 )
                 )
                 history, head_seq, sequence = await self._compress_history(
                 history, head_seq, sequence = await self._compress_history(
                     trace_id, history, goal_tree, config, sequence, head_seq,
                     trace_id, history, goal_tree, config, sequence, head_seq,
                 )
                 )
                 final_tokens = estimate_tokens(history)
                 final_tokens = estimate_tokens(history)
                 print(f"[Level 2 压缩] 完成: Token {token_count_after:,} → {final_tokens:,}")
                 print(f"[Level 2 压缩] 完成: Token {token_count_after:,} → {final_tokens:,}")
-            elif token_count > max_tokens:
+            elif needs_compression:
                 # Level 1 压缩成功,未触发 Level 2
                 # Level 1 压缩成功,未触发 Level 2
-                print(f"[压缩评估] ✅ Level 1 压缩后达标: {token_count_after:,} / {max_tokens:,}")
+                print(f"[压缩评估] ✅ Level 1 压缩后达标: 消息数 {msg_count_after} | Token {token_count_after:,} / {max_tokens:,}")
             print()  # 空行分隔
             print()  # 空行分隔
 
 
             # 构建 LLM messages(注入上下文)
             # 构建 LLM messages(注入上下文)

+ 161 - 26
agent/tools/builtin/bash.py

@@ -1,27 +1,139 @@
 """
 """
 Bash Tool - 命令执行工具
 Bash Tool - 命令执行工具
 
 
-参考 OpenCode bash.ts 完整实现。
-
 核心功能:
 核心功能:
 - 执行 shell 命令
 - 执行 shell 命令
 - 超时控制
 - 超时控制
 - 工作目录设置
 - 工作目录设置
 - 环境变量传递
 - 环境变量传递
+- 虚拟环境隔离(Python 命令,强制执行,LLM 不可控)
+- 目录白名单保护
 """
 """
 
 
 import os
 import os
 import signal
 import signal
 import asyncio
 import asyncio
+import logging
 from pathlib import Path
 from pathlib import Path
 from typing import Optional, Dict
 from typing import Optional, Dict
 
 
 from agent.tools import tool, ToolResult, ToolContext
 from agent.tools import tool, ToolResult, ToolContext
 
 
 # 常量
 # 常量
-DEFAULT_TIMEOUT = 120  # 2 分钟
-MAX_OUTPUT_LENGTH = 50000  # 最大输出长度
-GRACEFUL_KILL_WAIT = 3  # SIGTERM 后等几秒再 SIGKILL
+DEFAULT_TIMEOUT = 120
+MAX_OUTPUT_LENGTH = 50000
+GRACEFUL_KILL_WAIT = 3
+
+# ===== 安全配置(模块级,LLM 不可控)=====
+ENABLE_VENV = True                # 是否强制启用虚拟环境
+VENV_DIR = ".venv"                # 虚拟环境目录名(相对于项目根目录)
+
+ALLOWED_WORKDIR_PATTERNS = [
+    ".",
+    "examples",
+    "examples/**",
+    ".cache",
+    ".cache/**",
+    "tests",
+    "tests/**",
+    "output",
+    "output/**",
+]
+
+PYTHON_KEYWORDS = ["python", "python3", "pip", "pip3", "pytest", "poetry", "uv"]
+
+logger = logging.getLogger(__name__)
+
+
+def _get_project_root() -> Path:
+    """获取项目根目录(bash.py 在 agent/tools/builtin/ 下)"""
+    return Path(__file__).parent.parent.parent.parent
+
+
+def _is_safe_workdir(path: Path) -> bool:
+    """检查工作目录是否在白名单内"""
+    try:
+        project_root = _get_project_root()
+        resolved_path = path.resolve()
+        resolved_root = project_root.resolve()
+
+        if not resolved_path.is_relative_to(resolved_root):
+            return False
+
+        relative_path = resolved_path.relative_to(resolved_root)
+
+        for pattern in ALLOWED_WORKDIR_PATTERNS:
+            if pattern == ".":
+                if relative_path == Path("."):
+                    return True
+            elif pattern.endswith("/**"):
+                base = Path(pattern[:-3])
+                if relative_path == base or relative_path.is_relative_to(base):
+                    return True
+            else:
+                if relative_path == Path(pattern):
+                    return True
+
+        return False
+    except (ValueError, OSError) as e:
+        logger.warning(f"路径检查失败: {e}")
+        return False
+
+
+def _should_use_venv(command: str) -> bool:
+    """判断命令是否应该在虚拟环境中执行"""
+    command_lower = command.lower()
+    for keyword in PYTHON_KEYWORDS:
+        if keyword in command_lower:
+            return True
+    return False
+
+
+async def _ensure_venv(venv_path: Path) -> bool:
+    """确保虚拟环境存在,不存在则创建"""
+    if os.name == 'nt':
+        python_exe = venv_path / "Scripts" / "python.exe"
+    else:
+        python_exe = venv_path / "bin" / "python"
+
+    if venv_path.exists() and python_exe.exists():
+        return True
+
+    # 创建虚拟环境
+    print(f"[bash] 正在创建虚拟环境: {venv_path}")
+    logger.info(f"创建虚拟环境: {venv_path}")
+    try:
+        process = await asyncio.create_subprocess_shell(
+            f"python -m venv {venv_path}",
+            stdout=asyncio.subprocess.PIPE,
+            stderr=asyncio.subprocess.PIPE,
+        )
+        stdout, stderr = await asyncio.wait_for(process.communicate(), timeout=60)
+
+        if process.returncode == 0:
+            print(f"[bash] ✅ 虚拟环境创建成功: {venv_path}")
+            logger.info(f"虚拟环境创建成功: {venv_path}")
+            return True
+        else:
+            err_text = stderr.decode('utf-8', errors='replace') if stderr else ""
+            print(f"[bash] ❌ 虚拟环境创建失败: {err_text[:200]}")
+            logger.error(f"虚拟环境创建失败: exit code {process.returncode}, {err_text[:200]}")
+            return False
+
+    except Exception as e:
+        print(f"[bash] ❌ 虚拟环境创建异常: {e}")
+        logger.error(f"虚拟环境创建异常: {e}")
+        return False
+
+
+def _wrap_command_with_venv(command: str, venv_path: Path) -> str:
+    """将命令包装为在虚拟环境中执行"""
+    if os.name == 'nt':
+        activate_script = venv_path / "Scripts" / "activate.bat"
+        return f'call "{activate_script}" && {command}'
+    else:
+        activate_script = venv_path / "bin" / "activate"
+        return f'source "{activate_script}" && {command}'
 
 
 
 
 def _kill_process_tree(pid: int) -> None:
 def _kill_process_tree(pid: int) -> None:
@@ -33,20 +145,17 @@ def _kill_process_tree(pid: int) -> None:
     except ProcessLookupError:
     except ProcessLookupError:
         return
         return
 
 
-    # 先优雅终止
     try:
     try:
         os.killpg(pgid, signal.SIGTERM)
         os.killpg(pgid, signal.SIGTERM)
     except ProcessLookupError:
     except ProcessLookupError:
         return
         return
 
 
-    # 等一小段时间让进程自行退出
     time.sleep(GRACEFUL_KILL_WAIT)
     time.sleep(GRACEFUL_KILL_WAIT)
 
 
-    # 强制杀
     try:
     try:
         os.killpg(pgid, signal.SIGKILL)
         os.killpg(pgid, signal.SIGKILL)
     except ProcessLookupError:
     except ProcessLookupError:
-        pass  # 已退出
+        pass
 
 
 
 
 @tool(description="执行 bash 命令")
 @tool(description="执行 bash 命令")
@@ -72,7 +181,6 @@ async def bash_command(
     Returns:
     Returns:
         ToolResult: 命令输出
         ToolResult: 命令输出
     """
     """
-    # 参数验证
     if timeout is not None and timeout < 0:
     if timeout is not None and timeout < 0:
         return ToolResult(
         return ToolResult(
             title="参数错误",
             title="参数错误",
@@ -91,6 +199,32 @@ async def bash_command(
             error="Directory not found"
             error="Directory not found"
         )
         )
 
 
+    # 目录白名单检查
+    if not _is_safe_workdir(cwd):
+        project_root = _get_project_root()
+        return ToolResult(
+            title="目录不允许",
+            output=(
+                f"工作目录不在白名单内: {cwd}\n"
+                f"项目根目录: {project_root}\n"
+                f"允许的目录: {', '.join(ALLOWED_WORKDIR_PATTERNS)}"
+            ),
+            error="Directory not allowed"
+        )
+
+    # 虚拟环境处理(强制执行,LLM 不可绕过)
+    actual_command = command
+    if ENABLE_VENV and _should_use_venv(command):
+        venv_dir = _get_project_root() / VENV_DIR
+
+        venv_ok = await _ensure_venv(venv_dir)
+        if venv_ok:
+            actual_command = _wrap_command_with_venv(command, venv_dir)
+            print(f"[bash] 🐍 使用虚拟环境: {venv_dir}")
+            logger.info(f"[bash] 使用虚拟环境: {venv_dir}")
+        else:
+            logger.warning(f"[bash] 虚拟环境不可用,回退到系统环境: {venv_dir}")
+
     # 准备环境变量
     # 准备环境变量
     process_env = os.environ.copy()
     process_env = os.environ.copy()
     if env:
     if env:
@@ -98,23 +232,30 @@ async def bash_command(
 
 
     # 执行命令
     # 执行命令
     try:
     try:
-        process = await asyncio.create_subprocess_shell(
-            command,
-            stdout=asyncio.subprocess.PIPE,
-            stderr=asyncio.subprocess.PIPE,
-            cwd=str(cwd),
-            env=process_env,
-            start_new_session=True,  # 新进程组,超时时可杀整棵进程树
-        )
+        if os.name == 'nt':
+            process = await asyncio.create_subprocess_shell(
+                actual_command,
+                stdout=asyncio.subprocess.PIPE,
+                stderr=asyncio.subprocess.PIPE,
+                cwd=str(cwd),
+                env=process_env,
+            )
+        else:
+            process = await asyncio.create_subprocess_shell(
+                actual_command,
+                stdout=asyncio.subprocess.PIPE,
+                stderr=asyncio.subprocess.PIPE,
+                cwd=str(cwd),
+                env=process_env,
+                start_new_session=True,
+            )
 
 
-        # 等待命令完成(带超时)
         try:
         try:
             stdout, stderr = await asyncio.wait_for(
             stdout, stderr = await asyncio.wait_for(
                 process.communicate(),
                 process.communicate(),
                 timeout=timeout_sec
                 timeout=timeout_sec
             )
             )
         except asyncio.TimeoutError:
         except asyncio.TimeoutError:
-            # 超时,杀整个进程组(shell + 所有子进程)
             _kill_process_tree(process.pid)
             _kill_process_tree(process.pid)
             try:
             try:
                 await asyncio.wait_for(process.wait(), timeout=GRACEFUL_KILL_WAIT + 2)
                 await asyncio.wait_for(process.wait(), timeout=GRACEFUL_KILL_WAIT + 2)
@@ -127,30 +268,24 @@ async def bash_command(
                 metadata={"command": command, "timeout": timeout_sec}
                 metadata={"command": command, "timeout": timeout_sec}
             )
             )
 
 
-        # 解码输出
         stdout_text = stdout.decode('utf-8', errors='replace') if stdout else ""
         stdout_text = stdout.decode('utf-8', errors='replace') if stdout else ""
         stderr_text = stderr.decode('utf-8', errors='replace') if stderr else ""
         stderr_text = stderr.decode('utf-8', errors='replace') if stderr else ""
 
 
-        # 截断过长输出
         truncated = False
         truncated = False
         if len(stdout_text) > MAX_OUTPUT_LENGTH:
         if len(stdout_text) > MAX_OUTPUT_LENGTH:
             stdout_text = stdout_text[:MAX_OUTPUT_LENGTH] + f"\n\n(输出被截断,总长度: {len(stdout_text)} 字符)"
             stdout_text = stdout_text[:MAX_OUTPUT_LENGTH] + f"\n\n(输出被截断,总长度: {len(stdout_text)} 字符)"
             truncated = True
             truncated = True
 
 
-        # 组合输出
         output = ""
         output = ""
         if stdout_text:
         if stdout_text:
             output += stdout_text
             output += stdout_text
-
         if stderr_text:
         if stderr_text:
             if output:
             if output:
                 output += "\n\n--- stderr ---\n"
                 output += "\n\n--- stderr ---\n"
             output += stderr_text
             output += stderr_text
-
         if not output:
         if not output:
             output = "(命令无输出)"
             output = "(命令无输出)"
 
 
-        # 检查退出码
         exit_code = process.returncode
         exit_code = process.returncode
         success = exit_code == 0
         success = exit_code == 0
 
 

+ 1 - 1
agent/tools/builtin/experience.py

@@ -11,7 +11,7 @@ from ...llm.openrouter import openrouter_llm_call
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
 # 默认经验存储路径(当无法从 context 获取时使用)
 # 默认经验存储路径(当无法从 context 获取时使用)
-DEFAULT_EXPERIENCES_PATH = "./.cache/experiences_0.md"
+DEFAULT_EXPERIENCES_PATH = "./.cache/experiences_restore.md"
 
 
 def _get_experiences_path(context: Optional[Any] = None) -> str:
 def _get_experiences_path(context: Optional[Any] = None) -> str:
     """
     """

+ 1 - 0
agent/trace/compaction.py

@@ -84,6 +84,7 @@ class CompressionConfig:
     max_tokens: int = 0                # 最大 token 数(0 = 自动:context_window * 0.5)
     max_tokens: int = 0                # 最大 token 数(0 = 自动:context_window * 0.5)
     threshold_ratio: float = 0.5       # 触发压缩的阈值 = context_window 的比例
     threshold_ratio: float = 0.5       # 触发压缩的阈值 = context_window 的比例
     keep_recent_messages: int = 10     # Level 1 中始终保留最近 N 条消息
     keep_recent_messages: int = 10     # Level 1 中始终保留最近 N 条消息
+    max_messages: int = 50             # 最大消息数(超过此数量触发压缩,0 = 禁用)
 
 
     def get_max_tokens(self, model: str) -> int:
     def get_max_tokens(self, model: str) -> int:
         """获取实际的 max_tokens(如果为 0 则自动计算)"""
         """获取实际的 max_tokens(如果为 0 则自动计算)"""

+ 83 - 39
examples/how/run.py

@@ -150,45 +150,8 @@ async def show_interactive_menu(
             print("\n触发经验总结...")
             print("\n触发经验总结...")
             focus = input("请输入反思重点(可选,直接回车跳过): ").strip()
             focus = input("请输入反思重点(可选,直接回车跳过): ").strip()
 
 
-            from agent.trace.compaction import build_reflect_prompt
-
-            # 保存当前 head_sequence
-            trace = await store.get_trace(trace_id)
-            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:
-                from datetime import datetime
-                experiences_path = runner.experiences_path or "./.cache/experiences.md"
-                os.makedirs(os.path.dirname(experiences_path), exist_ok=True)
-                header = f"\n\n---\n\n## {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(f"\n反思已保存到: {experiences_path}")
-                print("\n--- 反思内容 ---")
-                print(reflection_text)
-                print("--- 结束 ---\n")
-            else:
-                print("未生成反思内容")
-
+            # 触发反思
+            await perform_reflection(runner, store, trace_id, focus=focus)
             continue
             continue
 
 
         elif choice == "3":
         elif choice == "3":
@@ -241,6 +204,76 @@ async def show_interactive_menu(
         else:
         else:
             print("无效选项,请重新输入")
             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_how.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():
 async def main():
     # 解析命令行参数
     # 解析命令行参数
@@ -507,6 +540,17 @@ async def main():
 
 
             # Runner 退出(完成/失败/停止/异常)→ 显示交互菜单
             # Runner 退出(完成/失败/停止/异常)→ 显示交互菜单
             if current_trace_id:
             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(
                 menu_result = await show_interactive_menu(
                     runner, current_trace_id, current_sequence, store
                     runner, current_trace_id, current_sequence, store
                 )
                 )

+ 2 - 1
examples/research/test.prompt

@@ -7,4 +7,5 @@ $system$
 你是最顶尖的AI助手,可以拆分并调用工具逐步解决复杂问题。
 你是最顶尖的AI助手,可以拆分并调用工具逐步解决复杂问题。
 
 
 $user$
 $user$
-去网页上搜索一些关于摄影的内容和文章,并且下载一些下来。(执行前调用get_experience工具来作为参考)
+登录一下小红书,搜索一下摄影.没有cookie文件,也尝试一下
+

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


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


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


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


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


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


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


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


+ 11 - 0
examples/restore/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/input/person.jpg


+ 7 - 0
examples/restore/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/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/production.prompt

@@ -0,0 +1,43 @@
+---
+model: sonnet-4.6
+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/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())