使用说明
黑曜石保险库的模型上下文协议(MCP)服务器
这是一个附带的研究和学习项目,主要关注人工智能代理和信息检索,以及人工智能工具的评估。
服务器允许访问 黑曜石.md 带有搜索和读取工具的Vault。Obsidian是一个纯文本Markdown编辑器,将所有笔记文件保存在一个文件夹中。该格式使其成为AI代理的完美伴侣和知识存储。
自2024年以来,我确实使用了AI编码代理(Claude Code、Cursor)与Obsidian.md Vault的组合,类似于 Andrej Karpathy法学硕士维基,但他的提议有点复杂。 有超过1500个笔记,代理经常错过重要信息,所以我决定创建一个搜索工具,了解我使用的知识组织
提供功能
网络深度研究
web_research 该工具是一个AI代理,其功能与 Perplaxity.ai 根据互联网上的公共信息回答问题。它经过优化,可以回答技术或学术问题。
核心回路:
- 生成网络搜索查询
- 从搜索结果URL中获取内容。没有试图绕过机器人程序保护,但支持广泛的公共来源:Arxiv.org文章、Github存储库、Reddit论坛、维基百科、pdf文档-从中提取信息的特殊情况,如切换到Reddit API而不是阅读网页,或使用Github原始格式而不是html页面。
- 使用LLM从获取结果中提取相关信息,减少主代理上下文
- 反思步骤,分析结果并决定完成研究或重复循环以填补知识空白
- 最终答案生成器,创建简短答案、详细解释如何得出结论以及支持答案的相关链接
评价结果
为了节省成本,使用Gamini Flash lite或GPT 5.4 nano等小型模型进行了评估,但问题很少。 GAIA数据集 -60%回答20个问题 DRACO数据集 -约40%,主要是因为答案不如评估标准中预期的详细
评估代码不在此存储库中,它是团队范围内人工智能软件开发工具内部项目的一部分,旨在优化我的创业流程 乔布斯弗洛.从那个项目移植的工具。
黑曜石拱顶RAG
obsidian_search 是混合向量+BM25搜索引擎,主要是经典的RAG。它针对我使用的Vault组织进行了优化
注释格式假设
我确实用相同的模式保存所有笔记,索引工具使用预期的格式将笔记分割成块并生成额外的元数据。由特殊的克劳德代码技能强制执行的格式,用于处理所有新的诺顿。
- Frontmatter属性:
title-短句是关于什么的description-3-4个句子描述笔记内容。用作类似的摘要 猛禽 几个块的组合摘要tags-我有一组预定义的标签,将笔记按3个维度进行划分:知识领域(人工智能、编程、财务等)、笔记类型(文章、教程、行动项等)和狭义主题(编程语言、工具类型、活动)。该工具允许检索标签分类并对其进行过滤
- 笔记内容-所有笔记均遵循科学论文格式,每一部分由第一级或第二级标题分隔。语义组块将笔记按部分分割。笔记之间的链接使用[[Wikilinks]格式,也提取并存储在数据库中。它允许图形化导航
- 笔记大小-保持不超过200行
索引
该工具按模式抓取vault文件夹,并提取所有标记文件。解析每个文件以提取frontmatter属性,按标头(不超过500个令牌)拆分,并将其与元信息一起保存到数据库中。块内容和描述也存储为向量嵌入。创建的块没有重叠,积极的搜索结果与邻居相结合。
额外 摘要 LLM从整个笔记内容中创建块,以增加进入搜索结果的机会。
由vault内容更改触发或从命令行显式触发的重新索引。
搜索
通过LLM创建的查询 低血压 查询本身用于全文搜索,并为矢量搜索生成答案。这类似于 qmd降价搜索
通过Reranker API调用(Cohere或Voiage.ai)过滤的数据库搜索结果,或来自LanceDB的倒数排名融合。RRFReranker根据排名位置而不是原始分数来融合结果,因此它避免了必须使向量和全文分数具有可比性。
第二个过滤使用LLM来选择重新关联到查询的块。结果块与其相邻块组合在一起(因此,如果选择了笔记中的第5个块,则搜索返回4-6个块的组合)
附加过滤器
要缩小搜索范围,可选参数:
tags结果中必须存在的标签列表path文件路径模式 我有两个特别的笔记, 标签.md 分类法,以及 文件夹.md 描述保险库组织的MCP服务器提供了阅读它们的工具和说明
评估
我确实使用了一个简单的评估工具,该工具对My Vault快照执行查询,并计算预期单词(精度)和不需要单词(召回)的数量。共25个问题,F1得分~0.9
用法
服务器仅使用单个LLM API提供程序。我确实有 LiteLLM AI网关(LLM代理) ,但它可以与 Openrouter
克隆存储库,创建 .env 文件来自 env.example ,然后运行
# Create vault index
uv run --project <local copy> mcps --vault <Vault Folder> --reindex
# run as HTTP MCP Server
uv run --project <local copy> mcps --vault <Vault Folder> --port 1234
使用http协议,所有AI工具都可以使用单个服务器。我确实将其用作所有项目的共享知识库和内存。
码头工人
将服务器构建为具有流式HTTP传输的独立容器并运行:
# Build image
docker build -t mcps:local .
# Run container (vault and secrets are mounted/injected explicitly)
docker run --rm --env-file .env -e VAULT=/vault -v <host-vault-path>:/vault -p 8000:8000 mcps:local
服务器可在以下位置访问 http://localhost:8000/mcp.