Dify
简体中文
简体中文
  • 入门
    • 欢迎使用 Dify
      • 特性与技术规格
      • 模型供应商列表
    • 云服务
    • 社区版
      • Docker Compose 部署
      • 本地源码启动
      • 宝塔面板部署
      • 单独启动前端 Docker 容器
      • 环境变量说明
      • 常见问题
    • Dify Premium
    • Dify 教育版
  • 手册
    • 接入大模型
      • 增加新供应商
      • 预定义模型接入
      • 自定义模型接入
      • 接口方法
      • 配置规则
      • 负载均衡
    • 构建应用
      • 创建应用
      • 聊天助手
        • 多模型调试
      • Agent
      • 应用工具箱
        • 敏感内容审查
    • 工作流
      • 关键概念
      • 变量
      • 节点说明
        • 开始
        • LLM
        • 知识检索
        • 问题分类
        • 条件分支
        • 代码执行
        • 模板转换
        • 文档提取器
        • 列表操作
        • 变量聚合
        • 变量赋值
        • 迭代
        • 参数提取
        • HTTP 请求
        • Agent
        • 工具
        • 结束
        • 直接回复
        • 循环
      • 快捷键
      • 编排节点
      • 文件上传
      • 异常处理
        • 预定义异常处理逻辑
        • 错误类型
      • 附加功能
      • 预览与调试
        • 预览与运行
        • 单步调试
        • 对话/运行日志
        • 检查清单
        • 运行历史
      • 应用发布
      • 结构化输出
      • 变更公告:图片上传被替换为文件上传
    • 知识库
      • 创建知识库
        • 1. 导入文本数据
          • 1.1 从 Notion 导入数据
          • 1.2 从网页导入数据
        • 2. 指定分段模式
        • 3. 设定索引方法与检索设置
      • 管理知识库
        • 维护知识库内文档
        • 通过 API 维护知识库
      • 元数据
      • 在应用内集成知识库
      • 召回测试/引用归属
      • 知识库请求频率限制
      • 连接外部知识库
      • 外部知识库 API
    • 工具
      • 快速接入工具
      • 高级接入工具
      • 工具配置
        • Google
        • Bing
        • SearchApi
        • StableDiffusion
        • Dall-e
        • Perplexity Search
        • AlphaVantage 股票分析
        • Youtube
        • SearXNG
        • Serper
        • SiliconFlow (支持 Flux 绘图)
        • ComfyUI
    • 发布
      • 发布为公开 Web 站点
        • Web 应用的设置
        • 文本生成型应用
        • 对话型应用
      • 嵌入网站
      • 基于 APIs 开发
      • 基于前端组件再开发
    • 标注
      • 日志与标注
      • 标注回复
    • 监测
      • 集成外部 Ops 工具
        • 集成 LangSmith
        • 集成 Langfuse
        • 集成 Opik
      • 数据分析
    • 扩展
      • API 扩展
        • 使用 Cloudflare Workers 部署 API Tools
        • 敏感内容审查
      • 代码扩展
        • 外部数据工具
        • 敏感内容审查
    • 协同
      • 发现
      • 邀请与管理成员
    • 管理
      • 应用管理
      • 团队成员管理
      • 个人账号管理
      • 订阅管理
      • 版本管理
  • 动手实验室
    • 初级
      • 如何搭建 AI 图片生成应用
      • AI Agent 实战:搭建个人在线旅游助手
    • 中级
      • 使用文件上传搭建文章理解助手
      • 使用知识库搭建智能客服机器人
      • ChatFlow 实战:搭建 Twitter 账号分析助手
  • 社区
    • 寻求支持
    • 成为贡献者
    • 为 Dify 文档做出贡献
  • 插件
    • 功能简介
    • 快速开始
      • 安装与使用插件
      • 插件开发
        • 初始化开发工具
        • Tool 插件
        • Model 插件
          • 创建模型供应商
          • 接入预定义模型
          • 接入自定义模型
        • Agent 策略插件
        • Extension 插件
        • Bundle 插件包
      • 插件调试
    • 插件管理
    • 接口定义
      • Manifest
      • Endpoint
      • Tool
      • Agent
      • Model
        • 模型设计规则
        • 模型接口
      • 通用规范定义
      • 持久化存储
      • 反向调用 Dify 服务
        • App
        • Model
        • Tool
        • Node
    • 最佳实践
      • 开发 Slack Bot 插件
      • Dify MCP 插件指南:一键连接 Zapier 并自动发送邮件
    • 发布插件
      • 自动发布插件
      • 发布至 Dify Marketplace
        • 插件开发者准则
        • 插件隐私政策准则
      • 发布至个人 GitHub 仓库
      • 本地发布与分享
      • 第三方签名验证
    • 常见问题
  • 研发
    • 后端
      • DifySandbox
        • 贡献指南
    • 模型接入
      • 接入 Hugging Face 上的开源模型
      • 接入 Replicate 上的开源模型
      • 接入 Xinference 部署的本地模型
      • 接入 OpenLLM 部署的本地模型
      • 接入 LocalAI 部署的本地模型
      • 接入 Ollama 部署的本地模型
      • 接入 LiteLLM 代理的模型
      • 接入 GPUStack 进行本地模型部署
      • 接入 AWS Bedrock 上的模型(DeepSeek)
    • 迁移
      • 将社区版迁移至 v1.0.0
  • 阅读更多
    • 应用案例
      • DeepSeek 与 Dify 集成指南:打造具备多轮思考的 AI 应用
      • 本地私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手
      • 如何训练出专属于“你”的问答机器人?
      • 教你十几分钟不用代码创建 Midjourney 提示词机器人
      • 构建一个 Notion AI 助手
      • 如何在几分钟内创建一个带有业务数据的官网 AI 智能客服
      • 使用全套开源工具构建 LLM 应用实战:在 Dify 调用 Baichuan 开源模型能力
      • 手把手教你把 Dify 接入微信生态
      • 使用 Dify 和 Twilio 构建 WhatsApp 机器人
      • 将 Dify 应用与钉钉机器人集成
      • 使用 Dify 和 Azure Bot Framework 构建 Microsoft Teams 机器人
      • 如何让 LLM 应用提供循序渐进的聊天体验?
      • 如何将 Dify Chatbot 集成至 Wix 网站?
      • 如何连接 AWS Bedrock 知识库?
      • 构建 Dify 应用定时任务助手
      • 如何在 Dify 内体验大模型“竞技场”?以 DeepSeek R1 VS o1 为例
      • 在 Dify 云端构建 AI Thesis Slack Bot
      • 将 Dify 快速接入 QQ、微信、飞书、钉钉、Telegram、Discord 等平台
    • 扩展阅读
      • 什么是 LLMOps?
      • 什么是数组变量?
      • 检索增强生成(RAG)
        • 混合检索
        • 重排序
        • 召回模式
      • 提示词编排
      • 如何使用 JSON Schema 让 LLM 输出遵循结构化格式的内容?
    • 常见问题
      • 本地部署
      • LLM 配置与使用
      • 插件
  • 政策
    • 开源许可证
    • 用户协议
      • 服务条款
      • 隐私政策
      • 获取合规报告
