【大模型:知识库管理】--Dify接入RAGFlow 知识库

ragflow的官方文档:

HTTP API 接口 |抹布流 --- HTTP API | RAGFlow

接着前文,我们已经创建了知识库,那么如何才能使用它呢?

当然也是通过网络API的形式去调用它。本文将讲解两种方式:

  1. Dify调用
  2. python源码调用

目录

1.创建API-Key

2.DIfy接入ragflow

2.1.确定ragflow的域名

[2.2. 确定IP地址](#2.2. 确定IP地址)

2.3.拼接完整域名

2.4.填写信息

3.聊天测试

4.Python连接ragflow

4.1.知识库管理

4.1.1.创建知识库

4.1.2.删除知识库

4.1.3.列出知识库

4.1.4.更新知识库

4.2.知识库文件管理

4.2.1.上传文件

4.2.2.更新文件

4.2.3.下载文件

4.2.4.列出文件

4.2.5.删除文件

4.2.6.解析文件

4.2.7.停止解析


1.创建API-Key

获取ragflow知识库ID:

2.DIfy接入ragflow

看看官网如何讲解:External Knowledge API - Dify Docs

貌似找不出什么,因为这个节点肯定是由外部知识库定义,只要遵循Dify的端点定义要求就行了,即:url路径中要有一个/retrieval

2.1.确定ragflow的域名

接口是对外提供服务的,是后端服务,所以,他是ragflow-server提供的,我们可以看到,ragflow的容器中,ragflow-server是对外提供服务的,有两种服务:

  • 一个是web网页端口的服务:默认是80端口,为了避免和dify端口冲突,我这里改为了8080端口,还有就是ssl端口443,我这里也改为了4434端口
  • 另一个就是接口服务的端口:9380,这个就是我们的知识库接口对外的服务端口,web前端通过接口提供的服务,与后端进行数据交互

到这里,ragflow的外部知识库接口前面的节点就确定了:http://{你的IP}:9380

2.2. 确定IP地址

由于我们的项目是通过docker启动的,所以,统一使用 host.docker.internal:9380

这里解释一下这个域名:

host.docker.internal 是Docker提供的一种方便的机制,用于在开发和测试环境中从容器访问宿主机的服务。这个名称在Docker Desktop for Windows和Docker Desktop for Mac上是可用的,它允许容器中的应用程序访问宿主机上的服务和端口。

在不同的操作系统(如Windows和Mac)上,宿主机的IP地址可能会有所不同.host.docker.internal 提供了一个统一的名称,使得容器中的配置在不同平台上保持一致。

2.3.拼接完整域名

按照前面一步步推理,理论上来说,一个完整的api节点应该完整了,但是这就够了吗?

我们看下官方文档:

发现每个接口都有个公共前缀:/api/v1

这其实也是绝大多数后端服务的通行做法,加上前面我们拼接处的api节点,现在才算是完整的拼接出了api节点了:http://host.docker.internal:9380/api/v1/dify/retrieval

我们现在可以确定Dify中关于外部知识库的节点定义了,如下图:

http://host.docker.internal:9380/api/v1/difyhttp://host.docker.internal:9380/api/v1/dify

2.4.填写信息

如果配置正确会显示出来。然后链接:

填写刚刚的外部知识库 API

3.聊天测试

创建一个聊天助手测试一下知识库,

4.Python连接ragflow

Python 应用程序接口 |抹布流 --- Python API | RAGFlow

先安装所需要的包:

pip install ragflow-sdk

4.1.知识库管理

4.1.1.创建知识库

python 复制代码
RAGFlow.create_dataset(
    name: str,
    avatar: Optional[str] = None,
    description: Optional[str] = None,
    embedding_model: Optional[str] = "BAAI/bge-large-zh-v1.5@BAAI",
    permission: str = "me", 
    chunk_method: str = "naive",
    pagerank: int = 0,
    parser_config: DataSet.ParserConfig = None
) -> DataSet
​参数​ ​类型​ ​说明​ ​可选值/默认值​
​**​name​(必填)**​ str 数据集的唯一名称(最长128字符,不区分大小写) -
​avatar​ str 头像的Base64编码 默认:None
​description​ str 数据集的简要描述 默认:None
​permission​ str 数据集访问权限 "me"(默认,仅自己可管理),"team"(全体团队成员可管理)
​chunk_method​ str 数据集内容的分块方法 "naive"(默认常规分块)、"manual"(手动)、"qa"(问答)、"table"(表格)、"paper"(论文)、"book"(书籍)、"laws"(法律)、"presentation"(演示文稿)、"picture"(图片)、"one"(单块)、"email"(邮件)、"knowledge-graph"(知识图谱)
​pagerank​ int 数据集的PageRank值(影响排序权重) 默认:0
​parser_config​ dict 解析器配置(根据chunk_method动态变化) 详见下方说明

​parser_config 详细说明(按分块方法)​

​chunk_method​ ​parser_config 配置​
"naive"(常规) {"chunk_token_num":128, "delimiter":"\\n", "html4excel":False, "layout_recognize":True, "raptor":{"use_raptor":False}}
"qa"(问答) {"raptor": {"use_raptor": False}}
"manual"(手动) 同上
"table"(表格) None
"paper"(论文) "qa"
"book"(书籍) "qa"
"laws"(法律) "qa"
"picture"(图片) None
"presentation"(演示) "qa"
"one"(单块) None
"knowledge-graph"(知识图谱) {"chunk_token_num":128, "delimiter":"\\n", "entity_types":["organization","person","location","event","time"]}
"email"(邮件) None

简单的例子:

python 复制代码
from ragflow_sdk import RAGFlow

rag_object = RAGFlow(api_key="***", base_url="http://host.docker.internal:9380")
#创建知识库
dataset = rag_object.create_dataset(name="gyp")

在ragflow网站可以查看到:

4.1.2.删除知识库

python 复制代码
RAGFlow.delete_datasets(ids: list[str] | None = None)

按 ID 删除数据集。

如果为 None,则将删除所有数据集。

id:8b025f18453711f0906f0242ac140004

python 复制代码
#8b025f18453711f0906f0242ac140004
rag_object.delete_datasets(ids=["8b025f18453711f0906f0242ac140004"])

4.1.3.列出知识库

python 复制代码
rag_object.list_datasets(
    page: int = 1, #页码
    page_size: int = 30,#每页数量
    orderby: str = "create_time",#排序字段
    desc: bool = True,#是否降序
    id: str = None,#id
    name: str = None#名称
) -> list[DataSet]

4.1.4.更新知识库

python 复制代码
DataSet.update(update_message: dict)
​参数​ ​类型​ ​说明​ ​约束/可选值​
​update_message​ dict[str, str|int] 包含待更新属性的字典,支持以下键: -
"name" str 数据集的新名称 - 仅限基本多语言平面(BMP)字符<br>- 最长128字符<br>- 不区分大小写
"avatar" str 头像的Base64编码(Body参数) - 最长65535字符
"embedding_model" str 更新的嵌入模型名称(Body参数) - 格式必须为 model_name@model_factory<br>- 最长255字符<br>- 需确保 chunk_count=0 才能更新
"permission" str 数据集权限 "me"(默认,仅自己可管理)<br>"team"(全体团队成员可管理)
"pagerank" int 数据集的PageRank值(影响排序权重) - 默认值:0<br>- 范围:0 ~ 100
"chunk_method" enum<string> 数据集内容的分块方法 "naive"(默认常规)<br>"book"(书籍)<br>"email"(邮件)<br>"laws"(法律)<br>"manual"(手动)<br>"one"(单块)<br>"paper"(论文)<br>"picture"(图片)<br>"presentation"(演示文稿)<br>"qa"(问答)<br>"table"(表格)<br>"tag"(标签)
python 复制代码
from ragflow_sdk import RAGFlow

rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.list_datasets(name="kb_name")
dataset = dataset[0]
dataset.update({"embedding_model":"BAAI/bge-zh-v1.5", "chunk_method":"manual"})

4.2.知识库文件管理

4.2.1.上传文件

python 复制代码
DataSet.upload_documents(document_list: list[dict])#上传文件
python 复制代码
dataset = rag_object.create_dataset(name="kb_name")
dataset.upload_documents([{"display_name": "1.txt", "blob": "<BINARY_CONTENT_OF_THE_DOC>"}, {"display_name": "2.pdf", "blob": "<BINARY_CONTENT_OF_THE_DOC>"}])

"display_name":(可选)要在数据集中显示的文件名。

"blob":(可选)要上传的文件的二进制内容。

4.2.2.更新文件

python 复制代码
from ragflow_sdk import RAGFlow

rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.list_datasets(id='id')
dataset = dataset[0]
doc = dataset.list_documents(id="wdfxb5t547d")
doc = doc[0]
doc.update([{"parser_config": {"chunk_token_count": 256}}, {"chunk_method": "manual"}])

4.2.3.下载文件

python 复制代码
from ragflow_sdk import RAGFlow

rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.list_datasets(id="id")
dataset = dataset[0]
doc = dataset.list_documents(id="wdfxb5t547d")
doc = doc[0]
open("~/ragflow.txt", "wb+").write(doc.download())
print(doc)

4.2.4.列出文件

python 复制代码
from ragflow_sdk import RAGFlow

rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.create_dataset(name="kb_1")

filename1 = "~/ragflow.txt"
blob = open(filename1 , "rb").read()
dataset.upload_documents([{"name":filename1,"blob":blob}])
for doc in dataset.list_documents(keywords="rag", page=0, page_size=12):
    print(doc)

4.2.5.删除文件

python 复制代码
from ragflow_sdk import RAGFlow

rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.list_datasets(name="kb_1")
dataset = dataset[0]
dataset.delete_documents(ids=["id_1","id_2"])

4.2.6.解析文件

python 复制代码
rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.create_dataset(name="dataset_name")
documents = [
    {'display_name': 'test1.txt', 'blob': open('./test_data/test1.txt',"rb").read()},
    {'display_name': 'test2.txt', 'blob': open('./test_data/test2.txt',"rb").read()},
    {'display_name': 'test3.txt', 'blob': open('./test_data/test3.txt',"rb").read()}
]
dataset.upload_documents(documents)
documents = dataset.list_documents(keywords="test")
ids = []
for document in documents:
    ids.append(document.id)
dataset.async_parse_documents(ids)
print("Async bulk parsing initiated.")

4.2.7.停止解析

python 复制代码
rag_object = RAGFlow(api_key="<YOUR_API_KEY>", base_url="http://<YOUR_BASE_URL>:9380")
dataset = rag_object.create_dataset(name="dataset_name")
documents = [
    {'display_name': 'test1.txt', 'blob': open('./test_data/test1.txt',"rb").read()},
    {'display_name': 'test2.txt', 'blob': open('./test_data/test2.txt',"rb").read()},
    {'display_name': 'test3.txt', 'blob': open('./test_data/test3.txt',"rb").read()}
]
dataset.upload_documents(documents)
documents = dataset.list_documents(keywords="test")
ids = []
for document in documents:
    ids.append(document.id)
dataset.async_parse_documents(ids)
print("Async bulk parsing initiated.")
dataset.async_cancel_parse_documents(ids)
print("Async bulk parsing cancelled.")
相关推荐
亿牛云爬虫专家1 小时前
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
分布式·python·架构·kubernetes·爬虫代理·监测·采集
蹦蹦跳跳真可爱5895 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij5 小时前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien5 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt
敲键盘的小夜猫6 小时前
LLM复杂记忆存储-多会话隔离案例实战
人工智能·python·langchain
高压锅_12206 小时前
Django Channels WebSocket实时通信实战:从聊天功能到消息推送
python·websocket·django
胖达不服输8 小时前
「日拱一码」020 机器学习——数据处理
人工智能·python·机器学习·数据处理
吴佳浩8 小时前
Python入门指南-番外-LLM-Fingerprint(大语言模型指纹):从技术视角看AI开源生态的边界与挑战
python·llm·mcp
吴佳浩8 小时前
Python入门指南-AI模型相似性检测方法:技术原理与实现
人工智能·python·llm
叶 落9 小时前
计算阶梯电费
python·python 基础·python 入门