news 2026/8/28 12:44:41

NeSy-RAG:面向可解释问答的神经符号检索增强生成架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NeSy-RAG:面向可解释问答的神经符号检索增强生成架构

这次我们来看一个比较新的 RAG 方向:NeSy-RAG,全称是Neuro-Symbolic RAG for Explainable Question Answering。它要解决的问题很直接:普通 RAG 能告诉你在哪几个文档片段里找到了答案,但很难告诉你这个答案是通过什么逻辑推理得出来的。对于客服、法务、金融等需要“答案可解释、依据可回溯”的场景,这种黑盒式输出并不够用。NeSy-RAG 的思路是,在向量检索之外再加一层符号表示和规则推理,让最终输出既包含参考答案,又包含证据片段和推理链。

这个方向最值得关注的点有三个:第一,它不是为了替代普通 RAG,而是在 RAG 的召回结果之上做符号化约束和推理,相当于补上了“逻辑验证”这一环;第二,它对硬件的要求取决于你选择哪套基础模型,不是只能跑在高端机器上,本地小模型同样可以搭出可用原型;第三,它天然适合做成 API 服务,方便接进现有知识库系统或企业问答应用。

这篇文章会以“概念解读 + 最小实现 + 验证方法”的方式展开。你会看到 NeSy-RAG 的核心模块怎么拆,知识库怎么构建,检索和推理怎么串起来,以及如何通过接口做批量验证和效果评估。如果你正在做企业级 RAG、想解决答案不稳定、引用不可控的问题,这篇文章可以先收藏备用。

1. 核心能力速览

在动手之前,先用一张表把 NeSy-RAG 的关键信息拉出来。

能力项说明
项目类型面向可解释问答的神经符号检索增强生成架构
核心技术向量检索、知识图谱/本体、规则推理、LLM 生成
解决的核心问题普通 RAG 缺乏逻辑推理与可解释性,答案依据不可验证
主要功能证据召回、符号校验、规则推理、推理链生成、问答输出
显存需求取决于嵌入模型和 LLM 规模;仅做检索与规则推理可低至纯 CPU 环境
支持模型相对开放,可接入本地 LLM 或在线 API,常见组合有 Qwen2-7B、llama.cpp、FastAPI
启动方式Python 服务启动,可封装为 FastAPI 接口服务
是否支持 API支持,可设计统一的 /query 问答接口和 /explain 解释接口
是否支持批量任务支持,通过批处理脚本或任务队列处理多条问题
适合场景企业知识问答、文档审查、合规问答、教学答疑、客服助手

从这张表能看出来,NeSy-RAG 并不是一个开箱即用的“一键包”,更像是一套可组合的实现思路。实际落地时,你要准备四个核心模块:向量库、知识图谱存储、规则推理器、LLM 生成器。下面各章节会逐个拆开讲。

2. 适用场景与使用边界

2.1 适合谁用

NeSy-RAG 最典型的适用场景是“答案不能只看相似度”的知识问答。举几个例子:

  • 企业制度问答:员工问“年假未休完能不能延续到下一年”,系统不能只返回一段相似文本,还要结合制度条款、累计天数、部门规则做推理。
  • 法务合规问答:合同条款是否违法、某个操作是否符合监管要求,需要把文档条款拆成结构化规则再验证。
  • 医疗或金融客服:回答需要带严格的逻辑判断,避免大模型自由发挥。
  • 教学场景:学生问“为什么这个公式这样推导”,系统需要输出推导步骤,而不是直接给结论。

这类场景的共同特征是:答案正确性可以验证、错误成本高、业务方要求给出理由。

2.2 不适合什么场景

  • 闲聊型对话:不需要严格逻辑链,NeSy-RAG 的符号推理层会拖慢响应速度。
  • 纯开放式创作:让模型写文案、讲故事,不需要结构化知识约束。
  • 数据量极小、问题单一:直接用小模型 + 提示词就能解决,不必引入知识图谱和规则引擎。

2.3 合规与安全边界

NeSy-RAG 涉及文档解析、知识抽取、LLM 生成,落地时需要特别关注三点:

  • 数据授权:放入知识库的文档必须有合法来源,涉及商业机密、个人信息的内容要脱敏。
  • 版权合规:不要让模型在未授权情况下复述大段受版权保护的内容。
  • 内容审计:可解释性不等于正确性,输出仍需人工复核,尤其是医疗、法律、金融领域。

3. 环境准备与前置条件

3.1 操作系统与语言版本

NeSy-RAG 本质上是 Python 服务,推荐 Ubuntu 22.04 或 Windows 10/11,Python 版本建议 3.10 或 3.11。如果是在 Windows 上,注意部分向量库和图数据库的安装方式略有差异,优先使用 Conda 创建独立虚拟环境。

3.2 硬件配置参考

硬件需求不能一概而论,因为 NeSy-RAG 的每一层都可以替换。这里给出一套常见配置参考:

组件最低要求推荐配置
CPU 推理4 核 8 线程8 核以上
内存16GB32GB
GPU(可选)6GB 显存12GB 以上显存
磁盘20GB 可用空间50GB 以上用于模型与向量库

如果你只有 CPU 环境,也可以跑通全流程,只是 LLM 生成速度会慢很多。建议先用小模型、少量文档做验证,再决定是否上 GPU。

3.3 依赖组件清单

实际落地时,你会用到以下组件:

  • LLM 推理:llama.cpp + Qwen2-7B 量化模型,或者通过 OpenAI 兼容 API 接入在线模型。
  • 向量库:FAISS、chromadb、Qdrant 均可使用,数量不大时 FAISS 最简单。
  • 图数据库:Neo4j Community Edition,用于存储知识图谱三元组。
  • 规则引擎:可以自己用 Python 写规则,也可以引入 RDFLib 处理本体推理。
  • 服务框架:FastAPI + Uvicorn,提供接口服务。
  • 文档解析:需要把 PDF、Word、Markdown 转成结构化文本,常用工具是 PyMuPDF、unstructured、或者直接读纯文本文件。

注意:如果输入文档量很大,建议预留至少 50GB 磁盘空间给向量库和模型缓存。

4. 部署与启动流程

下面以一套适合本地开发的最小链路为例:Qwen2-7B 量化模型 + llama.cpp 做 LLM 推理,FAISS 做向量检索,Neo4j 存知识图谱,FastAPI 提供查询接口。这个组合和当前社区里常见的“llama.cpp + qwen2-7b + fastapi”本地知识库方案一致,也最容易复现。

4.1 安装依赖

先创建一个虚拟环境,然后安装核心依赖:

conda create -n nesyrag python=3.11 -y conda activate nesyrag pip install fastapi uvicorn langchain langchain-community faiss-cpu sentence-transformers rdflib neo4j requests pymupdf

如果使用 GPU 推理,可以安装 llama-cpp-python 的 CUDA 版本:

CMAKE_ARGS="-DGGML_CUDA=on -DGGML_AVX2=on" pip install llama-cpp-python

用 llama.cpp 方式加载模型时,建议准备一个 Qwen2-7B 的 GGUF 量化文件,比如 Q4_K_M 版本。这个文件在几 GB 到十几 GB 之间,需要单独下载到模型目录。

4.2 启动 Neo4j 图数据库

Neo4j 可以通过 Docker 快速启动:

docker run -d \ --name neo4j-nesy \ -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTH=neo4j/testpassword \ -v ./neo4j-data:/data \ neo4j:5.20

启动后可以访问http://localhost:7474用 Neo4j Browser 查看图谱。默认用户名是 neo4j,密码是启动时设置的 testpassword,生产环境一定要换强密码。

如果你不想部署 Neo4j,也可以先用 NetworkX 或 RDFLib 在内存里做图谱逻辑,但这样无法处理和持久化大规模知识图谱。

4.3 准备知识库数据

NeSy-RAG 的知识来源,通常分两步:文档切块和三元组抽取。

第一步,文档切块策略很关键。普通 RAG 的切块可能按固定长度切,但 NeSy-RAG 需要把文档切成“带有语义边界的段落”,比如按标题层级、条款编号、表格名称切分。推荐的方式是:

  • 优先按 Markdown 标题结构切分。
  • 企业制度、合同类文档,优先按“条款”切分。
  • 每个切片保留元信息,比如来源文件、章节标题、页码。

