内容
<div align="center">
# 组合
### 无模型公司大脑,你的AI插件通过MCP连接
给予你的AI工具(Claude, Cursor, Copilot)一个**受控、引用、有范围保护**的记忆,
让它从你的真实文档中回答**或拒绝**,永远不会编造。
组合运行**没有自己的模型**:你的AI带来智能,组合拥有数据,
访问规则,拒绝和审计轨迹。
[](https://www.npmjs.com/package/open-company-brain)
[](./LICENSE)
[](./tsconfig.json)
[](#开发)
[](#后端)
[](#状态)
</div>
---
## 问题
一个公司的知识分散在文档、PDF、Word文件、Slack和人们的脑海中。
问一个AI "我们的退款政策是什么?" 它会猜测,或者你每次都粘贴文档 ——
并且每个队友的AI给出不同的答案。 没有一个单一的、当前可信的来源,
AI可以从中获取信息,并且没有任何东西可以阻止它编造答案。
**组合就是那个来源。** 有范围保护(Team A 不能读取 Team B),保持更新,
并且**拒绝它不知道的** 而不是编造。
---
## 为什么选择组合
这个领域的大多数工具要么是企业搜索(你不能自己托管),
要么是薄薄的RAG包装(仍然会编造)。 组合在三个重要的方面都不同:
- **受控,而不仅仅是检索。** 访问范围在每次读取时强制执行,
每个操作都经过人工批准和审计,答案被引用或拒绝 —— 从不发明。
- **无模型和自我托管。** 组合运行没有自己的模型;你的AI工具通过MCP带来智能。
默认情况下,单个文件上的关键词检索为 $0/query,无需数据库。
- **它会复合。** 每个记录的结果都会重新排列大脑信任的内容,
因此答案会随着使用而变得更好,而不是变得过时。
组合适用于在自己的知识上运行AI代理的工程和运维团队,
其中答案需要正确和有责任,而不是仅仅流利。
如果你只想向单个文件提问,你的AI工具已经可以做到 ——
组合在许多人、代理需要相同的可信、当前知识时才有价值。
---
## 快速开始 — 无模型,无数据库,无Docker
```bash
npm i -g open-company-brain # 安装 `comb` 命令
comb install claude # 将组合连接到 Claude / Cursor / VS Code 作为 MCP 服务器
comb ingest ./company-docs/ # 真实文件:.docx .pdf .md(OKF) .txt .csv .json
```
然后,在你的AI工具中(通过MCP):
> *"搜索大脑 —— 手册中关于退款的内容是什么?"*
你的代理从引用的记录中回答,或拒绝。 **组合运行无模型** ——
检索基于关键词,您的AI主机进行思考。($0/query,无需配置。)
---
## 它为你的代理提供的内容 — 17个受控MCP工具
| 分组 | 工具 |
|---|---|
| **读取** | `search_brain`, `ask_brain`, `find_skill`, `list_sources`, `list_intents` |
| **写入** | `ingest`, `record_fact`, `record_skill` |
| **执行** | `propose_action`, `submit_action` — 你起草,组合控制审批 → 执行 → **审计** |
| **证明 + 学习** | `query_runs`, `declare_intent`, `list_divergence_candidates`, `record_outcome` |
| **GTM** | `gtm_research_prospect`, `gtm_draft_outreach` |
### 通过MCP连接
```jsonc
// Claude Desktop / Cursor MCP 配置(或只需运行 `comb install claude`)
{ "mcpServers": { "comb": {
"command": "comb", "args": ["mcp"],
"env": { "LLM_BACKEND": "modelfree", "COMB_RETRIEVAL": "keyword",
"MCP_PRINCIPAL": "you", "MCP_SCOPES": "default-team" } } } }
```
---
## 真实文件导入,谷歌OKF导入导出
组合摄取公司实际使用的文件格式:
```bash
comb ingest ./docs/ # .docx(Word),.pdf,.md,.txt,.csv,.json
```
损坏或无法读取的文件会被**跳过**,不会导致批量处理失败。
它还支持**谷歌开放知识格式(OKF,2026)** —
一个带有YAML前置信息的markdown概念文件目录:
```bash
comb ingest ./okf-bundle/ # 概念类型/标题/标签变为结构化,可搜索
comb export --out ./okf-out # 将大脑写回为范围保护的OKF包
```
OKF是精选层;组合添加了OKF文件所缺乏的内容 —
**访问范围,引用或拒绝,审计和学习循环。**
---
## 基于大脑的GTM角色
静态提示文件无法实现:查询语料库超出上下文窗口,
强制范围保护,
在没有依据时拒绝。 两个MCP工具将大脑转换为有依据的GTM代理:
```
gtm_research_prospect { name:"Jane Doe", company:"Acme", role:"CTO" }
→ 仅从引用的大脑记录中构建档案 — 或为空
gtm_draft_outreach { name:"Jane Doe", company:"Acme", angle:"cut their API test maintenance" }
→ 根据引用的记录进行个性化电子邮件;如果没有依据,则拒绝
```
---
## 为什么这不是RAG包装
RAG包装有四个步骤:摄取 → 嵌入 → 检索 → 交给LLM。
组合保留了这个主干,并添加了包装跳过的所有系统工作 —
所有这些都已构建并经过今天的测试:
| 问题 | RAG包装 | 组合 |
|---|---|---|
| 谁可以读取记录 | 没有 | **每次读取都断言访问范围** |
| 幻觉控制 | 希望模型引用 | **代码中的确定性拒绝** 在生成之前 |
| 真实文件摄取 | 通常只有.txt/.md | .docx · .pdf · OKF · .csv · .json |
| 执行操作 | 没有 | 提案 → 批准 → 执行 → **审计** |
| 改进 | 静态 | `record_outcome` → 奖励 → 重新排列检索 |
| 证明有效 | 没有 | 在CI中声明的行为评估 |
模型是容易且可互换的部分。 治理、拒绝、审计和循环是产品。
---
## 后端
无需代码更改 — 设置`LLM_BACKEND`。 **您不需要向量数据库**;
默认情况下使用单个JSON文件。
| 后端 | 召回 | 生成 | 需要 | 成本 |
|---|---|---|---|---|
| `modelfree` *(默认)* | 关键词 | 您的AI主机,通过MCP | 无 | **$0/query** |
| `local` | pgvector / file-vector | Ollama | Ollama(+可选Postgres) | $0/query |
| `openai` | pgvector / file-vector | 任何OpenAI兼容密钥 | 您的密钥 | 您的密钥 |
| `langbase` | 已管理 | 已管理 | Langbase密钥 | 使用情况 |
---
## 命令行界面
```bash
comb install <client> # 将组合连接到Claude/Cursor/VS Code作为MCP
comb ingest <file|folder|url> [--source name] [--scope s] [--replace]
comb export [--out dir] [--scope a,b] # 将大脑写出为OKF包
comb mcp # 运行MCP服务器(stdio)
comb doctor # 哪个后端正在运行,缺少什么
comb reset [--all] [--yes] # 清洁 slate(擦除实际知识存储)
comb eval # 运行行为评估套件
```
### 保持数据新鲜(URL和馈送)
摄取接受URL,并存储快照 — 它不是实时链接。
要刷新随时间变化的数据,**重新摄取 `--replace`**:
它首先擦除该源的旧记录,因此更新的页面/馈送干净地替换其快照,
而不是在旁边堆积过时的副本。
```bash
comb ingest https://example.com/pricing --source pricing --replace
```
对于自动化,请在同一源上安排重新摄取(cron / n8n / Zapier),
或POST到摄取Webhook(`POST /api/ingest`)。
组合存储您提供的内容;它不自己轮询URL。
---
## 将其嵌入为库
```ts
import { Brain } from 'open-company-brain';
const brain = await Brain.create();
await brain.ingest({ format: 'text', source: 'notes', content: '…' }, ['my-team']);
const { answer, sources } = await brain.ask('…', ['my-team']); // 有根据 + 引用,或拒绝
```
---
## 开发
```bash
git clone https://github.com/PDgit12/open-company-brain.git
cd open-company-brain && npm install
npm test && npm run typecheck && npm run lint && npm run build
```
## 许可证
[MIT](./LICENSE)