Qwen Agent | MCP & Function Calling流程解读
仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
为了保证结果的完整性,我将保留所有输入输出,篇幅可能较长。重点关注每个轮次messages是如何变化的,role角色如何轮换、toolcall相关信息等。
sqlite是MCP工具,封装了一系列本地数据库增删改查的操作。提前在数据库中建了几张表,并插入了几条记录。
id:整数类型,主键。
name:文本类型,不能为空。
age:整数类型,不能为空。
这个表通常由SQLite自动维护,用于支持AUTOINCREMENT字段。
name:文本类型,默认值和是否为空未指定。
seq:序列号,类型未指定。
id:整数类型,主键。
action:文本类型,可以为空。
timestamp:日期时间类型,默认值为当前时间戳(CURRENT_TIMESTAMP),可以为空。
现在我期望agent帮我完成数据库操作相关的事情,通过自然语言对话驱动。事情可以包括几类:
简单动作:如数据库有几张表;
并行操作类动作:如查看3张表的数据量,期望能并行;
串行依赖类动作:如查看student表的某个同学的年龄,然后在log表中记录。
我将完整呈现1次会话,所有LLM的input、output,以及Qwen对input和output的预处理和后处理。
测试的模型包括Qwen-Max,DeepSeek-R1,Qwen3等,整体表现都还不错,不做特别区分。
我们提供的sqlitemcp配置:
实际可用的tools有6个:
MCPManager代理:单例模式,管理mcp工具,管理clients(工具获取、工具创建、工具调用)
核心实现init_config_async:基于用户提供的配置,在create_tool_class中创建MCPTool,继承自QwenAgent的工具基础类BaseTool,实现调用。
mcpclient:连接服务器,包括sse模式和Stdio模式,返回可用tools、执行调用返回结果。
原始Input:
预处理后的Input:模型真正的输入,会将tools列表和功能描述作为systemprompt的一部分,插在原始system的尾部。
LLM的原始output:在content中通过包裹工具调用命令。和gpt-4o原生返回tool_calls字段不一样,意味着工具解析引擎需要做适配。当然,底层原生模型训练的时候也需要特定样本定制训练,提升工具调用准确性。训练后面再单独分享。
后处理后的output:会解析content,将信息转成function_call结构化输出,Qwen定制了message结构,将function_call结构化。
LLM的原始output:基于上述信息,即可回答。
LLM的后处理后的output:无functioncall等,保持和上面一样
小结:表面上执行了1次对话,实际上背后执行了2次。第一次获取functioncall的调用指令、第二次将工具调用结果补充到会话中获取答案。
并行处理任务,理想情况下可并行发起多条数据库查询指令,仍然只需要2次交互即可。
原始Input:
预处理后的Input:模型真正的输入,仍然只有user/assistant角色。function等会转成,并作为userrole传入。
LLM原始Output:可以发现1次性返回多个函数调用指令。意味着可以并行调用多个工具。这点底层模型训练时肯定做了针对性优化。
LLM后处理的Output,拆成3个指令。
原始Input:将tool调用的结果通过functionrole给出:
预处理后的input,tool_response和tool_call指令按照顺序一一对应,模型能理解这个对应关系。
LLM原始Output:
LLM后处理后的output:和上面一样。
小结:可实现并行调用,仍然通过2轮完成。
追加问了个并行类的问题,这几个表的结构分别是什么样的,仍然可以解决,此处省略:
串行类问题,必须查询完结果,然后才能在log里记录查询行为和时间戳。
原始Input:
预处理后的Input:
小结:共执行了4次对话,获取查询年龄的指令、查询年龄并得到具体年龄6岁、获取插入日志的指令、执行插入并回答插入完成。
我们可以将上述过程通过weave工具[ 2]可视化出来,能够清晰的了解各个流程、mcp工具等如何调用和运转。
整体流程比较清晰。1)通常先经过1次询问,llm返回工具调用指令;2)再基于指令调用工具得到结果,以user的形式喂给llm,得出答案。Qwen3号称在这块原生支持mcp,笔者认为主要是QwenAgent支持。只不过在返回’调用指令’这块,Qwen3可能使用了functioncalling样本进行针对性优化,使得工具调用更加丝滑。
QwenAgent封装了不少通用工具,如代码执行器,搜索工具,mcp工具等。在工具解析引擎上适配不同格式,配合Qwen3在工具调用准度的提升,整体比较丝滑,下回再继续分享。
[1]https ://github. com/QwenLM/Qwen-Agent/
[2]https ://weave-docs. wandb.ai/
进技术交流群请添加AINLP小助手微信(id:ainlp2)
请备注具体方向+所用到的相关技术点
关于AINLP
AINLP是一个有趣有AI的自然语言处理社区,专注于AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。