diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..5b50e58
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,201 @@
+
+

+
+
+
+

+

+
+
+
+
+
+---
+
+## 🌟 简介
+
+Ragflow-Plus 是一个基于 Ragflow 的二次开发项目,目的是解决实际应用中的一些问题,主要有以下特点:
+
+- 管理模式
+额外搭建后台管理系统,支持管理员执行用户管理、团队管理、配置管理、文件管理、知识库管理等功能
+- 权限回收
+前台系统对用户权限进行收缩,进一步简化界面
+- 解析增强
+使用MinerU替代DeepDoc算法,使文件解析效果更好,并支持图片解析
+- 图文输出
+支持模型在回答时,输出引用文本块关联的相关图片
+- 文档撰写模式
+支持全新的文档模式交互体验
+
+视频演示及操作教程:
+
+[](https://www.bilibili.com/video/BV1UJLezaEEE)
+
+> [!NOTE]
+> 视频中采用了vllm作为演示示例,vllm默认拉取使用的模型是float16精度,导致众多用户因显存不足无法正常使用,因此将vllm容器进行注释,除非对vllm比较了解,否则建议使用ollama进行配置。
+
+ollama 配置方式:
+
+以配置`bge-m3`模型为例:
+
+下载模型:
+```c
+ollama pull bge-m3:latest
+```
+
+前台添加时,模型名称设为`bge-m3`,模型地址设为`http://host.docker.internal:11434`
+
+
+## 🚧绕路提醒
+
+请注意:
+
+1. 本项目重构了多处ragflow的底层接口,不建议和原始ragflow项目同时使用,存在冲突风险。
+
+ 如果只需要后台的用户/团队管理部分,可修改`web/.env`中`RAGFLOWPLUS_MANAGEMENT_WEB_IMAGE`和`RAGFLOWPLUS_MANAGEMENT_SERVER_IMAGE`的版本为 v0.1.2
+
+2. 本项目专注RAG,移除Agent的部分,如有Agent需求,请绕路。
+
+3. 本项目重写了文件解析模块(embedding模型固定为bge-m3),如需原本DeepDoc分块、知识图谱功能,请绕路。
+
+4. 本项目为ragflow(v0.17.2)版本的独立分支,不会完全按照ragflow的内容进行更新。
+
+## 📥使用方式
+
+#### 1. 使用Docker Compose运行
+
+- 使用GPU运行(需保证首张显卡有6GB以上剩余显存):
+
+ 1. 在宿主机安装nvidia-container-runtime,让 Docker 自动挂载 GPU 设备和驱动:
+
+ ```bash
+ sudo apt install -y nvidia-container-runtime
+ ```
+
+ 2. 在项目根目录下执行
+
+ ```bash
+ docker compose -f docker/docker-compose_gpu.yml up -d
+ ```
+
+- 使用CPU运行:
+
+ 在项目根目录下执行
+
+ ```bash
+ docker compose -f docker/docker-compose.yml up -d
+ ```
+
+访问地址:`服务器ip:80`,进入到前台界面
+
+访问地址:`服务器ip:8888`,进入到后台管理界面
+
+
+#### 2. 源码运行(mysql、minio、es、redis等组件仍需docker启动)
+
+1. 启动后台管理系统:
+
+- 启动后端:进入到`management/server`,执行:
+
+ ```bash
+ python app.py
+ ```
+
+- 启动前端:进入到`management\web`,执行:
+
+ ```bash
+ pnpm dev
+ ```
+
+2. 启动前台交互系统:
+
+- 启动后端:项目根目录下执行:
+
+ ```bash
+ python -m api.ragflow_server
+ ```
+
+- 启动前端:进入到`web`,执行:
+
+ ```bash
+ pnpm dev
+ ```
+
+> [!NOTE]
+> 源码部署需要注意:如果用到MinerU后台解析,需要参考MinerU的文档下载模型文件,并安装LibreOffice,配置环境变量,以适配支持除pdf之外的类型文件。
+
+
+## 📝 常见问题
+
+参见[常见问题](docs/faq.md)
+
+## 📜 开发计划
+
+参见[开发计划](docs/plan.md)
+
+## 🛠️ 如何贡献
+
+1. Fork本GitHub仓库
+2. 将fork克隆到本地:
+`git clone git@github.com:<你的用户名>/ragflow-plus.git`
+3. 创建本地分支:
+`git checkout -b my-branch`
+4. 提交信息需包含充分说明:
+`git commit -m '提交信息需包含充分说明'`
+5. 推送更改到GitHub(含必要提交信息):
+`git push origin my-branch`
+6. 提交PR等待审核
+
+## 📄 交流群
+如果有使用问题或建议,可加入交流群进行讨论。
+
+由于群聊超过200人,无法通过扫码加入,如需加群,加我微信zstar1003,备注"加群"即可。
+
+## 🚀 鸣谢
+
+本项目基于以下开源项目开发:
+
+- [ragflow](https://github.com/infiniflow/ragflow)
+
+- [v3-admin-vite](https://github.com/un-pany/v3-admin-vite)
+
+- [minerU](https://github.com/opendatalab/MinerU)
+
+感谢此项目贡献者们:
+
+
+
+
+
+## 💻 更新信息获取
+
+目前该项目仍在持续更新中,更新日志会在我的微信公众号[我有一计]上发布,欢迎关注。
+
+## 📜 许可证与使用限制
+1. **本仓库基于AGPLv3许可证**
+ 由于包含第三方AGPLv3代码,本项目必须遵循AGPLv3的全部条款。这意味着:
+ - 任何**衍生作品**(包括修改或组合代码)必须继续使用AGPLv3并公开源代码。
+ - 若通过**网络服务**提供本软件,用户有权获取对应源码。
+
+2. **商用说明**
+ - **允许商用**:本软件遵循AGPLv3,允许商业使用,包括SaaS和企业内部部署。
+ - **不修改代码**:若仅原样运行(不修改、不衍生),仍需遵守AGPLv3,包括:
+ - 提供完整的源代码(即使未修改)。
+ - 若作为网络服务提供,需允许用户下载对应源码(AGPLv3第13条)。
+ - **不允许闭源商用**:如需闭源(不公开修改后的代码)商用,需获得所有代码版权持有人的书面授权(包括上游AGPLv3代码作者)
+
+3. **免责声明**
+ 本项目不提供任何担保,使用者需自行承担合规风险。若需法律建议,请咨询专业律师。
+
+## ✨ Star History
+
+
\ No newline at end of file
diff --git a/docs/_sidebar.md b/docs/_sidebar.md
new file mode 100644
index 0000000..0e99cb6
--- /dev/null
+++ b/docs/_sidebar.md
@@ -0,0 +1,6 @@
+- [快速开始](/quickstart/)
+- [进阶技巧](/skill/)
+- [API接口](/api/)
+- [构建镜像](/build/)
+- [博客系列](/blog/)
+
diff --git a/docs/api/README.md b/docs/api/README.md
new file mode 100644
index 0000000..6be8d89
--- /dev/null
+++ b/docs/api/README.md
@@ -0,0 +1,521 @@
+本项目采用了和ragflow一致的api接口,python的api接口如下。
+
+http接口可参考原文档:https://github.com/infiniflow/ragflow/blob/main/docs/references/http_api_reference.md
+
+# 目录
+- 1. 依赖安装/密钥准备
+- 2. 创建聊天(Create chat completion)
+- 3. 知识库管理(DATASET MANAGEMENT)
+ * 3.1 创建知识库(Create dataset)
+ * 3.2 查询知识库(List datasets)
+ * 3.3 删除知识库(Delete datasets)
+ * 3.4 更新知识库配置(Update dataset)
+- 4. 文件管理 (FILE MANAGEMENT WITHIN DATASET)
+ * 4.1 上传文件(Upload documents)
+ * 4.2 更新文件配置(Upload documents)
+ * 4.3 下载文件(Download document)
+ * 4.4 删除文件(Delete documents)
+ * 4.5 文件解析(Parse documents)
+ * 4.5 停止文件解析(Stop parsing documents)
+- 5. 块管理(CHUNK MANAGEMENT WITHIN DATASET)
+ * 5.1 添加块(Add chunk)
+ * 5.2 查询块(List chunks)
+ * 5.3 删除块(Delete chunks)
+ * 5.4 更新块内容(Update chunk)
+ * 5.5 检索块 Retrieve chunks
+- 6. 聊天助手管理(CHAT ASSISTANT MANAGEMENT)
+ * 6.1 创建聊天助手(Create chat assistant)]
+ * 6.2 更新聊天助手配置(Update chat assistant)
+ * 6.3 删除聊天助手(Delete chat assistants)
+ * 6.4 查询聊天助手(List chat assistants)
+- 7. 会话管理(SESSION MANAGEMENT)
+ * 7.1 创建会话(Create session with chat assistant)
+ * 7.2 更新会话信息(Update chat assistant's session)
+ * 7.3 查询会话历史记录(List chat assistant's sessions)
+ * 7.4 删除会话(Delete chat assistant's sessions)
+ * 7.5 交互会话(Converse with chat assistant)
+- 8. 智能体管理(AGENT MANAGEMENT)
+ * 8.1 创建智能体(Create session with agent)
+ * 8.2 智能体交互(Converse with agent)
+ * 8.3 查询智能体会话(List agent sessions)
+ * 8.4 查询智能体(List agents)
+
+
+# 1. 依赖安装/密钥准备
+使用python调用API接口,需要安装`ragflow-sdk`依赖,可用pip进行安装:
+```python
+pip install ragflow-sdk
+```
+
+之后,需要在API菜单中,创建一个`API KEY`,复制该值,后续要用到。
+
+# 2. 创建聊天(Create chat completion)
+通过OpenAI的API为选择助理进行聊天。
+
+这里的示例需要修改三个值:
+- model:模型名称
+- api_key:替换成自己的api_key,后文同理
+- base_url:最后面一串为具体助手的`dialogId`,可直接从url中查看获取
+
+可选参数:stream,用于指定是否采用流式输出
+
+```python
+from openai import OpenAI
+
+model = "deepseek-r1:1.5b"
+client = OpenAI(api_key="ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm", base_url=f"http://localhost/api/v1/chats_openai/ec69b3f4fbeb11ef862c0242ac120002")
+
+completion = client.chat.completions.create(
+ model=model,
+ messages=[
+ {"role": "system", "content": "你是一个乐于助人的助手"},
+ {"role": "user", "content": "你是谁?"},
+ ],
+ stream=True
+)
+
+stream = True
+if stream:
+ for chunk in completion:
+ print(chunk)
+else:
+ print(completion.choices[0].message.content)
+```
+
+如果使用 `Infinity`,作为检索引擎,实测会发现遇到报错,等待官方后续完善支持。
+```c
+省略xxx条内容
+2025-03-25 22:30:52 raise InfinityException(res.error_code, res.error_msg)
+2025-03-25 22:30:52 infinity.common.InfinityException
+```
+
+# 3. 知识库管理(DATASET MANAGEMENT)
+## 3.1 创建知识库(Create dataset)
+
+创建一个名称为`kb_1`的知识库
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.create_dataset(name="kb_1")
+```
+
+
+
+
+
+
+## 3.2 查询知识库(List datasets)
+根据名称,查询知识库信息
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+
+# 查询所有知识库
+for dataset in rag_object.list_datasets():
+ print(dataset)
+# 根据name查询某一知识库
+dataset = rag_object.list_datasets(name = "kb_1")
+print(dataset[0])
+```
+
+## 3.3 删除知识库(Delete datasets)
+删除指定知识库
+
+只能根据知识库id进行删除,无name接口,id通过上一步查询得到
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+rag_object.delete_datasets(ids = ["50f80d7c099111f0ad0e0242ac120006"])
+```
+
+## 3.4 更新知识库配置(Update dataset)
+更新已存在的知识库配置
+
+这里原始文档给的示例存在小问题,`rag_object.list_datasets`返回的是一个list,因此需要取出list中第一项,对于该问题,我提交了一个PR:Fix: python_api_reference.md update dataset bug
+
+PR链接:https://github.com/infiniflow/ragflow/pull/6527
+
+官方响应还是挺快的,晚上提交的,第二天上午review,下午就merge了。
+
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+dataset.update({"chunk_method":"manual"})
+```
+
+# 4. 文件管理 (FILE MANAGEMENT WITHIN DATASET)
+
+## 4.1 上传文件(Upload documents)
+上传文件进入到`kb_1`的知识库
+
+两个主要参数:
+
+- display_name:文件名
+- blob:文件的二进制内容
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+dataset.upload_documents([{"display_name": "1.txt", "blob": open('1.txt',"rb").read()}])
+```
+
+
+## 4.2 更新文件配置(Upload documents)
+更新已有文件的配置信息
+
+原文档这里也有个小错误:`doc.update`外层多一个list,这里直接进行修正。
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+doc = dataset.list_documents(id="7c5ea41409f811f0b9270242ac120006")
+doc = doc[0]
+doc.update({"parser_config": {"chunk_token_count": 256}})
+```
+
+## 4.3 下载文件(Download document)
+根据documents id,下载文件
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+doc = dataset.list_documents(id="7c5ea41409f811f0b9270242ac120006")
+doc = doc[0]
+open("ragflow.txt", "wb+").write(doc.download())
+```
+
+这是按照文档实现的方法,但存在问题,`doc.download()`返回的是json数据,而不是二进制数据,会导致写入失败,尚未修复。
+
+## 4.4 删除文件(Delete documents)
+根据documents id,删除文件
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+dataset.delete_documents(ids=["7c5ea41409f811f0b9270242ac120006"])
+```
+
+
+
+## 4.5 文件解析(Parse documents)
+传入documents id,批量解析文件
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+dataset.async_parse_documents(["91bd7c5e0a0711f08a730242ac120006"])
+print("Async bulk parsing initiated.")
+```
+
+
+## 4.5 停止文件解析(Stop parsing documents)
+传入documents id,批量停止解析文件
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+dataset.async_cancel_parse_documents(["91bd7c5e0a0711f08a730242ac120006"])
+print("Async bulk parsing cancelled.")
+```
+
+# 5. 块管理(CHUNK MANAGEMENT WITHIN DATASET)
+## 5.1 添加块(Add chunk)
+增加一个分块,content为具体chunk的内容
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+doc = dataset.list_documents(id="91bd7c5e0a0711f08a730242ac120006")
+doc = doc[0]
+chunk = doc.add_chunk(content="xxxxxxx")
+```
+
+
+
+
+## 5.2 查询块(List chunks)
+查询`kb_1`中所有块的具体信息
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+docs = dataset.list_documents(keywords="1", page=1, page_size=12)
+for chunk in docs[0].list_chunks(keywords="", page=1, page_size=12):
+ print(chunk)
+```
+## 5.3 删除块(Delete chunks)
+根据文档id和块id,删除块
+
+```python
+
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+doc = dataset.list_documents(id="91bd7c5e0a0711f08a730242ac120006")
+doc = doc[0]
+doc.delete_chunks(["b7119fec099611f0b3d60242ac120006"])
+```
+
+实测运行会出现如下报错,原因未知:
+```bash
+Traceback (most recent call last):
+ File "D:\Code\ragflow\python_api\api_doc.py", line 12, in
+ doc.delete_chunks(["b7119fec099611f0b3d60242ac120006"])
+ File "<@beartype(ragflow_sdk.modules.document.Document.delete_chunks) at 0x298f9cf4b80>", line 47, in delete_chunks
+ File "D:\anaconda3\envs\lianghua\lib\site-packages\ragflow_sdk\modules\document.py", line 93, in delete_chunks
+ raise Exception(res.get("message"))
+Exception: rm_chunk deleted chunks 0, expect 1
+```
+
+
+## 5.4 更新块内容(Update chunk)
+将添加的chunk的内容进行更新:
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+doc = dataset.list_documents(id="91bd7c5e0a0711f08a730242ac120006")
+doc = doc[0]
+chunk = doc.add_chunk(content="123")
+chunk.update({"content":"sdfx..."})
+```
+## 5.5 检索块 Retrieve chunks
+检索块中的信息
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+dataset = rag_object.list_datasets(name="kb_1")
+dataset = dataset[0]
+doc = dataset.list_documents(id="91bd7c5e0a0711f08a730242ac120006")
+doc = doc[0]
+doc.add_chunk(content="This is a chunk addition test")
+for c in rag_object.retrieve(dataset_ids=[dataset.id],document_ids=[doc.id]):
+ print(c)
+```
+运行结果:无报错,但无检索出内容,原因未知
+
+# 6. 聊天助手管理(CHAT ASSISTANT MANAGEMENT)
+## 6.1 创建聊天助手(Create chat assistant)
+创建一个名为`"Miss R"`的聊天助手
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+datasets = rag_object.list_datasets(name="kb_1")
+dataset_ids = []
+for dataset in datasets:
+ dataset_ids.append(dataset.id)
+assistant = rag_object.create_chat("Miss R", dataset_ids=dataset_ids)
+```
+
+## 6.2 更新聊天助手配置(Update chat assistant)
+更新聊天助手的各种配置,可选项参考原文档
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+datasets = rag_object.list_datasets(name="kb_1")
+dataset_id = datasets[0].id
+assistant = rag_object.create_chat("Miss R2", dataset_ids=[dataset_id])
+assistant.update({"name": "Stefan", "llm": {"temperature": 0.8}, "prompt": {"top_n": 8}})
+```
+## 6.3 删除聊天助手(Delete chat assistants)
+根据dialogId,删除指定助手
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+rag_object.delete_chats(ids=["a39fa5480a2d11f082850242ac120006"])
+```
+
+## 6.4 查询聊天助手(List chat assistants)
+查询所有聊天助手信息
+
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+for assistant in rag_object.list_chats():
+ print(assistant)
+```
+# 7. 会话管理(SESSION MANAGEMENT)
+
+## 7.1 创建会话(Create session with chat assistant)
+选择`Miss R`助理,创建新会话
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+assistant = rag_object.list_chats(name="Miss R")
+assistant = assistant[0]
+session = assistant.create_session()
+```
+
+## 7.2 更新会话信息(Update chat assistant's session)
+创建完会话,并更新了会话名称
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+assistant = rag_object.list_chats(name="Miss R")
+assistant = assistant[0]
+session = assistant.create_session("session_name")
+session.update({"name": "updated_name"})
+```
+
+## 7.3 查询会话历史记录(List chat assistant's sessions)
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+assistant = rag_object.list_chats(name="Miss R")
+assistant = assistant[0]
+for session in assistant.list_sessions():
+ print(session)
+```
+
+## 7.4 删除会话(Delete chat assistant's sessions)
+根据conversationId,删除某一会话
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+assistant = rag_object.list_chats(name="Miss R")
+assistant = assistant[0]
+assistant.delete_sessions(ids=["0ed10bce0a3111f0a3240242ac120006"])
+```
+
+## 7.5 交互会话(Converse with chat assistant)
+指定某一助手,进行交互提问
+```python
+from ragflow_sdk import RAGFlow
+
+api_key = "ragflow-I0NmRjMWNhMDk3ZDExZjA5NTA5MDI0Mm"
+base_url = "http://localhost:9380"
+
+rag_object = RAGFlow(api_key=api_key, base_url=base_url)
+assistant = rag_object.list_chats(name="Miss R")
+assistant = assistant[0]
+session = assistant.create_session()
+
+print("\n==================== Miss R =====================\n")
+print("Hello. What can I do for you?")
+
+while True:
+ question = input("\n==================== User =====================\n> ")
+ print("\n==================== Miss R =====================\n")
+
+ cont = ""
+ for ans in session.ask(question, stream=True):
+ print(ans.content[len(cont):], end='', flush=True)
+ cont = ans.content
+```
diff --git a/docs/blog/README.md b/docs/blog/README.md
new file mode 100644
index 0000000..9d3397d
--- /dev/null
+++ b/docs/blog/README.md
@@ -0,0 +1,31 @@
+# 开发博客
+
+我的微信公众号[我有一计]记录了开发本项目的开发历程:
+
+1. Ragflow技术栈分析及二次开发指南
+2. 【Ragflow】2. rag检索原理和效率解析
+3. 【Ragflow】3. 给聊天界面打个美化补丁
+4. 【Ragflow】4. 增加文档撰写功能,实现全新交互模式
+5. 【Ragflow】5. 看完Python API文档,竟然成为了官方仓库的Contributor
+6. 【Ragflow】6. Ragflow-plus重磅更新:增加用户后台管理系统
+7. 【Ragflow】7. Ragflow-plus和Ragflow有什么关系?主流问题Q&A
+8. 【Ragflow】8. 基于ragflow API 搭建极简聊天Web界面
+9. 【Ragflow】9. 问答为什么比搜索响应慢?从源码角度深入分析
+10. 【Ragflow】10. 助理配置参数详细解析 / 模型响应加速方法
+11. 【Ragflow】11. 文件解析流程分析 / 批量解析实现
+12. 【Ragflow】12. Ragflow-Plus管理系统v0.1.1:增加团队管理和用户配置功能
+13. 【Ragflow】13. Deepdoc效果一言难尽,MinerU解析降维打击
+14. 【Ragflow】14. MinerU解析脚本,接入ragflow知识库
+15. 【Ragflow】15. Ragflow-Plus管理系统v0.1.2:小升级,连夜修复若干问题
+16. 【Ragflow】16. Ragflow-Plus管理系统开发日志:重塑文件管理单元
+17. 【Ragflow】17. Ragflow-Plus开发日志:增加知识库管理功能 / 支持MinerU解析 / 图片存储与读取
+18. 【Ragflow】18. 更好的推理框架:vLLM的docker部署方式
+19. 【Ragflow】19. RagflowPlus(v0.2.0):完善MinerU解析 / 支持图文关联输出
+20. 【Ragflow】20. Ragflow-Plus项目简介与操作指南
+21. 【Ragflow】21. RagflowPlus(v0.2.1):6个bug修复 / 增加重置密码功能
+22. 【Ragflow】22. RagflowPlus(v0.3.0):用户会话管理 / 文件类型拓展 / 诸多优化更新
+23. 【Ragflow】23. Ragflowv0.19.0:新特性解读
+24. 【Ragflow】24. Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题
+25. 【Ragflow】25. Ragflow-plus开发日志:excel文件解析新思路 / 公式解析适配
+26. 【Ragflow】26. RagflowPlus(v0.4.0):完善解析逻辑 / 文档撰写模式全新升级
+27. 【Ragflow】27. RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化
diff --git a/docs/build/README.md b/docs/build/README.md
new file mode 100644
index 0000000..fa1706a
--- /dev/null
+++ b/docs/build/README.md
@@ -0,0 +1,58 @@
+# Docker镜像构建
+
+本节介绍如何构建镜像,并在离线情况下实现镜像的导出和加载。
+
+## 1. 构建镜像
+
+构建前台镜像:
+
+```bash
+docker build -t zstar1003/ragflowplus:v0.4.3 .
+```
+
+构建后台镜像:
+
+构建后台镜像前,需先将模型文件放置到`management`文件夹中。
+
+下载地址:https://pan.baidu.com/s/1aUV7ohieL9byrbbmjfu3pg?pwd=8888 提取码: 8888
+
+```bash
+cd management
+docker-compose build
+```
+
+
+## 2. 上传镜像
+
+上传镜像到公共仓库,可供他人进行下载:
+
+上传前台镜像:
+
+```bash
+docker tag zstar1003/ragflowplus:v0.4.3 zstar1003/ragflowplus:v0.4.3
+docker push zstar1003/ragflowplus:v0.4.3
+```
+
+上传后台镜像:
+```bash
+docker tag zstar1003/ragflowplus-management-web:v0.4.3 zstar1003/ragflowplus-management-web:v0.4.3
+docker tag zstar1003/ragflowplus-management-server:v0.4.3 zstar1003/ragflowplus-management-server:v0.4.3
+docker push zstar1003/ragflowplus-management-web:v0.4.3
+docker push zstar1003/ragflowplus-management-server:v0.4.3
+```
+
+## 3. 导出镜像
+
+导出所有镜像文件,可实现离线情况下的镜像迁移安装。
+
+```bash
+docker save -o ragflowplus-images.tar zstar1003/ragflowplus-management-web:v0.4.3 zstar1003/ragflowplus-management-server:v0.4.3 zstar1003/ragflowplus:v0.4.3 valkey/valkey:8 quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z mysql:8.0.39 elasticsearch:8.11.3
+```
+
+## 4. 离线安装镜像
+
+在离线服务器中,安装镜像
+
+```bash
+docker load -i ragflowplus-images.tar
+```
\ No newline at end of file
diff --git a/docs/custom.css b/docs/custom.css
new file mode 100644
index 0000000..a112559
--- /dev/null
+++ b/docs/custom.css
@@ -0,0 +1,14 @@
+/* 调整侧边栏字体 */
+.sidebar {
+ font-size: 18px;
+}
+
+.sidebar ul li a {
+ font-size: 18px !important;
+}
+
+/* 调整正文字体 */
+.content {
+ font-size: 18px;
+ line-height: 1.8; /* 可选:增加行距让内容更易读 */
+}
diff --git a/docs/doc.html b/docs/doc.html
new file mode 100644
index 0000000..e63368b
--- /dev/null
+++ b/docs/doc.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+ Ragflow-Plus
+
+
+
+
+
+
+
+
+
+ 加载中...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
index 3678258..e53d521 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -18,6 +18,7 @@
+ - 文档
- 功能
- 演示
- 快速开始
diff --git a/docs/quickstart/README.md b/docs/quickstart/README.md
new file mode 100644
index 0000000..7e3921a
--- /dev/null
+++ b/docs/quickstart/README.md
@@ -0,0 +1,153 @@
+# 快速开始
+
+## 1. 适合人群
+
+Ragflow-Plus 适合以下应用场景:
+
+- 高校/企业等事业单位团队,需要构建一系列中心知识库通过在线API,增强现有大模型的回答效果。
+
+- 本地部署大模型,通过构建局域网进行内部关联访问。
+
+考虑到实际的落地需要,本项目移除了Agent相关模块,并将文件管理、文件解析等操作移动到后台进行。
+
+## 2. 硬件要求
+
+建议部署硬件资源需满足以下配置:
+
+- CPU ≥ 4 cores (x86);
+- RAM ≥ 16 GB;
+- Disk ≥ 50 GB;
+- Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1.
+
+## 3. 开始部署
+
+推荐采用docker进行部署。
+
+### 1. 克隆项目代码
+
+```bash
+git clone https://github.com/zstar1003/ragflow-plus.git
+```
+
+### 2. 拉取镜像并启动
+
+进入项目根目录,执行:
+
+```bash
+docker compose -f docker/docker-compose.yml up -d
+```
+
+如果拉取镜像失败,建议通过配置以下docker镜像源,以加速拉取镜像速度。
+
+```bash
+"registry-mirrors": [
+ "https://docker.m.daocloud.io",
+ "https://docker.imgdb.de",
+ "https://docker-0.unsee.tech",
+ "https://docker.hlmirror.com",
+ "https://docker.1ms.run",
+ "https://func.ink",
+ "https://lispy.org",
+ "https://docker.xiaogenban1993.com"
+]
+```
+
+也可以直接下载网盘打包好的镜像资源文件:
+
+网盘地址: [https://pan.baidu.com/s/1fC7dzuD0WO3FaEARjJNoMg?pwd=8888](https://pan.baidu.com/s/1fC7dzuD0WO3FaEARjJNoMg?pwd=8888) 提取码: 8888
+
+使用如下命令加载安装镜像:
+```bash
+docker load -i ragflowplus-images.tar
+```
+
+### 3. 注册新用户
+
+浏览器输入:`http://localhost:8888`,登陆后台管理系统。
+
+初始登陆账号为: `admin`, 密码为: `12345678`
+
+在用户管理菜单中,新建新用户。
+
+考虑到后续嵌入模型配置、知识库创建的身份均是以初始用户的身份执行,推荐将此用户定义为管理员用户,即采用(admin/lab)公共账户的命名方式,而非具体用户。
+
+
+
+### 4. 初始用户模型配置
+
+创建完初始用户后,在创建下一用户前,建议先在前台配置初始用户的模型设置。
+
+浏览器输入:`http://localhost:80`,登陆前台用户系统。
+
+
+
+需要配置embedding模型和chat模型。
+
+embedding模型当前仅支持*bge-m3*,以ollama平台为例:
+
+首先通过ollama拉取bge-m3模型:
+
+```bash
+ollama pull bge-m3:latest
+```
+
+前台配置时,模型名称设置为`bge-m3`,url地址设置为`http://host.docker.internal:11434`。
+
+如果想通过API在线进行配置,推荐采用硅基流动平台,bge-m3模型可免费调用。
+
+平台地址:https://cloud.siliconflow.cn/i/bjDoFhPf
+
+需要在平台中获取API KEY,并将其输入到模型选择菜单中。
+
+chat模型配置同理。
+
+### 5. 创建其它用户
+
+配置好初始用户,回到后台,可继续创建其它用户。
+
+其它新用户会使用和初始用户相同的模型配置,并自动加入新用户的团队,加入团队后,可共享知识库信息。
+
+可通过团队管理菜单,可对用户的团队所属情况进行进一步添加和移除。
+
+
+### 6. 上传文件
+
+在后台文件管理菜单中,可以上传文件或文件夹。
+
+
+
+### 7. 知识库构建和解析
+
+在后台知识库管理菜单中,可以进行知识库的创建和文档添加与解析。
+
+在解析前,建议先进行嵌入模型的配置测试。
+
+
+
+该界面会自动读取初始用户最新的嵌入模型配置信息(注:是最后添加的模型配置而非系统模型配置中的模型信息)
+
+测试连接通过,可进行下一步文件解析,支持文件单独解析和批量文件解析两种方式。
+
+
+
+解析的日志信息可在`docker\ragflow-plus-logs\parser.log`进行输出。
+
+支持解析的文件类型包括:pdf,doc,docx,pptx,xlsx,csv,txt,md,jpg,png。
+
+### 8. 解析内容查看
+
+解析完成后,可到前台查看具体的解析块信息,并查询其所关联图片。
+
+
+
+### 9. 问答模式
+
+在前台问答模块,创建助理后,可进行问答交互,输出文本信息和文本块关联的图像信息。
+
+
+
+### 10. 文档撰写模式
+
+在前台文档撰写模块,可选择指定知识库,根据指定模板,进行文档写作输出,结果可导出下载为Word文档。
+
+
diff --git a/docs/quickstart/_images/image_1.png b/docs/quickstart/_images/image_1.png
new file mode 100644
index 0000000..e37b83f
Binary files /dev/null and b/docs/quickstart/_images/image_1.png differ
diff --git a/docs/quickstart/_images/image_2.png b/docs/quickstart/_images/image_2.png
new file mode 100644
index 0000000..afa58d4
Binary files /dev/null and b/docs/quickstart/_images/image_2.png differ
diff --git a/docs/quickstart/_images/image_3.png b/docs/quickstart/_images/image_3.png
new file mode 100644
index 0000000..fe67b6e
Binary files /dev/null and b/docs/quickstart/_images/image_3.png differ
diff --git a/docs/quickstart/_images/image_4.png b/docs/quickstart/_images/image_4.png
new file mode 100644
index 0000000..2910ea7
Binary files /dev/null and b/docs/quickstart/_images/image_4.png differ
diff --git a/docs/quickstart/_images/image_5.png b/docs/quickstart/_images/image_5.png
new file mode 100644
index 0000000..923c7e3
Binary files /dev/null and b/docs/quickstart/_images/image_5.png differ
diff --git a/docs/quickstart/_images/image_6.png b/docs/quickstart/_images/image_6.png
new file mode 100644
index 0000000..b307858
Binary files /dev/null and b/docs/quickstart/_images/image_6.png differ
diff --git a/docs/quickstart/_images/image_7.png b/docs/quickstart/_images/image_7.png
new file mode 100644
index 0000000..90927b6
Binary files /dev/null and b/docs/quickstart/_images/image_7.png differ
diff --git a/docs/quickstart/_images/image_8.png b/docs/quickstart/_images/image_8.png
new file mode 100644
index 0000000..65603cf
Binary files /dev/null and b/docs/quickstart/_images/image_8.png differ
diff --git a/docs/skill/README.md b/docs/skill/README.md
new file mode 100644
index 0000000..4cf25ed
--- /dev/null
+++ b/docs/skill/README.md
@@ -0,0 +1,189 @@
+# 进阶技巧
+
+此模块用来介绍一些进阶使用技巧,适合有一定经验的开发者。
+
+## 1. gpu加速
+
+本项目提供了gpu部署的方案,可通过独立显卡,大大加速文档解析速度,预留空余显存需 > 6GB。
+
+docker启动:
+
+```bash
+docker compose -f docker/docker-compose_gpu.yml up -d
+```
+
+若启动失败,可通过以下方式增加docker对gpu加速的支持。
+
+```bash
+# 575为具体版本号,可根据具体gpu型号选择合适的版本
+sudo apt install nvidia-cuda-toolkit
+sudo apt install nvidia-container-toolkit
+sudo apt install nvidia-fabricmanager-575
+sudo apt install libnvidia-nscq-575
+sudo apt install nvidia-container-runtime
+sudo systemctl start nvidia-fabricmanager
+sudo systemctl enable nvidia-fabricmanager
+sudo systemctl status nvidia-fabricmanager
+```
+
+## 2. 源码启动
+
+除docker外,本项目支持采用源码的方式启动前后端。
+
+### 1. 启动中间件
+
+使用docker启动中间件:
+
+```bash
+docker start ragflow-es-01
+docker start ragflow-mysql
+docker start ragflow-minio
+docker start ragflow-redis
+```
+
+### 2. 前台环境启动
+
+后端安装依赖
+
+```bash
+pip install -r requirements.txt
+```
+
+启动后端
+```bash
+python -m python -m api.ragflow_server
+```
+
+前端安装依赖
+
+```bash
+cd web
+pnpm i
+```
+
+启动前端
+
+```bash
+pnpm dev
+```
+
+### 3. 后台环境启动
+
+后端安装依赖
+
+```bash
+cd management/server
+pip install -r requirements.txt
+```
+
+启动后端
+```bash
+python -m python -m api.ragflow_server
+```
+
+前端安装依赖
+
+```bash
+cd management/web
+pnpm i
+```
+
+启动前端
+
+```bash
+pnpm dev
+```
+
+> [!NOTE]
+> 源码部署需要注意:如果用MinerU后台解析,需要参考MinerU的文档下载模型文件,并安装LibreOffice,配置环境变量,以适配支持除pdf之外的类型文件。
+
+## 3. 修改后台系统管理员账号密码
+
+可通过修改`docker\.env`文件中,以下两个参数:
+```bash
+# 管理系统用户名和密码
+MANAGEMENT_ADMIN_USERNAME=admin
+MANAGEMENT_ADMIN_PASSWORD=12345678
+```
+
+修改后重启容器。
+
+## 4. 修改图像访问ip地址
+
+服务器部署,minio访问地址可修改为服务器ip,以实现图片在用户端的正常访问。
+
+可修改`docker\.env`文件中,以下参数:
+```bash
+# 显示minio文件时的ip地址,如需局域网/公网访问,可修改为局域网/公网ip地址
+MINIO_VISIT_HOST=localhost
+```
+
+## 5. 更换title和logo
+
+### 1. 后台系统修改logo和title
+
+1.修改logo
+
+logo文件在`management\web\src\common\assets\images\layouts`路径下,对应三个.png文件,分别是主页logo和登陆页logo(不同主题显示)
+
+2.修改title
+
+title在`management\web\.env`中,修改`VITE_APP_TITLE`参数
+
+3.去除水印
+
+管理系统主页,如需去除项目水印,可修改`management\web\src\layouts\components\Footer\index.vue`文件。
+
+4.打包dist文件
+
+进入到`management/web`路径,打包dist文件:
+
+```c
+cd management/web
+pnpm run build
+```
+
+5.进入到容器,删除容器中已有的`/usr/share/nginx/html`文件
+```c
+docker exec -it ragflowplus-management-frontend /bin/sh
+rm -rf /usr/share/nginx/html
+```
+
+6.将打包好的`dist`文件拷贝到容器中
+```c
+docker cp dist ragflowplus-management-frontend:/usr/share/nginx/html
+```
+
+### 前台系统修改logo和title
+
+1.修改logo
+
+logo文件在`web\public`路径下,logo文件格式为svg,如果是其它文件格式,需要对应转换。
+
+2.修改title
+
+title在`web\src\conf.json`中,修改`appName`参数
+
+3.修改登录页title
+
+如需修改登陆页title,可修改`web\src\locales\zh.ts`文件的`title`参数。
+
+4.打包dist文件
+
+进入到`web`路径,打包dist文件:
+
+```c
+cd web
+pnpm run build
+```
+
+5.进入到容器,删除容器中已有的`/ragflow/web/dist`文件
+```c
+docker exec -it ragflowplus-server /bin/sh
+rm -rf /ragflow/web/dist
+```
+
+6.将打包好的`dist`文件拷贝到容器中
+```c
+docker cp dist ragflowplus-server:/ragflow/web/
+```
\ No newline at end of file
diff --git a/management/docker-compose.yml b/management/docker-compose.yml
index 660167f..9561b3d 100644
--- a/management/docker-compose.yml
+++ b/management/docker-compose.yml
@@ -1,7 +1,7 @@
services:
management-frontend:
container_name: ragflowplus-management-frontend
- image: zstar1003/ragflowplus-management-web:v0.4.2
+ image: zstar1003/ragflowplus-management-web:v0.4.3
build:
context: .
dockerfile: Dockerfile
@@ -17,7 +17,7 @@ services:
management-backend:
container_name: ragflowplus-management-backend
- image: zstar1003/ragflowplus-management-server:v0.4.2
+ image: zstar1003/ragflowplus-management-server:v0.4.3
build:
context: .
dockerfile: Dockerfile
diff --git a/management/server/services/files/file_service.py b/management/server/services/files/file_service.py
index 222ce48..dac5204 100644
--- a/management/server/services/files/file_service.py
+++ b/management/server/services/files/file_service.py
@@ -25,7 +25,7 @@ class FileService(BaseService):
return "ppt_parser"
elif file_type == FileType.VISUAL.value:
return "image_parser"
- elif file_type == FileType.TEXT.value: # 添加对文本文件的支持
+ elif file_type == FileType.TEXT.value:
return "text_parser"
else:
return "default_parser"