# 外部知识库接入 PRD ## 文档信息 | 项目 | 内容 | | --- | --- | | 状态 | 三家短答案、Dify 完整 App 与当前 UI 自动回归已通过;剩余产品验收待完成 | | 版本 | 0.2 | | 日期 | 2026-09-13 | | 适用产品 | GoodBuddy 桌面端 | | 关联逻辑 | [外部知识库逻辑设计](./external-knowledge-logic-design.md) | | 关联界面 | [外部知识库 UI 设计](./external-knowledge-ui-design.md) | | 技术设计 | [外部知识库技术设计](./external-knowledge-technical-design.md) | ## 当前交付范围 当前工作区已提供实例管理、加密凭据保存、目录与手工 ID、外部绑定、Provider 检索参数、 统一知识库列表、聊天预检索与按需工具检索、外部引用和本地移除的实现。参数与恢复默认 遵循下文只读产品决策。2026-09-13 已验证三家 Provider 的生产服务与本机 HTTP MCP, 以及 Dify 桌面的实例保存、绑定、参数更新、重启和历史引用。后续已修正外部弹窗的字段 样式与布局,并验证三家通过生产 IPC 生成有依据的短答案、Dify 按需检索,以及从完整 App 输入区发送 Dify 问题并点击真实答案引用。该证据不代表广泛问答质量。 FastGPT/RAGFlow 完整桌面、远程预检索仍待验收;当前 UI 修改后的聚焦测试、全量回归与 相关检查已通过,精确结果见[实施进度](./progress.md)。 本文的功能需求和产品验收仍是验收目标。以下差异不能仅凭实现存在就标为满足: | 原需求 | 当前实现与待核对差异 | | --- | --- | | `EK-FR-02`、`EK-FR-03` | 实例先保存为未测试,再在列表执行目录测试;目标检索在绑定时验证。没有分项草稿探测、版本或完整能力快照 | | `EK-FR-04` | 已有目录搜索和分页;Dify/RAGFlow 搜索过滤当前页,FastGPT 搜索当前父级响应,不能保证全目录搜索 | | `EK-FR-09` | 内置严格配置已实现,没有按探测版本维护支持矩阵;Dify 高级只读能力展示、Metadata 编辑和 RAGFlow Rerank 未提供 | | `EK-FR-13`、`EK-FR-14` | 已显示片段、原始评分、总耗时和失败;没有完整的 Provider 耗时、裁剪前数量与截断诊断,也不持久化远端目标失效状态 | | `EK-FR-16` | Main 固定端点及数据说明已接入;当前没有单独接入全局内网兼容模式和按地址传输确认流程 | 这些差异由功能 owner 在验收时核对。2026-09-09、2026-09-10 真实接口探测只作为历史 兼容性资料,不作为本轮桌面产品验证结果。 ## 1. 背景 不少企业已经在内网部署 Dify、FastGPT 或 RAGFlow,并在其中维护制度、产品、研发 和客服知识。继续要求用户把相同资料导入 GoodBuddy,会产生重复存储、版本分叉和 额外维护成本。 GoodBuddy 需要把这些已有知识库加入当前知识库列表和聊天检索范围。外部系统只 承担知识存储与检索,问题理解、上下文组织、模型回答、Agent 和工具执行仍由 GoodBuddy 负责。 ## 2. 产品决策 1. 外部知识库属于现有“知识库”功能,不新增一级页面,也不放入全局设置中心。 2. 知识库页面标题区增加“管理外部实例”;现有“新建知识库”向导增加知识库类型。 3. 一个外部实例代表一个 Provider 服务地址和一组凭据,可绑定多个远端知识库。 4. 一个外部知识库绑定在 GoodBuddy 中仍是一个 `KnowledgeBase`,可以进入现有聊天 范围、每次先检索、模型按需检索和检索测试流程。 5. 外部知识库保持远端检索,不批量同步或本地索引远端文档、分块、向量和图谱,也不 显示“已同步”。实际进入回答的有界片段和引用随会话保存在本机,并遵循会话删除规则。 6. Dify、FastGPT 和 RAGFlow 只使用知识库列表、详情和检索接口。App、Chat、 Assistant、Workflow 和 Agent API 均不接入。 7. 用户点击“添加”只创建本地绑定,不在外部实例中创建知识库;移除绑定也不删除 远端知识库。 8. 通用配置只包含跨 Provider 语义一致的选项。检索算法、阈值、重排和图谱开关 由 Provider 配置承担。 9. Provider 专属字段由 GoodBuddy 内置适配器定义。外部服务器不能下发任意表单、 脚本或字段 Schema。 10. API Key 在用户输入表单和受限 IPC 中短暂存在,由 Main 进程加密保存并用于请求; 保存后不回传 Renderer,也不进入 Runtime、日志、普通元数据和检索引用。 第一版按只读接入交付:参数修改和恢复默认只更新 GoodBuddy 中当前绑定的客户端配置, 在后续检索请求中使用,不修改远端知识库默认配置,也不影响其他客户端。远端文档、 索引、图谱构建、模型和 Pipeline 设置由用户在对应平台维护。检索请求仍可能产生远端 Embedding、重排用量和审计记录。 ## 3. 目标 ### 3.1 用户目标 - 在知识库页面配置企业现有的 Dify、FastGPT 或 RAGFlow 实例。 - 新建知识库时选择 Provider、实例和远端知识库,不手工复制资料。 - 在同一知识库列表和聊天选择器中使用本地与外部知识库。 - 按 Provider 能力调整检索参数,例如 RAGFlow 图谱检索。 - 明确看到查询发送到哪个实例、检索是否成功以及引用来自哪里。 - 连接失效后能更新凭据、重试或更换远端知识库,不丢失其他知识库配置。 ### 3.2 产品目标 - 保持现有知识库 ID 作为聊天和 Runtime 的统一授权单位。 - 让三种 Provider 的结果进入同一有界证据与引用契约。 - 保留每种 Provider 的有效检索能力,不用最低公共字段覆盖全部差异。 - 将实例认证与知识库绑定分离,使一个实例可以服务多个绑定。 - 对 Provider 版本差异、列表权限关闭和部分检索失败提供可诊断状态。 ## 4. 非目标 本功能不包含: - 调用 Dify App、FastGPT 应用、RAGFlow Chat 或任何外部 Agent。 - 使用外部系统生成最终回答或维护外部会话。 - 在外部实例中创建、编辑、删除知识库、文档或分块。 - 向外部实例上传文件、网页、剪贴板、完整会话或本地知识库内容。 - 批量同步或本地索引外部文档、分块、Embedding、图谱或模型配置。回答实际引用的 有界片段仍会随会话保存在本机。 - 跨实例复制、迁移或统一管理外部知识内容。 - 企业 SSO、组织级凭据下发、文档级 ACL 映射或 ShareServer 管理策略。 - 自定义脚本适配器和任意 HTTP 请求模板。兼容检索 API 需要独立设计。 - 把不同 Provider 的原始分数解释成可直接比较的统一质量分数。 ## 5. 核心对象 | 对象 | 定义 | 用户可执行操作 | | --- | --- | --- | | 外部实例 | Provider、服务地址、凭据和已探测能力 | 添加、测试、编辑、停用、删除 | | 外部知识库目录项 | 实例列表接口返回的远端知识库摘要 | 刷新、选择 | | 外部知识库绑定 | GoodBuddy 知识库与远端知识库的只读关联 | 添加、改名、配置、测试、移除 | | Provider 配置 | 适配器支持的检索参数 | 查看、修改、恢复默认 | | 标准化检索结果 | Provider 结果转换后的片段、来源和诊断 | 查看、引用、提供给 Runtime | ## 6. 主要流程 ### 6.1 管理外部实例 1. 用户在知识库页面点击“管理外部实例”。 2. 页面列出实例名称、Provider、服务地址、状态和已绑定知识库数量。 3. 用户添加实例,填写名称、Provider、服务地址和 API Key。 4. 用户先保存实例,API Key 被加密保存,列表显示凭据状态和“未测试”。 5. 在已保存实例上“测试连接”读取目录并记录结果;检索能力在绑定目标时验证。 目录 403 显示“需手工指定知识库”;不可达或认证失败保留实例和失败状态,用户可编辑 后重试。保存本身不代表可用。原分项测试验收目标见 `EK-FR-03`,当前实现差异见上表。 ### 6.2 添加外部知识库 1. 用户点击现有“新建知识库”。 2. 在“知识库类型”中选择“本地”、Dify、FastGPT 或 RAGFlow。 3. 选择外部类型后,左侧选择同 Provider 的外部实例。 4. GoodBuddy 自动读取远端知识库列表,提供搜索、分页和目标选择。 5. 列表权限不可用时,用户可以手工填写远端知识库 ID。 6. 用户选择一个远端知识库,填写 GoodBuddy 显示名称。 7. 右侧展示通用配置和当前 Provider 的专属配置。 8. 用户填写测试查询并执行有界检索;成功后可添加,零结果不算失败。保存时服务会再次 执行该查询验证目标和配置,之后创建本地绑定。 添加完成后沿用现有知识库规则,把新绑定加入当前聊天选择,但不会重新启用用户此前 取消的其他知识库。 ### 6.3 使用外部知识库 外部绑定出现在现有知识库列表和聊天知识范围中,持续显示 Provider 与实例名称。 检索请求只发送本次查询文本和该绑定已保存的检索配置。返回片段经过 Main 校验、 截断和标准化后,才作为不可信证据提供给 Runtime。 一次请求选择多个知识库时,本地与外部检索可以并行。单个外部知识库失败不扩大 检索范围,也不切换其他实例;其他知识库成功时可继续回答,并显示部分失败。 ### 6.4 编辑和移除 - 修改显示名称只影响 GoodBuddy 本地名称。 - 修改 Provider 配置只影响后续检索,不写回远端知识库。 - 更换远端知识库属于重新绑定,保存前必须重新测试。 - 删除外部实例前必须处理其所有绑定:取消,或明确移除这些本地绑定。 - 移除绑定只删除 GoodBuddy 中的绑定和检索配置,不调用远端删除接口。已经保存在历史 会话中的引用继续可读,但不再提供依赖当前实例的刷新操作。 ## 7. 功能需求 ### EK-FR-01 知识库页面入口 知识库页面必须同时提供“管理外部实例”和“新建知识库”。外部实例管理不得迁移到 全局设置中心或创建新的一级导航。 ### EK-FR-02 实例配置 实例必须包含唯一 ID、显示名称、Provider、规范化服务地址、凭据状态、启停状态、 最近测试结果和适配器能力快照。用户可以使用 `keep`、`replace`、`clear` 语义更新凭据。 ### EK-FR-03 分项连接测试 连接测试必须区分服务可达、认证、列表读取和测试检索。新增实例尚未选择知识库时, 测试检索显示“绑定知识库时验证”,不能伪装成已通过。测试错误应包含可处理原因, 不得返回凭据、Authorization、完整响应正文或内部堆栈。 ### EK-FR-04 远端目录读取 选择实例后自动读取有界、可分页的远端知识库列表。列表支持加载、刷新、搜索、空结果、 权限不足和失败状态,且异步旧响应不得覆盖当前实例结果。 ### EK-FR-05 手工指定远端 ID 列表接口不受支持或没有权限时,允许手工填写远端知识库 ID 和显示名称。保存前必须通过 该 ID 的详情或检索验证;不能只验证字符串非空。 ### EK-FR-06 知识库类型 新建向导必须提供“本地”、Dify、FastGPT、RAGFlow 四种类型。本地类型保持现有创建、 存储模式、图谱和导入行为;外部类型不得显示本地分块、导入或索引设置。 ### EK-FR-07 两栏配置 外部类型的创建向导在常规宽度使用左右两栏。左侧负责 Provider、实例、远端知识库和 显示名称;右侧负责通用配置与 Provider 专属配置。窄窗口按来源、通用配置、专属配置 顺序堆叠。 ### EK-FR-08 通用配置 通用配置至少包含最终返回片段数、请求超时和单片段最大字符数。数值必须有固定范围, 由 Main 再次校验。Provider 的 Top K、Token 预算或 Page Size 不得冒充同一字段。 ### EK-FR-09 Provider 专属配置 Provider 配置使用受版本控制的判别联合。界面只展示当前适配器和已确认实例版本支持的字段; 不支持的已保存字段必须明确显示为失效配置并阻止静默提交。 ### EK-FR-10 统一知识库列表 外部绑定与本地知识库出现在同一列表,但必须显示 Provider、实例和“远端检索”状态。 外部绑定不得显示本地文档数、同步、分块、向量覆盖率或本地图谱状态。 ### EK-FR-11 统一检索范围 现有聊天知识范围、多选上限、`auto` 和 `always` 模式继续以 GoodBuddy 知识库 ID 工作。 Runtime 只能获得标准化后的有界证据,不能获得实例地址、API Key 或 Provider 原始响应。 ### EK-FR-12 引用来源 每条外部结果必须保留 Provider、实例 ID、远端知识库 ID、文档名称和片段。远端文档 ID、 远端片段 ID、页码、URL、分数及其他定位只在 Provider 实际返回时保存,不得补造。 ### EK-FR-13 检索测试 现有检索测试入口支持外部绑定。页面显示生效配置、总耗时、Provider 耗时、返回数量、 截断状态和脱敏错误。外部测试不创建聊天、调用 GoodBuddy LLM 或修改远端内容。 ### EK-FR-14 故障隔离 认证失败、超时、限流、目标删除、版本不兼容和响应无效必须分别报告。多知识库检索中, 单项失败不得改写为零结果,也不得阻止已成功证据进入回答。 ### EK-FR-15 生命周期边界 删除实例、移除绑定、清除凭据和更换远端目标必须经过明确确认。任何操作都不得调用 Provider 的远端创建、更新、上传或删除接口。 ### EK-FR-16 网络与数据说明 界面必须说明查询会发送到所选实例,并列出不会发送的内容。请求遵循用户配置的服务地址 和当前内网兼容模式,不自动切换地址、Provider 或公共云端点。HTTP 或放宽证书校验会 传输 API Key,测试和保存实例前必须显示风险并取得针对当前地址的明确确认。 ## 8. Provider 初始范围 | Provider | 目录能力 | 检索能力 | 首批专属配置 | | --- | --- | --- | --- | | Dify | 知识库列表与详情 | Dataset Retrieve | 使用知识库默认配置,或完整覆盖检索方式、Top K、Score 阈值及 Rerank 模式 | | FastGPT | 知识库层级列表与详情 | Dataset Search Test | 搜索模式、Token 上限、相似度、Rerank | | RAGFlow | Dataset 列表与详情 | Retrieval | 相似度、向量权重、KNN Top K、图谱检索、Knowledge Compilation;当前未提供 Rerank 配置 | “首批专属配置”表示适配器允许表达的字段,不保证每个实例版本都支持。具体显隐由能力 探测和[逻辑设计](./external-knowledge-logic-design.md)共同决定。 ## 9. 产品验收 以下为验收清单,尚未整体通过。第 2 项已有三家生产服务绑定与检索证据,Dify 另有桌面 操作证据;其他 Provider 的桌面、受限目录与高级配置等仍需补验。第 12 项确认流程当前 未实现。早期历史引用检查使用标记为测试的会话;后续已从完整 App 输入区生成 Dify 真实短答案并点击引用,三家另有生产 IPC 短答案证据。完整 App 尚未覆盖 FastGPT/RAGFlow, 也未评估广泛问答质量;本机 MCP 成功不替代被 SSH 凭据解密阻断的真实远程预检索。 详细结果以实施进度为准。 1. 用户可以在知识库页面完成三种 Provider 的实例添加、连接测试、编辑和删除。 2. 每种 Provider 至少通过一个真实自部署实例完成列表读取、绑定和检索。 3. 列表权限关闭时,可以通过手工 ID 添加并验证一个可检索知识库。 4. 本地与外部知识库可以同时进入一次聊天检索,引用来源可区分。 5. RAGFlow 支持时可以开启图谱检索;不支持时不发送该字段。 6. 外部知识库详情不出现本地导入、同步、分块和索引操作。 7. 删除绑定或实例不会改变远端知识库和文档。 8. 保存完成后的 Renderer 状态、Runtime、SQLite 普通元数据、日志和错误中均找不到明文 API Key。 9. 超时、401/403、404、429、5xx 和响应格式错误都有独立测试并显示准确状态。 10. 中断、切换实例或关闭向导后,过期列表与测试响应不会写入当前表单。 11. FastGPT 页面说明检索会记录远端 API 使用情况,并可能产生 Embedding 或 Rerank 用量。 12. HTTP 或放宽证书校验的实例未经明确确认不能保存或发送 API Key。 ## 10. 外部资料 以下链接用于核对初始适配范围,实施时仍须用受支持版本的真实实例和响应 fixture 验证: - [Dify Knowledge API](https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-dataset-via-api) - [Dify Retrieve Chunks](https://docs.dify.ai/en/api-reference/knowledge-bases/retrieve-chunks-from-a-knowledge-base-test-retrieval) - [FastGPT 知识库接口](https://doc.fastgpt.io/zh-CN/openapi/dataset) - [RAGFlow HTTP API](https://ragflow.io/docs/dev/http_api_reference) - [RAGFlow Release Notes](https://ragflow.io/docs/dev/release_notes)