Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Natural language search for local files (100G-1T). Supports xlsx, pptx, pdf, docx formats with location info. Triggered when user asks to search local/computer/folder content.
.claude/skills/local-ai-search/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
当用户说以下内容时,调用此 Skill:
本 Skill 提供本地文件的 AI 智能搜索功能:
用户: 帮我在本地搜索关于销售数据的内容
用户: 在 ~/Documents/Projects 文件夹中搜索 API 相关的文档
用户: 搜索本电脑中包含"关键词"的文件用户: 帮我在 ~/Documents/Projects 文件夹中搜索技术文档用户: 帮我找一下第三季度的销售报告
用户: 搜索一下关于数字化转型的内容
用户: 找找看有没有关于项目计划的 PPTbash# 1. 启动 Khoj 服务(嵌入式 PostgreSQL 模式) export USE_EMBEDDED_DB="true" khoj --anonymous-mode # 2. 转换文档 ~/.agents/skills/local-ai-search/scripts/convert.py ~/Documents/source -o ~/Documents/converted # 3. 索引文件(API 方式) curl -X PATCH "http://localhost:42110/api/content" \ -F "files=@~/Documents/converted/example.xlsx.md" # 4. 搜索查询 ~/.agents/skills/local-ai-search/scripts/query.py "搜索内容"
[1] 文件: test_data.xlsx.md
工作表: Sales Data
内容: | Month | Sales | | January | $10,000 |...
[2] 文件: test_slides.pptx.md
幻灯片: 第 1 页
内容: # Project Overview This is a test presentation...基于 Khoj 的本地 RAG 知识库解决方案,支持大规模文件(100G到1T)的全文检索和自然语言查询。通过 MarkItDown 转换 Office 文档,结合云端 LLM API 实现轻量级部署,适合资源受限环境。
| 需求项 | 具体要求 | |---|---| | 数据规模 | 建议小于1T的数据量,例如200GB 本地文件 | | 文件格式 | xlsx, pptx, pdf, docx, md 等 | | 检索方式 | 自然语言查询 | | 大模型 | 云端 API(OpenAI/DeepSeek/Claude/Qwen/Kimi/Minmax) | | 定位精度 | 来源文件 + 大致位置(工作表/幻灯片) | | 集成方式 | 封装为 OpenCode Skill |
| 约束项 | 配置 | |---|---| | 设备 | 常规个人PC,例如MacBook Air M2 | | 内存 | 8GB+ 可用内存 | | 剩余空间 | 足够的磁盘空间(文档大小的 25-40%)。例如200G的文件,需要有80GB空闲空间,支持本地向量数据库存储RAG结果。 | | 本地 LLM | 无法部署(资源不足) |
┌─────────────────────────────────────────────────────────────────┐
│ OpenCode Skill │
│ rag query "搜索内容" --top-k 10 │
│ rag index /path/to/files │
│ rag status │
└─────────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Khoj API Server │
│ localhost:42110 │
│ • 向量检索 │
│ • 对话生成 │
│ • 文件管理 │
└─────────────────────────┬───────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ PostgreSQL 数据库 │ │ 云端 LLM API │
│ (嵌入式 pgserver) │ │ 多模型支持 │
│ • 向量存储 │ │ • Chat Model │
│ • 文档索引 │ │ • 对话生成 │
│ • ~50-80GB │ │ • 无本地占用 │
└─────────────────────┘ └─────────────────────┘xlsx/pptx → MarkItDown 转换 → Markdown → Khoj 索引 → 向量数据库
↓
用户查询 → 向量检索 → 匹配片段 → 云端 LLM → 自然语言回答
↓
显示来源文件 + 位置| 组件 | 选择 | 理由 | |---|---|---| | RAG 服务 | Khoj | 成熟(33k stars)、API 友好、内存占用低 | | 文档转换 | MarkItDown | 微软开源、支持 xlsx/pptx、保留位置信息 | | 向量数据库 | PostgreSQL(嵌入式) | 成熟稳定、pgvector 向量索引、8GB+ RAM 友好 | | Embedding | 本地模型(sentence-transformers) | 免费、快速、隐私保护 | | LLM | 云端 API | 解放内存压力、性能更好 |
| 平台 | 支持状态 | 说明 | |------|----------|------| | macOS | ✅ 完全支持 | 原生支持,直接使用 | | Linux | ✅ 完全支持 | 原生支持,直接使用 | | Windows | ⚠️ 需要 WSL2 | 使用 WSL2 运行 Linux 环境 |
WSL2(Windows Subsystem for Linux 2)让 Windows 可以直接运行 Linux,无需虚拟机或双系统。
powershell# 1. 在 Windows PowerShell(管理员模式)中运行 wsl --install # 2. 重启电脑后,打开 "Ubuntu" 应用 # 3. 在 Ubuntu 终端中继续以下安装步骤
安装 WSL2 后,在 Ubuntu 终端中执行所有后续命令。
bash# 安装 Khoj pip install khoj # 安装 MarkItDown(含 Office 文档支持) pip install "markitdown[xlsx,pptx]"
bash# OpenAI export OPENAI_API_KEY="sk-xxx" # DeepSeek(推荐,性价比高) export OPENAI_API_KEY="sk-xxx" export OPENAI_BASE_URL="https://api.deepseek.com/v1" # Anthropic Claude export ANTHROPIC_API_KEY="sk-xxx"
bash# 嵌入式 PostgreSQL 模式(推荐个人使用) export USE_EMBEDDED_DB="true" khoj --anonymous-mode # 访问 Web UI open http://localhost:42110
| 命令 | 说明 | 示例 | |---|---|---| | rag start | 启动 Khoj 服务 | rag start | | rag stop | 停止服务 | rag stop | | rag status | 查看服务状态 | rag status | | rag convert <dir> | 转换 xlsx/pptx 为 Markdown | rag convert ~/Documents | | rag index <dir> | 索引文件到知识库 | rag index ~/Documents/converted | | rag query "<问题>" | 查询知识库 | rag query "第三季度销售数据" | | rag clean | 清理转换后的临时文件 | rag clean | | rag sync | 增量同步目录到知识库 | rag sync ~/Documents | | rag schedule | 管理定时同步任务 | rag schedule ~/Documents --enable |
bash# 转换指定目录下的 xlsx/pptx 文件 markitdown convert ~/Documents/source -o ~/Documents/converted # 转换单个文件 markitdown convert report.xlsx -o report.md
转换结果示例:
Excel (xlsx):
markdown## Sheet1 | Name | Age | City | |---|---|---| | Alice | 30 | NYC | | Bob | 25 | LA | ## Sheet2 | Product | Price | |---|---| | Apple | $1 |
PowerPoint (pptx):
markdown<!-- Slide number: 1 --> # Project Overview This is the introduction... <!-- Slide number: 2 --> ## Key Features - Feature 1 - Feature 2
bashcurl -X PATCH "http://localhost:42110/api/content" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "files=@/path/to/document.md"
bash# CLI 查询 khoj query "第三季度的销售数据在哪?" # API 查询 curl "http://localhost:42110/api/search?q=第三季度销售数据&n=5" \ -H "Authorization: Bearer YOUR_API_KEY"
返回结果示例:
来源文件: Q3_report.xlsx
位置: Sheet1
匹配内容:
| Month | Sales | Growth |
|---|---|---|
| July | $50,000 | +12% |
| August | $55,000 | +10% |
| September | $60,000 | +9% |
来源文件: sales.pptx
位置: Slide 5
匹配内容:
Q3 Sales Summary: Total $165,000| 格式 | 支持方式 | 位置信息 | 说明 | |---|---|---|---| | xlsx/xls | MarkItDown 转换 | ✅ 工作表名称 | 表格数据完整保留 | | pptx | MarkItDown 转换 | ✅ 幻灯片编号 | 文本、表格提取 | | pdf | Khoj 原生支持 | ✅ 页码 | 自动 OCR 扫描版 | | docx | Khoj 原生支持 | ✅ 段落标题 | 完整文档结构 | | md/txt | Khoj 原生支持 | ✅ 文件名 | 最佳支持 | | org | Khoj 原生支持 | ✅ 文件名 | Emacs 用户友好 |
| 格式 | 解决方案 | |---|---| | .epub | pandoc book.epub -o book.md | | .html | pandoc page.html -o page.md | | .rtf | pandoc doc.rtf -o doc.md |
| 项目 | 空间占用 | 说明 | |---|---|---| | 原始文件 | 200GB | 保留不变 | | 转换后 Markdown | ~20-40GB | 索引后可删除 | | Khoj 安装 | ~0.5GB | Python 包 + 本地模型 | | 向量数据库 | ~50-80GB | 索引文件 | | 临时占用(最大) | ~70-120GB | 索引过程中 | | 最终占用 | ~250-280GB | 删除 Markdown 后 |
初始状态: 100GB 可用
安装后: 99.5GB 可用(-0.5GB)
转换后: 60-80GB 可用(-20-40GB)
索引完成: 10-30GB 可用(-50-80GB)← 最紧张时刻
删除 Markdown: 50-70GB 可用(+20-40GB)| 指标 | 数值 | 说明 | |---|---|---| | 索引速度 | ~1-2GB/小时 | 常规个人PC | | 查询响应 | 50-200ms | 向量检索 | | 对话生成 | 1-3秒 | 取决于云端 API | | 内存占用 | ~200-500MB | 空闲时 | | 索引时内存 | ~2-4GB | 取决于文件大小 |
| 提供商 | API Key 环境变量 | 模型示例 | |---|---|---| | OpenAI | OPENAI_API_KEY | gpt-4o, gpt-4o-mini | | DeepSeek | OPENAI_API_KEY + OPENAI_BASE_URL | deepseek-chat, deepseek-reasoner | | Anthropic | ANTHROPIC_API_KEY | claude-3-5-sonnet | | Google | GEMINI_API_KEY | gemini-2.0-flash | | Qwen/通义 | OPENAI_API_KEY + OPENAI_BASE_URL | qwen-turbo, qwen-plus | | Kimi/月之暗面 | OPENAI_API_KEY + OPENAI_BASE_URL | moonshot-v1-8k | | Minimax | OPENAI_API_KEY + OPENAI_BASE_URL | abab6.5-chat | | 本地 Ollama | - | llama3, qwen2.5 |
yaml# ~/.khoj/config.yml # LLM 配置 chat-model: provider: openai # 或 deepseek, anthropic model: gpt-4o-mini api-key: ${OPENAI_API_KEY} # Embedding 配置(使用本地模型) embedding-model: provider: local model: BAAI/bge-small-zh-v1.5 # 数据库配置 database: type: sqlite path: ~/.khoj/khoj.db
bash# 1. 先小规模测试 rag convert ~/Documents/test_folder rag index ~/Documents/test_folder_converted # 2. 观察实际空间占用 du -sh ~/.khoj/ # 3. 根据测试结果推算全量需求 # 4. 分批索引核心文件 rag convert ~/Documents/important_folder rag index ~/Documents/important_folder_converted
bash# 查看索引状态 rag status # 清理过期文件 rag clean # 备份知识库 cp -r ~/.khoj ~/.khoj_backup_$(date +%Y%m%d) # 重新索引(更换 Embedding 模型后) khoj --regenerate
| 问题 | 解决方案 | |---|---| | 服务启动失败 | 检查端口 42110 是否被占用 | | 索引速度慢 | 减少并发、关闭其他应用 | | 内存不足 | 使用云端 Embedding API | | 查询无结果 | 检查文件格式、重新索引 |
| 项目 | 说明 | |---|---| | 本地数据 | 所有向量存储在本地 PostgreSQL | | Embedding | 默认使用本地模型,数据不上传 | | LLM 对话 | 仅查询内容发送到云端 API | | API Key | 存储在本地环境变量或配置文件 |
bash# Skill 目录结构 ~/.agents/skills/khoj-rag/ ├── SKILL.md # 本文档 ├── khoj_cli.py # CLI 封装脚本 ├── config.yaml # 默认配置 └── scripts/ ├── start_server.sh # 启动服务 ├── convert.py # 批量转换 └── query.py # 查询封装
pythonimport requests KHOJ_URL = "http://localhost:42110" API_KEY = "your-api-key" # 搜索 response = requests.get( f"{KHOJ_URL}/api/search", params={"q": "查询内容", "n": 5}, headers={"Authorization": f"Bearer {API_KEY}"} ) # 对话 response = requests.post( f"{KHOJ_URL}/api/chat", json={"q": "问题内容"}, headers={"Authorization": f"Bearer {API_KEY}"} )
| 客户端 | 说明 | |---|---| | Web UI | http://localhost:42110 | | Obsidian 插件 | 自动同步 Markdown 笔记 | | Emacs | M-x khoj 命令 | | Desktop App | 跨平台桌面客户端 | | API | RESTful API 接口 |
当文件有更新时,可以手动触发增量同步:
bash# 增量同步(只处理变化的文件) ~/.agents/skills/local-ai-search/scripts/sync.py ~/Documents # 全量同步(强制重新索引所有文件) ~/.agents/skills/local-ai-search/scripts/sync.py ~/Documents --full # 详细输出 ~/.agents/skills/local-ai-search/scripts/sync.py ~/Documents --verbose
或使用 CLI:
bash# 增量同步 local-ai-search sync ~/Documents # 全量同步 local-ai-search sync ~/Documents --full
设置每小时自动同步:
bash# 启用定时同步(每小时) ~/.agents/skills/local-ai-search/scripts/schedule_sync.sh ~/Documents --enable # 启用定时同步(每2小时) ~/.agents/skills/local-ai-search/scripts/schedule_sync.sh ~/Documents --enable --interval 2 # 查看定时同步状态 ~/.agents/skills/local-ai-search/scripts/schedule_sync.sh --status # 禁用定时同步 ~/.agents/skills/local-ai-search/scripts/schedule_sync.sh --disable # 立即执行一次同步 ~/.agents/skills/local-ai-search/scripts/schedule_sync.sh ~/Documents --run
或使用 CLI:
bash# 启用定时同步 local-ai-search schedule ~/Documents --enable # 设置每2小时同步 local-ai-search schedule ~/Documents --enable --interval 2 # 查看状态 local-ai-search schedule --status # 禁用定时同步 local-ai-search schedule --disable
在大规模索引时会显示进度:
扫描目录: ~/Documents
找到文件: 150 个
已索引: 120 个
需要同步: 30 个
[=============> ] 60.0% (18/30) report.xlsx
✓ 成功: 28
✗ 失败: 2
同步完成!增量同步通过以下方式判断文件变化:
| 检查项 | 说明 | |--------|------| | 文件修改时间 | 文件被修改时时间会变化 | | 文件大小 | 内容变化时大小会变化 | | 已索引文件列表 | 对比 Khoj 已索引的文件 |
同步状态保存在 ~/.khoj/sync_state.json,记录每个文件的同步状态。
可以。Khoj 已将内容存入向量数据库,Markdown 文件仅作为临时转换产物,索引完成后可安全删除,节省 20-40GB 空间。
默认不支持。MarkItDown 保留工作表名称和幻灯片编号,但不保留单元格位置。如需精确定位,需自定义转换脚本。
支持。在 Khoj 配置中启用文件监控,文档变更会自动触发重新索引。
bash# 备份 tar -czf khoj_backup.tar.gz ~/.khoj/ # 恢复 tar -xzf khoj_backup.tar.gz -C ~/
| 版本 | 日期 | 说明 | |---|---|---| | 1.1.0 | 2026-03-20 | 新增增量同步、定时同步、进度显示功能 | | 1.0.4 | 2026-03-20 | 添加 Windows 平台说明(需要 WSL2) | | 1.0.3 | 2026-03-20 | 澄清数据库类型:Khoj 使用嵌入式 PostgreSQL(非 SQLite) | | 1.0.1 | 2026-03-20 | 更新文档:数据规模调整,新增 LLM 支持 | | 1.0.0 | 2026-03-20 | 初始版本 |
本 Skill 基于 MIT 许可证开源。Khoj 和 MarkItDown 分别遵循各自的许可证。
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +48 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.