1、知识库
大多数语言模型采用较为陈旧的训练数据,并且对每次请求的上下文有长度限制。例如 GPT-3.5 是基于 2021 年的语料进行训练的,且有每次约 4K Token 的限制。这意味着开发者如果想让 AI 应用基于最新的、私有的上下文对话,必须使用类似嵌入(Embedding)之类的技术。
Dify 的数据集功能可以使开发者(甚至非技术人员)以简单的方式管理数据集,并自动集成至 AI 应用中。你只需准备文本内容,例如:
长文本内容(TXT、Markdown、DOCX、HTML、JSONL 甚至是 PDF 文件)
结构化数据(CSV、Excel 等)
另外,我们正在逐步支持从诸多数据源同步数据至数据集,包括:
网页
Notion
Github
数据库
……
情景:如果你的公司想基于现有知识库和产品文档建立一个 AI 客服助手,你可以在 Dify 中将文档上传至数据集,并建立一个对话型应用。这在过去可能需要花费你数周的时间,且难以持续维护。
数据集与文档
在 Dify 中,**数据集(Knowledge)是一些文档(Documents)**的集合。一个数据集可以被整体集成至一个应用中作为上下文使用。文档可以由开发者或运营人员上传,或由其它数据源同步(通常对应数据源中的一个文件单位)。
上传文档的步骤:
上传你的文件,通常是长文本文件或表格文件。
分段、清洗并预览
由 Dify 提交至 LLM 供应商嵌入为向量数据,并存储
为文档设置元数据
可以在应用中使用了🎉!
创建数据集
在 Dify 主导航栏中点击数据集,在该页面你可以看到已有的数据集。你可以点击创建数据集进入创建向导:
如果你已经准备好了文件,可以从上传文件开始
如果你还没有准备好文档,可以先创建一个空数据集
如果你在创建数据集时选择了使用外部数据源,该数据集的类型不可更改。这是为了防止单一数据集存在多数据源而造成的管理困难。如果你需要使用多个数据源,建议创建多个数据集。
编辑良好的数据集描述
当一个应用中引用多个数据集时,AI 会根据用户的提问和数据集的描述来决定使用哪个数据集来回答用户的问题。因此,良好的数据集描述能提升 AI 选择数据集的准确率。
编写良好的数据集描述的要点是写清楚数据集包含的内容和特点。数据集的描述建议以这个开头:仅当你想要回答的问题是关于以下内容时有用:具体描述。一个房地产数据集的描述:
仅当你想要回答的问题是关于以下内容时有用: 2010 年到 2020
年的全球房地产市场数据。这些数据包括每个城市的平均房价、房产销售量、房屋类型等信息。此外,该数据集还包括了一些经济指标,如
GDP、失业率等,以及一些社会指标,如人口数量、教育水平等,这些指标可以帮助分析房地产市场的趋势和影响因素。
通过这些数据,我们可以了解全球房地产市场的发展趋势,分析各个城市的房价变化,以及了解经济和社会因素对房地产市场的影响。
上传文档
选择你要上传的文件,支持批量上传;
预览全文;
进行分段和清洗;
等待 Dify 为你处理这些数据,通常该步骤在 LLM 供应商中需要消耗 Token。
文本分段与清洗
文本数据的分段与清洗是指 Dify 自动将你的数据进行段落分段 & 向量化处理,使得用户的提问(输入)能匹配到相关的文本段落(Q to P),最后输出结果。
上传一个数据集的文档,你需要选择文本的索引方式来指定数据的匹配方式。这会影响到 AI 在回复问题时的准确度。
高质量模式下,将调用 OpenAI 的嵌入接口进行处理,以在用户查询时提供更高的准确度。
经济模式下,会使用关键词索引方式,降低了准确度但无需花费 Token。
Q&A 分段模式下,Q&A 分段模式功能,与上述普通的「Q to P」(问题匹配文本段落)匹配模式不同,它是采用「Q to Q」(问题匹配问题)匹配工作,在文档经过分段后,经过总结为每一个分段生成 Q&A 匹配对,当用户提问时,系统会找出与之最相似的问题,然后返回对应的分段作为答案。这种方式更加精确,因为它直接针对用户问题进行匹配,可以更准确地获取用户真正需要的信息。
问题文本是具有完整语法结构的自然语言,而不是文档检索任务中的一些关键字,所以 Q to Q (问题匹配问题)的模式会令语意和匹配更加清晰,并同时满足一些高频和高相似度问题的提问场景。
对文档进行修改
由于技术原因,如果开发者对文档进行以下修改,Dify 会为你创建一个新的文档,而旧的文档会被存档和停用:
- 调整分段和清洗设置
- 重新上传文件
我们支持对分段与清洗后的文本进行自定义增删改,你可以动态调整自己的分段信息,让你的数据集更加精准。通过点击数据集中 文档 --> 段落 --> 编辑 可修改段落内容以及自定义关键词。通过点击 文档 --> 段落–> 添加分段–>添加新分段 可手动添加新的分段内容,也可以点击 文档 --> 段落–> 添加分段–>批量添加 批量上传新的分段内容。
文档的禁用和归档
禁用、取消禁用:数据集支持将暂时不想被索引的文档或分段进行禁用,在数据集文档列表,点击禁用按钮,则文档被禁用;也可以在文档详情,点击禁用按钮,禁用整个文档或某个分段,禁用的文档将不会被索引。禁用的文档点击启用,可以取消禁用。
归档、取消归档:一些不再使用的旧文档数据,如果不想删除可以将它进行归档,归档后的数据就只能查看或删除,不可以进行编辑。在数据集文档列表,点击归档按钮,则文档被归档,也可以在文档详情,归档文档。归档的文档将不会被索引。归档的文档也可以点击撤销归档。
通过 API 维护数据集
TODO
数据集设置
在数据集的左侧导航中点击设置,你可以改变数据集的以下设置项:
数据集名称,用于识别一个数据集。
数据集描述,能够让 AI 更好的适时取用数据集,如果描述为空则会使用 Dify 的自动索引策略
权限,可选择 只有我 或 所有团队成员,不具有权限的人将无法查阅和编辑数据集。
修改索引模式。注意:索引模式如果从经济升级为高质量会带来额外的 Token 消耗。而从高质量降级为经济则不会消耗 Token。
集成至应用
数据集准备完成后需集成到应用中,当 AI 应用处理用户请求时,会自动将与之关联的数据集内容作为上下文参考。
进入应用 - 提示词编排页面
在上下文选项中,选择需要集成的数据集
保存设置以完成集成
Q&A
Q: 上传 PDF 解析乱码怎么办?
A: 如果你的 PDF 在特定格式内容下解析出现乱码的情况,可以考虑将 PDF 转成 Markdown 格式,或目前 Markdown 的准确度会更高,或减少 PDF 内的图片、表格等格式内容。对于 PDF 的使用体验我们正在研究优化方案。
2、从 Notion 导入数据
Dify 数据集支持从 Notion 导入,并设置 同步 使得数据在 Notion 更新后便自动同步到 Dify。
授权验证
在创建数据集,选择数据源时,点击 同步自 Notion 内容-- 去绑定,根据提示完成授权验证。
你也可以:进入 设置 – 数据来源 – 添加数据源 中点击 Notion 来源 绑定 ,完成授权验证。
导入 Notion 数据
完成验证授权后,进入创建数据集页面,点击 **同步自 Notion 内容 ,**选择需要的授权页面进行导入。
进行分段和清洗
接下来,选择你的分段设置和索引方式,保存并处理。等待 Dify 为你处理这些数据,通常该步骤在 LLM 供应商中需要消耗 Token。Dify 不仅支持普通类型页面导入,并且会将 database 类型下的页面属性进行汇总保存。
请注意:图片和文件暂不支持导入,表格类数据会被转换为文本展示。
同步 Notion 数据
如果您的 Notion 内容有修改,您可以直接在 Dify 数据集 文档列表页中点击 同步 即可进行数据一键同步,该步骤是需要消耗 Token。
社区版 Notion 的集成配置方法
Notion集成分为内部集成(internal integration)和外部集成(public integration)两种方式。可按需在 Dify 里配置。两种集成方式的具体区别请参阅 Notion 官方文档。
1、使用 internal 集成方式
首先,在集成的设置页面中创建集成。默认情况下,所有集成都以内部集成开始;内部集成将与您选择的工作区相关联,因此您需要是工作区所有者才能创建集成。
具体操作步骤:
点击“New integration”按钮,类型默认是 Internal(不可修改),选择关联的空间,输入集成名称并上传 logo 后,点击“Submit”,集成创建成功。
创建集成后,您可以根据需要在 Capabilities 选项卡下更新其设置,并在 Secrets 下点击 “Show” 按钮然后复制 Secrets。
复制后回到 Dify 源代码下,在 .env 文件里配置相关环境变量,环境变量如下:
NOTION_INTEGRATION_TYPE = internal or NOTION_INTEGRATION_TYPE = public
NOTION_INTERNAL_SECRET=you-internal-secret
2、使用 Public 集成方式
需要将 internal 集成升级为 public 集成,导航到集成的 Distribution 页面,然后切换开关以公开集成。将开关切换到公共设置,您需要在下面的 Organization Information 表单中填写其他信息,包括您的公司名称、网站和重定向 URL 等信息,然后点击“Submit”按钮。
在集成的设置页面中成功公开集成后,您将能够在密钥选项卡中访问集成的密钥:
回到 Dify 源代码下,在 .env 文件里配置相关环境变量,环境变量如下:
NOTION_INTEGRATION_TYPE=public
NOTION_CLIENT_SECRET=you-client-secret
NOTION_CLIENT_ID=you-client-id
配置完成后,即可在数据集中操作 Notion 的数据导入及同步功能。
3、通过 API 维护数据集
鉴权、调用方式与应用 Service API 保持一致,不同的是一个数据集 API token 可操作所有数据集
使用数据集API的优势
将您的数据系统同步至 Dify 数据集,创建强大的工作流程。
提供数据集列表,文档列表及详情查询,方便构建您自己的数据管理页。
同时支持纯文本和文件两种上传和更新文档的接口,并支持分段级的批量新增和修改,便捷您的同步方式。
减少文档手动处理同步的时间,提高您对 Dify 的软件和服务的可见性。
如何使用
进入数据集页面,你可以在左侧的导航中切换至 API 页面。在该页面中你可以查看 Dify 提供的数据集 API 文档,并可以在 API 密钥 中管理可访问数据集 API 的凭据。
API 调用示例
创建空数据集
仅用来创建空数据集
curl --location --request POST 'https://api.dify.ai/v1/datasets' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "name"}'
数据集列表
curl --location --request GET 'https://api.dify.ai/v1/datasets?page=1&limit=20' \
--header 'Authorization: Bearer {api_key}'
通过文本创建文档
curl --location --request POST '<https://api.dify.ai/v1/datasets/<uuid:dataset_id>/document/create_by_text>' \\
--header 'Authorization: Bearer {api_key}' \\
--header 'Content-Type: application/json' \\
--data-raw '{
"name": "Dify",
"text": "Dify means Do it for you...",
"indexing_technique": "high_quality",
"process_rule": {
"rules": {
"pre_processing_rules": [{
"id": "remove_extra_spaces",
"enabled": true
}, {
"id": "remove_urls_emails",
"enabled": true
}],
"segmentation": {
"separator": "###",
"max_tokens": 500
}
},
"mode": "custom"
}
}'
通过文件创建文档
curl --location POST 'https://api.dify.ai/v1/datasets/{dataset_id}/document/create_by_file' \
--header 'Authorization: Bearer {api_key}' \
--form 'data="{
"name": "Dify",
"indexing_technique": "high_quality",
"process_rule": {
"rules": {
"pre_processing_rules": [{
"id": "remove_extra_spaces",
"enabled": true
}, {
"id": "remove_urls_emails",
"enabled": true
}],
"segmentation": {
"separator": "###",
"max_tokens": 500
}
},
"mode": "custom"
}
}";
type=text/plain' \
--form 'file=@"/path/to/file"'
获取文档嵌入状态(进度)
curl --location --request GET 'https://api.dify.ai/v1/datasets/{dataset_id}/documents/{batch}/indexing-status' \
--header 'Authorization: Bearer {api_key}'
删除文档
curl --location --request DELETE 'https://api.dify.ai/v1/datasets/{dataset_id}/documents/{document_id}' \
--header 'Authorization: Bearer {api_key}'
数据集文档列表
curl --location --request GET 'https://api.dify.ai/v1/datasets/{dataset_id}/documents' \
--header 'Authorization: Bearer {api_key}'
新增分段
curl 'https://api.dify.ai/v1/datasets/aac47674-31a8-4f12-aab2-9603964c4789/documents/2034e0c1-1b75-4532-849e-24e72666595b/segment' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw $'"chunks":[
{"content":"Dify means Do it for you",
"keywords":["Dify","Do"]
}
]'
--compressed
错误信息
document_indexing,文档索引失败
provider_not_initialize, Embedding 模型未配置
not_found,文档不存在
dataset_name_duplicate ,数据集名称重复
provider_quota_exceeded,模型额度超过限制
dataset_not_initialized,数据集还未初始化
unsupported_file_type,不支持的文件类型
目前只支持:txt, markdown, md, pdf, html, htm, xlsx, docx, csv
too_many_files,文件数量过多,暂时只支持单一文件上传
file_too_large,文件太大,支持15M以下
4、外部数据工具
功能介绍
此前 功能允许开发者可以直接上传各类格式的长文本、结构化数据来构建数据集,使 AI 应用基于用户上传的最新上下文进行对话。
而本次更新的外部数据工具赋能开发者可以使用自有的搜索能力或内部知识库等外部数据作为 LLM 的上下文,通过 API 扩展的方式实现外部数据的获取并嵌入提示词。相比在云端上传数据集,使用外部数据工具可以在保障私有数据安全,自定义搜索,获取实时数据等方面有显著优势。
具体实现
当终端用户向对话系统提出请求时,平台后端会触发外部数据工具(即调用自己的 API),它会查询用户问题相关的外部信息,如员工资料、实时记录等,通过 API 返回与当前请求相关的部分。平台后端会将返回的结果组装成文本作为上下文注入到提示词中,以输出更加个性化和符合用户需求的回复内容。
操作说明
- 在使用外部数据工具之前,你需要准备一个 API 和用于鉴权的 API Key,请阅读
- Dify 提供了集中式的 API 管理,在设置界面统一添加 API 扩展配置后,即可在 Dify 上的各类应用中直接使用。
- 我们以“查询天气”为例,在“新增基于 API 的扩展”对话框输入名字,API 端点,API Key。保存后我们就可以调用 API 了。
4. 在提示词编排页面,点击“工具”右侧的“+添加”按钮,在打开的“添加 工具”对话框,填写名称和变量名称(变量名称会被引用到提示词中,请填写英文),以及选择第 2 步中已经添加的基于 API 的扩展。
- 这样,我们在提示词编排框就可以把查询到的外部数据拼装到提示词中。比如我们要查询今天的伦敦天气,可以添加location 变量,输入"London",结合外部数据工具的扩展变量名称weather_data,调试输出如下:
在对话日志中,我们也可以看到 API 返回的实时数据: