当前位置: 首页 > article >正文

孤舟笔记 AgentScope + llama.cpp + qwen3.6本地大模型工具调用踩坑实录

文章目录环境说明踩坑一llama-server 默认不支持 Function Calling问题现象问题原因解决方案踩坑二工具函数返回值类型错误问题现象错误代码问题原因解决方案踩坑三自作聪明写了一堆解析代码问题现象问题原因解决方案最终正确代码运行效果总结参考资料最近在尝试用 AgentScope 框架连接本地部署的 Qwen3.6 大模型通过 llama-server实现工具调用Function Calling功能。本以为按照 OpenAI 标准接口对接就行结果踩了一堆坑特此实录。环境说明本地模型: Qwen3.6-35B (GGUF 格式)推理服务: llama.cpp 的 llama-server智能体框架: AgentScope (阿里巴巴开源)操作系统: Windows 10踩坑一llama-server 默认不支持 Function Calling问题现象代码写好了工具也注册了但模型就是不调用工具而是自己瞎编答案。toolkitToolkit()toolkit.register_tool_function(get_current_time)agentReActAgent(name AI,sys_prompt你是智能助手可以调用工具。,modelchat_model,toolkittoolkit,)用户问现在几点了模型直接回答现在是2024年…完全没有调用get_current_time()工具。问题原因llama-server 默认使用的是普通聊天模式不支持 OpenAI 的 Function Calling 格式。即使你在请求中传了tools参数服务器也不会处理模型也收不到工具定义。解决方案启动 llama-server 时加上--jinja参数llama-server.exe ^ -m F:\models\Qwen3.6-35B-A3B-UD-IQ1_M.gguf ^ --n-gpu-layers 999 ^ --ctx-size 16384 ^ --jinja ^ --host 127.0.0.1 ^ --port 8080--jinja参数会启用 Jinja2 模板渲染让服务器能够正确处理 ChatML 格式的消息包括工具调用。注意: 不是所有模型都支持 Function Calling需要模型本身经过相关训练。Qwen 系列模型大多支持。踩坑二工具函数返回值类型错误问题现象加上--jinja后模型终于开始调用工具了但是报错TypeError: The tool function must return a ToolResponse object, or an AsyncGenerator/Generator of ToolResponse objects, but got class str错误代码defget_current_time()-str:获取当前时间fromdatetimeimportdatetimereturndatetime.now().strftime(%Y-%m-%d %H:%M:%S)问题原因AgentScope 的工具函数必须返回ToolResponse对象不能直接返回字符串。这是 AgentScope 的设计规范用于统一处理工具调用的结果。解决方案fromagentscope.toolimportToolResponsedefget_current_time()-ToolResponse:获取当前时间fromdatetimeimportdatetime resultdatetime.now().strftime(%Y-%m-%d %H:%M:%S)returnToolResponse(contentresult)所有工具函数都要改成返回ToolResponsedefcalculate(expression:str)-ToolResponse:计算数学表达式try:resulteval(expression,{__builtins__:{}},{})returnToolResponse(contentf{expression}{result})exceptExceptionase:returnToolResponse(contentf计算错误:{e})踩坑三自作聪明写了一堆解析代码问题现象一开始以为 AgentScope 不能正确处理工具调用于是写了一个LlamaServerModelWrapper里面有一大堆正则表达式来解析模型输出classLlamaServerModelWrapper(OpenAIChatModel):TOOL_PATTERNre.compile(r{{call:\s*(\w)\s*\}\})JSON_TOOL_PATTERNre.compile(r\[\s*\{\s*name\s*:\s*(\w)...)TOOL_CALL_PATTERNre.compile(rtool_call\s*\(\s*(\w)\s*\(\s*([^)]*)\s*\)\s*\))asyncdef__call__(self,messages,**kwargs):# 100多行的解析逻辑...responseawaitsuper().__call__(messages,**kwargs)# 各种正则匹配...# 手动构造 ToolUseBlock...returnresponse问题原因完全没必要AgentScope 原生就支持 OpenAI 格式的工具调用。只要 llama-server 正确返回tool_calls字段AgentScope 会自动处理一切。解决方案删除所有自定义解析代码只保留必要的参数修正classLlamaServerModelWrapper(OpenAIChatModel):包装 OpenAIChatModel修复 tool_choice 参数asyncdef__call__(self,messages,**kwargs):iftool_choiceinkwargsandkwargs[tool_choice]isNone:kwargs[tool_choice]autoreturnawaitsuper().__call__(messages,**kwargs)AgentScope 会自动把工具定义发给模型解析模型的tool_calls响应执行对应的工具函数把结果返回给模型让模型生成最终回复最终正确代码#!/usr/bin/env python3importasyncioimportagentscopefromagentscope.agentimportReActAgentfromagentscope.messageimportMsgfromagentscope.toolimportToolkit,ToolResponsefromagentscope.memoryimportInMemoryMemoryfromagentscope.formatterimportOpenAIChatFormatterfromagentscope.modelimportOpenAIChatModel# 工具函数 - 必须返回 ToolResponsedefget_current_time()-ToolResponse:获取当前日期和时间fromdatetimeimportdatetime resultdatetime.now().strftime(%Y-%m-%d %H:%M:%S)returnToolResponse(contentresult)defcalculate(expression:str)-ToolResponse:计算数学表达式try:allowed{abs:abs,max:max,min:min}resulteval(expression,{__builtins__:{}},allowed)returnToolResponse(contentf{expression}{result})exceptExceptionase:returnToolResponse(contentf计算错误:{e})# 自定义 Model 包装器 - 只需修复参数classLlamaServerModelWrapper(OpenAIChatModel):asyncdef__call__(self,messages,**kwargs):iftool_choiceinkwargsandkwargs[tool_choice]isNone:kwargs[tool_choice]autoreturnawaitsuper().__call__(messages,**kwargs)defcreate_agent():chat_modelLlamaServerModelWrapper(model_nameqwen3.6,api_keyany-key,client_kwargs{base_url:http://127.0.0.1:8080/v1},)toolkitToolkit()toolkit.register_tool_function(get_current_time)toolkit.register_tool_function(calculate)returnReActAgent(name AI,sys_prompt你是智能助手可以使用工具回答问题。,modelchat_model,toolkittoolkit,memoryInMemoryMemory(),max_iters3,)asyncdefmain():agentscope.init()agentcreate_agent()user_msgMsg(name用户,content现在几点了,roleuser)responseawaitagent(user_msg)print(fAI:{response.content})if__name____main__:asyncio.run(main())运行效果 你: 现在几点了 AI: 调用工具 get_current_time() 工具返回: 2026-04-27 02:49:27 AI: 现在是2026年4月27日02点49分27秒。总结问题原因解决方案模型不调用工具llama-server 默认不支持 FC启动时加--jinja参数TypeError: ToolResponse工具函数返回字符串返回ToolResponse(content...)代码复杂难维护自作聪明写解析逻辑信任框架用原生功能核心教训不要自作聪明框架能做的事就让框架做。遇到问题先查官方文档而不是自己造轮子。参考资料llama.cpp 官方文档AgentScope 官方文档Qwen 模型仓库如果这篇文章对你有帮助欢迎点赞收藏有问题欢迎评论区交流~

相关文章:

孤舟笔记 AgentScope + llama.cpp + qwen3.6本地大模型工具调用踩坑实录

文章目录环境说明踩坑一:llama-server 默认不支持 Function Calling问题现象问题原因解决方案踩坑二:工具函数返回值类型错误问题现象错误代码问题原因解决方案踩坑三:自作聪明写了一堆解析代码问题现象问题原因解决方案最终正确代码运行效果…...

计算机视觉:原理、挑战与应用实践

1. 计算机视觉概述:让机器拥有"视觉"的能力计算机视觉(Computer Vision,简称CV)是一门让计算机通过数字图像或视频来"看"并理解其中内容的学科。想象一下,当你看到一张照片时,可以立即…...

2026年新生怎么搭建OpenClaw/Hermes Agent?一看就懂教程

2026年新生怎么搭建OpenClaw/Hermes Agent?一看就懂教程。Hermes Agent/OpenClaw怎么部署?还在为部署OpenClaw到处找教程踩坑吗?别再瞎折腾了!Hermes Agent/OpenClaw一键部署攻略来了,无需代码、只需两步,新…...

AI Agent开发指南:从Awesome清单到实战应用

1. 项目概述:为什么我们需要一个“Awesome Agents”清单?如果你最近也在关注AI Agent这个领域,大概率会和我有同样的感受:信息爆炸,但良莠不齐。每天都有新的框架、新的工具、新的论文冒出来,GitHub上随便一…...

GHelper:轻量级华硕笔记本控制工具完整使用指南

GHelper:轻量级华硕笔记本控制工具完整使用指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, an…...

Qianfan-OCR应用实践:科研论文PDF→图表标题提取+方法论段落定位

Qianfan-OCR应用实践:科研论文PDF→图表标题提取方法论段落定位 1. 项目背景与价值 科研工作者每天需要阅读大量论文,其中图表和方法论是最核心的内容。传统方式需要手动翻阅PDF、截图识别文字、再整理关键信息,整个过程耗时耗力。Qianfan-…...

Bistoury:无侵入Java应用诊断利器,在线Debug与性能监控实战

1. 项目概述:一站式Java应用诊断利器Bistoury如果你是一名Java后端开发者,或者负责线上系统的稳定性保障,那么对下面这个场景一定不陌生:线上服务突然出现CPU飙升、内存泄漏,或者某个接口响应时间异常拉长。传统的排查…...

物联网项目避坑:TEA5767收音机模块I2C通信失败?5个常见问题排查指南

TEA5767收音机模块实战:5个I2C通信故障的深度排查手册 调试TEA5767收音机模块时,I2C通信失败是最令人头疼的问题之一。明明接线看起来没问题,代码也照着示例写了,但模块就是没反应。这种挫败感我太熟悉了——去年在一个智能家居项…...

机器学习作品集构建指南:从项目选择到部署展示

1. 为什么机器学习从业者需要作品集?在机器学习这个快速迭代的领域,简历上的学历和工作经历已经不足以证明你的真实能力。我见过太多候选人带着漂亮的学历背景去面试,却在面对实际业务问题时束手无策。这就是为什么顶级科技公司在招聘时越来越…...

为什么你的Chromatic注入器经常“failed to fetch“?5个修复方法详解

为什么你的Chromatic注入器经常"failed to fetch"?5个修复方法详解 【免费下载链接】chromatic Universal modifier for Chromium/V8 | 广谱注入 Chromium/V8 的通用修改器 项目地址: https://gitcode.com/gh_mirrors/be/chromatic 作为一名技术爱…...

猫抓资源嗅探:5步掌握网页媒体下载的核心技能

猫抓资源嗅探:5步掌握网页媒体下载的核心技能 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾为无法保存网页中的精彩视频而烦…...

如何快速实现Switch手柄跨平台控制:BetterJoy完整指南

如何快速实现Switch手柄跨平台控制:BetterJoy完整指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/…...

UABEAvalonia:跨平台Unity资源编辑器的完整使用指南

UABEAvalonia:跨平台Unity资源编辑器的完整使用指南 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA UABEAvalonia是一款基于C#开发的跨平台Unity资源编辑器,专为现代Unity引擎版…...

3个高效技巧解决显卡驱动残留难题:DDU工具实战指南

3个高效技巧解决显卡驱动残留难题:DDU工具实战指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller …...

Qianfan-OCR保姆级教程:公式识别LaTeX代码可直接粘贴至Overleaf

Qianfan-OCR保姆级教程:公式识别LaTeX代码可直接粘贴至Overleaf 1. 工具介绍 Qianfan-OCR是基于百度千帆InternVL架构开发的单卡GPU专属文档解析工具。它解决了传统OCR在处理复杂排版、公式、表格和长文档时的局限性,特别适合学术研究和办公场景使用。…...

PowerPoint 练习题(3)

考生目录的Paper子目录下有ppt.ppt文件,请完成下列操作后保存。1.隐藏最后一张幻灯片(“Bye-bye”)。2.将第1张幻灯片的背景纹理设置为“绿色大理石”。3.删除第3张幻灯片中所有一级文本的项目符号。4.将第2张幻灯片中…...

PowerPoint 练习题(2)

1.将第2张幻灯片的一级文本的项目符号均设置为“✓”.2.将第3张幻灯片的图片超级链接到第2张幻灯片。3.将第1张幻灯片的版式设置为“标题幻灯片”。4.在第4张幻灯片的日期区中插入自动更新的日期和时间(采用…...

PowerPoint 练习题(1)

PowerPoint2000 操作题目如下,单击“回答”按钮,进行测试。考生目录的Paper子目录下有ppt.ppt文件,请完成下列操作后保存。1.将第1张幻灯片的主标题“营养物质的组成”的字体设置为“隶书”,字号不变。.将第…...

JX3Toy:5分钟掌握剑网3自动化操作,告别手忙脚乱的副本时光

JX3Toy:5分钟掌握剑网3自动化操作,告别手忙脚乱的副本时光 【免费下载链接】JX3Toy 一个自动化测试DPS的小工具 项目地址: https://gitcode.com/GitHub_Trending/jx/JX3Toy 你是否曾在剑网3的副本中手忙脚乱,按错技能顺序?…...

堡盟Baumer VCX系列工业相机供电与触发:网口(GigE) vs USB3.0

堡盟Baumer VCX系列工业相机供电与触发:网口(GigE) vs USB3.0,8-pin接口是关键!“我的VCXU相机为什么接上USB线就无法正常工作?” “VCXG相机PoE供电不稳定,导致图像丢帧怎么办?” “硬件触发信号明明接上了…...

SCTRANet:空间-通道交叉 Transformer 红外小目标检测

文章目录 SCTRANet:空间-通道交叉 Transformer 红外小目标检测 一、任务 二、环境 三、数据 (SIRST / IRSTD-1k) 3.1 结构 3.2 加载 四、模型 4.1 U-Net 基线 4.2 SCTBlock 五、训练 5.1 Focal Loss 5.2 训练循环 六、结果 七、消融 八、调试 九、总结 代码链接与详细流程 购买…...

基于 FAISS 的 AI 长期记忆系统示例

FAISS(Facebook AI Similarity Search)是 Meta 开源的高性能向量检索库,专为海量高维向量数据的快速近似搜索而设计。基于 FAISS 构建的 AI 长期记忆系统,本质上是为 AI 模型(尤其是大语言模型)提供持久化、…...

面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附Python实战演示

面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附Python 实战演示面阵 vs 线阵:工业视觉的“广角镜”与“扫描仪”🔍 核心差异:一帧 vs 一行面阵相机 (Area Scan):瞬间的“广角镜”线阵相机 (Line Scan)&#xf…...

5个机器学习可视化黑马工具:从EDA到模型解释

1. 项目概述:机器学习可视化工具的隐藏瑰宝在数据科学项目中,可视化从来不只是锦上添花——它直接决定了你的模型价值能否被决策者理解和采纳。虽然Matplotlib和Seaborn已经成为行业标配,但当我连续三个季度需要向非技术高管汇报机器学习项目…...

边走边聊 Python 3.8:pandas 内存优化技巧(深度版)

pandas 内存优化技巧(深度版)——专为 Python 3.8 + Windows 7 系统打造 大家好!第9篇我们用 pandas 处理了手机记账 CSV,很多读者反馈“Win7 老机器内存只有 4~8GB,处理 10 万行以上文件就卡死了”。今天专门出一期内存优化实战技巧,全部代码在 Python 3.8 + Windows 7…...

Qwen3-32B镜像配置优化:提升响应速度与使用体验

Qwen3-32B镜像配置优化:提升响应速度与使用体验 1. 为什么需要优化Qwen3-32B镜像配置 Qwen3-32B作为一款320亿参数的大型语言模型,在推理能力、多语言支持和复杂任务处理方面表现出色。然而,在实际部署和使用过程中,许多用户会遇…...

PCA降维技术:原理、实现与优化实战

## 1. PCA基础概念与核心价值主成分分析(PCA)本质上是一种降维技术,它通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量。我第一次接触PCA是在处理一个包含200多个特征的数据集时——当时可视化都成问题,更别说…...

贝叶斯最优分类器:理论与应用解析

1. 贝叶斯最优分类器入门指南 在机器学习领域,分类问题就像一场永不停歇的智慧较量。我们不断开发新算法,调整参数,优化模型,只为了那百分之几的准确率提升。但你是否想过,理论上存在一个完美的分类器,它的…...

终极指南:UABEAvalonia - 跨平台Unity资源编辑器完全解析

终极指南:UABEAvalonia - 跨平台Unity资源编辑器完全解析 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA UABEAvalonia是一款功能强大的跨平台Unity资源编辑器,专为游戏开发者和…...

PHP进程管理利器:轻量级工具pao的原理、配置与实战

1. 项目概述:一个轻量级的PHP进程管理器如果你在PHP开发中,特别是处理后台任务、队列消费或者需要管理长时间运行的脚本时,还在为进程的启动、停止、重启和监控而头疼,那么nunomaduro/pao这个项目绝对值得你花时间了解一下。它不是…...