一、企业知识库:从“能用”到“好改”
在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源码gitclone https://github.com/Mintplex-Labs/anything-llm.gitcdanything-llm# 安装依赖(使用Bun)buninstall# 启动开发服务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:asyncfunction({query,department}){constskillName=`${this.config.name}-v${this.config.version}`;try{// 记录推理过程到UI(用户可见)this.introspect(`${skillName}开始检索: "${query}",部门:${department||'全部'}`);// 获取配置的API密钥constapiKey=this.runtimeArgs["INTERNAL_API_KEY"];// 调用企业内部知识库APIconstresponse=awaitfetch(`https://internal-kb.company.com/api/search?q=${encodeURIComponent(query)}&dept=${department||''}`,{headers:{'Authorization':`Bearer${apiKey}`,'Content-Type':'application/json'}});if(!response.ok){thrownewError(`API请求失败:${response.status}`);}constdata=awaitresponse.json();constresults=data.results.slice(0,5).map(r=>`【${r.title}】${r.snippet}`).join('\n\n');// 返回结果字符串(必须返回string类型)returnresults||'未找到相关文档,请尝试调整关键词。';}catch(e){this.introspect(`${skillName}执行失败:${e.message}`);this.logger(`${skillName}错误:`,e.message);return`检索服务暂时不可用:${e.message}`;}}};关键API说明:
this.introspect():向用户展示推理过程,增加透明度this.runtimeArgs:访问plugin.json中setup_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%需求,再将二次开发聚焦于业务逻辑而非底层框架,以保持与上游版本的同步。