Docker 便于快速部署,但不便于修改。因此作者多数情况下保持 SQL、Redis 等数据库组件容器化部署的同时,会选择从源码安装。对于开源的 RAGFlow,在 linux 中安装 tree 工具( apt install tree),可快速详细列出目录结构。
root@wsl:/opt/ragflow# tree -L 2 . |-- 9b5ad71b2ce5302211f9c61530b329a4922fc6a4 |-- CONTRIBUTING.md |-- Dockerfile |-- Dockerfile.deps |-- Dockerfile.scratch.oc9 |-- LICENSE |-- README.md |-- README_id.md |-- README_ja.md |-- README_ko.md |-- README_pt_br.md |-- README_tzh.md |-- README_zh.md |-- SECURITY.md |-- agent | |-- README.md | |-- README_zh.md | |-- __init__.py | |-- __pycache__ | |-- canvas.py | |-- component | |-- settings.py | |-- templates | `-- test |-- agentic_reasoning | |-- __init__.py | |-- __pycache__ | |-- deep_research.py | `-- prompts.py |-- api | |-- __init__.py | |-- __pycache__ | |-- apps | |-- constants.py | |-- db | |-- ragflow_server.py | |-- settings.py | |-- utils | |-- validation.py | `-- versions.py |-- conf | |-- infinity_mapping.json | |-- llm_factories.json | |-- mapping.json | |-- private.pem | |-- public.pem | `-- service_conf.yaml |-- deepdoc | |-- README.md | |-- README_zh.md | |-- __init__.py | |-- __pycache__ | |-- parser | `-- vision |-- docker | |-- README.md | |-- docker-compose-CN-oc9.yml | |-- docker-compose-base.yml | |-- docker-compose-gpu-CN-oc9.yml | |-- docker-compose-gpu.yml | |-- docker-compose-macos.yml | |-- docker-compose.yml | |-- entrypoint.sh | |-- infinity_conf.toml | |-- init.sql | |-- launch_backend_service.sh | |-- nginx | `-- service_conf.yaml.template |-- docs | |-- _category_.json | |-- configurations.md | |-- develop | |-- faq.mdx | |-- guides | |-- quickstart.mdx | |-- references | `-- release_notes.md |-- download_deps.py |-- example | |-- http | `-- sdk |-- flask_session | |-- 2029240f6d1128be89ddc32729463129 | |-- 215011ed710e3e0007d07f418e1b826a | `-- 842b7795e070f3f127fd914bde1fa442 |-- graphrag | |-- __init__.py | |-- __pycache__ | |-- entity_resolution.py | |-- entity_resolution_prompt.py | |-- general | |-- light | |-- query_analyze_prompt.py | |-- search.py | `-- utils.py |-- helm | |-- Chart.yaml | |-- templates | `-- values.yaml |-- intergrations | |-- chatgpt-on-wechat | `-- extension_chrome |-- logs | |-- ragflow_server.log | |-- task_executor_0.log | |-- task_executor_0.log.1 | |-- task_executor_0.log.2 | |-- task_executor_0.log.3 | |-- task_executor_0.log.4 | `-- task_executor_0.log.5 |-- pyproject.toml |-- rag | |-- __init__.py | |-- __pycache__ | |-- app | |-- benchmark.py | |-- llm | |-- nlp | |-- prompts.py | |-- raptor.py | |-- res | |-- settings.py | |-- svr | `-- utils |-- sdk | `-- python |-- show_env.sh |-- uv.lock `-- web |-- externals.d.ts |-- jest-setup.ts |-- jest.config.ts |-- node_modules |-- package-lock.json |-- package.json |-- public |-- src |-- tailwind.config.js |-- tailwind.css |-- tsconfig.json `-- typings.d.ts 52 directories, 90 files
主要目录包括:
- web:管理前端实现,react+tailwind 栈
- docker:快速验证部署的 docker 配置
- rag:rag 实现
- deepdoc:文档解析实现(Todo 支持视觉模型)
- agent:智能体相关实现
- agentic_reasoning:0.17.2 版本更新的推理实现
- graphrag:知识图谱实现
- api:后端 api 实现
- sdk:ragflow封装的python sdk
- intergrations :RAGFlow 与 ChatGPT-on-WeChat 对接
- conf:源码启动配置文件
- .venv:python 虚拟环境目录,.venv/nltk_data 为下载的 nltk 数据,从源码部署需自行下载
- helm:K8s配置
以下仅列举一二,基本原理相同,不做过多赘述。
api 目录
后端 api 在二次开发时可能最为常用,主要包括 apps、db、utils 目录和服务入口、初始化配置、常量、版本验证与 nltk 数据文件等程序。
- apps:RAGFlow 对外暴露的接口,apps/__init__.py 定义了路由规则分别为 /api/{API_VERSION} 和 /{API_VERSION}/{page_name}
- apps/sdk:对外提供的 api,操作知识库
- db:数据库操作封装,db/db_models.py 封装了表单结构
- utils:工具封装
graphrag 目录
知识图谱目录,包括图谱抽取、实体映射、内部查询接口的文件和 light、general 两种方法的目录。
- light、general:对应默认知识图谱抽取的两种模式,默认 light
- general/index.py:图谱抽取入口
- entity_resolution.py:实体多表述情况下的映射实现,是构建高质量知识图谱的核心组件,结合语义理解与图结构分析,提升图谱的准确性和一致性。
- search.py:提供给内部的直接查询知识图谱的方法
agent 目录
RAGFlow 的 agent 实际是 workflow,功能上没有 dify 等框架丰富、友好,被很多人诟病。客观来看,agent 目录提供了非常低门槛地添加、修改自定义智能体的功能。agent 下包括了编排画板、编排设置程序文件和组件、模板目录。
- component:agent 功能中所有列出的可拖拽内置节点(UI 导航栏),在 __init__.py 中注册,每个节点一个独立的 py 文件
- templates:创建 agent(实为 workflow)可选的模板
... ... def component_class(class_name): m = importlib.import_module("agent.component") c = getattr(m, class_name) return c __all__ = [ "Begin", "BeginParam", "Generate", "GenerateParam", "Retrieval", "RetrievalParam", "Answer", "AnswerParam", "Categorize", "CategorizeParam", "Switch", "SwitchParam", "Relevant", "RelevantParam", "Message", "MessageParam", "RewriteQuestion", "RewriteQuestionParam", "KeywordExtract", ... ...
可以添加自定义拖拽节点,或者修改 invoke 节点以实现更高级的远程调用功能,充当 MCP Client 也没有问题。
if self._param.headers: headers = json.loads(self._param.headers) proxies = None if re.sub(r"https?:?/?/?", "", self._param.proxy): proxies = {"http": self._param.proxy, "https": self._param.proxy} if method == 'get': response = requests.get(url=url, params=args, headers=headers, proxies=proxies, timeout=self._param.timeout) if self._param.clean_html: sections = HtmlParser()(None, response.content) return Invoke.be_output("\n".join(sections)) return Invoke.be_output(response.text)
deeploc 目录
deeploc 是 ragflow 用于文档识别、解析的核心模块,包括 parser、vision 两个子模块。
- parser:文档格式支持与实现
- vision:引入了 layout、table_structure,实现对版式识别、布局和结构化内容的支持
其他目录如 rag 谨慎修改,已有的业务逻辑尽量避免改动,否则一不小心把小工程变成了大项目就不好了。
文章评论