跳到主要内容 本地大模型工具调用能力评测:主流 Agent 框架实测与局限 | 极客日志
Python AI
本地大模型工具调用能力评测:主流 Agent 框架实测与局限 本文测试了 AutoGPT、LangChain、Rivet、AutoGen 和 CrewAI 在本地大模型环境下的工具调用能力。结果显示,大多数框架依赖 OpenAI 兼容接口或无法直接调用本地函数,存在配置复杂、提示词过长、幻觉等问题。尽管部分框架支持 Ollama,但真正的本地代码执行功能仍受限。建议开发者关注后续更新,目前更适合结合云端 API 使用。
通过大模型调用其他工具到底可不可行?ChatGPT 或许能轻松搞定一切,但同样的需求落在本地大模型上,恐怕就要打个问号了。法国开发工程师 Emilien Lancelot 尝试了多款号称具备工具调用功能的 agent 框架,来看看本地大模型到底能不能完成任务,结果证明许多框架在本地化支持上存在显著缺陷。
AutoGPT:配置复杂且依赖云端验证
AutoGPT 是款看似强大的框架,提供 CLI 和 Flutter UI,能够通过浏览器创建 agent。其主要功能是处理用户的文档、音频、视频等本地内容。但是,它主要依靠 ChatGPT 或其他专有大模型服务来完成繁重工作。
若要使用 Ollama 端点,必须对配置文件进行'糊弄'式修改,让其误认为是 ChatGPT。
OPENAI_API_KEY="helloworld"
OPENAI_API_BASE_URL=http://localhost:11434/v1
SMART_LLM=dolphin-mixtral:8x7b-v2.7-q4_K_M
FAST_LLM=mistral:latest
运行后常遇到模型名称枚举错误,因为 AutoGPT 强制要求特定的专有模型名称(如 gpt-4-turbo),而本地模型通常不在此白名单中。
value is not a valid enumeration member; permitted: 'text-embedding-ada-002' , ... 'gpt-4-turbo' ...
实验小结:要想解决模型名称问题,可以在 Ollama 当中创建一个名为 GPT4-turbo 的自定义模型,但这只是重命名,无法解决 API key 错误。网上的相关文件没有介绍使用本地模型的任何内容。AutoGPT 恐怕还没有准备好对接本地模型,只能等后续升级。
网友 Wladastic 评价道,没有任何本地模型可以完全与 Auto-GPT 配合使用,因为 GPT-4 可以保持上下文长度而不会过于关注它,但其他有效的模型确实过于关注给予 LLM 的提示。如果让 Mistral 7B AWQ 运行,唯一的问题是必须从头开始编写自己的 Auto-GPT,因为 Auto-GPT 的提示对于本地 llms 来说太长且混乱。它们有时会返回正确的提示,但有时会通过 Auto-GPT 专注于系统提示,导致无限循环。
LangChain:语法晦涩且工具支持有限 Langchain 已经成为诸多项目的核心,但其语法太过复杂,很多开发者没时间去学习和适应。提供的是一种相当晦涩的 Python 功能使用方式。
chain = prompt | model | outputparser
chain.invoke("Question." )
Python 的 LCEL 系统使用 pipes(「|」)将事物串连起来。具体在 Python 之内,就是通过覆盖 Python 的 or 方法来实现。换句话说,Langchain 会像在 C++ 那些覆盖掉运算符。
针对本地模型,Langchain 提供 2 款插件:
Ollama chat: 允许用户与大模型对话。
Ollama-functions: 允许大模型通过特定输出格式回答问题。
请注意'函数调用'功能!这纯纯就是 OpenAI 的恶搞,千万别被功能名称给蒙蔽了!它并不像大家想象中那样以'使用工具'的方式调用函数,而只是对大模型的输出做格式调整。
那么,工具调用(即在本地执行真实代码)到底可不可行?Ollama 插件不提供这项功能。
@tool
def multiply (first_number: int , second_number: int ):
"""Multiplies two numbers together."""
return first_number * second_number
model = ChatOllama(model="mistral:latest" )
model_with_tools = model.bind_tools([multiply])
ChatOllama doesn't have a method bind_tools ()
实验小结:这套框架在为 CrewAI 等许多其他框架提供支持,本以为它能跟本地工具良好集成。但事实证明,它做得并不好,这个复杂的烂摊子同样没办法帮我们解决核心需求。
Rivet:界面友好但文档缺失 Rivet 用于创建复杂的 AI 代理和提示链,它是某种用于跟大模型交互的 IDE,使用画布创建执行图(DAG)。Rivet 能够在浏览器中运行,同时允许用户导出 DAG 并作为代码运行以增强软件功能。
Rivet 目前支持的大模型有:GPT-3.5、GPT-4、Claude 2、Claude 3 系列、用于语音数据的 AssemblyAI LeMUR 框架等。
Rivet 还提供 Ollama 插件以支持本地使用。请注意单击右上角的三个点并将执行器更改为'节点',否则可能无法运行。
遗憾的是,没有找到调用自定义工具的方法,而且 Rivet 的项目文档也不够完备。这个项目显然还需要进一步更新,但强烈建议大家关注。
实验总结:这软件很酷,免费而且开源。喜欢它的画面系统设计,用起来感觉就像做对了的 LangGraph。要让它真正发挥作用,还得配合工具调用。
AutoGen:多智能体强大但工具受限 作为本份榜单中表现最好的方案之一,AutoGen 是微软公司开源的多智能体(Multiple Agents)应用开发框架,多智能体应用让不同的 Agent 之间相互交流沟通来解决问题。
code_writer_agent = ConversableAgent(
"code_writer_agent" ,
system_message=code_writer_system_message,
llm_config={"config_list" :
[{"model" : "dolphin-mixtral:8x7b-v2.7-q4_K_M" ,
"api_key" : "hello world" ,
"base_url" : "http://127.0.0.1:11434/v1" }]},
code_execution_config=False ,
)
Autogen 最棒的特性包括:动态生成代码并执行;调用工具(即调用我们的代码);支持人工输入。
但工具调用真能起效吗?还是不行……必须调用大模型的 OpenAI 兼容工具才能实现这项功能,所以 Ollama + Mistral 的理想终究只是理想。但是,Autogen 的代码生成和执行功能都运行良好。另外需要注意,它不支持调用 LangChain 工具。
双模型聊天模式:允许两个大模型相互对话以完成任务。
按序对话:任务将按照您指定的顺序进行评估。
群组对话:某个 agent 充当主脑,在其他各 agent 之间建立了某种层次结构。
ReAct:允许拆分操作并制定计划。之后它会尝试执行各个步骤,一旦出现问题,则会制定新的计划并重新开始。
Reflection:跟 ReAct 有点类似,但强调的是自己的输出。在'说话'之后,它会问自己'这个结果对吗?'而且自我迭代似乎确能提升答案质量。
如果不想被代码吞没,也可以尝试下载 AutoGenStudio 软件,它能在不编写任何代码的前提下完成 agent 定义。
实验小结:AutoGen 显然有着光明的未来。但因为是由微软开发而成,我们唯一担心的就是它可能会被最终抛弃、或者成为仅限跟 OpenAI 搭配使用的软件。但哪怕是它,也仍然实现不了本地大模型的工具调用功能。
CrewAI:协调性强但提示词负担重 CrewAI 是一款用于协调角色扮演、自主 AI 代理的框架。通过促进协作智能,CrewAI 使代理能够无缝协作,解决复杂的任务。
支持 Ollama;
支持 LangChain 工具调用;
支持自定义工具调用;
支持人工输入。
工具调用仍然无法起效;
人工输入有时无法触发;
一致性差、无限循环;
Bug 频出;
需要编写的提示词太多。
可供选择的聊天机制:这里提供'按序'和'分层'两种选项。按序允许大模型按照我们指定的顺序完成任务;而分层则是创建一个幽灵 agent,由该 agent 自动决定应该根据描述触发哪个 agent。
这套框架提供三种使用模式:
第一,你已经拥有 agent,则可使用以下提示词将其绑定:角色、目标、背景故事。
writer = Agent(
role='Writer' ,
goal='Write a fake anecdote using a number.' ,
backstory='An experienced writer with vivid imagination.' ,
llm=ollama_mistral,
verbose=True
)
teacher_task = Task(
description='Decompose the arithmetic operations.' ,
expected_output='A consise list of operation to execute' ,
agent=teacher
)
最后是工具:可以将工具绑定至 agent 以实现功能。我喜欢使用 @tool 装饰符。这里只需传递一条工具描述字符串,大模型就能知道是否需要使用。
总而言之,这个过程需要编写大量提示词,很容易把人搞得晕头转向。比如说这条提示词属于任务还是 agent?这个工具是属于 agent 甲还是 agent 乙?或者说要不要把工具绑定至任务本身?问题很多,答案却非常有限,因为 CrewAI 的说明文档很不完备!
实验小结:如果大家想要各 agent 之间能相互交流,那 CrewAI 确实是个简单的框架。它速度快、设计简洁,唯一的问题就是需要编写大量提示词。但它也没办法实现工具调用,所以我们的实验目标仍然没能解决。另外,CrewAI 的一致性相当差,我们经常会看到 agent 陷入无限循环。
总结与建议 一无所获!老实说,现在我们真的需要一种更好的方法,来以较低的成本把大模型整合到自己的应用程序当中。调用工具在特定场景下可行,但仍需要更简单的架构,而且最好能脱离 OpenAI 的复杂格式。
毕竟对于 Phi 这样只能输出文本的小模型,如果无法与我们的应用程序相集成,那它跑在移动设备上还有什么意义呢?
开发者建议 基于上述测试,针对希望使用本地大模型进行工具调用的开发者,提出以下建议:
降低预期 :目前的开源 Agent 框架大多针对云端 API 优化,本地部署时往往面临兼容性挑战。不要指望开箱即用即可完美调用本地函数。
关注中间件 :考虑使用专门的中间件层来桥接本地模型与工具调用逻辑,而不是直接依赖框架内置的功能。
监控上下文 :本地模型通常上下文窗口较小,容易在长对话中丢失指令或产生幻觉。需设计短轮次交互或记忆压缩机制。
参与社区 :由于部分框架(如 AutoGPT、CrewAI)正在积极迭代,建议关注 GitHub Issue 列表,寻找已修复的本地化补丁。
试验配置
32 GB 显存的 RTX4090;
使用以下大模型进行测试:
llama3:8 B
dolphin-mixtral:8x7b-v2.7-q4_K_M
mistral:latest
由 Ollama 提供本地支持。
当前阶段,若必须使用工具调用功能,建议暂时结合云端 API 使用,待本地生态成熟后再迁移至纯本地环境。
相关免费在线工具 RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online