# sirchmunk **Repository Path**: lzdn/sirchmunk ## Basic Information - **Project Name**: sirchmunk - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-20 - **Last Updated**: 2026-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
Sirchmunk 标志 # Sirchmunk:无需向量数据库和预索引的自进化搜索引擎 [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/downloads/) [![FastAPI](https://img.shields.io/badge/FastAPI-0.100%2B-009688?style=flat-square&logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com/) [![Next.js](https://img.shields.io/badge/Next.js-14-000000?style=flat-square&logo=next.js&logoColor=white)](https://nextjs.org/) [![TailwindCSS](https://img.shields.io/badge/Tailwind-3.4-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white)](https://tailwindcss.com/) [![DuckDB](https://img.shields.io/badge/DuckDB-OLAP-FFF000?style=flat-square&logo=duckdb&logoColor=black)](https://duckdb.org/) [![License](https://img.shields.io/badge/License-Apache%202.0-blue?style=flat-square)](LICENSE) [![ripgrep-all](https://img.shields.io/badge/ripgrep--all-Search-E67E22?style=flat-square&logo=rust&logoColor=white)](https://github.com/phiresky/ripgrep-all) [![OpenAI](https://img.shields.io/badge/OpenAI-API-412991?style=flat-square&logo=openai&logoColor=white)](https://github.com/openai/openai-python) [![Kreuzberg](https://img.shields.io/badge/Kreuzberg-Text_Extraction-4CAF50?style=flat-square)](https://github.com/kreuzberg-dev/kreuzberg) [![MCP](https://img.shields.io/badge/MCP-Python_SDK-8B5CF6?style=flat-square&logo=python&logoColor=white)](https://github.com/modelcontextprotocol/python-sdk) 📖 **[官方文档](https://modelscope.github.io/sirchmunk-web/zh/)** [**快速开始**](#-快速开始) · [**核心特性**](#-核心特性) · [**MCP 服务器**](#-mcp-服务器) · [**Web UI**](#️-web-ui) · [**Docker 部署**](#-docker-部署) · [**工作原理**](#️-工作原理) · [**FAQ**](#-faq)
🔍 **智能体搜索**  •  🧠 **知识聚类**  •  📊 **蒙特卡洛证据采样**
⚡ **无索引检索**  •  🔄 **自进化知识库**  •  💬 **实时对话**

[English](README.md) | [中文](README_zh.md) --- ## 🌰 为什么选择 “Sirchmunk”? 基于向量检索的智能流水线往往 _僵硬且脆弱_。它们依赖静态向量嵌入,**计算成本高、对实时变化不敏感,并且脱离原始上下文**。我们引入 **Sirchmunk**,开启更敏捷的范式:数据不再是静态的快照和分块,而是直接从原始数据中洞见所查。 --- ## ✨ 核心特性 ### 1. 无需向量数据库和预索引:直接面向原始数据形态 **Sirchmunk** 直接处理 **原始数据** —— 无需将大量而繁杂的文件压缩为固定维度向量,或是构建为图数据库。 * **即开即用搜索:** 不再需要复杂、耗时的预处理与索引;直接添加文件即可检索。 * **全量保真:** 零信息损失,避免向量近似带来的偏差。 ### 2. 自进化:实时动态索引 数据是流动的,而非静态快照。**Sirchmunk** 天然具备动态特性。相比之下,向量数据库可能在数据变化的瞬间就过时。 * **上下文感知:** 随数据上下文实时演化。 * **LLM 自主驱动:** 面向智能体设计,通过精心设计的上下文检索技术,仅在必要时触发LLM推理,提高Token使用效率,兼顾智能与成本。 ### 3. 规模化:实时与海量数据支持 **Sirchmunk** 具备 **高吞吐** 与 **实时感知** 的特性,能够高效处理本地大型数据集和文件系统。 > 更多技术细节,参考 [Sirchmunk blog](https://modelscope.github.io/sirchmunk-web/zh/blog/). --- ### 传统 RAG vs. Sirchmunk
维度 传统 RAG ✨Sirchmunk
💰 搭建成本 高开销
(VectorDB、GraphDB、复杂文档解析器...)
✅ 零基础设施
直接面向数据检索,无向量孤岛
🕒 数据新鲜度 滞后(批量重建索引) ✅ 即时 & 动态
自进化索引反映实时变化
📈 可扩展性 线性成本增长 ✅ 极低 RAM/CPU 占用
原生弹性支持,高效处理大规模数据集
🎯 准确性 近似向量匹配 ✅ 确定性 & 上下文相关
混合逻辑确保语义精度
⚙️ 工作流 复杂 ETL 流水线 ✅ 直接检索
零配置集成,快速部署
--- ## 演示

直接访问文件或文件夹即可开始对话

