人工智能大模型RAGAI 应用医疗健康数据分析【免费下载链接】agent该项目已停止维护请参考https://gitcode.com/ModelEngine/nexent项目。 致力于汇聚利用 ModelEngine 能力的创新应用开发和推广高质量的应用程序旨在创建一个强大的多智能体架构将各种功能整合为无缝的用户体验。项目地址https://gitcode.com/ModelEngine/agent点击查看免费下载本指南围绕ask_question_app/admin/conf/plugins.md展开深入讲解 ModelEngine agentask_question_app中基于 MCP 的插件注册机制如何通过修改plugins.json添加自定义插件、如何覆写预置插件以及固定流程插件与RAG 插件的划分规则。结合仓库源码你还能掌握插件从启动注册到文档解析、QA 生成、关键词标注的完整调用链并了解main_前缀命名、print禁用、路径顺序等关键约束。插件体系固定流程插件与 RAG 插件官方文档给出的核心规则只有一句话却定义了整套插件体系的分流逻辑除去部分预置插件名称为固定流程插件其它插件建议不要以main_开头注册后默认为 RAG 插件。这条规则的实现位于 consts.py 的ToolName枚举中。凡是 tool 名称命中该枚举的插件会被识别为固定流程插件fixed tool按名称精确匹配调用其他未被枚举收录的 tool 名称则统一归类为 RAG 插件参与多路召回枚举值ToolName实际 tool 名称插件类型用途RAGmain_rag固定流程插件RAG 检索入口多路召回并行QA_GENqa_gen固定流程插件基于切片批量生成 QA 对KEYWORDS_GENERATEkeywords_generate固定流程插件文本关键词提取QUESTION_GENERATEquestion_generate固定流程插件基于切片生成候选问题SMART_CHUNKsmart_chunk固定流程插件LLM 智能语义切片DOCX_CHUNKdocx_chunk固定流程插件docx 文档切片PDF_CHUNKpdf_chunk固定流程插件pdf 文档切片含版面/OCRTXT_CHUNKtxt_chunk固定流程插件txt、sql 等纯文本切片HTML_CHUNKhtml_chunk固定流程插件htm/html 切片EXCEL_CHUNKexcel_chunk固定流程插件xlsx 切片可转 HTMLMD_CHUNKmd_chunk固定流程插件md/markdown 切片JSON_CHUNKjson_chunk固定流程插件json 切片PPT_CHUNKppt_chunk固定流程插件ppt 切片含页面图片KB_MARK_KEYWORDkb_mark_keyword固定流程插件知识库业务关键词标注文档中建议不要以main_开头的提示正是为了避免与固定流程插件main_rag的命名空间产生冲突。plugins.json插件注册的唯一入口添加自定义插件的方式非常简单修改plugins.json将插件入口文件路径加入数组即可针对预置插件做覆写则通过定义相同插件名称实现。配置文件位于 ask_question_app/admin/conf/plugins.json默认内容如下[ {project_path}/plugins/qa_generate.py, {project_path}/plugins/keywords_generate.py, {project_path}/plugins/question_generate.py, {project_path}/plugins/smart_chunk.py, {project_path}/plugins/docx_chunk.py, {project_path}/plugins/pdf_chunk.py, {project_path}/plugins/txt_chunk.py, {project_path}/plugins/html_chunk.py, {project_path}/plugins/excel_chunk.py, {project_path}/plugins/md_chunk.py, {project_path}/plugins/json_chunk.py, {project_path}/plugins/ppt_chunk.py, {project_path}/plugins/kb_mark_keyword.py ]其中{project_path}是一个占位符。在 consts.py 中定义ROOT_PATH dirname(dirname(dirname(abspath(__file__)))) CONFIG_PATH join(ROOT_PATH, conf, plugins.json) PLUGIN_PARAMETER { project_path: ROOT_PATH }ROOT_PATH指向admin目录随后由 client_manage.py 的get_plugin_path完成格式化def get_plugin_path(path: str) - str: return path.format(**PLUGIN_PARAMETER)因此{project_path}/plugins/qa_generate.py最终会被解析为admin/plugins/qa_generate.py。配置文件在模块导入时即被读取PLUGIN_CONFIG json.load(file)所以新增插件后需要重启服务生效。插件加载与分类启动时的一次性注册插件的加载发生在服务启动阶段。在 admin.py 中settings.init_settings()之后会立即调用generate_plugins()。加载流程由 client_manage.py 的generate_plugin完成def generate_plugin(plugin_path: str): plugin PluginClient(get_plugin_path(plugin_path)) loop asyncio.new_event_loop() # 自管理异步事件循环 plugins.append((plugin, loop)) loop.run_until_complete(plugin.connect()) resp loop.run_until_complete(plugin.session.list_tools()) for tool in resp.tools: tool_name tool.name # 固定tool记录其它tool定义为RAG if is_string_in_enum(tool.name, ToolName): tools_map[tool_name] (plugin, loop, tool) else: rag_tools.append((plugin, loop, tool))每个插件通过 PluginClient 以MCP stdio 协议拉起独立子进程。PluginClient.connect_to_server会根据文件后缀选择启动器.py用python启动.js用node启动会话初始化超时为 20 秒。随后调用session.list_tools()枚举该插件暴露的全部 tooltool 名称命中ToolName枚举 → 登记进tools_map固定流程插件tool 名称未命中枚举 → 追加进rag_toolsRAG 插件多路召回候选。一个插件文件可以同时暴露多个 tool例如自定义插件若同时定义了smart_chunk和另一个业务 tool前者进tools_map后者进rag_tools。这就是覆写预置插件的机制基础——只要你的插件文件里注册了同名 tool如docx_chunk启动时它就会覆盖掉预置实现。exec_plugin固定调用与 RAG 多路并行所有业务代码都通过 exec_plugin 统一调用插件def exec_plugin(tool_name: ToolName, *args): # RAG时多路召回并行处理 if tool_name ToolName.RAG: futures [] with ThreadPoolExecutor(max_workersRAG_CONCURRENCY) as executor: for plugin, loop, tool in rag_tools: future executor.submit(run_async_task, loop, plugin, tool, *args) futures.append((future, tool.name)) results [] for future, name in futures: result future.result() setattr(result, tool_name, name) results.append(result) return results plugin, loop, tool tools_map[tool_name.value] asyncio.set_event_loop(loop) return loop.run_until_complete(plugin.exec(tool.name, *args))关键点RAG 插件多路并行调用ToolName.RAG时会遍历rag_tools中所有 RAG 插件用ThreadPoolExecutor并发执行最大并发数由 consts.py 的RAG_CONCURRENCY 5控制每个结果会被打上tool_name属性供上层区分召回来源。固定流程插件精确路由非 RAG 调用直接从tools_map[tool_name.value]取出对应的plugin, loop, tool三元组执行。每次调用都通过PluginClient.exec→session.call_tool(tool_name, tool_args)完成 MCP 远程调用。自定义插件开发以 FastMCP 编写一个工具服务从源码结构看每个插件本质上是一个FastMCP 服务端以 stdio 传输方式运行。以预置的 qa_generate.py 为例其骨架如下import json import logging import requests from mcp.server.fastmcp import FastMCP import __init__ # 确保把项目根目录加入 sys.path mcp FastMCP(qa_gen) mcp.tool(qa_gen) async def qa_gen(qa_url, payload): try: headers {Content-Type: application/json} for prompt in payload[prompts]: prompt[content] prompt[content].encode(utf-8).decode(unicode_escape) response requests.post(qa_url, datajson.dumps(payload), headersheaders) if response.status_code 200: data response.json() qas_list data.get(QAs, []) return qas_list except Exception as e: raise Exception(str(e)) # 该启动函数是必须的不能删除 if __name__ __main__: logging.debug(, __init__) mcp.run(transportstdio)开发自定义插件时需要遵守的约定必须import __init__每个插件文件都引入了 plugins/init.py其作用是把admin目录写入sys.path使插件能from api.db.services.llm_service import LLMBundle、from deepdoc.parser import PdfParser等。源码注释明确写着日志打印是确保__init__引用因此main块中的logging.debug(, __init__)不能删除。入口函数必须保留mcp.run(transportstdio)启动 MCP stdio 服务端由宿主进程拉起。入参编码约定跨进程传中文时调用方通常用encode(unicode_escape)插件内部先encode(utf-8).decode(unicode_escape)还原二进制文件则先base64.b64encode插件内base64.b64decode。所有预置插件均遵循这一约定。返回类型可以直接返回 list/dict/strMCP 会将其序列化为 tool 调用结果上层如 naive.py再通过item.text读取并用eval/json.loads还原。写入 plugins.json 并注意路径顺序在plugins.json数组末尾追加你的插件路径即可完成注册[ {project_path}/plugins/qa_generate.py, {project_path}/plugins/keywords_generate.py, ..., {project_path}/plugins/my_business_plugin.py ]文档特别强调自定义插件路径需要置于默认插件路径之前覆写才能生效。这是因为generate_plugins按数组顺序逐个连接并枚举 tool先注册的同名 tool 会占据tools_map中的键位后续同名 tool 因tools_map[tool_name] ...被覆盖。若你的插件定义了自己的docx_chunk以覆写预置实现务必把它放在plugins.json数组的开头。预置插件族切片、文本生成与业务标注文档切片插件chunk 系列切片类插件负责把原始文件解析成可向量化的文本块全部位于 ask_question_app/admin/plugins 目录底层复用deepdoc.parser中的解析器插件文件tool 名称底层解析器核心参数docx_chunk.pydocx_chunkDocxParser子类filename, binary, langpdf_chunk.pypdf_chunkPdfParser/PlainParserfilename, lang, binary, parser_config, from_page, to_pagetxt_chunk.pytxt_chunkTxtParserfilename, binary切片长度 128分隔符\n!?。html_chunk.pyhtml_chunkHtmlParserfilename, binaryexcel_chunk.pyexcel_chunkExcelParserbinary, html4excel为真时输出 HTML 表格md_chunk.pymd_chunkMarkdownParserfilename, binary, langchunk_token_num128json_chunk.pyjson_chunkJsonParserbinary切片长度 128ppt_chunk.pyppt_chunkPptParserfilename, binary, lang, from_page经 LibreOffice 转 PDF 提取页面图以调用最复杂的 pdf_chunk.py 为例它支持parser_config控制解析行为layout_recognize默认True为真时走完整PdfParser流程OCR → 版面分析 → 表格结构识别 → 文本合并为假时退化为PlainParser纯文本解析chunk_token_num默认128naive_merge的目标切片 token 数delimiter默认\n!?。切分时的句子边界分隔符。docx 解析另有细节继承自DocxParser的Docx类重写了get_picture会提取段落内嵌图片并做容错跳过无法识别的图片流表格则转成带colspan的 HTML随后通过tokenize_chunks_docx生成带content_with_weight、image等字段的切片字典。LLM 文本生成插件smart_chunk.pysmart_chunk智能语义切片。调用LLMBundle(tenant_id, LLMType.CHAT, llm_name)获取聊天模型用系统提示词要求模型按最小标题层级/问答成段/正文与目录分离规则切分段落之间用------分隔长文本先按page_length4500、tmp_length2300的滑动窗口split_content分批处理再经dup_remove去除跨批重复段落。生成参数为temperature0, top_p0.3, max_tokens5120。keywords_generate.pykeywords_generate关键词提取。复用 dialog_service.py 的keyword_extraction要求模型输出 topN 关键词、英文逗号分隔、仅输出关键词temperature0.2再经rag_tokenizer.tokenize生成important_kwd与important_tks。question_generate.pyquestion_generate候选问题生成。复用question_proposal要求问题不重叠、尽量覆盖正文、每行一个问题输出question_kwd与question_tks。qa_generate.pyqa_gen批量 QA 生成。将多个切片内容组装为 prompts 后 POST 到qa_url环境变量配置解析响应的QAs列表。业务自定义插件kb_mark_keywordkb_mark_keyword.py 是文档中预置插件可覆写最典型的业务场景知识库切片入库前的自定义关键词标注钩子。它接收chunks、task、es_mapping三个参数只有当task.kb_type命中KB_MARK_KEYWORD_LIST见 constant/constants.py时才执行标注逻辑示例实现会向 ES mapping 追加product_name的 keyword 字段并为每个 chunk 填充product_name属性最终返回更新后的es_mapping与chunks。插件的真实调用链从上传文档到入库插件不是孤立运行的它们在解析任务中被串成完整流水线。以 task_executor.py 的处理流程看build_chunks从 MinIO 读取文件二进制按parser_id选择解析器默认 naivenaive.py 的chunk按扩展名分发docx 走DOCX_CHUNK→ 追加SMART_CHUNK智能切片 →OCR识别图片文字txt/py/js 等源码类文本走TXT_CHUNK→SMART_CHUNKpdf 走PDF_CHUNKxlsx/md/html/json/ppt 各自路由切片向量化后、写入 ES 前调用KB_MARK_KEYWORD做业务标注并刷新 mappingtask_executor.py若配置了auto_questions则调用QA_GEN生成 QA 对并写入独立的 QA 向量索引task_executor.pyauto_keywords/ 候选问题分别由KEYWORDS_GENERATE、QUESTION_GENERATE完成。调用链中的切片结果类型由 plugin_types.py 的RetrievalResultid/title/content/source_url/metadata体现RAG 多路召回的返回结果集合则直接来自exec_plugin(ToolName.RAG)。三条必须遵守的注意事项原文档以注意事项收尾这三条在源码中都有对应依据插件中不要使用print输出print会向 MCP stdio 通道写入非协议数据污染与宿主进程的通信导致程序无法正确关闭。宿主通过 stdio 子进程方式管理插件生命周期见 client.py 的stdio_client任何标准输出都必须是合法的 MCP 协议帧。自定义插件路径须位于默认插件路径之前generate_plugins按plugins.json数组顺序依次注册同名 tool 后注册者覆盖先注册者要覆写预置插件必须把自定义插件文件放在数组靠前位置。受限 MCP 协议模式无法并行单个 MCP Server 仅支持一个 RAG 插件这是因为exec_plugin对 RAG 插件按一个插件 一个独立 MCP Server 子进程模型做ThreadPoolExecutor并发如果让一个插件文件暴露多个 RAG tool它们共享同一 stdio 会话无法并行执行反而拖慢多路召回。建议一个 RAG 插件只暴露一个 tool。总结plugins.jsonToolName枚举 exec_plugin构成了 ask_question_app 的插件体系闭环plugins.json决定加载哪些插件ToolName决定哪些是固定流程插件exec_plugin决定如何调用。想要扩展业务能力只需写一个 FastMCP 服务端文件、把路径加入plugins.json注意放在数组前部以便覆写、并在admin启动后生效想要接入 RAG 多路召回则确保插件 tool 名称不以main_开头、不落入ToolName枚举且单个插件只暴露一个 RAG tool。这套机制的配置文件与源码分别位于 conf/plugins.json、api/plugins 与 plugins 目录可作为二次开发的直接参考。赞分享人工智能大模型RAGAI 应用医疗健康数据分析【免费下载链接】agent该项目已停止维护请参考https://gitcode.com/ModelEngine/nexent项目。 致力于汇聚利用 ModelEngine 能力的创新应用开发和推广高质量的应用程序旨在创建一个强大的多智能体架构将各种功能整合为无缝的用户体验。项目地址https://gitcode.com/ModelEngine/agent点击查看免费下载相关推荐Electron Forge 插件系统全解析内置插件、配置方式与运行机制Electron Forge 插件系统全解析内置插件、配置方式与运行机制 Electron Forge 通过一套统一的插件体系来扩展其核心构建能力默认情况下开发工具桌面应用前端构建Hydra 插件配置指南在主配置中覆盖与扩展插件默认配置Hydra 插件配置指南在主配置中覆盖与扩展插件默认配置 本篇技术指南聚焦 Hydra 框架中插件的配置方法。Hydra 的所有插件Launcher、Swe开发工具后端CLIEOSIO Nodeos 插件机制全解析必选核心插件、可选功能插件与配置实战EOSIO Nodeos 插件机制全解析必选核心插件、可选功能插件与配置实战 Nodeos 是 EOSIO 区块链的核心节点程序其功能以插件plugin区块链上一篇如何用tsfresh从时间序列中自动提取关键特征完整指南下一篇Qwen2.5-Coder-32B-Instruct快速入门5分钟搭建你的AI编程助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考