Open Index 是一个开源工具,旨在为 AI 智能体构建领域特定、准确、结构化的数据层,并随着事物变化持续保持数据正确。它用于构建一个“大脑”(brain):一个可搜索、持续改进的领域上下文图。该大脑与领域无关,可以建模支持组织(产品 → “有常见问题” → 问题)、销售管道(客户 → 订单)、基础设施(服务 → 运行手册)等任何内容。用户定义概念,Open Index 存储、搜索并绘制地图。
主要能力
Open Index 的大脑由四个原语构成:
- doc_type:要跟踪和维护的概念(如 service、customer、issue)。
- doc_schema:给定 doc_type 存储的字段。
- entity:doc_type 的一个实例,按 schema 存储。每个实体可以通过 related_to(目标)+ relationship_edge_meaning(自由文本边语义)链接到其他实体。
- connector:可选的数据源,从中提取实体(如 MCP 服务器)。
它设计为领域专用智能体的上下文层(法律、营销、客户支持、销售、基础设施等)。MCP 服务器为这些智能体提供结构化上下文,并提供经过验证的方式保持上下文最新:
- agent prompt:通过 MCP 服务器指令发布动态领域导航,支持的主机可在首轮对话前注入。
- 读:navigation_guidelines() 刷新指令;search_brain() 和 get_entity() 检索领域上下文。
- 写:put_entity()(添加/更新实体)、create_doc_type()(定义概念)。
默认 MCP 模式为读写,领域智能体既可使用知识也可维护知识。添加 --read-only 可让智能体仅消费上下文而不修改。支持 Claude Code 作为可选 MCP 客户端;open-index init 会为其生成 .mcp.json、CLAUDE.md 和编辑技能。
使用方式
- 创建大脑:
open-index init <name>生成目录,然后编写 doc_types(模式)和 entities(实例)。示例包括 support-brain、infra-brain 和 personal-brain。 - 定义 doc_type:在 doc_types/ 下创建 YAML 文件,可设置每字段搜索权重(boost)和关系词汇(relationships)。可用
open-index add-doc-type service创建。 - 添加实体:对于 storage: file 类型,在 entities/<doc_type>/ 下编写 JSON 文件,id 格式为 <doc_type>:<slug>,related_to 定义图边。然后运行
open-index index和open-index validate。 - 大规模填充:手动/智能体写入、批量导入(支持 JSON、JSONL、CSV,
open-index import issues.csv --doc-type issue --asserted-by import:jira)、连接器(connectors/*.py 从 MCP 服务器按计划拉取,open-index ingest <name>或open-index run)、智能体写回(Stop 钩子通过 put_entity 记录学习)。 - 探索:
open-index ui打开只读浏览器,含 Explore、Map、Analytics、Jobs 四个标签页。 - MCP 服务器:
open-index mcp运行 MCP 服务器(stdio),默认读写。open-index mcp --read-only或open-index serve --read-only可只读。
存储与后端
存储默认使用 SQLite + FTS5(零外部服务)。后端位于可插拔接口后,有两种实现:SQLite(默认,本地/开发)和 OpenSearch(通过 search.backend: opensearch 选择)。
每个 doc_type 声明其真实来源:
- storage: index(默认):搜索数据库拥有这些实体,不写入文件。适合连接器拉取、高容量或时序数据。
- storage: file:entities/<doc_type>/ 下的 JSON 文件是真实来源,受 git 跟踪和 PR 审查。适合精心策划、人工/智能体编写的实体。
open-index index 每次运行从磁盘协调 file 支持的�:类型,并保留 index 支持的实体(由连接器/智能体写入)不变。brain.db 是 index 支持类型的持久状态,默认被 gitignore。
云智能体使用(生产)
使用 Docker(共享大脑推荐):docker compose --profile sqlite up。两种方式都服务 http://localhost:8080/mcp。brain.yaml 相同,profile 设置 OPEN_INDEX_SEARCH_BACKEND 覆盖文件。添加 --profile ui 可在 :8501 使用浏览器。
serve 通过流式 HTTP 和 bearer-token 认证暴露相同的读写工具。没有令牌则端点未认证——任何能访问端口的人都能写入大脑。使用 --read-only 获得智能体无法修改的可查询端点。
选择后端:SQLite 是单写入者。当第二个智能体需要写入时,迁移到 OpenSearch。它还提供原生的每字段提升、模糊(容错)搜索和 k-NN 语义搜索,可扩展超过 SQLite 约 10k 实体的暴力上限。
搜索控制
Schema(每字段):数据类型(string/number/boolean/timestamp)、处理(keyword/text/timestamp)和搜索类型(syntactic = keyword+prefix、semantic = 向量支持的密集搜索、none = 不索引)。标记字段 search: semantic 后,后端在索引时自动嵌入。
排序:每字段提升器,每个字段的 boost 权重决定匹配的重要性。混合查询时,关键词和语义分数用 search.semantic_weight 混合(默认 0.3)。
嵌入模型:安装 [semantic] 额外项(pip install 'open-index[semantic]')启用本地嵌入。默认模型 BAAI/bge-small-en-v1.5(384-D)。可通过 brain.yaml 中的 search.embedding_model 覆盖,或使用 OpenAI 兼容 API(设置 OPEN_INDEX_EMBEDDING_BASE_URL 等)。更改嵌入维度需要重建索引:SQLite 上 open-index index --reembed,OpenSearch 上重新创建索引后完整 open-index index --reembed。
限制
SQLite 语义上限:SQLite 后端对范围内的实体执行暴力余弦扫描,适用于大约 10,000 个实体以内;更大的大脑需切换到 OpenSearch 后端或未来的 sqlite-vec 集成。
尚未实现(存在可声明的接缝):类型级和时间提升器。
贡献
欢迎贡献——新的 doc_type 示例、连接器、后端、文档修复或错误报告。先在 Discord 社区提问或讨论。
更改流程:先开 issue 讨论非平凡更改(新后端、schema 更改、CLI 表面);从 main 分支(feat/…、fix/…、docs/…);在 tests/ 下添加测试并运行 pytest;如果修改了 examples/ 中的大脑,运行 open-index validate --brain examples/<name>;更新 README/docs;提交 PR 描述更改内容和原因并链接 issue。CI 在 Python 3.10 和 3.13 上运行测试套件并验证 examples/ 中每个大脑。
注意:pytest 在未安装 MCP 和 UI 额外项时跳过这些套件,因此部分安装的绿色运行意义不大——本地使用 [all](或至少 [ui,mcp])。CI 显式安装它们并在缺失时失败。