下面是一个简化的文档加载和切片示例:

from langchain_community.document_loaders import PyMuPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter loader = PyMuPDFLoader("data/employee_handbook.pdf") documents = loader.load() splitter = RecursiveCharacterTextSplitter( chunk_size=600, chunk_overlap=100, separators=["\n\n", "\n", "。", ";", " "], ) chunks = splitter.split_documents(documents) print(f"文档切块数量: {len(chunks)}")

切块之后,需要把每个块建索引存入 FAISS:

from sentence_transformers import SentenceTransformer from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings embedding_model = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5" ) vectorstore = FAISS.from_documents(chunks, embedding_model) vectorstore.save_local("index/faiss_index")

4.4 构建知识图谱

为了让系统具备符号推理能力,需要从文档中抽取“实体-关系-实体”三元组,写入 Neo4j。抽取方式可以是用 LLM,也可以用规则。先看一个用规则从合同条款中抽取的例子:

import re from neo4j import GraphDatabase driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "testpassword")) def extract_clause(*, subject, relation, obj, source): with driver.session() as session: session.run( """ MERGE (a:Entity {name: $subject}) MERGE (b:Entity {name: $obj}) MERGE (a)-[r:REL {type: $relation}]->(b) SET r.source = $source """, subject=subject, relation=relation, obj=obj, source=source, )

如果文档结构复杂,可以让 LLM 从段落中抽取实体和关系,但抽取结果一定要人工抽检。规则抽取的优点是稳定、可追溯,缺点是需要人工维护规则模板。建议第一版先用规则模板,等知识库规模大了再引入 LLM 辅助抽取。

4.5 启动问答服务

下面用 FastAPI 把整个 NeSy-RAG 流程封装成服务:

from fastapi import FastAPI from pydantic import BaseModel app = FastAPI(title="NeSy-RAG API") class QueryRequest(BaseModel): question: str top_k: int = 5 use_symbolic: bool = True @app.post("/query") def query(request: QueryRequest): # 1. 向量检索召回 docs = vectorstore.similarity_search(request.question, k=request.top_k) # 2. 从召回命中结果中提取实体,做图谱查询 # 3. 规则推理,生成推理链 # 4. 注入 LLM prompt,生成最终答案 return { "answer": "...", "evidence": [doc.metadata for doc in docs], "reasoning_chain": ["规则1:...", "事实2:..."], } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=7860)

这个示例代码只展示了整体框架,实际运行时需要把检索、图谱查询、规则推理、LLM 生成四步串起来,下面一节会详细说明验证方法。

5. 功能测试与效果验证

NeSy-RAG 的功能测试,不能只看“答没答对”,还要看“有没有给出可解释的推理路径”。建议按以下顺序逐个验证。

5.1 测试向量检索召回

先单独测检索模块,判断文档切片质量是否达标。

测试目的:确认给定问题能召回到正确文档片段。

测试输入示例:

{ "question": "员工年假未休完如何处理", "top_k": 5 }

预期结果:返回的 5 个片段里,前 2 个片段应该涉及年假制度、结转规则。如果召回不到,说明切块策略有问题,或者 Embedding 模型不适合该领域。

5.2 测试知识图谱查询

测试目的:确认实体识别和关系查询能在知识图谱中找到推理所需的事实。

比如提问“A 部门员工年假能结转吗”,系统内部会解析出实体“A 部门员工”和关系“年假政策”,再到 Neo4j 中查询:

MATCH (e:Entity {name: 'A部门员工'})-[r:REL]->(policy:Entity) RETURN e.name, r.type, policy.name, r.source

判断标准:返回的图谱节点能够覆盖回答问题所需的条件事实。例如需要找出“普通员工年假 5 天”“年假未休可顺延一个月”等相关节点。

如果图谱数据为空,大概率是三元组抽取阶段没有成功写入,需要回头检查抽取规则。

5.3 测试规则推理链

