
1. Dify安装与部署(Linux系统使用Docker)
1.1 安装Docker
首先,确保你的Linux系统中已安装Docker。如果未安装,可以通过以下命令安装Docker:
# 更新apt索引
sudo apt-get update
# 安装Docker依赖
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加Docker的GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker CE(社区版)
sudo apt-get update
sudo apt-get install docker-ce
# 启动Docker并验证
sudo systemctl start docker
sudo systemctl enable docker
docker --version
1.2 安装Docker Compose(如果需要)
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 检查安装是否成功
docker-compose --version
1.3 拉取Dify镜像并启动容器
# 拉取Dify镜像
docker pull dify/dify
# 启动Dify容器(你可以自定义端口等配置)
docker run -d -p 8000:8000 dify/dify
# 验证是否启动成功
docker ps
部署完dify,页面如下,有探索、工作室、知识库及工具

2. 搭建知识库
Dify支持多种格式的数据导入,尤其适用于结构化数据和非结构化数据。

2.1 上传与管理数据
你可以通过Dify的Web界面上传不同格式的文件,包括:
结构化数据:如Excel、CSV、数据库(MySQL、PostgreSQL等)。
非结构化数据:如PDF、PPT、Word文件、科学文献(Sci)、实验数据、文本资料等。

2.1.1 上传文件
在Dify的后台管理界面,进入知识库管理页面,选择“上传文件”,并选择你需要导入的文件(如PDF、PPT、Word等格式的文件)。系统将自动提取文本内容并将其结构化存储在数据库中。

2.1.2 处理结构化数据(Excel、CSV等)
通过Dify提供的数据导入工具,将Excel或CSV文件上传至系统,系统会自动识别并映射数据字段,将其保存为结构化数据,便于后续查询和分析。一般可以直接对文档进行拖拽拉取上传。

导入文件后,会有一个配置选项,需要勾选下,使用默认的方式,上传是最快的,如果让其自动分段,可以先预览下,有些QA文档是AI自动截取的,非结构化数据按照一定的文字段落并会直接截取,导致语义不通,牛头不对马嘴。所以推荐,最好的方式是自己先对语料文档进行预处理,上传速度也会变快。

并且需要修改检索设置,一般选用混合检索、Rerank模型
上传成功的话,可以点开看,每份文档的具体信息
在知识库的构建过程中,分块和结构化的实现依赖于多个步骤,包括:
-
文本提取:通过Python中的PyPDF2、python-docx等库提取文档中的文本。
-
分块:通过NLP技术将文档按句子、段落或语义进行分块。
-
结构化:通过实体识别、关系抽取等技术提取关键信息,并存储到数据库或知识图谱中。
这种流程大多是通过编写代码实现的,结合了自然语言处理和数据库技术,使得文档中包含的知识可以转化为结构化的数据,方便后续的查询、分析和应用。
2.1.3 导入数据库数据
对于已有的数据库(如MySQL、PostgreSQL等),你可以配置数据库连接,Dify会定期同步并更新数据库中的数据,保持知识库内容的实时更新。
2.1.4 处理PDF、Word等非结构化数据
Dify通过内置的文档解析工具,将PDF、Word等文档中的文本内容提取并进行自然语言处理(NLP),以便将非结构化内容转化为结构化数据,便于查询。如考虑到内存问题,建议可以对文档进行预加工,变成.md或者.txt的格式进行上传。或转成QA对的形式,也可最大程度的保留语料的综合信息
class DocumentProcessor:
"""处理不同类型文档并提取文本内容"""
@staticmethod
def extract_from_pdf(file_path):
"""提取PDF文件内容,保留结构信息"""
try:
# 清理文件路径
clean_path = clean_filename(file_path)
logger.info(f"处理PDF文件: {
clean_path}")
doc = fitz.open(file_path)
# 提取元数据
metadata = doc.metadata
metadata_text = "\n".join([f"{
key}: {
value}" for key, value in metadata.items() if value])
# 提取目录结构
toc = doc.get_toc()
toc_text = ""
if toc:
toc_text = "文档目录结构:\n" + "\n".join([f"{
' ' * (level-1)}● {
title} (页码: {
page})" for level, title, page in toc])
# 提取文本内容(按页处理)
pages_text = []
for page_num in range(len(doc)):
page = doc.load_page(page_num)
page_text = f"【第{
page_num+1}页】\n"
# 尝试提取表格
try:
tables = page.find_tables()
if tables and hasattr(tables, 'tables') and len(tables.tables) > 0:
for table_num, table in enumerate(tables.tables):
page_text += f"【表格{
table_num+1}】\n"
if hasattr(table, 'rows'):
for row in table.rows:
try:
row_items =

最低0.47元/天 解锁文章
6458