Powered by GitBook
On this page
  • 关联知识库并指定召回模式
  • 使用元数据筛选知识
  1. 手册
  2. 知识库

在应用内集成知识库

Previous元数据Next召回测试/引用归属

Last updated 3 months ago

知识库可以作为外部知识提供给大语言模型用于精确回复用户问题,你可以在 Dify 的内关联已创建的知识库。

以聊天助手为例,使用流程如下:

  1. 进入 工作室 -- 创建应用 --创建聊天助手

  2. 进入 上下文设置 点击 添加 选择已创建的知识库

  3. 在 上下文设置 -- 参数设置 内配置召回策略

  4. 在 元数据筛选 板块中配置元数据的筛选条件,使用元数据功能筛选知识库内的文档

  5. 前往知识库 -- 创建知识库 -- 上传文件

  6. 在 添加功能 内打开 引用和归属

  7. 在 调试与预览 内输入与知识库相关的用户问题进行调试

  8. 调试完成之后保存并发布为一个 AI 知识库问答类应用


关联知识库并指定召回模式

如果当前应用的上下文涉及多个知识库,需要设置召回模式以使得检索的内容更加精确。进入 上下文 -- 参数设置 -- 召回设置。

召回设置

检索器会在所有与应用关联的知识库中去检索与用户问题相关的文本内容,并将多路召回的相关文档结果合并,以下是召回策略的技术流程图:

根据用户意图同时检索所有添加至 “上下文” 的知识库,在多个知识库内查询相关文本片段,选择所有和用户问题相匹配的内容,最后通过 Rerank 策略找到最适合的内容并回答用户。该方法的检索原理更为科学。

举例:A 应用的上下文关联了 K1、K2、K3 三个知识库,当用户输入问题后,将在三个知识库内检索并汇总多条内容。为确保能找到最匹配的内容,需要通过 Rerank 策略确定与用户问题最相关的内容,确保结果更加精准与可信。

考虑到 Rerank 的使用成本和业务需求,多路召回模式提供了以下两种 Rerank 设置:

权重设置

该设置无需配置外部 Rerank 模型,重排序内容无需额外花费。可以通过调整语义或关键词的权重比例条,选择最适合的内容匹配策略。

  • 语义值为 1

    仅启用语义检索模式。借助 Embedding 模型,即便知识库中没有出现查询中的确切词汇,也能通过计算向量距离的方式提高搜索的深度,返回正确内容。此外,当需要处理多语言内容时,语义检索能够捕捉不同语言之间的意义转换,提供更加准确的跨语言搜索结果。

  • 关键词值为 1

    仅启用关键词检索模式。通过用户输入的信息文本在知识库全文匹配,适用于用户知道确切的信息或术语的场景。该方法所消耗的计算资源较低,适合在大量文档的知识库内快速检索。

  • 自定义关键词和语义权重

    除了仅启用语义检索或关键词检索模式,我们还提供了灵活的自定义权重设置。你可以通过不断调试二者的权重,找到符合业务场景的最佳权重比例。

Rerank 模型

Rerank 模型是一种外部评分系统,它会计算用户问题与给定的每个候选文档之间的相关性分数,从而改进语义排序的结果,并按相关性返回从高到低排序的文档列表。

虽然此方法会产生一定的额外花费,但是更加擅长处理知识库内容来源复杂的情况,例如混合了语义查询和关键词匹配的内容,或返回内容存在多语言的情况。

Dify 目前支持多个 Rerank 模型,进入 “模型供应商” 页填入 Rerank 模型(例如 Cohere、Jina AI 等模型)的 API Key。

可调参数

  • TopK

    用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小,动态调整分段数量。数值越高,预期被召回的文本分段数量越多。

  • Score 阈值

    用于设置文本片段筛选的相似度阈值。向量检索的相似度分数需要超过设置的分数后才会被召回,数值越高,预期被召回的文本数量越少。

使用元数据筛选知识

聊天流/工作流

在 聊天流/工作流 的 知识检索 节点中,你可以使用 元数据筛选 功能精确检索文档。该功能有助于你根据文档的元数据字段(如标签、类别或访问权限)优化检索结果。