规则推理是 NeSy-RAG 和普通 RAG 拉开差距的关键。假设你要回答“员工小王今年有几天年假”,系统需要在图谱中完成如下推理:

  • 事实1:小王属于技术部门。
  • 事实2:技术部门执行公司统一年假政策。
  • 事实3:司龄满 1 年不足 10 年,年假 5 天。
  • 结论:小王今年年假为 5 天。

这部分可以用 Python 写一个简单的规则解释器:

RULES = [] def rule(condition_fn, conclusion_fn): RULES.append((condition_fn, conclusion_fn)) # 示例规则:司龄满 1 年且不足 10 年 -> 年假 5 天 rule( lambda facts: facts.get("years_of_service", 0) >= 1 and facts.get("years_of_service", 0) < 10, lambda facts: {"annual_leave_days": 5}, ) def infer(facts): chain = [] for condition, conclusion in RULES: if condition(facts): result = conclusion(facts) chain.append(f"司龄 {facts['years_of_service']} 年,适用年假 {result['annual_leave_days']} 天") return chain

测试时,输入一组结构化的实体事实,观察推理链是否完整。如果推理链断掉了,通常是图谱里缺少中间事实,比如没有“小王属于技术部门”这个实体关系。

5.4 测试 LLM 生成结果

最后一步,把召回片段、图谱事实、推理链一起交给 LLM 生成最终答案。Prompt 示例:

你是一个严谨的问答助手。请基于以下证据和推理链回答问题。 如果证据不足,请直接说明无法回答。 证据片段: ... 图谱事实: ... 推理链: ... 问题:...

判断最终答案是否成功,可以从四个维度打分:

维度判断方法
正确性答案是否符合证据和推理结果
忠实度答案是否没有超出证据内容
可解释性推理链是否完整、每步有依据
稳定性同一问题多次提问结果是否一致

5.5 常见失败现象

  • 检索到了,但图谱没有对应实体:说明实体抽取覆盖不全,需要补充图谱。
  • 图谱有实体,但推理链为空:说明规则没有覆盖该问题类型,需要新增规则。
  • LLM 输出和推理链不一致:说明 Prompt 约束不够,需要调整生成环节的指令。

6. 接口 API 与批量任务

NeSy-RAG 要真正投入应用,必须做成接口服务,并提供批量任务能力。

6.1 统一问答接口

建议把接口拆成两个:/query负责问答并返回简要结果,/explain负责返回完整推理链和证据。

curl -X POST "http://127.0.0.1:7860/query" \ -H "Content-Type: application/json" \ -d '{"question": "年假未休完能延到明年吗", "top_k": 5}'

返回结果示例:

{ "answer": "根据公司制度,未休完年假可在次年第一季度内安排补休,逾期未安排作废。", "evidence": [ { "source": "employee_handbook.pdf", "page": 12, "chunk": "第十一条 ..." } ], "reasoning_chain": [ "事实:员工未休完年假", "规则:年假补休窗口为次年第一季度", "结论:可以延到明年第一季度" ] }

6.2 Python 批量调用

批量测试时,可以先准备一个问题集合,逐个提交接口,再把结果汇总成评估表。

import requests import json questions = [ "年假未休完能延到明年吗", "事假工资如何计算", "试用期三个月合法吗", ] results = [] for q in questions: resp = requests.post( "http://127.0.0.1:7860/query", json={"question": q, "top_k": 5}, timeout=60, ) item = resp.json() results.append({"question": q, "answer": item["answer"]}) with open("batch_result.json", "w", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2)

批量任务需要做好四件事:

  • 请求超时控制:LLM 生成速度不稳定,建议 timeout 设到 60 秒以上。
  • 失败重试:接口返回 500 或超时时自动重试,最多重试 2 次。
  • 日志记录:记录每道题的检索耗时、推理耗时、生成耗时。
  • 人工抽检:对批量结果抽样复核,不能只看自动评估指标。

6.3 批量任务队列设计

如果问题量很大,建议把接口调用改成异步任务队列。简单方案是用 Redis + RQ 或 Celery,复杂方案可以上任务编排。这里给出一个简化模型:

{ "task_id": "20240501-001", "question": "...", "status": "pending", "created_at": "...", "finished_at": null }

