知识库
为您的 AI 智能体提供一个实时可搜索的大脑。智能体不仅读取,还能自主写回 — 形成项目内所有智能体共享的闭环多人记忆,即一个公司大脑 OS。
概览
知识库是一个与领域无关的系统,将你的数据转化为结构化知识图谱。AI 智能体在对话期间搜索这个图谱,以提供准确、有据可查的回答,而不是凭空生成。
而且这是多人协作的。智能体可以在对话中将学到的内容自主写回到项目知识库中,所有其他智能体在下一次会话中都能读取 — 形成一个像人类组织记忆一样累积复利的闭环公司大脑。此外,服务于一个团队的单个智能体可以跨用户携带带归属的记忆,因此它可以用与用户 B 交谈时收集的上下文来回应用户 A。详见 智慧(Wisdom)与共享记忆(Shared Memory)。
项目(你的租户)
|
+--------------------------+--------------------------+
| | |
v v v
智能体 A 智能体 B 智能体 C
| | |
|--- 写入已验证 ----------+ |
| 的事实 | |
| | |
| 读取 + 为回答提供依据 |
| | |
| +--- 更新条目 ------------>|
| |
| 读取已强化的事实
v v v
用户 X 用户 Y 用户 Z
智能体之间:闭环。一个智能体学到的任何东西,项目内
其他所有智能体都能立即获取。
智能体内部:单个智能体也可以在它服务的用户之间共享
记忆 — 带归属(sharedMemory)或不带归属(wisdom)。
同一智能体、多位用户、共享上下文。
上传文档 / API 推送
|
v
提取实体 + 关系
|
v
构建知识图谱(去重节点 + 边)
|
v
运行分析规则(推荐、趋势)
|
v
智能体在对话中查询图谱
数据如何进入知识库
填充知识库有两种方式,外加一个可选能力,可以叠加在两者之上:
1. 手动上传。 通过 SDK 或仪表板上传 PDF、DOCX、Markdown 或纯文本文件。平台自动提取实体和关系并写入图谱。适用于你掌控的静态文档 — 手册、政策、产品说明、世界观。一次性,或在源变更时重新上传。→ 文档上传
2. 在增量变化时推送的 ETL 作业。 一次定义实体模式;让你的作业按计划、队列或变更数据捕获流调用 insertFacts 或 bulkUpdate。适用于实时上游真实源 — 数据库、价格数据流、CMS、爬虫 — 这样源一变 KB 就保持同步。Upsert 是幂等的:推同一标签两次会合并属性并增加版本号,因此同样的作业在任何节奏下重跑都是安全的。→ SDK:插入与搜索
+ 智能体自主编辑 (可选开关 — 按智能体或按项目全局启用/禁用)。打开 knowledgeBaseWrite 能力后,智能体获得 knowledge_create / knowledge_update / knowledge_delete 工具。在对话中智能体自己记录已验证的事实,每次写入都打上 source = "agent:<agent-id>" 的戳,并采用 compare-and-swap 更新语义,因此并发的管理员编辑不会被静默覆盖。当真相之源就是对话本身时使用 — 客服记录已验证的事故详情、客户成功捕获续约上下文、记录员智能体写会议记录等。
两条导入路径相互独立 — 用其中之一、两者、或都不用。自主编辑是按智能体的开关(或通过 default_agent_kb_write 设的项目级默认值),叠加在你已经在运行的任何导入路径之上。你始终保持掌控:每次智能体写入都在服务器端针对你的模式验证、按配额限制、范围限定到智能体自己的项目,且可逆 — 仅软删除,硬删除仍然只属于管理员。
手动上传 增量变化时 ETL 对话中的智能体
(PDF / DOCX / MD) (insertFacts / bulkUpdate) (knowledge_create / update / delete)
| | |
| | | 需要
| | | knowledgeBaseWrite: true
v v v
+----------------------------------------------------------------+
| 项目知识图谱 |
| 实体 + 关系 + 版本历史 + 审计追踪 |
+----------------------------------------------------------------+
|
v
智能体在每次对话中通过
knowledge_search 查询
两种数据导入方式
1. 文档上传
上传 PDF、DOCX、Markdown 或纯文本文件。平台自动处理文档,提取实体和关系,并将其添加到知识图谱中。
import fs from "fs";
const doc = await client.knowledge.uploadDocument(projectId, {
file: fs.createReadStream("product_catalog.pdf"),
fileName: "product_catalog.pdf",
});
console.log(doc.documentId, doc.status); // "processing"2. API 推送(结构化数据)
以编程方式推送结构化数据——非常适合爬虫、库存信息流、价格追踪器或任何外部数据源。
await client.knowledge.insertFacts(projectId, {
source: "inventory_sync",
facts: [
{
entityType: "product",
label: "Widget Pro X",
properties: {
price: 29.99,
category: "electronics",
inStock: true,
tags: ["wireless", "bluetooth"],
},
},
],
relationships: [
{ fromLabel: "Widget Pro X", toLabel: "Electronics", edgeType: "belongs_to" },
],
});插入更新语义
如果具有相同标签和类型的实体已存在,属性将被合并且版本号递增。每次变更都以来源和时间戳记录在版本历史中。
SDK:插入与搜索
使用 SDK 从你的服务器推送数据并执行搜索:
import { Sonzai } from "@sonzai-labs/agents";
const client = new Sonzai({ apiKey: "sk-..." });
// 插入实体
await client.knowledge.insertFacts(projectId, {
source: "price_sync",
facts: [
{
entityType: "item",
label: "Charizard Base Set",
properties: { price: 450, trend: "+12%", condition: "PSA 10" },
},
],
relationships: [
{ fromLabel: "Charizard Base Set", toLabel: "Fire Pokemon", edgeType: "is_type" },
],
});
// 搜索
const results = await client.knowledge.search(projectId, {
query: "fire pokemon under 500",
type: "item",
limit: 10,
});
for (const r of results.results) {
console.log(r.label, r.properties);
}SDK:批量更新
使用 bulkUpdate 批量同步外部数据(价格、库存、统计数据)。只有变更的字段才会更新——适合频繁同步。
await client.knowledge.bulkUpdate(projectId, {
source: "price_sync",
updates: [
{ label: "Charizard Base Set", entityType: "item", properties: { price: 460 } },
{ label: "Blastoise Base Set", entityType: "item", properties: { price: 390 } },
],
});实体模式
定义带类型字段的自定义实体类型。模式指导提取,让平台精确知道要寻找哪些字段。支持的类型:string、number、boolean、date、enum、array。
await client.knowledge.createSchema(projectId, {
entityType: "pokemon_card",
description: "Collectible trading cards",
fields: [
{ name: "price", type: "number", required: true },
{ name: "condition", type: "enum", enumValues: ["PSA 10", "PSA 9", "Raw"] },
{ name: "set", type: "string", required: true },
{ name: "rarity", type: "enum", enumValues: ["Common", "Uncommon", "Rare", "Ultra Rare"] },
{ name: "tags", type: "array" },
],
similarityConfig: {
enabled: true,
threshold: 0.7,
fieldWeights: { price: 0.3, set: 0.4, rarity: 0.3 },
},
});知识图谱
实体通过类型化关系相互连接。图谱支持任意实体类型和关系类型——完全与领域无关。
节点
具有类型、标签和灵活属性的实体。按标准化标签 + 类型去重。
边
节点之间的类型化关系(belongs_to、similar_to、located_in 等)。支持双向遍历。
相似性
在模式上启用后,系统会根据属性相似度分数自动在实体之间创建 similar_to 边。
版本历史
每次变更都带有来源、时间戳和旧值进行版本控制。完整的合规审计记录。
搜索
对所有实体标签和属性进行全文搜索。支持类型过滤、属性过滤和图谱遍历以包含关联实体。
const results = await client.knowledge.search(projectId, {
query: "bluetooth speaker",
type: "product",
limit: 10,
filters: { in_stock: true },
});
for (const r of results.results) {
console.log(r.label, r.score, r.properties);
// r.related[] 包含 1 跳遍历得到的关联节点
}推荐引擎
定义规则,根据字段匹配将源实体与目标实体匹配。引擎防止反馈循环,并通过转化反馈随时间改进推荐。
字段匹配
支持精确匹配、范围容差、最小阈值、数组重叠或数值邻近度匹配。每条规则有可配置的权重。
转化追踪
记录推荐导致操作(购买、注册)的情况。系统随时间学习和改进。
过期过滤
超过可配置时间窗口未更新的实体会自动从推荐中排除。
// 创建推荐规则
const rule = await client.knowledge.createAnalyticsRule(projectId, {
ruleType: "recommendation",
name: "Similar cards",
config: { matchFields: ["set", "rarity"], limit: 5 },
enabled: true,
});
// 获取推荐
const recs = await client.knowledge.getRecommendations(
projectId, rule.ruleId, sourceNodeId, 5
);
for (const rec of recs.results) {
console.log(rec.label, rec.score);
}
// 记录反馈(改进未来推荐)
await client.knowledge.recordFeedback(projectId, {
ruleId: rule.ruleId,
sourceNodeId: sourceNodeId,
targetNodeId: rec.nodeId,
action: "converted", // "shown" | "converted"
});趋势分析
追踪实体属性在时间窗口(7天、30天、90天)内的变化。获取涨幅最大、跌幅最大、波动最大和均值最高的排名。
// 获取趋势排名
const trends = await client.knowledge.getTrendRankings(projectId, {
ruleId: ruleId,
type: "top_gainers", // "top_gainers" | "top_losers" | "most_volatile" | "highest_avg"
window: "30d", // "7d" | "30d" | "90d"
limit: 10,
});
for (const item of trends.rankings) {
console.log(item.label, item.currentValue, item.changePercent);
}智能体如何使用知识库
在对话期间,AI 智能体可以使用 knowledge_search 工具查询知识库。智能体从你的图谱中获取准确数据(包括实体属性、关系和推荐),而不是凭空生成事实。
用户:"500 美元以下最好的卡牌是什么?"
|
v
智能体调用 knowledge_search("cards under 500")
|
v
知识库返回:Charizard($450,+12%)、Blastoise($380,+8%)
|
v
智能体:"Charizard Base Set 售价 $450,本月涨幅 12%——
500 美元以内的绝佳投资选择。"
有据可查的响应
基于知识库的响应建立在你的真实数据之上。智能体了解当前价格、库存水平、规格和关系,因为它实时查询图谱。
智慧(Wisdom)与共享记忆(Shared Memory)
专用页面
共享记忆有自己的完整文档页面 — 何时使用、如何启用和关闭、智能体获得哪些工具、如何用实时 API 探针验证它在工作、以及完整的隐私控制故事,请见 共享记忆。下面的摘要保留在这里,是为了让 KB 读者能在上下文中看到多人记忆这个钩子。
除了静态文档,与众多用户对话的智能体会沉淀出模式——重复的行为、共同的目标、稳定的偏好。Sonzai 通过两个互补的层级把这种跨用户的归纳能力暴露出来:智慧(wisdom)(去归属,默认开启)和共享记忆(shared memory)(带归属,需主动开启)。
Wisdom(去归属,默认开启)
当 wisdom 能力开启时(每个新建智能体都默认开启),平台每日运行一个推广任务:从每位用户的事实历史中抽取模式,做 k-匿名化处理,再通过 LLM 改写为去归属的知识。任何个体用户都无法被识别。每个智能体都能享受到「这种做法通常有效 / 这类话题常常出现」的好处,而不会泄露任何人说过什么。
这是你的免费归纳层。智能体无需调用任何工具——只要能力开启,wisdom 会自动出现在智能体的上下文中。
// 每个新建智能体的 wisdom 默认开启。如果某个具体智能体不需要跨用户归纳
//(例如单用户陪伴产品),可以在创建时或通过 updateCapabilities 显式关闭:
await client.agents.updateCapabilities("agent_abc", { wisdom: false });默认开启,可选关闭
Wisdom 对所有智能体都开启——包括默认开启切换之前创建的旧智能体。该能力存储为三态:true、false、未设置(视为开启)。仅当你想关闭时才显式传 wisdom: false;不传则保持平台默认。
Shared Memory(带归属,需主动开启)
某些业务想要的恰好是去归属的反面——他们希望使用同一智能体的多位用户能看到谁在做什么。一个团队协作智能体可能会显示「Alice 负责迁移,Bob 负责事故响应」;一个派对协调智能体可能记录「Carol 带甜点,Dave 负责布置」。这就是 sharedMemory 能力所控制的。
开启该能力后,智能体会记录带人/实体归属的事实(角色、专长、业务上下文、关系边),并把它们暴露给共享该智能体的其他用户。三件事会发生变化:
- 工具。 智能体获得
wisdom_create、wisdom_update、wisdom_delete以及关系边工具,加上后台的 CSV 导入。 - 上下文。 其他用户的归属事实会带着归属信息出现在智能体的每轮上下文中。
- 隐私底线。 每次写入都会先经过隐私黑名单(薪酬、健康、政治)的语义校验后再持久化——即使用户主动要求,智能体也不能跨用户分享不该分享的内容。
Shared memory 默认关闭。仅在智能体服务于一个群组、团队或派对,且这种跨用户可见性确实有价值时才显式开启。
// Wisdom 是前置条件(新智能体默认 ON——只有当你要覆盖默认值时才显式传)。
await client.agents.updateCapabilities("agent_abc", {
wisdom: true,
sharedMemory: true,
});也可以在创建智能体时直接开启:
const agent = await client.agents.create({
name: "Team Coordinator",
project_id: "proj_abc",
tool_capabilities: {
wisdom: true,
shared_memory: true,
},
});Wisdom vs. shared memory——慎重选择
wisdom 是归纳层(安全、去归属、默认开启);sharedMemory 是归属层(敏感、按人记录、默认关闭)。两者可以共存——但只有在使用场景真正需要跨用户可见性(小组、团队、派对、共享业务场景)时再开启 shared memory。单用户陪伴类产品请保持关闭。
使用场景
价格追踪器
每小时爬取价格,通过 API 推送。智能体用真实数据回答"什么在涨?"。趋势规则追踪涨跌幅。
房地产
从 MLS 信息流推送房源。推荐规则按预算、卧室数量、地段匹配买家与房产。
电子商务
上传产品目录。相似度检测关联相关产品。智能体根据偏好和转化数据进行推荐。
内部知识
上传员工手册、政策文档、产品手册。智能体用准确、有来源的信息回答问题。
产品目录
通过 API 推送产品数据。智能体用当前数据为用户提供选项、配置和推荐建议。
API 参考
所有端点使用 Authorization: Bearer {api_key} 请求头。
| 端点 | 方法 | 用途 |
|---|---|---|
/knowledge/documents | POST | 上传文档(multipart) |
/knowledge/documents | GET | 列出带状态的文档 |
/knowledge/documents/{docId} | DELETE | 删除文档 |
/knowledge/facts | POST | 创建/更新实体和关系 |
/knowledge/search?q=... | GET | 带过滤器的全文搜索 |
/knowledge/nodes | GET | 列出节点(可选类型过滤) |
/knowledge/nodes/{nodeId} | GET | 获取带边和历史的节点 |
/knowledge/schemas | POST | 创建实体模式 |
/knowledge/schemas | GET | 列出模式 |
/knowledge/schemas/{schemaId} | PUT | 更新模式 |
/knowledge/stats | GET | 获取知识库统计数据 |
/knowledge/analytics/rules | POST | 创建分析规则 |
/knowledge/analytics/rules | GET | 列出规则 |
/knowledge/analytics/rules/{ruleId}/run | POST | 触发规则执行 |
/knowledge/recommendations | GET | 获取预计算推荐 |
/knowledge/trends | GET | 获取趋势聚合数据 |
/knowledge/trends/rankings | GET | 获取趋势排名 |
/knowledge/conversions | GET | 获取转化统计数据 |
/knowledge/feedback | POST | 记录推荐反馈 |
基础路径
以上路径均相对于 /api/v1/projects/{projectId}。从仪表盘的项目页面获取你的项目 ID。
实际应用
每类受众都会使用知识库——但上传什么以及如何查询各不相同。
上传传说,不要上传枯燥事实。 伴侣与背景故事文档结合 效果最佳——角色历史、个人哲学、重要关系、世界构建。 智能体会有机地将这些融入对话。
为人物和地点使用实体模式。 如果 Luna 会提及 反复出现的人或地点,将它们建模为知识库实体,让智能体 跨会话保持一致。
await client.knowledge.insertFacts("project-id", {
entities: [
{ label: "Aunt Miriam", type: "person", properties: { relation: "mentor", alive: false } },
{ label: "The old observatory", type: "place", properties: { significance: "first-love" } },
],
});不要过度上传。 太多素材会稀释角色声音—— 1-3 份精心挑选的文档胜过一堆文档倾倒。