求助:如何实现meta-llama/Llama-3.2-1B-Instruct的工具调用?
Llama-3.2-1B-Instruct 工具调用实现建议
直接用Hugging Face Transformers原生API实现
别依赖LangChain了,直接上手Transformers库的核心组件。关键是严格遵循Llama-3.2官方定义的工具调用格式构造提示,明确工具的名称、参数结构,强制模型返回指定格式的工具调用指令。
示例代码:from transformers import AutoTokenizer, AutoModelForCausalLM import torch import re model_name = "meta-llama/Llama-3.2-1B-Instruct" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.bfloat16, device_map="auto" ) # 严格对齐Llama-3.2的工具调用提示模板 system_prompt = """你是能使用工具的助手,可用工具如下: [ { "name": "get_weather", "description": "获取指定城市的实时天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "要查询的城市名称" } }, "required": ["city"] } } ] 规则: 1. 需要用工具时,必须返回格式:<|tool_call|>[{"name":"工具名","parameters":{"参数名":"参数值"}}]<|tool_call|> 2. 不需要工具时直接回答问题""" user_query = "上海今天气温多少?" # 拼接符合模型要求的对话格式 prompt = ( "<|begin_of_solution|><|start_header_id|>system<|end_header_id|>\n" f"{system_prompt}<|eot_id|><|start_header_id|>user<|end_header_id|>\n" f"{user_query}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n" ) inputs = tokenizer(prompt, return_tensors="pt").to(model.device) outputs = model.generate( **inputs, max_new_tokens=200, temperature=0.1, do_sample=False ) response = tokenizer.decode(outputs[0], skip_special_tokens=False) # 提取工具调用指令 tool_call = re.search(r'<\|tool_call\|>(.*?)<\|tool_call\|>', response, re.DOTALL) if tool_call: print("工具调用:", tool_call.group(1)) else: print("直接回答:", response.split("<|end_header_id|>\n")[-1].strip())精准优化提示词
小模型对提示词细节要求更高,别写模糊表述:- 明确告知模型必须按指定格式返回工具调用,否则回答无效
- 工具的描述和参数要简洁结构化,避免冗余信息
- 可以在提示词里加入1个工具调用示例,强化模型的格式记忆
检查模型的特殊token配置
确认tokenizer包含<|tool_call|>等Llama-3.2工具调用专用的特殊token,如果缺失,需要手动添加后重新保存tokenizer再加载。用量化减少资源占用
哪怕是1B参数的模型,资源不足也会导致生成不稳定。用bitsandbytes做4bit或8bit量化,保证模型运行流畅,避免因资源限制导致格式输出错误。
内容的提问来源于stack exchange,提问作者RJtokenring
相关产品推荐
相关产品推荐