把任务信息写入队列,消费端从队列取任务、调用 NeSy-RAG 服务、写回结果。这样做的好处是:LLM 服务卡住时,队列里的任务不会丢,还能重试。

7. 资源占用与性能观察

NeSy-RAG 的性能瓶颈通常有三个:向量检索、符号推理、LLM 生成。

7.1 显存占用观察

显存占用主要由 LLM 决定。如果使用 Qwen2-7B 的 GGUF 量化版本,量化级别越低,显存占用越低,但推理质量也会下降。更稳妥的判断是:用nvidia-smi实时观察推理时的显存峰值,以本机测试为准。

nvidia-smi -l 2

如果显存不足,可以采取以下措施:

  • 降低 LLM 的上下文长度,比如从 8192 降到 4096。
  • 使用更小参数的模型,比如 3B 或 1.5B。
  • 把检索和生成拆成两个服务,避免同时抢显存。
  • 使用 GGUF 量化模型,选择 Q4 或 Q3 级别。

7.2 CPU 推理性能

如果在纯 CPU 环境下运行,LLM 生成是主要瓶颈。建议:

  • 尽可能缩短输入上下文,只把最相关的证据和推理链拼进 Prompt。
  • 使用批处理方式合并多个问题,但要注意并发请求可能互相干扰。
  • 对生成结果做缓存,相同问题不重复推理。

7.3 各阶段耗时记录

建议在服务里打点统计,输出类似下面的日志:

retrieval_time_ms=45 graph_query_time_ms=12 rule_inference_time_ms=3 llm_generation_time_ms=3400 total_time_ms=3460

这样可以快速定位是哪一环拖慢了整体响应。通常向量检索和图谱查询不会慢太多,真正慢的是 LLM 生成。如果生成时间超过 5 秒,要么是模型太大,要么是 Prompt 太长。

7.4 降低资源占用的实践

  • 嵌入模型选择 100MB 以内的小模型,比如 bge-small。
  • 图数据库和向量库分离部署,避免内存互相挤占。
  • 启动多个服务时,用 Docker 做资源限制,比如设置--memory=4g
  • 模型预热后再次推理更快,可以在服务启动时跑一次空请求。

8. 常见问题与排查方法

问题现象可能原因排查方式解决方案
启动后接口返回 404FastAPI 路由没有注册查看启动日志,检查访问路径确认路由路径是 /query 还是其他地址
向量库索引加载失败index 路径不对或文件损坏检查路径和目录权限重新生成索引
图谱查不到数据三元组抽取未写入成功用 Neo4j Browser 查询节点数检查抽取脚本和批量写入逻辑
问答响应太慢LLM 模型过大或 Prompt 过长查看耗时日志换小模型、缩短上下文、调整量化级别
显存不足并发请求太多观察 nvidia-smi限制并发数或增加模型缓存清理
答案和推理链不一致Prompt 指令约束不够查看生成日志强化 Prompt 中“只根据证据回答”的指令
批量任务卡住某个问题触发超时查看任务队列日志增加超时时间和重试机制
文档切块后检索不到相关内容切块策略不合适检查切块大小和重叠值调整为按标题或条款切分

8.1 模型加载失败

如果 llama.cpp 加载 GGUF 模型失败,优先检查两处:一是模型路径是否正确,二是 Python 库是否按当前环境编译。Windows 环境经常需要单独编译 llama-cpp-python,Debug 时可以先用 pip 装 CPU 版本跑通流程,再换 CUDA 版本。

8.2 API 调用失败

接口返回 500 时,先看 Uvicorn 日志里的异常栈。大多数情况是某个中间流程报错,而不是 API 框架本身问题。建议在 FastAPI 里加全局异常捕获:

@app.exception_handler(Exception) async def global_exception_handler(request, exc): return JSONResponse( status_code=500, content={"error": str(exc), "trace": traceback.format_exc()}, )

注意:生产环境不要对客户端返回完整堆栈,避免泄露内部信息。

9. 最佳实践与使用建议

9.1 第一版保持小规模

第一次搭建 NeSy-RAG 时,不要一上来就上全量知识库。建议准备 5 到 10 个典型问答文档,手工整理对应的三元组和规则,先把链路跑通,再逐步扩大知识库规模。