--- | 微信群 | 钉钉群 | |:--------:|:--------:| | | | --- ## 🎉 News * 🚀 **2026年4月13日**: Sirchmunk v0.0.7 - **C/S 部署加固**:远程模式下严格的 `allowed_paths` 路径约束与符号链接检测;按 IP 速率限制与 JSON Lines 审计日志;本地模式保持向后兼容。 - **远程文件上传**:三种上传模式(选择文件 / 选择文件夹 / 拖拽上传);服务端上传前重复检测,支持跳过/覆盖;基于 manifest 的存储统计。 - **服务端文件浏览**:`FileBrowser` 默认打开服务端 `data/` 目录;手动路径输入校验 `allowed_paths`;远程访问的权限感知错误提示。 - **Init 对齐**:`sirchmunk init` 生成与 `config/env.example` 完全对齐的 `.env`,覆盖所有 C/S 部署变量。 * 🚀 **2026年3月31日**: Sirchmunk v0.0.6post3 - **Docker 多架构支持**:通过 Docker Buildx 原生构建 `linux/amd64` 和 `linux/arm64` 镜像;CI 自动构建双架构。 - **FAST 模式优化**:`_fast_find_best_file` 新增文件级去重与动态分数剪枝;知识集群复用增加搜索范围感知。 * 🚀 **2026年3月20日**: Sirchmunk v0.0.6post1 - **🐿️x🦞OpenClaw 技能**:Sirchmunk 已发布为 [OpenClaw](https://openclaw.org/) 技能,上架 [ClawHub](https://clawhub.ai/wangxingjun778/sirchmunk) — 任何兼容 OpenClaw 的 AI Agent均可通过自然语言搜索本地文件。详见 [openclaw-recipe](recipes/openclaw_skills/README.md)。 - **Search API**:新增 SSE 流式端点(`POST /api/v1/search/stream`),支持实时日志输出;通过 `SIRCHMUNK_MAX_CONCURRENT_SEARCHES` 控制并发;`paths` 参数同时支持字符串和数组,且为可选(回退到 `SIRCHMUNK_SEARCH_PATHS`)。 - **依赖修复**:`sirchmunk serve` 不再要求安装 `sirchmunk[web]` — `uvicorn` 已纳入核心依赖;`psutil` 改为可选。 * 🚀 **2026年3月12日**: Sirchmunk v0.0.6 - **多轮对话**:上下文管理与 LLM 查询重写;配置项 `CHAT_HISTORY_MAX_TURNS` / `CHAT_HISTORY_MAX_TOKENS`;搜索默认 token 预算 128K - **文档摘要与跨语言检索**:摘要流水线(分块/合并/重排)、跨语言关键词提取、聊天历史相关性过滤 - **Docker**:支持 `SIRCHMUNK_SEARCH_PATHS` 环境变量;更新 entrypoint;文档处理依赖 - **OpenAI 客户端**:`_ProviderProfile` 多提供商管理;按 `base_url` 自动检测;统一流式处理;支持 `thinking_content`
历史版本(v0.0.2 – v0.0.5) * 🚀 **2026.3.5**: **Sirchmunk v0.0.5 发布** - **破坏性变更**:统一搜索 API:重构 search() 接口的返回类型,引入 SearchContext 对象并简化返回参数控制,API 调用更简洁。 - **高可用 RAG 对话**:引入重试机制与细粒度异常处理,大幅提升了 RAG 聊天在复杂网络环境下的稳定性。 - **稳定 MCP 集成**:修复 mcp run 初始化问题,确保 MCP 协议服务器在各环境下均能顺畅启动。 - **PyPI 安装修复**:解决了标准 pip 安装后的 Web 源码定位问题,确保 Web UI 即装即用。 * 🚀 **2026.2.27**: **Sirchmunk v0.0.4 发布** - **Docker 部署支持**:提供预构建 Docker 镜像,支持容器化一键部署。 - **FAST 检索模式**:新增默认贪心搜索模式,采用两级关键词级联与上下文窗口采样策略,仅需 2 次 LLM 调用(2-5s vs 10-30s),大幅提升检索速度。 - **简化部署链路**:精简命令行与 Web 端的部署和配置流程,降低上手门槛。 - **Windows 兼容性修复**:修复 Windows 环境下的兼容性问题。 * 🚀 **2026.2.12**: **Sirchmunk v0.0.3 发布:核心搜索算法与 MCP 集成双升级** - **MCP 增强**:深度优化 Model Context Protocol 集成及配置文档。 - **搜索精细化**:搜索工具支持 Glob 模式过滤,默认自动排除缓存与日志文件。 - **算法文档**:新增“蒙特卡洛证据采样”与“自进化知识簇”核心原理深度解析。 - **架构稳定性**:重构搜索管线(AgenticSearch.search),引入 SHA256 确定性 ID 确保知识簇一致性。 * 🚀 **2026.2.5**: 发布 **v0.0.2** — MCP 支持、CLI 命令行 & 知识持久化! - **MCP 集成**:完整支持 [Model Context Protocol](https://modelcontextprotocol.io),与 Claude Desktop 和 Cursor IDE 无缝协作。 - **CLI 命令行**:全新 `sirchmunk` 命令行工具,支持 `init`、`serve`、`search`、`web` 和 `mcp` 命令。 - **KnowledgeCluster 持久化**:基于 DuckDB 存储,支持 Parquet 导出,高效管理知识聚类。 - **知识复用**:基于语义相似度的知识聚类检索,通过 embedding 向量加速搜索。 * 🎉🎉 2026.1.22: **Sirchmunk** 初始版本 v0.0.1 现已发布!
--- ## 🚀 快速开始 ### 前置条件 - **Python** 3.10+ - **LLM API Key**(OpenAI 兼容 Endpoint,本地或远程) - **Node.js** 18+(可选,用于 Web 界面) ### 安装 ```bash # 创建虚拟环境(推荐) conda create -n sirchmunk python=3.13 -y && conda activate sirchmunk pip install sirchmunk # 或使用 UV: uv pip install sirchmunk # 或从源码安装: git clone https://github.com/modelscope/sirchmunk.git && cd sirchmunk pip install -e . ``` ### Python SDK 使用 ```python import asyncio from sirchmunk import AgenticSearch from sirchmunk.llm import OpenAIChat llm = OpenAIChat( api_key="your-api-key", base_url="your-base-url", # 例如 https://api.openai.com/v1 model="your-model-name" # 例如 gpt-5.2 ) async def main(): agent_search = AgenticSearch(llm=llm) # FAST 模式(默认):贪心搜索,2 次 LLM 调用,2-5s result: str = await agent_search.search( query="How does transformer attention work?", paths=["/path/to/documents"], ) # DEEP 模式:全面分析,蒙特卡洛证据采样,10-30s result_deep: str = await agent_search.search( query="How does transformer attention work?", paths=["/path/to/documents"], mode="DEEP", ) print(result) asyncio.run(main()) ``` **⚠️ 注意:** - 初始化时,AgenticSearch 会自动检查是否安装 ripgrep-all 和 ripgrep。如缺失,会尝试自动安装。若自动安装失败,请手动安装。 - 参考:https://github.com/BurntSushi/ripgrep | https://github.com/phiresky/ripgrep-all - 将 `"your-api-key"`、`"your-base-url"`、`"your-model-name"` 和 `/path/to/documents` 替换为实际值。
使用 MiniMax ```python from sirchmunk.llm import OpenAIChat llm = OpenAIChat( api_key="your-minimax-api-key", base_url="https://api.minimax.io/v1", # 海外版 # base_url="https://api.minimaxi.com/v1", # 国内版 model="MiniMax-M2.7" # 或 "MiniMax-M2.7-highspeed" ) ```
### 命令行界面 Sirchmunk 提供强大的 CLI,用于服务器管理和搜索操作。 #### 安装 ```bash pip install "sirchmunk[web]" # 或使用UV安装 uv pip install "sirchmunk[web]" ``` #### 初始化 ```bash # 使用默认设置初始化 Sirchmunk,默认工作路径为 `~/.sirchmunk/` sirchmunk init # 或者,也可以使用自定义工作路径初始化 sirchmunk init --work-path /path/to/workspace ``` #### 启动服务器 ```bash # 仅启动后端 API 服务器 sirchmunk serve # 自定义主机和端口 sirchmunk serve --host 0.0.0.0 --port 8000 ``` #### 搜索 ```bash # 在当前目录搜索(默认 FAST 模式) sirchmunk search "认证是如何工作的?" # 在指定路径搜索 sirchmunk search "查找所有 API 端点" ./src ./docs # DEEP 模式:蒙特卡洛证据采样全面分析 sirchmunk search "数据库架构" --mode DEEP # 快速文件名搜索 sirchmunk search "config" --mode FILENAME_ONLY # 输出为 JSON 格式 sirchmunk search "数据库模式" --output json # 通过 API 服务器搜索(需要先启动服务器) sirchmunk search "查询" --api --api-url http://localhost:8584 ``` #### 可用命令 | 命令 | 说明 | |------|------| | `sirchmunk init` | 初始化工作目录、.env 及 MCP 配置 | | `sirchmunk serve` | 仅启动后端 API 服务器 | | `sirchmunk search` | 执行搜索查询 | | `sirchmunk web init` | 构建 WebUI 前端(需要 Node.js 18+) | | `sirchmunk web serve` | 启动 API + WebUI(单端口) | | `sirchmunk web serve --dev` | 开发模式,Next.js 热重载 | | `sirchmunk mcp serve` | 启动 MCP 服务器(stdio/HTTP) | | `sirchmunk mcp version` | 显示 MCP 版本信息 | | `sirchmunk version` | 显示版本信息 | --- ## 🔌 MCP 服务器 Sirchmunk 提供 [Model Context Protocol (MCP)](https://modelcontextprotocol.io) 服务器,将其智能搜索能力作为 MCP 工具暴露。可与 **Claude Desktop** 和 **Cursor IDE** 等 AI 助手无缝集成。 ### 快速开始 ```bash # 安装(含 MCP 支持) pip install sirchmunk[mcp] # 初始化(生成 .env 和 mcp_config.json) sirchmunk init # 可选:使用自定义工作目录 # sirchmunk init --work-path /path/to/your_work_path # 编辑 ~/.sirchmunk/.env 配置 LLM API Key # 使用 MCP Inspector 测试 npx @modelcontextprotocol/inspector sirchmunk mcp serve # 可选:本次 MCP 运行使用自定义工作目录 # npx @modelcontextprotocol/inspector sirchmunk mcp serve --work-path /path/to/your_work_path ``` ### `mcp_config.json` 配置 运行 `sirchmunk init` 后会生成 `~/.sirchmunk/mcp_config.json` 文件。将其复制到你的 MCP 客户端配置目录即可。 **示例:** ```json { "mcpServers": { "sirchmunk": { "command": "sirchmunk", "args": ["mcp", "serve"], "env": { "SIRCHMUNK_SEARCH_PATHS": "", "SIRCHMUNK_WORK_PATH": "/path/to/your_work_path" } } } } ``` | 参数 | 说明 | |---|---| | `command` | 启动 MCP 服务器的命令。如果在虚拟环境中运行,请使用完整路径(如 `/path/to/venv/bin/sirchmunk`)。 | | `args` | 命令参数。`["mcp", "serve"]` 以 stdio 模式启动 MCP 服务器。 | | `env.SIRCHMUNK_SEARCH_PATHS` | 默认文档搜索目录(逗号分隔)。同时支持英文逗号 `,` 和中文逗号 `,` 作为分隔符。设置后,若工具调用时未提供 `paths` 参数,将使用这些路径作为默认值。 | | `env.SIRCHMUNK_WORK_PATH` | 指定 MCP 服务器使用的 Sirchmunk 工作目录(`.env`、缓存、知识库、历史记录)。推荐在持久化 MCP 客户端中配置。 | > **提示**:MCP Inspector 非常适合在连接 AI 助手之前测试集成是否正常。 > 在 MCP Inspector 中:**Connect** → **Tools** → **List Tools** → `sirchmunk_search` → 输入参数(`query` 和 `paths`,如 `["/path/to/your_docs"]`)→ **Run Tool**。 > 也可通过 `sirchmunk mcp serve --work-path /path/to/your_work_path` 临时覆盖工作目录。 ### 特性 - **多模式搜索**:FAST 模式(默认,贪心搜索 2-5s)、DEEP 模式(全面分析 10-30s)、FILENAME_ONLY 模式(快速文件发现) - **知识聚类管理**:自动提取、存储和复用知识 - **标准 MCP 协议**:支持 stdio 和 Streamable HTTP 传输 📖 **详细文档请参阅 [Sirchmunk MCP README](src/sirchmunk_mcp/README.md)**。 --- ## 🖥️ Web UI Web UI 专为快速、透明的工作流设计:对话、知识分析、系统监控一体化。
Sirchmunk Home

Home — 流式日志聊天、基于文件的 RAG 与会话管理。

Sirchmunk Monitor

Monitor — 系统健康、聊天活动、知识分析与 LLM 用量。

### 方式一:单端口模式(推荐) 一次构建前端,随后通过单端口同时提供 API 和 WebUI — 运行时无需 Node.js。 ```bash # 构建 WebUI 前端(构建时需要 Node.js 18+) sirchmunk web init # 启动含内嵌 WebUI 的服务器 sirchmunk web serve ``` **访问地址:** http://localhost:8584(API + WebUI 同端口) ### 方式二:开发模式 支持前端热重载的开发环境: ```bash # 启动后端 + Next.js 开发服务器 sirchmunk web serve --dev ``` **访问地址:** - 前端(热重载):http://localhost:8585 - 后端 API:http://localhost:8584/docs ### 方式三:传统脚本 ```bash # 通过脚本启动前后端 python scripts/start_web.py # 停止所有服务 python scripts/stop_web.py ``` **配置:** - 访问 `Settings` → `Envrionment Variables` 设置 LLM API Key 和其他环境变量 --- ## 🐳 Docker 部署 预构建的 Docker 镜像托管在阿里云容器镜像服务: | 区域 | 镜像 | |---|---------------------------------------------------------------------------------------------------------| | 美西 | `modelscope-registry.us-west-1.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.7` | | 北京 | `modelscope-registry.cn-beijing.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.7` | ```bash # 拉取镜像(根据地理位置选择最近的 Registry) docker pull modelscope-registry.cn-beijing.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.7 # 启动服务 docker run -d \ --name sirchmunk \ --cpus="4" \ --memory="2g" \ -p 8584:8584 \ -e LLM_API_KEY="your-api-key-here" \ -e LLM_BASE_URL="https://api.openai.com/v1" \ -e LLM_MODEL_NAME="gpt-5.2" \ -e LLM_TIMEOUT=60.0 \ -e UI_THEME=light \ -e UI_LANGUAGE=en \ -e SIRCHMUNK_VERBOSE=false \ -e SIRCHMUNK_ENABLE_CLUSTER_REUSE=false \ -e SIRCHMUNK_SEARCH_PATHS=/mnt/docs \ -v /path/to/your_work_path:/data/sirchmunk \ -v /path/to/your/docs:/mnt/docs:ro \ modelscope-registry.cn-beijing.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.7 # 停止和删除容器 docker stop sirchmunk && docker rm sirchmunk ```
历史版本 | 版本 | 区域 | 镜像 | |---|---|---| | v0.0.6post3 | 美西 | `modelscope-registry.us-west-1.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.6post3` | | v0.0.6post3 | 北京 | `modelscope-registry.cn-beijing.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.6post3` | | v0.0.4 | 美西 | `modelscope-registry.us-west-1.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.4` | | v0.0.4 | 北京 | `modelscope-registry.cn-beijing.cr.aliyuncs.com/modelscope-repo/sirchmunk:ubuntu22.04-py312-0.0.4` |
打开 http://localhost:8584 访问 WebUI,或直接调用 API: ```python import requests response = requests.post( "http://localhost:8584/api/v1/search", json={ "query": "你的搜索问题", "paths": ["/mnt/docs"], }, ) print(response.json()) ``` 📖 **完整 Docker 参数和使用说明,请参阅 [docker/README.md](docker/README.md)**。 --- ## 🏗️ 工作原理 ### Sirchmunk 框架
Sirchmunk 架构
### 核心组件 | 组件 | 说明 | |:------------------------|:-----------------------------------------------------------------------| | **AgenticSearch** | 搜索编排器,具备 LLM 增强检索能力 | | **KnowledgeBase** | 将原始结果转化为结构化知识聚类并附带证据 | | **EvidenceProcessor** | 基于蒙特卡洛重要性采样的证据处理 | | **GrepRetriever** | 高性能 _无索引_ 文件检索,支持并行处理 | | **OpenAIChat** | 统一 LLM 接口,支持流式与用量统计 | | **MonitorTracker** | 实时系统与应用指标采集 | ### 蒙特卡洛证据采样 传统检索系统要么读取完整文档,要么依赖固定大小的分块,导致 Token 浪费或上下文丢失。Sirchmunk 借鉴**蒙特卡洛方法**,采用了截然不同的策略——将证据提取视为一个**采样问题**而非解析问题。
蒙特卡洛证据采样

蒙特卡洛证据采样 — 从大文档中提取相关证据的三阶段启发式探索-利用策略。

该算法分为三个阶段: 1. **第一阶段 — 撒网(探索):** 模糊锚定匹配结合分层随机采样。系统在识别潜在相关种子区域的同时,通过随机探测保持广泛覆盖,确保不会遗漏高价值区域。 2. **第二阶段 — 聚焦(利用):** 以第一阶段高分种子为中心进行高斯重要性采样。采样密度集中在最有前景的区域,提取上下文并对每个片段评分。 3. **第三阶段 — 合成:** 将 Top-K 评分片段传递给 LLM,合成为连贯的兴趣区域(ROI)摘要,并附带置信度标志——使管线能够判断证据是否充分,或是否需要启用 ReAct 智能体进行更深层的自适应检索。 **核心特性:** - **文档无关性:** 同一算法在 2 页备忘录和 500 页技术手册上同样有效,无需针对特定文档的分块启发式规则。 - **Token 高效:** 仅将最相关的区域发送给 LLM,相比全文档方案大幅降低 Token 消耗。 - **探索-利用平衡:** 随机探索防止视野盲区,重要性采样确保在关键区域深入挖掘。 ### 自进化知识聚类(Knowledge Cluster) Sirchmunk 不会在回答完查询后丢弃搜索结果。相反,每次搜索都会产生一个 **KnowledgeCluster(知识聚类)**——一个结构化、可复用的知识单元,随着使用不断变得更加智能。这正是系统具备_自进化_能力的核心机制。 #### 什么是 KnowledgeCluster? KnowledgeCluster 是一个丰富标注的对象,完整记录了单次搜索周期的认知产出: | 字段 | 用途 | |:-----|:-----| | **Evidences(证据)** | 通过蒙特卡洛采样提取的源文件片段,包含文件路径、摘要和原始文本 | | **Content(内容)** | LLM 合成的结构化 Markdown 分析,附带引用 | | **Patterns(模式)** | 从证据中提炼的 3–5 条设计原则或核心机制 | | **Confidence(置信度)** | 共识评分 \[0, 1\],指示聚类的可靠性 | | **Queries(查询历史)** | 贡献或复用该聚类的历史查询(FIFO,最多 5 条) | | **Hotness(热度)** | 反映查询频率和时效性的活跃度评分 | | **Embedding(嵌入向量)** | 由累积查询生成的 384 维向量,用于语义检索 | #### 生命周期:从创建到进化 ``` ┌─────── 新查询 ───────┐ │ ▼ │ ┌───────────────────────────────┐ │ │ 阶段 0:语义复用 │──── 匹配命中 ──→ 返回缓存聚类 │ │ (余弦相似度 ≥ 0.85) │ + 更新热度/查询/嵌入 │ └──────────┬────────────────────┘ │ 未匹配 │ ▼ │ ┌───────────────────────────────┐ │ │ 阶段 1–3:完整搜索 │ │ │ (关键词 → 检索 → │ │ │ 蒙特卡洛采样 → LLM 合成) │ │ └──────────┬────────────────────┘ │ ▼ │ ┌───────────────────────────────┐ │ │ 构建新聚类 │ │ │ 确定性 ID: C{sha256} │ │ └──────────┬────────────────────┘ │ ▼ │ ┌───────────────────────────────┐ │ │ 阶段 5:持久化 │ │ │ 嵌入查询 → DuckDB → │ │ │ Parquet(原子写入同步) │ └─────└───────────────────────────────┘ ``` 1. **复用检查(阶段 0):** 在任何检索开始之前,查询会被嵌入并通过余弦相似度与所有已存储聚类进行比对。若发现高置信度匹配,系统直接返回已有聚类——完全省去 LLM 推理和搜索开销。 2. **创建(阶段 1–3):** 当无复用匹配时,完整管线运行:关键词提取、文件检索、蒙特卡洛证据采样、LLM 合成,最终生成新的 `KnowledgeCluster`。 3. **持久化(阶段 5):** 聚类存储在内存中的 DuckDB 表中,并定期刷写为 Parquet 文件。原子写入和基于文件修改时间的重载机制确保多进程安全。 4. **复用时进化:** 每当聚类被复用时,系统会: - 将新查询追加到聚类的查询历史中(FIFO,最多 5 条) - 提升热度(+0.1,上限 1.0) - 基于更新后的查询集重新计算嵌入——扩展聚类的语义覆盖范围 - 更新版本号和时间戳 #### 核心特性 - **零成本加速:** 重复或语义相似的查询直接从缓存聚类获取答案,无需任何 LLM 推理,后续搜索几乎瞬时完成。 - **查询驱动的嵌入:** 聚类嵌入基于_查询_而非内容生成,确保检索与用户的实际提问方式对齐——而非文档的书写方式。 - **语义拓展:** 随着多样化查询复用同一聚类,其嵌入会漂移以覆盖更广的语义邻域,自然提升相关未来查询的召回率。 - **轻量级持久化:** DuckDB 内存存储 + Parquet 磁盘持久化——无需外部数据库基础设施。后台守护线程同步,可配置刷写间隔,开销极小。 --- ### 数据存储 所有持久化数据存储在配置的 `SIRCHMUNK_WORK_PATH`(默认:`~/.sirchmunk/`): ``` {SIRCHMUNK_WORK_PATH}/ ├── .cache/ ├── history/ # 聊天会话历史(DuckDB) │ └── chat_history.db └── knowledge/ # 知识聚类(Parquet) └── knowledge_clusters.parquet ``` --- ## 🔗 HTTP 客户端访问(Search API) 服务器启动后(`sirchmunk serve` 或 `sirchmunk web serve`),Search API 可通过任何 HTTP 客户端访问。
API 端点 | 方法 | 端点 | 说明 | |------|------|------| | `POST` | `/api/v1/search` | 执行搜索查询(完成后一次性返回 JSON) | | `POST` | `/api/v1/search/stream` | 请求体与 `/search` 相同;通过 **SSE** 流式返回运行日志及最终 `result` / `error` | | `GET` | `/api/v1/search/status` | 检查服务器与 LLM 配置(含 `max_concurrent_searches`) | **交互式文档:** http://localhost:8584/docs(Swagger UI)
cURL 示例 **`paths` 规则(`/search` 与 `/search/stream` 相同):** - **可选**。类型:**单个字符串**或**字符串数组**(`"paths": "/一个目录"` 或 `"paths": ["/a", "/b"]`)。 - **不传**、**`null`**、**`""`**、**`[]`**,或列表里全是空白项时,使用服务器环境变量 **`SIRCHMUNK_SEARCH_PATHS`**(一般在 `~/.sirchmunk/.env` 中配置,服务启动时加载)。若未设置,则回退到服务进程**当前工作目录**。 - **优先级:** 请求里非空的 `paths` → `SIRCHMUNK_SEARCH_PATHS` → cwd。 ```bash # FAST 模式(默认,贪心搜索,2 次 LLM 调用) curl -X POST http://localhost:8584/api/v1/search \ -H "Content-Type: application/json" \ -d '{ "query": "认证是如何工作的?", "paths": ["/path/to/project"] }' # 单个路径用字符串(等价于单元素数组) curl -X POST http://localhost:8584/api/v1/search \ -H "Content-Type: application/json" \ -d '{ "query": "认证是如何工作的?", "paths": "/path/to/project" }' # 省略 paths — 使用服务器上 ~/.sirchmunk/.env 中的 SIRCHMUNK_SEARCH_PATHS curl -X POST http://localhost:8584/api/v1/search \ -H "Content-Type: application/json" \ -d '{"query": "认证是如何工作的?"}' # DEEP 模式(蒙特卡洛证据采样全面分析) curl -X POST http://localhost:8584/api/v1/search \ -H "Content-Type: application/json" \ -d '{ "query": "数据库连接池", "paths": ["/path/to/project/src"], "mode": "DEEP" }' # 文件名搜索(快速,无需 LLM) curl -X POST http://localhost:8584/api/v1/search \ -H "Content-Type: application/json" \ -d '{ "query": "config", "paths": ["/path/to/project"], "mode": "FILENAME_ONLY" }' # 完整参数(详见下表「请求参数说明」) curl -X POST http://localhost:8584/api/v1/search \ -H "Content-Type: application/json" \ -d '{ "query": "数据库连接池", "paths": ["/path/to/project/src"], "mode": "DEEP", "max_depth": 10, "top_k_files": 20, "max_loops": 10, "include_patterns": ["*.py", "*.java"], "exclude_patterns": ["*test*", "*__pycache__*"], "return_context": true }' # 检查服务器状态 curl http://localhost:8584/api/v1/search/status ```
Python 客户端示例 **使用 `requests`:** ```python import requests response = requests.post( "http://localhost:8584/api/v1/search", json={ "query": "认证是如何工作的?", "paths": ["/path/to/project"], }, timeout=60 ) data = response.json() if data["success"]: payload = data.get("data") or {} print(payload.get("summary", payload)) ``` **使用 `httpx`(异步):** ```python import httpx import asyncio async def search(): async with httpx.AsyncClient(timeout=300) as client: resp = await client.post( "http://localhost:8584/api/v1/search", json={ "query": "查找所有 API 端点", # 可选:省略 paths 时使用服务端 SIRCHMUNK_SEARCH_PATHS "paths": ["/path/to/project"], } ) data = resp.json() if data.get("success"): p = data.get("data") or {} print(p.get("summary", p)) asyncio.run(search()) ```
JavaScript 客户端示例 ```javascript const response = await fetch("http://localhost:8584/api/v1/search", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: "认证是如何工作的?", paths: ["/path/to/project"], }) }); const data = await response.json(); if (data.success) { const p = data.data || {}; console.log(p.summary ?? p); } ```
SSE 流式搜索(/api/v1/search/stream 需要 **实时查看搜索过程日志** 时使用本接口(检索流程与 `POST /api/v1/search` 一致)。响应类型为 **`text/event-stream`**(Server-Sent Events)。请求 JSON 与 `/api/v1/search` **完全相同**(**`paths`** 可选;可为字符串或数组,见上文 cURL 说明)。 **事件类型** | SSE `event` | `data`(JSON) | 含义 | |-------------|----------------|------| | `log` | `{"level":"info",...,"message":"..."}` | 搜索流水线输出的一条日志 | | `result` | `{"success":true,"data":{...}}` | 最终结果(`data` 与 `/search` 一致:可为 `summary`、`files` 或 `context`) | | `error` | `{"error":"..."}` | 致命错误,流结束 | 以 `:` 开头的行是心跳/注释,可忽略。 **并发限制** 服务端通过环境变量 **`SIRCHMUNK_MAX_CONCURRENT_SEARCHES`**(默认 `3`)限制同时进行的搜索任务数,超出时新请求会排队等待。可在 `GET /api/v1/search/status` 的响应中查看 **`max_concurrent_searches`**。 **cURL(使用 `-N` / `--no-buffer` 才能实时看到分块输出)** ```bash curl -N -X POST "http://localhost:8584/api/v1/search/stream" \ -H "Content-Type: application/json" \ -H "Accept: text/event-stream" \ -d '{ "query": "认证是如何工作的?", "paths": ["/path/to/project"], "mode": "FAST" }' ``` **Python — `requests`(按行流式读取)** ```python import json import requests url = "http://localhost:8584/api/v1/search/stream" payload = { "query": "认证是如何工作的?", "paths": ["/path/to/project"], "mode": "FAST", } event_type = "" with requests.post( url, json=payload, stream=True, timeout=(10, 600), headers={"Accept": "text/event-stream"}, ) as resp: resp.raise_for_status() for raw in resp.iter_lines(decode_unicode=True): if raw is None or raw == "": continue if raw.startswith(":"): continue if raw.startswith("event: "): event_type = raw[7:].strip() continue if raw.startswith("data: "): obj = json.loads(raw[6:]) if event_type == "log": print(f"[{obj.get('level', 'info')}] {obj.get('message', '')}") elif event_type == "result": print("完成:", json.dumps(obj, indent=2, ensure_ascii=False)) elif event_type == "error": print("错误:", obj.get("error")) event_type = "" ``` **Python — `httpx`** ```python import json import httpx url = "http://localhost:8584/api/v1/search/stream" payload = {"query": "查找 API 路由", "paths": ["/path/to/project"], "mode": "DEEP"} event_type = "" with httpx.Client(timeout=httpx.Timeout(600.0, connect=10.0)) as client: with client.stream( "POST", url, json=payload, headers={"Accept": "text/event-stream"}, ) as resp: resp.raise_for_status() for line in resp.iter_lines(): if not line or line.startswith(":"): continue if line.startswith("event: "): event_type = line[7:].strip() continue if line.startswith("data: "): obj = json.loads(line[6:]) if event_type == "log": print(obj.get("message", "")) elif event_type == "result": data = obj.get("data", {}) print(data.get("summary") or data) event_type = "" ``` **JavaScript — `fetch` + ReadableStream**(`EventSource` 仅支持 GET;POST 的 SSE 需用 `fetch`) ```javascript async function searchStream(baseUrl, body) { const res = await fetch(`${baseUrl}/api/v1/search/stream`, { method: "POST", headers: { "Content-Type": "application/json", Accept: "text/event-stream", }, body: JSON.stringify(body), }); if (!res.ok) throw new Error(await res.text()); const reader = res.body.getReader(); const dec = new TextDecoder(); let buf = ""; let currentEvent = ""; while (true) { const { done, value } = await reader.read(); if (done) break; buf += dec.decode(value, { stream: true }); const parts = buf.split("\n\n"); buf = parts.pop() || ""; for (const block of parts) { let dataLine = null; for (const line of block.split("\n")) { if (line.startsWith("event:")) currentEvent = line.slice(6).trim(); else if (line.startsWith("data:")) dataLine = line.slice(5).trim(); } if (!dataLine) continue; const obj = JSON.parse(dataLine); if (currentEvent === "log") console.log(`[${obj.level}]`, obj.message); if (currentEvent === "result") console.log("result", obj); if (currentEvent === "error") console.error(obj.error); } } } await searchStream("http://localhost:8584", { query: "认证是如何工作的?", paths: ["/path/to/project"], mode: "FAST", }); ``` **命令行** `sirchmunk search --api` 在可用时会优先调用本流式端点,实时打印日志,最后输出摘要。
请求参数说明 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `query` | `string` | *必填* | 搜索查询或问题 | | `paths` | `string` \| `string[]` | *可选* | 单路径或多路径。省略 / `null` / `""` / `[]` / 仅空白 → 使用服务端 `SIRCHMUNK_SEARCH_PATHS`(如 `~/.sirchmunk/.env`),再回退 cwd。请求中的路径优先于环境变量。 | | `mode` | `string` | `"FAST"` | `FAST`、`DEEP` 或 `FILENAME_ONLY` | | `enable_dir_scan` | `bool` | `true` | 是否启用目录扫描(FAST/DEEP)以发现文件 | | `max_depth` | `int` | `null` | 最大目录深度 | | `top_k_files` | `int` | `null` | 返回的文件数量 | | `max_loops` | `int` | `null` | ReAct 最大迭代次数(DEEP 模式) | | `max_token_budget` | `int` | `null` | LLM token 预算(DEEP 模式,默认 128K) | | `include_patterns` | `string[]` | `null` | 文件 glob 匹配模式(包含) | | `exclude_patterns` | `string[]` | `null` | 文件 glob 匹配模式(排除) | | `return_context` | `bool` | `false` | 返回完整 SearchContext(含 KnowledgeCluster 和遥测数据) | > **注意:** `FILENAME_ONLY` 模式无需 LLM API Key。`FAST` 和 `DEEP` 模式需要配置 LLM。
--- ## ❓ FAQ
这与传统 RAG 系统有什么不同? Sirchmunk 采用 **无索引** 方法: 1. **无预索引**:无需向量数据库,直接检索文件 2. **自进化**:知识聚类随检索模式演化 3. **多层检索**:自适应关键词粒度提升召回 4. **证据驱动**:蒙特卡洛重要性采样实现精准内容定位和抽取
支持哪些 LLM 提供商? 任何 OpenAI 兼容 API 端点,包括但不限于: - OpenAI(GPT-5.2, ...) - [MiniMax](https://platform.minimax.io)(MiniMax-M2.7、MiniMax-M2.7-highspeed、MiniMax-M2.5) - DeepSeek、Moonshot、Mistral、Groq、Together AI、Cohere - Google Gemini、智谱(GLM)、百川、零一万物、硅基流动、火山引擎 - Azure OpenAI - 通过 Ollama、llama.cpp、vLLM、SGLang 等托管的本地模型 - 通过 API 代理接入的 Claude 使用 MiniMax 的配置示例: ```bash LLM_BASE_URL=https://api.minimax.io/v1 # 海外版 # LLM_BASE_URL=https://api.minimaxi.com/v1 # 国内版 LLM_API_KEY=your-minimax-api-key LLM_MODEL_NAME=MiniMax-M2.7 ``` 详见 [MiniMax OpenAI 兼容 API 文档](https://platform.minimax.io/docs/api-reference/text-openai-api)。
如何添加需要检索的文档? 只需在搜索请求中指定路径: ```python result = await search.search( query="Your question", paths=["/path/to/folder", "/path/to/file.pdf"] ) ```
知识聚类存储在哪里? 知识聚类以 Parquet 格式持久化于: ``` {SIRCHMUNK_WORK_PATH}/.cache/knowledge/knowledge_clusters.parquet ``` 你可以使用 DuckDB 或 `KnowledgeManager` API 查询。
如何监控 LLM Token 使用量? 1. **Web 面板**:访问 Monitor 页面查看实时统计 2. **API**:`GET /api/v1/monitor/llm` 返回用量指标 3. **代码**:搜索完成后访问 `search.llm_usages`
--- ## 📋 Roadmap - [x] 原始文件文本检索 - [x] 知识结构化与持久化 - [x] 基于 RAG 的实时对话 - [x] Web UI 支持 - [x] 支持多轮对话 - [ ] Web 搜索集成 - [ ] 多模态支持(图片、视频) - [ ] 分布式跨节点检索 - [ ] 知识可视化与深度分析 - [ ] 更多文件类型支持 --- ## 🤝 贡献 欢迎 [贡献](https://github.com/modelscope/sirchmunk/pulls)! --- ## 📄 许可 本项目采用 [Apache License 2.0](LICENSE)。 ---
**[ModelScope](https://github.com/modelscope)** · [⭐ Star us](https://github.com/modelscope/sirchmunk/stargazers) · [🐛 反馈问题](https://github.com/modelscope/sirchmunk/issues) · [💬 Discussions](https://github.com/modelscope/sirchmunk/discussions) *✨ Sirchmunk:原始数据到自进化智能,实时。*

❤️ 感谢访问 ✨ Sirchmunk !

Views