运行时依赖
安装命令
点击复制技能文档
Photo 搜索 技能
📸 智能照片搜索技能 - 基于 VL 大模型的照片索引和语义搜索
📋 概述
Photo 搜索 技能 是一个独立的智能技能程序,用于扫描、索引和搜索照片。它利用 VL(Vision-Language)大模型分析照片内容,建立结构化索引,并支持通过自然语言进行语义搜索。
✨ 特性 🔍 完全独立:可以从任何目录调用,无需设置环境变量 🤖 智能体友好:专为 hermes、OpenClaw 等智能体设计 📦 零配置调用:自动定位主项目,无需手动配置路径 🌐 JSON 输出:支持结构化输出,便于智能体解析 核心能力 🔍 照片扫描:扫描指定目录的所有照片文件 🤖 VL 分析:使用本地/远程 VL 模型智能解读照片内容 📊 自动索引:生成场景、物体、人物、标签等结构化数据 🔎 语义搜索:支持自然语言查询,理解搜索意图 🏷️ 人工标注:用户可自定义标签,训练个性化识别 🌐 命令行工具 接口:通过命令行调用,易于集成到智能体 📷 支持的图片格式(17 种) 类型 格式 常见格式 .jpg .jpeg .png .网页p .bmp .tiff .gif iPhone/应用le .heic .heif Canon 单反 .cr2 Nikon 单反 .nef Sony 单反 .arw Olympus .orf Fujifilm .raf 通用 RAW .dng Panasonic .rw2 Pentax .pef Sony 旧款 .sr2 🚀 快速使用 智能体调用方式
智能体(如 hermes, OpenClaw 等)可以通过命令行直接调用此技能:
# 从任何目录调用(使用绝对路径) python G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py 搜索 "海滩日落"
# 扫描照片 python G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py 扫描 --dir D:\Photos
# 扫描并搜索(一步完成) python G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py 扫描_and_搜索 --dir D:\Photos --查询 "海边"
# JSON 格式输出(便于智能体解析) python G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py 搜索 "海滩" --格式化 json
在项目目录中调用 cd G:\python\Photo索引WithLLM
# 扫描照片 python 技能s/photo-搜索/技能.py 扫描 --dir D:\Photos
# 搜索照片 python 技能s/photo-搜索/技能.py 搜索 "海滩日落"
# 扫描并搜索 python 技能s/photo-搜索/技能.py 扫描_and_搜索 --dir D:\Photos --查询 "海边"
📖 智能体调用指南 环境要求
主项目需要配置好:
Python 3.10+ 已安装依赖:pip 安装 -r requirements.txt 已配置 .env 文件 LM Studio 运行在端口 1234(如需本地模型)
技能 本身无需额外配置!
基本调用模式 # 1. 扫描并索引照片 python <技能路径> 扫描 --dir <照片目录>
# 2. 搜索照片 python <技能路径> 搜索 "<搜索关键词>"
# 3. 扫描并搜索(组合命令) python <技能路径> 扫描_and_搜索 --dir <目录> --查询 "<关键词>"
智能体工作流程 用户请求:"帮我找一下海边的照片" ↓ 智能体执行: python G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py 搜索 "海边" ↓ 返回结果: { "结果s": [...], "total": 5, "搜索_type": "hybrid" } ↓ 智能体回复用户: "找到了5张海边的照片..."
🎯 完整命令参考 扫描照片 # 扫描指定目录 python 技能.py 扫描 --dir D:\MyPhotos
# 扫描多个目录 python 技能.py 扫描 --dir D:\Photos E:\Pictures
# 强制重新索引 python 技能.py 扫描 --force --dir D:\Photos
搜索照片 # 关键词搜索 python 技能.py 搜索 "海滩 日落"
# 语义搜索(自然语言) python 技能.py 搜索 "蓝色的海边风景"
# 带标签过滤 python 技能.py 搜索 "旅行" --tags 风景,人物
# 按场景过滤 python 技能.py 搜索 "风景" --scene 户外
# 按日期范围 python 技能.py 搜索 "旅行" --date-from 2024-01-01 --date-to 2024-12-31
# 限制返回数量 python 技能.py 搜索 "海滩" --limit 10
# JSON 格式输出 python 技能.py 搜索 "海滩" --格式化 json
扫描并搜索(组合命令) # 一步完成:先扫描,再搜索 python 技能.py 扫描_and_搜索 --dir D:\Photos --查询 "海边"
# JSON 输出 python 技能.py 扫描_and_搜索 --dir D:\Photos --查询 "海边" --格式化 json
人工标注 # 为照片添加标签 python 技能.py annotate --photo D:\Photos\img001.jpg --type person --name 张三
# 添加场景标签 python 技能.py annotate --photo D:\Photos\img002.jpg --type scene --name 海边
# JSON 输出 python 技能.py annotate --photo D:\Photos\img001.jpg --type person --name 张三 --格式化 json
训练模型 # 训练个性化模型 python 技能.py trAIn
# JSON 输出 python 技能.py trAIn --格式化 json
其他命令 # 查看统计信息 python 技能.py stats
# 测试 LLM 连接 python 技能.py test
# 列出照片 python 技能.py 列出 --limit 20
🤖 智能体集成示例 示例 1:Python 智能体(Hermes、OpenClaw 等) 导入 subprocess 导入 json
def 搜索_photos(查询: str, limit: int = 20) -> dict: """搜索照片""" 技能_path = r"G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py" 结果 = subprocess.运行( ["python", 技能_path, "搜索", 查询, "--limit", str(limit), "--格式化", "json"], capture_输出=True, text=True ) if 结果.returncode == 0: return json.loads(结果.stdout) else: return {"error": 结果.stderr}
# 使用 photos = 搜索_photos("海滩日落") print(f"找到 {photos['total']} 张照片")
示例 2:Shell 脚本智能体 #!/bin/bash # photo_代理.sh - 智能体照片搜索脚本
技能="G:\python\Photo索引WithLLM\技能s\photo-搜索\技能.py"
# 搜索照片 搜索_photos() { local 查询="$1" local limit="${2:-20}" python "$技能" 搜索 "$查询" --limit "$limit" --格式化 json }
# 扫描照片 扫描_photos() { local dir="$1" python "$技能" 扫描 --dir "$dir" }
# 使用 搜索_photos "海滩" 10
示例 3:通用智能体封装 class Photo搜索技能: """照片搜索技能封装""" def __init__(self, 技能_path: str): self.技能_path = 技能_path def 搜索(self, 查询: str, **kwargs) -> dict: """搜索照片""" cmd = ["python", self.技能_path, "搜索", 查询] if kwargs.获取("格式化") == "json": cmd.应用end("--格式化") cmd.应用end("json") 结果 = subprocess.运行(cmd, capture_输出=True, text=True) return json.loads(结果.stdout) if 结果.returncode == 0 else None def 扫描(self, directories: 列出) -> bool: """扫描照片""" cmd = ["python", self.技能_path, "扫描", "--dir"] + directories 结果 = subprocess.运行(cmd, capture_输出=True, text=True) return 结果.returncode == 0 def annotate(self, photo: str,