一、企业知识库:从“能用”到“好改”

在2026年的AI应用版图中,AnythingLLM和FastGPT已成为企业构建私有知识库的两大主流选择。AnythingLLM凭借全文档格式支持、工作区隔离和MIT协议友好性,在GitHub上收获了数万Star;FastGPT则以可视化工作流编排和灵活的数据处理能力,成为需要复杂业务流程定制团队的首选。

然而,开箱即用的版本往往无法满足企业特有的业务流程和数据格式需求。二次开发能力,正是将这两个工具从“能用”升级为“好改”的关键分水岭。


二、AnythingLLM二次开发:自定义Agent技能

2.1 AnythingLLM的核心架构

AnythingLLM是Mintplex Labs开发的企业级文档聊天机器人解决方案,采用MIT许可证,支持PDF、TXT、DOCX等多种文档格式,通过工作区(workspace) 概念实现文档隔离与共享。

二次开发的主要入口是自定义Agent技能(Custom Agent Skills)。AnythingLLM的Agent技能以插件形式运行,支持热加载——修改后无需重启服务即可生效。

2.2 开发环境准备

# 克隆AnythingLLM源码
git clone https://github.com/Mintplex-Labs/anything-llm.git
cd anything-llm

# 安装依赖(使用Bun)
bun install

# 启动开发服务
bun run dev:frontend
bun run dev:backend

自定义Agent技能需要存放在STORAGE_DIR/plugins/agent-skills/目录下。对于Docker部署,该目录通过volume挂载;本地开发则在server/storage/plugins/agent-skills/

2.3 创建第一个自定义技能

每个自定义技能需要三个核心文件:plugin.json(配置文件)、handler.js(逻辑入口)、以及文件夹名称与hubId一致。

plugin.json配置文件

{
  "active": true,
  "hubId": "enterprise-knowledge-search",
  "name": "企业知识库检索",
  "schema": "skill-1.0.0",
  "version": "1.0.0",
  "description": "检索企业内部知识库文档",
  "author": "your-team",
  "license": "MIT",
  "setup_args": {
    "INTERNAL_API_KEY": {
      "type": "string",
      "required": true,
      "input": {
        "type": "text",
        "placeholder": "输入企业内部API密钥",
        "hint": "用于调用企业知识库API的认证密钥"
      }
    }
  },
  "examples": [
    {
      "prompt": "查询最新的产品规格文档",
      "call": "{\"query\": \"产品规格\", \"department\": \"研发部\"}"
    }
  ],
  "entrypoint": {
    "file": "handler.js",
    "params": {
      "query": {
        "description": "搜索关键词",
        "type": "string"
      },
      "department": {
        "description": "部门名称(用于元数据过滤)",
        "type": "string"
      }
    }
  },
  "imported": true
}

handler.js业务逻辑

// handler.js - 企业知识库检索技能
module.exports.runtime = {
  handler: async function ({ query, department }) {
    const skillName = `${this.config.name}-v${this.config.version}`;
    
    try {
      // 记录推理过程到UI(用户可见)
      this.introspect(`${skillName} 开始检索: "${query}",部门: ${department || '全部'}`);
      
      // 获取配置的API密钥
      const apiKey = this.runtimeArgs["INTERNAL_API_KEY"];
      
      // 调用企业内部知识库API
      const response = await fetch(
        `https://internal-kb.company.com/api/search?q=${encodeURIComponent(query)}&dept=${department || ''}`,
        {
          headers: {
            'Authorization': `Bearer ${apiKey}`,
            'Content-Type': 'application/json'
          }
        }
      );
      
      if (!response.ok) {
        throw new Error(`API请求失败: ${response.status}`);
      }
      
      const data = await response.json();
      const results = data.results.slice(0, 5).map(r => 
        `${r.title}${r.snippet}`
      ).join('\n\n');
      
      // 返回结果字符串(必须返回string类型)
      return results || '未找到相关文档,请尝试调整关键词。';
      
    } catch (e) {
      this.introspect(`${skillName} 执行失败: ${e.message}`);
      this.logger(`${skillName} 错误:`, e.message);
      return `检索服务暂时不可用: ${e.message}`;
    }
  }
};

关键API说明

  • this.introspect():向用户展示推理过程,增加透明度
  • this.runtimeArgs:访问plugin.jsonsetup_args配置的值
  • this.logger():输出调试日志到控制台
  • this.requestToolApproval():如需执行高风险操作(如删除记录),请求用户确认

三、FastGPT二次开发:工作流节点扩展

3.1 FastGPT的核心架构

FastGPT的核心能力是Flow节点编排(工作流),通过可视化方式构建复杂AI应用。从V4.0版本开始,节点包括系统节点(流程入口)和功能节点(知识库搜索、AI对话等),节点间通过触发器连接形成执行链路。

二次开发主要涉及三个层面:

  • 新增功能节点:在/packages/service/core/workflow/nodes/中添加
  • 接入外部知识库:通过FastGPT的第三方知识库接口规范扩展
  • 模型适配:在/packages/global/core/model/中接入企业内部模型

3.2 工作流执行原理

理解工作流执行机制是二次开发的基础。FastGPT工作流从【流程开始】节点启动,每个节点的连接线有三种状态:

  • waiting:等待执行
  • active:可执行
  • skip:跳过

节点执行原则:判断前置线状态,若有waiting则等待,有active则执行,无active也无waiting则跳过。执行完毕后更新后置线状态。

3.3 循环节点的应用

FastGPT V4.15.0+引入了循环节点,支持两种模式:

数组循环:依次遍历数组元素,每轮处理一个元素

条件循环:持续执行循环体,直到触发【循环终止】节点

以下是一个“AI润色文案直至评估达标”的条件循环实现示例:

循环开始(条件循环模式)
  ├── 【AI对话】文案优化
  ├── 【AI对话#2】评分评估
  ├── 【判断器】分数 >= 80?
  │   ├── 是 → 【指定回复】输出结果 → 【循环终止】
  │   └── 否 → 自动进入下一轮
  └── (循环体结束,回到循环开始)

循环节点不支持嵌套,系统默认最大循环次数为100次(可配置WORKFLOW_MAX_LOOP_TIMES环境变量调优)。


四、二次开发选型决策

维度 AnythingLLM FastGPT
核心定位 企业级RAG知识库应用 LLM工作流编排平台
二次开发入口 自定义Agent技能(插件热加载) 自定义工作流节点、循环编排
开发语言 JavaScript/Node.js TypeScript(后端)、Python(API调用)
适用场景 文档问答、多部门知识库隔离 复杂业务流程定制、多轮优化

避坑指南

常见问题 解决方案
自定义技能返回非字符串类型 所有handler函数必须返回string,否则Agent会中断
热加载不生效 退出当前会话/exit后重新进入,或刷新页面
FastGPT循环节点死循环 确保条件循环内有【循环终止】节点,或检查WORKFLOW_MAX_LOOP_TIMES配置
自定义技能需要用户确认高风险操作 使用this.requestToolApproval(),用户有120秒响应时间

五、总结

AnythingLLM和FastGPT的二次开发,本质上是将通用工具与特定业务流程进行适配。AnythingLLM通过自定义Agent技能扩展功能,适合需要定制化检索逻辑和多租户隔离的场景;FastGPT通过工作流节点和循环编排实现复杂流程,适合需要多轮迭代和条件分支的业务。

在实际项目中,建议从最小可行定制开始——先通过配置和API满足80%需求,再将二次开发聚焦于业务逻辑而非底层框架,以保持与上游版本的同步。

更多推荐