CogniDocs是一款基于模型上下文协议(MCP)的服务器,它为AI助手提供了搜索和查询文档的能力。现在支持灵活的后端配置以满足不同的隐私和基础设施需求。
此版本引入了一个完整的后端抽象层,允许您选择您偏好的技术堆栈:
我们现在使用插件式的提供商注册表,并自动注册。配置不再在模式中引用特定的提供商;而是指定:
# 存储
STORAGE_NAME=chroma
STORAGE_OPTIONS={"url":"http://localhost:8000"}
# 嵌入
EMBEDDINGS_NAME=xenova
EMBEDDINGS_OPTIONS={"model":"Xenova/all-MiniLM-L6-v2","maxBatchSize":50}
# 替代方案(Transformers.js)
# EMBEDDINGS_NAME=transformersjs
# EMBEDDINGS_OPTIONS={"model":"Xenova/all-MiniLM-L6-v2","device":"wasm","pooling":"mean","normalize":true,"maxBatchSize":50}
注意事项:
app/*/providers/index.ts副作用导入进行自我注册(例如,app/embeddings/providers/index.ts,app/storage/providers/index.ts,app/chunking/providers/index.ts)。register*Provider()的新文件一样简单。STORAGE_PROVIDER,EMBEDDING_PROVIDER,CHROMA_URL,XENOVA_MODEL在解析时仍然支持,但已弃用。chunkSize=3000,chunkOverlap=150。CHUNKING_NAME=langchain和CHUNKING_OPTIONS={"strategy":"recursive","chunkSize":3000,"chunkOverlap":150}进行配置。intelligent:内容类型感知分割(根据代码、markdown、html等调整分隔符/大小)。semantic:初始分割+当嵌入余弦相似度超过阈值时相邻合并。Chunk.text始终是一个字符串。代理引导的分块和注释可以通过将分块对齐到主题边界并丰富它们的元数据(主题标签、章节标题、代码语言、实体、摘要和质量评分)来显著提高大型多主题文档的搜索质量。这设计为一个可选的、无提供商依赖的摄入阶段。
了解更多:参见docs/agentic-processing.md。
---
config:
layout: dagre
theme: redux
look: neo
---
flowchart LR
subgraph subGraph0["存储提供商"]
chroma["ChromaDB"]
storage["存储层"]
end
subgraph subGraph1["嵌入提供商"]
xenova["Xenova"]
embeddings["嵌入层"]
end
subgraph subGraph2["分块提供商"]
langchain["LangChain (默认)"]
chunking["分块层"]
chonkie["Chonkie"]
builtin["内置"]
end
client["MCP客户端 (Claude)"] --- upload["HTTP上传服务器"]
web["Web UI (可选)"] --- upload
upload --> abstractions["提供商抽象\n(存储 / 嵌入 / 分块)"]
abstractions --> storage & embeddings & chunking
storage --> chroma
embeddings --> xenova
chunking --> langchain & chonkie & builtin
# 克隆并安装
git clone <仓库>
cd cogni-docs
bun install
# 配置本地处理
cp .env.example .env
# 编辑.env以包含无提供商依赖的配置:
STORAGE_NAME=chroma
STORAGE_OPTIONS={"url":"http://localhost:8000"}
EMBEDDINGS_NAME=xenova
EMBEDDINGS_OPTIONS={"model":"Xenova/all-MiniLM-L6-v2","maxBatchSize":50}
# 分块(默认:LangChain递归)
CHUNKING_NAME=langchain
CHUNKING_OPTIONS={"strategy":"recursive","chunkSize":3000,"chunkOverlap":150}
# 启动服务器
# 启动服务器(上传 + MCP在同一端口)
bun run upload-server:prod # 默认端口:3001(设置HTTP_PORT)。使用:dev以启用监视模式
# 启动ChromaDB
docker run -p 8000:8000 chromadb/chroma
# 配置应用
STORAGE_NAME=chroma
STORAGE_OPTIONS={"url":"http://localhost:8000"}
EMBEDDINGS_NAME=xenova
EMBEDDINGS_OPTIONS={"model":"Xenova/all-MiniLM-L6-v2"}
# 启动应用
bun run upload-server:prod
| 变量 | 类型 | 描述 |
|---|---|---|
HTTP_PORT | 数字 | 上传服务器端口(示例默认:3001,配置默认:8787) |
STORAGE_NAME | 字符串 | 存储提供商名称(例如,chroma) |
STORAGE_OPTIONS | JSON | 提供商特定选项作为JSON(例如,{ "url": "http://localhost:8000" }或{ "projectId": "..." }) |
EMBEDDINGS_NAME | 字符串 | 嵌入提供商名称(例如,xenova) |
EMBEDDINGS_OPTIONS | JSON | 提供商特定选项作为JSON(例如,{ "model": "Xenova/all-MiniLM-L6-v2" }) |
CHUNKING_NAME | 字符串 | 分块提供商名称:langchain(默认),chonkie,或builtin |
CHUNKING_OPTIONS | JSON | 提供商特定分块选项作为JSON(例如,{ "strategy": "recursive", "chunkSize": 3000, "chunkOverlap": 150 }) |
CHUNK_SIZE | 数字 | 向后兼容:目标分块大小(默认:3000) |
CHUNK_OVERLAP | 数字 | 向后兼容:分块之间的重叠(默认:150) |
MAX_CHUNK_SIZE | 数字 | 向后兼容:分块大小的硬上限(默认:5000) |
查看.env.example以获取完整的配置选项。
recursive(默认):
CHUNKING_NAME=langchain
CHUNKING_OPTIONS={"strategy":"recursive","chunkSize":3000,"chunkOverlap":150}
intelligent(内容类型感知:代码/markdown/html会调整分隔符及大小):
CHUNKING_NAME=langchain
CHUNKING_OPTIONS={"strategy":"intelligent","chunkSize":3000,"chunkOverlap":150,"contentTypeAware":true}
semantic(通过嵌入相似性相邻合并):
CHUNKING_NAME=langchain
CHUNKING_OPTIONS={
"strategy":"semantic",
"chunkSize":3000,
"chunkOverlap":150,
"contentTypeAware":true,
"semanticSimilarityThreshold":0.9,
"semanticMaxMergeChars":6000,
"semanticBatchSize":64
}
注意事项:
semanticSimilarityThreshold(通常0.85–0.92)。已弃用(仍为向后兼容而解析):STORAGE_PROVIDER,EMBEDDING_PROVIDER,CHROMA_URL,XENOVA_MODEL,MAX_BATCH_SIZE,UPLOAD_SERVER_PORT,UPLOAD_SERVER_HOST。
| 特征 | ChromaDB + Xenova |
|---|---|
| 隐私 | ✅ 自托管 |
| 性能 | ✅ 良好 |
| 可扩展性 | ✅ 高 |
| 设置复杂度 | ⚠️ 中等 |
| 成本 | 💰 基础设施 |
| 离线支持 | ⚠️ 部分 |
→ ChromaDB + Xenova
→ ChromaDB + Xenova
→ ChromaDB + Xenova
app/
├── index.ts # 启动HTTP上传 + MCP服务器
├── config/
│ └── app-config.ts # Zod验证,无提供商依赖的配置
├── chunking/ # 分块接口、工厂和提供商
│ ├── chunker-interface.ts
│ ├── chunking-factory.ts
│ └── providers/ # 提供商:langchain(默认)、chonkie、内置
├── storage/
│ ├── storage-interface.ts # 存储接口
│ ├── chroma-storage.ts # ChromaDB实现
│ └── storage-factory.ts # 提供商注册表 + 工厂
├── embeddings/
│ ├── embedding-interface.ts # 嵌入接口
│ ├── embedding-factory.ts # 提供商注册表 + 工厂
│ └── providers/ # 嵌入提供商(例如,Xenova)
├── server/
│ └── mcp-server.ts # MCP工具 + SSE传输(/sse,/messages)
├── ingest/
│ └── chunker.ts # 摄入入口点;使用分块服务
└── parsers/
├── pdf.ts # PDF解析器
├── html.ts # HTML解析器
└── text.ts # 纯文本解析器
GET /health - 服务健康检查,包括提供商状态GET /sets - 列出文档集POST /sets - 创建文档集GET /sets/:setId - 获取特定集合GET /sets/:setId/documents - 列出集合中的文档POST /sets/:setId/upload - 上传文档DELETE /sets/:setId/documents/:docId - 删除文档GET /sse(事件流),POST /messages(JSON消息)list_documentation_sets - 列出可用的集合get_documentation_set - 获取特定集合的详细信息search_documentation - 在集合内进行向量搜索agentic_search - 提取式、基于上下文的答案# 安装依赖
bun install
# 开启文件监视的开发
bun run upload-server:dev # 启动带有热重载的上传+MCP服务器
bun run web:dev # 启动Web UI开发服务器
# 类型检查
bun run typecheck
# 为生产构建
bun run web:build
检查服务状态:
curl http://localhost:3001/health
响应包括:
灵活的后端架构使得添加新的提供商变得容易:
StorageService接口EmbeddingService接口MIT许可证 - 查看LICENSE文件以获取详情。
一款提供AI助手搜索和查询文档能力的MCP服务器,使用本地优先、无提供商依赖的后端。
该项目实现了双服务器架构:
bun install
cp .env.example .env
# 编辑.env以包含您的无提供商依赖设置
bun run upload-server
bun run mcp-server
创建一个文档集并上传文件:
# 创建一个文档集
curl -X POST http://localhost:3001/sets \
-H "Content-Type: application/json" \
-d '{"name": "我的API文档", "description": "REST API文档"}'
# 上传文档(PDF、HTML、TXT)
curl -X POST http://localhost:3001/sets/{SET_ID}/upload \
-F "files=@文档.pdf" \
-F "files=@API指南.html"
MCP服务器暴露四个工具:
list_documentation_sets - 列出所有可用的文档集get_documentation_set - 获取特定集合的详细信息search_documentation - 在集合内进行基本向量搜索agentic_search - 从您的文档中提取基于上下文的答案// 在Claude或其他兼容MCP的AI助手中
await mcp.callTool("agentic_search", {
setId: "您的集合ID",
query: "如何认证API请求?",
limit: 10,
});
# 核心
HTTP_PORT=3001
# 无提供商依赖
STORAGE_NAME=chroma
STORAGE_OPTIONS={"url":"http://localhost:8000"}
EMBEDDINGS_NAME=xenova
EMBEDDINGS_OPTIONS={"model":"Xenova/all-MiniLM-L6-v2","maxBatchSize":50}
# 分块
CHUNKING_NAME=langchain
CHUNKING_OPTIONS={"strategy":"recursive","chunkSize":3000,"chunkOverlap":150}
CHUNK_SIZE=3000
CHUNK_OVERLAP=150
MAX_CHUNK_SIZE=5000
bun run upload-server:dev # 热重载上传+MCP服务器
bun run upload-server:prod # 生产上传+MCP服务器
bun run web:dev # Web UI开发
bun run typecheck # 类型检查
app/parsers/中创建解析器app/ingest/chunker.ts中的分块策略适合新的类型bun run upload-server:prod(非监视模式)。GET /sse(而非POST)和POST /messages。STORAGE_OPTIONS={"url":"http://localhost:8000"}。GET /health以获取存储状态;如果Chroma宕机,请重启。