配置步骤

  1. 选择筛选模式

    • 禁用模式(默认):禁用 元数据筛选 功能,不配置任何筛选条件。

    • 自动模式:系统会根据传输给该 知识检索 节点的 查询变量 自动配置筛选条件,适用于简单的筛选需求。

    启用自动模式后,你依然需要在 模型 栏中选择合适的大模型以执行文档检索任务。

    • 手动模式:用户可以手动配置筛选条件,自由设置筛选规则,适用于复杂的筛选需求。

  1. 如果你选择了 手动模式,请参照以下步骤配置筛选条件:

    1. 点击 条件 按钮,弹出配置框。

    1. 点击配置框中的 +添加条件 按钮:

      • 可以从下拉列表中选择一个已选中知识库内的元数据字段,添加到筛选条件列表中。

      如果你同时选择了多个知识库,下拉列表只会显示这些知识库共有的元数据字段。

      • 可以在 搜索元数据 搜索框中搜索你需要的字段,添加到筛选条件列表中。

    1. 如果需要添加多条字段,可以重复点击 +添加条件 按钮。

    1. 配置字段类型的筛选条件:

    字段类型
    筛选条件
    筛选条件说明与示例

    字符串

    is

    字段的值必须与你输入的值完全匹配。例如,如果你设置筛选条件为 is "Published",则只会返回标记为“Published”的文档。

    is not

    字段的值不能与你输入的值匹配。例如,如果你设置筛选条件为 is not "Draft",则会返回所有未标记为“Draft”的文档。

    is empty

    字段的值为空。如果你配置了此条件,可以检索到未标记该字符串的文档。

    is not empty

    字段的值不为空。如果你配置了此条件,可以检索到标记了该字符串的文档。

    contains

    字段的值包含你输入的文本。例如,如果你设置筛选条件为 contains "Report",则会返回所有包含“Report”的文档,如“Monthly Report”或“Annual Report”。

    not contains

    字段的值不包含你输入的文本。例如,如果你设置筛选条件为 not contains "Draft",则会返回所有不包含"Draft"的文档。

    starts with

    字段的值以你输入的文本开头。例如,如果你设置筛选条件为 starts with "Doc",则会返回所有以“Doc”开头的文档,如“Doc1”、“Document”等。

    ends with

    字段的值以你输入的文本结尾。例如,如果你设置筛选条件为 ends with "2024",则返回所有以"2024"结尾的文档,如“Report 2024”、“Summary 2024”等。

    数字

    =

    字段的值必须等于你输入的数字。例如,= 10 会匹配所有数字标记为 10 的文档。

    ≠

    字段的值不能等于你输入的数字。例如,≠ 5 会返回所有数字未标记为 5 的文档。

    >

    字段的值必须大于你输入的数字。例如,> 100 会返回所有数字标记为大于 100 的文档。

    <

    字段的值必须小于你输入的数字。例如,< 50 会返回所有数字标记为小于 50 的文档。

    ≥

    字段的值必须大于或等于你输入的数字。例如,≥ 20 会返回所有数字标记为大于或等于 20 的文档。

    ≤

    字段的值必须小于或等于你输入的数字。例如,≤ 200 会返回所有数字标记为小于或等于 200 的文档。

    is empty

    字段未设置值。例如,is empty 会返回所有该字段未标记数字的文档。

    is not empty

    字段已设置值。例如,is not empty 会返回所有该字段已标记数字的文档。

    时间

    is

    字段的时间值必须与你选择的时间完全匹配。例如,is "2024-01-01" 只会返回标记为 2024 年 1 月 1 日的文档。

    before

    字段的时间值必须早于你选择的时间。例如,before "2024-01-0" 会返回所有标记为 2024 年 1 月 1 日之前的文档。

    after

    字段的时间值必须晚于你选择的时间。例如,after "2024-01-01" 会返回所有标记为 2024 年 1 月 1 日之后的文档。

    is empty

    字段的时间值为空。如果你配置了此条件,可以检索到未标记该时间信息的文档。

    is not empty

    字段的时间值不为空。如果你配置了此条件,可以检索到标记了该时间信息的文档。

    1. 选择并添加元数据筛选值:

      • 变量:选择 变量(Variable),并选择该聊天流/工作流中需要用于筛选文档的变量。

      • 常量:选择 常量(Constant),并手动输入你需要的常量值。

      时间 字段类型仅支持使用常量筛选文档。如果你选用时间字段筛选文档,系统会弹出时间选择器,供你选择具体的时间节点。

    当你输入常量筛选值时,该筛选值必须与该元数据字段值的文本完全一致,系统才能返回该文档。例如,当你设置筛选条件为 starts with "App" 或 contains "App" 时,系统会返回标记为 “Apple” 的文档,但不会返回标记为 “apple” 或 “APPLE” 的文档。

    1. 配置筛选条件之间的逻辑关系 AND 或 OR。

      • AND:当一个文档满足所有筛选条件时,才能检索到该文档。

      • OR:只要一个文档满足其中任意一个筛选条件,就可以检索到该文档。

    1. 关闭弹窗,系统将自动保存你的选择。

    聊天助手

    在聊天助手中,元数据筛选 功能位于界面左下方的 上下文 板块下方,配置方法与聊天流/工作流中的操作一致。你可以按照相同的步骤配置元数据筛选条件。

    在知识库内查看已关联的应用

    知识库将会在左侧信息栏中显示已关联的应用数量。将鼠标悬停至圆形信息图标时将显示所有已关联的 Apps 列表,点击右侧的跳转按钮即可快速查看对应的应用。

    常见问题

    1. 如何选择多路召回中的 Rerank 设置?

    如果用户知道确切的信息或术语,可以通过关键词检索精确发挥匹配结果,那么请将 “权重设置” 中的关键词设置为 1。

    如果知识库内并未出现确切词汇,或者存在跨语言查询的情况,那么推荐使用 “权重设置” 中的语义设置为 1。

    如果业务人员对于用户的实际提问场景比较熟悉,想要主动调整语义或关键词的比值,那么推荐自行调整 “权重设置” 里的比值。

    如果知识库内容较为复杂,无法通过语义或关键词等简单条件进行匹配,同时要求较为精准的回答,愿意支付额外的费用,那么推荐使用 Rerank 模型 进行内容检索。

    1. 为什么会出现找不到 “权重设置” 或要求必须配置 Rerank 模型等情况,应该如何处理?

    以下是知识库检索方式对文本召回的影响情况:

    1. 引用多个知识库时,无法调整 “权重设置”,提示错误应如何处理?

    出现此问题是因为上下文内所引用的多个知识库内所使用的嵌入模型(Embedding)不一致,为避免检索内容冲突而出现此提示。推荐设置在“模型供应商”内设置并启用 Rerank 模型,或者统一知识库的检索设置。

    1. 为什么在应用内的知识库设置内找不到“权重设置”选项,只能看到 Rerank 模型?

    请检查你的知识库是否使用了“经济”型索引模式。如果是,那么将其切换为“高质量”索引模式。

在实际问答场景中,每个知识库的内容来源和检索方式可能都有所差异。针对检索返回的多条混合内容,是一个更加科学的内容排序机制。它可以帮助确认候选内容列表与用户问题的匹配度,改进多个知识间排序的结果以找到最匹配的内容,提高回答质量和用户体验。

语义检索指的是比对用户问题与知识库内容中的向量距离。距离越近,匹配的概率越大。参考阅读:。

点击了解更多机制。

Model Selection
Filter mode
Conditions
Add Condition
Add more fields
Variable
Date picker
Logic
Chatbot
查看已关联的应用
Rerank 策略
《Dify:Embedding 技术与 Dify 知识库设计/规划》
重排序
所有应用类型
在模型供应商内配置 Rerank 模型