[!WARNING]
make test 会读取 .env 并真实调用 Embedding 和 Reranker API,不使用 HTTP Mock,也不会因缺少 key 或网络异常而跳过。完整测试可能产生 API 费用。
当前测试覆盖:
Markdown 标题层级与公开问题切分;
本地 Hash Embedding 的确定性;
真实远程 Embedding 调用与向量维度;
真实远程 Reranker 调用与排序;
Milvus BM25 schema;
RRF 融合和本地词法精排。
常用开发命令
make sync # 安装全部依赖
make db-up # 启动 PostgreSQL / MinIO / etcd / Milvus
make db-down # 停止本地数据服务
make migrate # 执行 PostgreSQL 迁移
make api # 启动 FastAPI
make worker # 持续运行 worker
make worker-debug # 等待 VS Code 接入后调试 worker
make mcp # 启动 MCP Server
make mcp-debug # 等待 VS Code 接入后调试 MCP Server
make mcp-inspector # 启动 MCP Inspector UI
make test # 运行测试
make test-debug # 等待 VS Code 接入后调试测试
make lint # Ruff 静态检查
make format # Ruff 代码格式化
使用 VS Code 调试
项目使用 debugpy 和 VS Code Attach 模式调试。make worker-debug、make mcp-debug
和 make test-debug 都会在本机 5678 端口启动调试服务,并通过
--wait-for-client 暂停执行,直到 VS Code 接入。
准备调试环境
在 VS Code 中安装官方 Python 和 Python Debugger 扩展;
从 VS Code 打开项目根目录,而不是只打开某个子目录;
执行 make sync,确保开发依赖中的 debugpy 已安装;
在代码中设置断点;
打开 VS Code 的 Run and Debug 面板,选择
Attach: Geometry service (5678)。
make test-debug FILE=tests/unit/test_openai_embedding.py
make test-debug FILE=tests/unit/test_openai_embedding.py::test_openai_embedding_provider_calls_configured_remote_model
Geometry Knowledge MCP
面向几何分析研究 Agent 的证据优先文献知识库 MCP 服务
将专著、论文和综述中的章节、公开问题与原文证据组织成可追溯知识单元,
通过 MCP 向 Agent 提供专业检索和原文回查能力。
架构 · 快速开始 · FastAPI 试用 · MCP Inspector · MCP 能力 · 项目文档
为什么做这个项目
几何分析文献具有中英文混排、重音专名、LaTeX 公式、复杂章节层级和严格前提条件等特点。普通“切片后聊天”的 RAG 容易丢失章节背景、原文出处和证据等级。
本项目围绕“证据优先”设计:
section_path;核心能力
/rerankAPIsearch_knowledge、get_source_evidence架构
系统分为后台建库和 Agent 使用两条链路:
flowchart TB subgraph Build["① 后台文献建库"] Maintainer["知识库维护人员"] Upload["Markdown 上传与版本管理"] Parse["文档解析与章节识别"] Units["数学知识单元提取"] Maintainer --> Upload --> Parse --> Units end subgraph Knowledge["② 专业证据知识库"] Source[("MinIO原始文献")] Facts[("PostgreSQL
事实与证据")] Index[("Milvus
Dense + BM25")] end subgraph Service["③ MCP 证据服务"] MCP["MCP Server
search_knowledge
get_source_evidence"] Retrieval["混合检索
BM25 + Dense + RRF + Reranker"] Evidence["EvidencePackage
原文 · 来源 · 章节 · 证据状态"] MCP --> Retrieval --> Evidence end subgraph AgentSide["④ Agent 使用"] Researcher["数学研究人员"] Agent["几何分析研究 Agent"] Researcher -->|"提出研究问题"| Agent Agent -->|"基于证据回答"| Researcher end Upload --> Source Units --> Facts Units --> Index Retrieval --> Facts Retrieval --> Index Agent -->|"MCP 工具调用"| MCP Evidence -->|"结构化证据返回"| Agent
FastAPI 用于后台建库、内部集成和交互式调试;MCP 是面向 Agent 的正式使用入口。
快速开始
1. 环境要求
3.12>=22.7.5进入项目根目录后,先创建本地配置:
2. 先配置 Embedding 和 Reranker
在启动 worker、执行测试或导入示例文档前,必须编辑
.env,填入真实的在线 API 配置:配置约定:
POST /embeddings;POST /rerank;model、query、documents、top_n与results[index, relevance_score];EMBEDDING_DIMENSION必须与远程模型实际返回维度一致;dimensions请求参数,设置EMBEDDING_API_DIMENSIONS_ENABLED=false;3. 安装依赖并启动数据服务
确认数据服务状态:
4. 启动 FastAPI
浏览器打开:
FastAPI 的 Swagger 交互文档可以直接创建项目、上传 Markdown、查询任务和测试检索,无需手写请求代码。
在 FastAPI 交互文档中完成一次试用
第一步:创建项目
在 Swagger 中展开:
点击 Try it out,输入:
执行后记录响应中的
id,后续将它作为project_id。第二步:上传示例 Markdown
当前请只使用 Markdown。项目已经提供一份 MinerU 示例文档:
在 Swagger 中展开:
填写:
project_idfiletest_docs/选择.md示例titleSelected Expository Works of Shing-Tung Yaudocument_typeBOOKlanguageenpublication_year执行后记录:
document_id;document_version_id;ingestion_job_id。第三步:运行 worker
上传只会创建入库任务。另开终端启动 worker:
worker 会依次完成:
第四步:查看任务状态
在 Swagger 中调用:
将
job_id替换为上传响应中的ingestion_job_id。成功状态应为:若任务失败,可以查看
error_message,修复配置后调用:然后重新运行 worker。
第五步:测试检索
在 Swagger 中调用:
请求示例:
响应是结构化 EvidencePackage,包含原文、文献来源、章节路径、证据状态,以及 BM25、Dense、RRF 和 Reranker 的分数与排名。
使用 MCP Inspector 可视化查看服务
MCP Inspector 可以可视化查看并测试 MCP 的 Tools、Resources 和 Prompts,无需安装到项目依赖中。
连接 Streamable HTTP
确认
.env包含:终端一启动 MCP 服务:
终端二启动 Inspector:
Inspector 会在终端打印一个包含会话 token 的本地地址,通常基于:
在 Inspector 页面中:
Streamable HTTP;http://127.0.0.1:8080/mcp;search_knowledge或get_source_evidence;还可以在:
geometry://projects/{project_id}/units/{unit_id};evidence_verification;MCP 能力
search_knowledgeget_source_evidencegeometry://projects/{project_id}/units/{unit_id}evidence_verificationsearch_knowledge支持:unit_types:限定知识单元类型;year_from/year_to:限定发表年份;verified_only:只使用文献明确证据或专家确认内容;top_k:控制返回证据数量。示例文档与提取效果
示例目录:
其中包含一份丘成桐综述文章选集的 MinerU Markdown。使用当前解析与切块代码实测:
Problem 1至Problem 10会被识别为独立OPEN_PROBLEM,并继承所属章节:MinerU Markdown 不按普通空行切块。当前规则优先处理:
# ...:文章或大章;## I. ...、## 1 ...:章节;## A. ...:子章节;## Problem 1:公开问题证据单元。当前 Markdown 尚未恢复原 PDF 页码,较长章节也需要后续增加安全的二次切块。
混合检索
flowchart LR Agent["Agent 调用 search_knowledge"] --> BM25["Milvus BM25"] Agent --> Embed["Query Embedding"] Embed --> Dense["Milvus Dense Search"] BM25 --> RRF["RRF 融合"] Dense --> RRF RRF --> PG["PostgreSQL 回取事实"] PG --> Rank["在线 Reranker"] Rank --> Evidence["EvidencePackage"] Evidence --> AgentResult["MCP 返回 Agent"]Milvus
search_text使用 ICU Analyzer:它能够处理中文、英文、欧洲语言和重音数学专名。例如
Kahler可以匹配Kähler,Metriques可以匹配Métriques。Milvus Collection 与版本说明
当前默认 Collection:
knowledge_units_v1:旧 Dense-only schema;knowledge_units_v2:Jieba BM25 schema;knowledge_units_v3:当前 ICU BM25 schema;dense_idx:Dense 向量索引;bm25_idx:Milvus 原生 BM25 索引。Analyzer 和向量维度是 Collection schema 的一部分,不能原地修改。更换 Analyzer、Embedding 维度或字段后应创建新 Collection,并重新索引已有文档。
关键配置
VECTOR_INDEX_ENABLEDMILVUS_COLLECTIONEMBEDDING_BASE_URLEMBEDDING_API_KEYEMBEDDING_MODELEMBEDDING_DIMENSIONRERANKER_ENABLEDRERANKER_BASE_URLRERANKER_API_KEYRERANKER_MODELMCP_TRANSPORTstdio或streamable-httpMCP_PORT/MCP_PATH完整模板见
.env.example。测试与质量检查
当前测试覆盖:
常用开发命令
使用 VS Code 调试
项目使用
debugpy和 VS Code Attach 模式调试。make worker-debug、make mcp-debug和make test-debug都会在本机5678端口启动调试服务,并通过--wait-for-client暂停执行,直到 VS Code 接入。准备调试环境
make sync,确保开发依赖中的debugpy已安装;Attach: Geometry service (5678)。仓库已经提供
.vscode/launch.json,通常不需要手动创建调试配置。调试 worker
先通过 FastAPI 上传文档并产生入库任务,然后在终端执行:
终端开始等待后,在 VS Code 中按
F5接入。worker 随后开始取任务,可以在 Markdown 解析、知识单元切分、Embedding 调用和 Milvus 写入位置命中断点。调试 MCP Server
终端一执行:
在 VS Code 中按
F5接入并等待 MCP Server 启动,然后在终端二执行:连接
http://127.0.0.1:8080/mcp,调用search_knowledge或get_source_evidence即可进入 MCP 工具和检索服务断点。调试测试
调试全部测试:
使用
FILE只调试指定测试文件或测试用例:启动命令后再在 VS Code 中按
F5。VS Code 接入之前 pytest 不会开始执行。结束调试时,先在 VS Code 中停止调试,再在启动 debug target 的终端按
Ctrl+C结束进程。launch.json默认使用justMyCode: true;需要进入第三方库源码时可临时改为false。项目结构
项目文档
当前边界与路线图
当前 MVP 已完成 Markdown 建库、混合检索、结构化证据包和 MCP 接入。下一阶段重点:
Geometry Knowledge MCP 的目标是让研究 Agent 在回答之前先找到可靠证据,并且能够说明证据来自哪里。