跳转至

知识库与文档检索

知识库保存你主动提供的文档,配置 embedding 后可检索相关段落。 它与记忆后端对对话内容的召回分开。

当前源码树提供知识库 Python 库和 knowledge.* RPC 处理函数, 但当前 WebUI 源码中没有完整挂载的知识库管理功能,也没有 raven knowledge CLI。 本页因此介绍可验证的库/RPC 流程,不假设每个安装都存在某些按钮。

选择文档、知识库或记忆

需求 选择
为本次任务读取文件 附件或可读工作目录路径
反复从文档集合检索段落 已索引知识库
保存来源文档但不做向量检索 以 embedding: false 创建的库
召回用户偏好或 Agent 经验 记忆与技能

创建知识库不会自动把所有内容加入每次模型 prompt。客户端需要检索目标库, 并显式将相关段落提供给任务。检索文本是待核实的证据,不是可信指令。

配置 Embedding

Endpoint 由 Raven 配置,不要求安装记忆插件。合并以下片段,使用已配置的 provider 和它实际提供的 embedding 模型:

{
  "embedding": {
    "provider": "custom",
    "model": "YOUR_EMBEDDING_MODEL"
  }
}

Provider 保存 URL 与凭据,聊天模型不一定支持 embedding。创建库会探测向量维度; 索引会将文档 chunk、搜索会将 query 发到该 endpoint。这些操作可能收费, 也会将对应文本提供给该服务商。

向量索引是内嵌的文件存储,不要求独立向量服务。库记录模型和维度; 后续不兼容的模型/维度变更会报 stale-base,而不是静默混用向量。 应新建库,并重新索引保留的来源。

小型端到端示例

在源码环境中使用可信本地脚本:将以下内容保存为仓库之外的 knowledge_demo.py, 用项目环境执行。它在当前工作目录下使用独立 knowledge-demo/, 不打开正在运行的 gateway 数据库,并且会发起真实 embedding 调用。

"""Create and query a small isolated knowledge base."""

import asyncio
from pathlib import Path

from raven.knowledge import KnowledgeManager


async def main():
    manager = KnowledgeManager(Path("./knowledge-demo"))
    base = await manager.create_base(name="Release handbook")
    document = manager.add_document(
        base.id,
        filename="release.md",
        content=b"# Release checklist\nRun unit tests before publishing a release.\n",
    )
    indexed = await manager.index_document(document.id)
    if indexed is None or indexed.status != "ready" or not indexed.chunk_count:
        raise RuntimeError(indexed.error if indexed else "Document disappeared")
    result = await manager.search([base.id], "What must run before publishing?", top_k=3)
    for hit in result.hits:
        print(hit.document_id, hit.chunk.source, hit.score, hit.chunk.text)


asyncio.run(main())
uv run python /absolute/path/to/knowledge_demo.py

执行后目录与索引会保留。同名再次创建会被拒绝;应使用已有 base ID 或新的 demo 目录。 确认返回段落确实要求运行单元测试。相似度分数用于排序,不是答案正确的概率。 核对来源后,再要求模型仅依据这些段落回答。

使用宿主 RPC 流程

经过认证的 Raven RPC 客户端遵循同样生命周期。以下是 RPC 方法,不是 HTTP 资源路径 或 A2A 方法:

步骤 方法与参数 检查
发现 knowledge.status,参数 {} 已配置模型及支持扩展名
创建 knowledge.bases.create,传 name/description 保存返回的 base.id
添加笔记 knowledge.documents.add_note,传 base_id、title、text 保存 document ID
添加文件 knowledge.documents.add,传 base_id 和上传后的 path 路径必须在宿主上可读
索引 knowledge.documents.index,传 document_id 查看 status、error、chunk_count
搜索 knowledge.search,传 base_ids、query、可选 top_k 查看命中、来源和 chunk 位置

创建库后,搜索参数示例:

{
  "base_ids": ["BASE_ID_FROM_CREATE"],
  "query": "What must run before publishing?",
  "top_k": 3
}

添加与索引分开。“已上传”不等于可检索,索引 RPC 也可能返回 failed 文档。 未启用 embedding 的库可以 ready 且零 chunk,向量搜索会跳过它。

knowledge.documents.add_url 抓取并保存页面快照,不会持续同步网站; 文件上传保存的也是副本,不是文件系统订阅。

格式、更新与删除

以 knowledge.status.extensions 或 supported_extensions() 为准。 当前默认 parser 是结构化 Markdown/HTML 和纯文本系列,包括 CSV/JSON/YAML。 不能因为 Raven 其他功能支持预览 PDF 或 Office,就假定知识库也能索引它们。

笔记可用 knowledge.documents.update_note 更新后重新索引。 同一文档重新索引会替换向量,不累加重复项。修改切块设置后,需要重新索引已有文档; 改变 embedding 身份则需要重建库。

knowledge.documents.delete 删除文档及关联存储; knowledge.bases.delete 删除库及其文档和索引。 两者都不是可撤销的回收站操作。原始来源和备份应保留在知识库存储之外。

Gateway 在知识库数据目录中保存 records、blobs 和 vectors。 应使用运行中服务的 RPC,不要让第二个进程同时打开该存储;示例特意使用独立目录。

隐私与排障

宿主文件导入遵循可读路径策略,包括保护 Raven 状态/凭据文件。 按 document ID 预览不代表可以读取任意宿主路径。库脚本是可信本地代码, 不能替代宿主 RPC 的访问检查。

现象 检查
WebUI 没有管理页 当前前端支持;使用兼容 RPC 客户端或库
Embedding 未配置 Provider/model 配对、endpoint 能力和凭据
索引失败 文档 error、真实 parser 支持和 embedding endpoint
搜索为空 已索引 chunk、目标 base ID、是否启用 embedding
Stale base 原始模型/维度与当前配置
来源改了但结果未变 存储副本与实时来源不同;更新/导入并重建索引
回答缺证据 显式提供检索段落,保留来源引用

实现位于 raven/knowledge/、raven/rpc/methods/knowledge.py 和 raven/rpc/knowledge_preview.py。源码/schema 校验不等于真实 embedding 服务兼容性测试。