大家好,我是何三,独立开发者

最近在研究 AI 检索技术时,发现了一个很有意思的项目——Sirchmunk。这个项目让我重新思考了"检索"这个看似简单的问题。今天就来聊聊它为什么值得关注。

为什么需要 Sirchmunk?

在传统的 RAG(检索增强生成)架构中,我们通常需要经历这样的流程:

  1. 把文档喂给 Embedding 模型,生成向量
  2. 把向量存入向量数据库(如 Pinecone、Milvus 等)
  3. 查询时,把问题也转向量
  4. 在向量数据库中做相似度搜索
  5. 找到最相关的文档片段

这个流程看起来很合理,但实际用起来问题不少:

成本高:向量数据库的部署和维护成本不低,尤其是对个人开发者来说。

灵活性差:数据更新后需要重新索引,实时性很差。

信息损失:把丰富的文档压缩成固定维度的向量,必然会丢失信息。

依赖复杂:需要配置 Embedding 模型、向量数据库、文档解析器等一系列组件。

Sirchmunk 的出现,就是为了解决这些问题。

传统 RAG 流程

Sirchmunk 的核心思想

Sirchmunk 的核心理念很简单:直接在原始数据上做检索,不需要向量数据库

它采用了一种"无索引检索"(Indexless Retrieval)的方式,结合了以下技术:

  • Agentic Search:智能代理式搜索,根据上下文动态调整搜索策略
  • Knowledge Clustering:知识聚类,自动将相关文档分组
  • Monte Carlo Evidence Sampling:蒙特卡洛证据采样,用概率方法找到最相关的证据

简单来说,Sirchmunk 不是预先建立索引,而是在查询时实时分析文档,找到最相关的内容。这就像是:传统方法是提前把所有书的内容做成摘要卡片,而 Sirchmunk 是在你提问时,现场翻阅书籍找到答案。

Sirchmunk 架构

Sirchmunk vs 传统 RAG

让我们对比一下两者的差异:

维度 传统 RAG Sirchmunk
搭建成本 需要向量数据库、图数据库、复杂文档解析器 零基础设施,直接检索
数据新鲜度 批量重新索引,数据会过时 实时动态,数据变化立即生效
可扩展性 成本线性增长 极低的 RAM/CPU 消耗,原生弹性支持
准确性 近似向量匹配 确定性和上下文感知
工作流程 复杂的 ETL 管道 放入文件即可搜索

传统 RAG vs Sirchmunk 对比

代码实战

让我们看看如何使用 Sirchmunk。

安装

pip install sirchmunk

基本使用

from sirchmunk import Sirchmunk

# 初始化 Sirchmunk
sm = Sirchmunk()

# 添加文档
sm.add_documents([
    "docs/技术文档.pdf",
    "docs/产品说明.md",
    "docs/用户手册.txt"
])

# 执行搜索
results = sm.search(
    query="如何配置 API 密钥?",
    top_k=3
)

# 打印结果
for i, result in enumerate(results, 1):
    print(f"\n结果 {i}:")
    print(f"来源: {result['source']}")
    print(f"内容: {result['content'][:200]}...")
    print(f"相关性: {result['score']:.2f}")

与 LLM 集成

Sirchmunk 可以轻松集成到 LLM 应用中:

from sirchmunk import Sirchmunk
from openai import OpenAI

# 初始化
sm = Sirchmunk()
client = OpenAI()

# 添加文档
sm.add_documents(["./docs/"])

# 聊天循环
while True:
    user_query = input("\n你的问题: ")

    # 使用 Sirchmunk 检索相关文档
    context = sm.search(
        query=user_query,
        top_k=3,
        return_context=True
    )

    # 构建提示词
    prompt = f"""
    基于以下上下文回答用户问题:

    上下文:
    {context}

    用户问题:{user_query}
    """

    # 调用 LLM
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "你是一个有帮助的助手。"},
            {"role": "user", "content": prompt}
        ]
    )

    print(f"\n回答: {response.choices[0].message.content}")

使用 Web UI

Sirchmunk 还提供了 Web 界面:

# 启动 Web UI
sirchmunk web

# 访问 http://localhost:8000

在 Web UI 中,你可以: - 直接拖拽文件上传 - 实时搜索和预览结果 - 管理文档集合

Sirchmunk Web UI

Docker 部署

如果你喜欢容器化部署,Sirchmunk 也支持 Docker:

# 拉取镜像
docker pull modelscope/sirchmunk:latest

# 运行容器
docker run -d \
  -p 8000:8000 \
  -v /path/to/your/docs:/app/docs \
  modelscope/sirchmunk:latest

高级特性

知识持久化

Sirchmunk 支持将知识集群持久化存储:

from sirchmunk import Sirchmunk

sm = Sirchmunk()

# 添加文档
sm.add_documents(["./docs/"])

# 保存知识集群
sm.save_knowledge_clusters("knowledge_clusters.db")

# 后续加载
sm.load_knowledge_clusters("knowledge_clusters.db")

MCP 集成

Sirchmunk 支持 Model Context Protocol (MCP),可以与 Claude Desktop、Cursor IDE 等工具无缝集成:

# 启动 MCP 服务器
sirchmunk mcp

自定义搜索配置

from sirchmunk import Sirchmunk, SearchConfig

# 创建自定义配置
config = SearchConfig(
    search_mode="fast",  # "fast" 或 "accurate"
    top_k=5,
    include_patterns=["*.md", "*.txt"],
    exclude_patterns=["temp/*", "cache/*"]
)

sm = Sirchmunk(config=config)

# 执行搜索
results = sm.search("你的查询")

适用场景

Sirchmunk 特别适合以下场景:

  1. 个人知识库:快速搭建自己的文档检索系统
  2. 代码文档搜索:在代码仓库中快速找到相关文档
  3. 实时数据检索:需要实时反映数据变化的场景
  4. 资源受限环境:不想部署复杂向量数据库的情况
  5. 快速原型开发:快速验证想法,不需要复杂配置

总结

Sirchmunk 给我们带来了一个全新的思路:有时候,最简单的方案就是最好的方案

它让我们意识到: - 不一定需要向量数据库才能做语义检索 - 实时性比预建索引更重要 - 直接处理原始数据可以避免信息损失

当然,Sirchmunk 并不是要完全取代传统 RAG,而是提供了一个新的选择。对于某些场景,传统 RAG 可能仍然更合适。但对于个人开发者、快速原型、实时性要求高的场景,Sirchmunk 无疑是一个值得尝试的工具。

如果你对 Sirchmunk 感兴趣,可以访问它的 GitHub 仓库:https://github.com/modelscope/sirchmunk


推荐阅读: - Sirchmunk 官方文档 https://github.com/modelscope/sirchmunk - Monte Carlo Evidence Sampling 原理解析 https://github.com/modelscope/sirchmunk - Self-Evolving Knowledge Clusters 详解https://github.com/modelscope/sirchmunk

相关项目: - ModelScope https://modelscope.cn/ - Claude Desktop https://claude.ai/download - Cursor IDE https://cursor.sh/