You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LangGraph中Llama3.2 3B未调用指定工具的问题求助

问题分析与解决建议

你的核心问题是Llama3.2 3B未触发指定工具调用,反而直接计算结果。结合代码和模型输出,主要原因集中在提示词引导不足和工具调用格式适配两方面,以下是具体分析和修复方案:

1. 提示词引导力度不够

当前系统提示仅用"encouraged to call a function",对参数量较小的Llama3.2 3B来说,这种软性引导不足以强制它放弃直接计算、选择工具调用。小模型对指令的遵循度远低于大模型,需要更明确、强制的约束。

修改建议:

将系统提示词改为强制要求调用工具,并明确禁止直接计算:

def assistant(state: MessagesState):
    sys_message = [SystemMessage(content="你必须调用提供的add/multiply/divide工具完成算术计算,绝对不能直接计算结果。严格按照工具调用格式执行,不要输出代码块或自行计算的结果。")]
    return {'messages' : [llm_with_tools.invoke(sys_message + state['messages'])]}

2. 工具调用格式适配错误

LangChain的bind_tools默认使用OpenAI的工具调用格式,但Llama3.2有自己专属的工具调用格式规范(用<|function_call_begin|>和<|function_call_end|>包裹JSON结构)。直接用默认绑定会导致模型无法识别工具调用的预期格式,从而跳过工具调用。

修改建议:

绑定工具时指定Llama3的格式:

# 替换原来的llm_with_tools绑定
llm_with_tools = llm.bind_tools(tools, tool_call_format="llama3")

如果你的LangChain版本不支持tool_call_format参数,可手动转换工具为Llama兼容的格式:

from langchain_core.tools import format_tool_to_openai_function

# 转换工具为OpenAI函数格式(Llama3支持该格式的变种)
functions = [format_tool_to_openai_function(tool) for tool in tools]
llm_with_tools = llm.bind(functions=functions)

3. 额外检查项

  • 确认tools_condition函数逻辑正确:该函数需要判断AI消息中是否存在tool_calls,若存在则跳转到tools节点,否则结束。示例逻辑:
    def tools_condition(state: MessagesState):
        last_message = state['messages'][-1]
        if hasattr(last_message, 'tool_calls') and len(last_message.tool_calls) > 0:
            return "tools"
        return "end"
    
  • 降低模型温度(temperature):将温度设为0.1或更低,减少模型的随机性,提升指令遵循度:
    # 初始化llm时设置温度
    llm = ChatLlama(model="meta-llama/Llama-3.2-3B-Instruct", temperature=0.1)
    

为什么Llama3.2 3B会直接计算?

虽然官方说明Llama3.2 3B支持工具调用,但小参数量模型的工具调用能力本身较弱,当问题(如99*99)属于它的知识范围时,会优先选择直接输出结果而非触发工具调用。通过强化提示词和适配格式,可以强制它遵循工具调用流程。

内容的提问来源于stack exchange,提问作者KycdiA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:04:52