9.2 知识图谱和向量库分工明确

向量库负责召回“可能相关的片段”,知识图谱负责提供“确定的事实关系”,规则推理负责“推导出结论”。这三个模块不要耦合得太紧,尽量通过接口隔离。尤其是图谱查询,应该封装成独立服务,方便以后替换存储引擎。

9.3 规则需要版本管理

规则是 NeSy-RAG 的可解释性基础,规则写错会导致系统“一本正经地答错”。建议把规则脚本纳入 Git 管理,每条规则附带说明文档,修改规则后跑一遍回归测试集。

9.4 评估集是必需品

准备一个 50 到 100 道题的验证集,包含简单检索题、多跳推理题、边界题。每次修改模型、切块策略、规则之后,都跑一遍验证集,对比正确率和推理链完整性。

9.5 合规红线

涉及人脸、声音、个人信息、商业秘密的数据,必须先做授权和脱敏。涉及医疗、法律、金融的建议性输出,生成结果必须标注“仅供参考”并由专业人员复核。不要用 NeSy-RAG 处理未经授权的受版权保护文档。

10. 总结与下一步

NeSy-RAG 最值得尝试的点,不是某个具体组件,而是“把 LLM 生成从相似度匹配变成带逻辑验证的结构化过程”。相比普通 RAG,它多出了知识图谱构建、规则推理和推理链输出三个模块,难度确实更高,但换来的是可审计、可解释的问答结果。

任何已经做了基础 RAG、经常被业务方追问“为什么是这个答案”的团队,都应该先搭一个最小 NeSy-RAG 原型跑一遍。最开始要验证的不是最终正确率,而是这三件事:文档能不能稳定抽取成三元组,规则推理能不能覆盖高频问题,推理链能不能让业务方看懂。

最容易踩的坑也在这些地方:三元组抽取遗漏、规则覆盖不全、图谱和检索结果冲突。这三个问题在数据量小的时候不明显,一上线就会被用户问住。所以,一定要先做评估集,再逐步上线。

后续可以继续扩展的方向包括:用 LangChain 或 Dify 接入现有 RAG 流程、把推理链可视化展现在 Web 页面、引入本体推理和不确定性推理、把批量问题接入定时调度任务。如果你已经在做企业级 RAG,NeSy-RAG 这条路线值得花一个迭代周期去验证效果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 12:44:24

从阶乘约数问题看数论与算法优化:质因数分解与勒让德定理实战

1. 项目概述&#xff1a;从一道竞赛题看算法思维的深度与广度最近在复盘一些经典的算法竞赛题目&#xff0c;蓝桥杯国赛的“阶乘约数”问题又一次引起了我的注意。这道题表面上是一个简单的数论问题&#xff1a;给定一个正整数 n&#xff0c;求 n!&#xff08;n的阶乘&#xff…

作者头像 李华
网站建设 2026/8/28 12:43:41

C++模板编程:从泛型基础到高级应用全解析

1. 从“重复造轮子”到“一劳永逸”&#xff1a;为什么我们需要模板&#xff1f; 如果你写过一段时间的C&#xff0c;尤其是写过一些需要处理多种数据类型的工具函数或数据结构&#xff0c;你大概率经历过这种痛苦&#xff1a;为了给 int 、 double 、 string 分别实现一…

作者头像 李华
网站建设 2026/8/28 12:41:44

C语言库函数模拟实现:从strcpy到memmove的底层原理与安全实践

1. 从“会用”到“懂它”&#xff1a;为什么我们要模拟实现库函数 刚学C语言那会儿&#xff0c;我最常干的事就是打开 <string.h> 或者 <ctype.h> &#xff0c;照着手册调用 strcpy 、 strlen 、 toupper 这些函数。它们就像黑盒子&#xff0c;给输入&am…

作者头像 李华
网站建设 2026/8/28 12:40:09

n8n学习管理系统集成:4步搭建课程同步与作业提醒自动化

n8n学习管理系统集成&#xff1a;4步搭建课程同步与作业提醒自动化 【免费下载链接】n8n Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400 integrations. 项目地址: https://gitco…

作者头像 李华