Install
openclaw skills install li-photo-index基于视觉-语言模型,扫描与索引指定目录照片,支持自然语言语义搜索及标签自定义并输出结构化结果。
openclaw skills install li-photo-index📸 智能照片搜索技能 - 基于 VL 大模型的照片索引和语义搜索
Photo Search Skill 是一个独立的智能技能程序,用于扫描、索引和搜索照片。它利用 VL(Vision-Language)大模型分析照片内容,建立结构化索引,并支持通过自然语言进行语义搜索。
智能体(如 hermes, openclaw 等)可以通过命令行直接调用此技能:
# 从任何目录调用(使用绝对路径)
python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py search "海滩日落"
# 扫描照片
python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py scan --dir D:\Photos
# 扫描并搜索(一步完成)
python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py scan_and_search --dir D:\Photos --query "海边"
# JSON 格式输出(便于智能体解析)
python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py search "海滩" --format json
cd G:\python\PhotoIndexWithLLM
# 扫描照片
python skills/photo-search/skill.py scan --dir D:\Photos
# 搜索照片
python skills/photo-search/skill.py search "海滩日落"
# 扫描并搜索
python skills/photo-search/skill.py scan_and_search --dir D:\Photos --query "海边"
主项目需要配置好:
pip install -r requirements.txt.env 文件Skill 本身无需额外配置!
# 1. 扫描并索引照片
python <skill路径> scan --dir <照片目录>
# 2. 搜索照片
python <skill路径> search "<搜索关键词>"
# 3. 扫描并搜索(组合命令)
python <skill路径> scan_and_search --dir <目录> --query "<关键词>"
用户请求:"帮我找一下海边的照片"
↓
智能体执行:
python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py search "海边"
↓
返回结果:
{
"results": [...],
"total": 5,
"search_type": "hybrid"
}
↓
智能体回复用户:
"找到了5张海边的照片..."
# 扫描指定目录
python skill.py scan --dir D:\MyPhotos
# 扫描多个目录
python skill.py scan --dir D:\Photos E:\Pictures
# 强制重新索引
python skill.py scan --force --dir D:\Photos
# 关键词搜索
python skill.py search "海滩 日落"
# 语义搜索(自然语言)
python skill.py search "蓝色的海边风景"
# 带标签过滤
python skill.py search "旅行" --tags 风景,人物
# 按场景过滤
python skill.py search "风景" --scene 户外
# 按日期范围
python skill.py search "旅行" --date-from 2024-01-01 --date-to 2024-12-31
# 限制返回数量
python skill.py search "海滩" --limit 10
# JSON 格式输出
python skill.py search "海滩" --format json
# 一步完成:先扫描,再搜索
python skill.py scan_and_search --dir D:\Photos --query "海边"
# JSON 输出
python skill.py scan_and_search --dir D:\Photos --query "海边" --format json
# 为照片添加标签
python skill.py annotate --photo D:\Photos\img001.jpg --type person --name 张三
# 添加场景标签
python skill.py annotate --photo D:\Photos\img002.jpg --type scene --name 海边
# JSON 输出
python skill.py annotate --photo D:\Photos\img001.jpg --type person --name 张三 --format json
# 训练个性化模型
python skill.py train
# JSON 输出
python skill.py train --format json
# 查看统计信息
python skill.py stats
# 测试 LLM 连接
python skill.py test
# 列出照片
python skill.py list --limit 20
import subprocess
import json
def search_photos(query: str, limit: int = 20) -> dict:
"""搜索照片"""
skill_path = r"G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py"
result = subprocess.run(
["python", skill_path, "search", query, "--limit", str(limit), "--format", "json"],
capture_output=True,
text=True
)
if result.returncode == 0:
return json.loads(result.stdout)
else:
return {"error": result.stderr}
# 使用
photos = search_photos("海滩日落")
print(f"找到 {photos['total']} 张照片")
#!/bin/bash
# photo_agent.sh - 智能体照片搜索脚本
SKILL="G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py"
# 搜索照片
search_photos() {
local query="$1"
local limit="${2:-20}"
python "$SKILL" search "$query" --limit "$limit" --format json
}
# 扫描照片
scan_photos() {
local dir="$1"
python "$SKILL" scan --dir "$dir"
}
# 使用
search_photos "海滩" 10
class PhotoSearchSkill:
"""照片搜索技能封装"""
def __init__(self, skill_path: str):
self.skill_path = skill_path
def search(self, query: str, **kwargs) -> dict:
"""搜索照片"""
cmd = ["python", self.skill_path, "search", query]
if kwargs.get("format") == "json":
cmd.append("--format")
cmd.append("json")
result = subprocess.run(cmd, capture_output=True, text=True)
return json.loads(result.stdout) if result.returncode == 0 else None
def scan(self, directories: list) -> bool:
"""扫描照片"""
cmd = ["python", self.skill_path, "scan", "--dir"] + directories
result = subprocess.run(cmd, capture_output=True, text=True)
return result.returncode == 0
def annotate(self, photo: str, type: str, name: str) -> bool:
"""添加标注"""
cmd = [
"python", self.skill_path, "annotate",
"--photo", photo,
"--type", type,
"--name", name
]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.returncode == 0
{
"results": [
{
"file_name": "beach_sunset_001.jpg",
"file_path": "D:\\Photos\\2024\\beach_sunset_001.jpg",
"scene_type": "风景",
"description": "海边的日落,天空呈现橙红色",
"tags": ["海滩", "日落", "风景", "海洋"],
"confidence_score": 0.92
}
],
"total": 5,
"search_type": "hybrid"
}
🔍 搜索查询: '海滩 日落'
📊 找到 5 条结果
1. beach_sunset_001.jpg
📁 D:\Photos\2024\beach_sunset_001.jpg
🏷️ 场景: 风景
📝 描述: 海边的日落,天空呈现橙红色
🔖 标签: 海滩, 日落, 风景, 海洋
⭐ 置信度: 0.92
Skill 依赖于主项目的配置(.env 文件),主要包括:
# 本地 LLM
LOCAL_LLM_ENDPOINT=http://localhost:1234/v1
LOCAL_LLM_MODEL=qwen3-vl-8b-q4_k_m
# 远程 LLM(可选)
REMOTE_LLM_API_KEY=your-api-key
REMOTE_LLM_MODEL=nvidia/nemotron-nano-12b-v2-vl:free
# 照片目录
PHOTO_SCAN_DIRS=D:\Photos
| 参数 | 说明 | 示例 |
|---|---|---|
query | 搜索关键词 | "海滩" |
--dir | 扫描目录 | "D:\Photos" |
--tags | 标签过滤 | "风景,人物" |
--scene | 场景类型 | "户外" |
--date-from | 起始日期 | "2024-01-01" |
--date-to | 结束日期 | "2024-12-31" |
--limit | 返回数量 | 20 |
--format | 输出格式 | json 或 text |
--no-vector | 禁用向量搜索 | - |
解决方案:
# 使用绝对路径
python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py search "海滩"
解决方案:
# 确保主项目存在
ls G:\python\PhotoIndexWithLLM\config.py
# 测试连接
python skill.py test
# 检查 LM Studio 是否运行
netstat -ano | findstr :1234
# 1. 确认已索引照片
python skill.py stats
# 2. 重新扫描
python skill.py scan --force --dir D:\Photos
# 3. 尝试不同关键词
python skill.py search "海边"
# 搜索多个关键词
python skill.py search "海滩" --format json > beach.json
python skill.py search "山脉" --format json > mountain.json
python skill.py search "城市" --format json > city.json
# 搜索 → 过滤 → 发送
python skill.py search "海滩" --format json | jq '.results[] | .file_path' | send_to_user
# Windows 任务计划程序
# 每天凌晨2点扫描新照片
0 2 * * * python G:\python\PhotoIndexWithLLM\skills\photo-search\skill.py scan --dir D:\Photos
--format jsonpython skill.py --helpSKILL.md(本文件)README.md, USAGE.mdSkill 版本: v1.0
独立版本: ✅
兼容智能体: hermes, openclaw, 所有支持 CLI 的智能体
更新日期: 2026-05-16