建立一個 Tool-Calling LLM 助手

更新 發佈閱讀 12 分鐘

下面是一個工程級但仍然精簡、可在 RTX 4090 本地跑通的完整範例

目標:建立一個 Tool-Calling LLM 助手

包含四部分:

1️⃣ 100 條 Tool-Calling 訓練資料生成器

2️⃣ LLaMA / Qwen LoRA 微調腳本

3️⃣ 4090 本地訓練流程

4️⃣ 自己的 ChatGPT + Tool 系統

使用 Qwen2-7BLlama 3 都可用的格式。


一、專案目錄(工程級結構)

llm_tool_agent/

├─ dataset/
│ ├─ generate_dataset.py
│ └─ tool_train.jsonl

├─ training/
│ └─ train_lora.py

├─ tools/
│ ├─ tools.py

├─ server/
│ └─ chat_agent.py

├─ requirements.txt

二、100 條 Tool Calling Dataset 生成器

dataset/generate_dataset.py

</>Python
import json
import random

queries = [
"查一下預算表",
"查2026年預算",
"查公司預算",
"找預算資料",
]

meetings = [
"排個會議",
"安排會議",
"新增會議",
]

dataset = []

for i in range(100):

query = random.choice(queries)
meeting = random.choice(meetings)

instruction = f"{query},並在明天下午三點{meeting}"

example = {
"messages":[
{
"role":"system",
"content":"你是一個AI助理,可以使用工具"
},
{
"role":"user",
"content":instruction
},
{
"role":"assistant",
"content":
'{"tool":"query_database","params":{"query_str":"budget"}}\n'
'{"tool":"add_calendar_event","params":{"title":"預算審核","start_time":"tomorrow 15:00"}}'
}
]
}

dataset.append(example)

with open("tool_train.jsonl","w",encoding="utf-8") as f:
for d in dataset:
f.write(json.dumps(d,ensure_ascii=False)+"\n")

print("dataset generated:",len(dataset))

執行:

</>Bash
python generate_dataset.py

會得到

tool_train.jsonl
100 samples

三、LoRA 微調腳本

training/train_lora.py

</>Python
from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import load_dataset
from peft import LoraConfig, get_peft_model
from transformers import TrainingArguments, Trainer

model_name = "Qwen/Qwen2-7B"

tokenizer = AutoTokenizer.from_pretrained(model_name)

model = AutoModelForCausalLM.from_pretrained(
model_name,
load_in_4bit=True,
device_map="auto"
)

lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj","v_proj"],
lora_dropout=0.05,
)

model = get_peft_model(model,lora_config)

dataset = load_dataset("json",data_files="../dataset/tool_train.jsonl")

def tokenize(example):

text = ""

for m in example["messages"]:
text += f"{m['role']}: {m['content']}\n"

tokens = tokenizer(
text,
truncation=True,
padding="max_length",
max_length=512
)

tokens["labels"] = tokens["input_ids"].copy()

return tokens

dataset = dataset.map(tokenize)

args = TrainingArguments(
output_dir="./lora_tool",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
num_train_epochs=3,
learning_rate=2e-4,
logging_steps=10,
save_steps=100,
)

trainer = Trainer(
model=model,
args=args,
train_dataset=dataset["train"]
)

trainer.train()

model.save_pretrained("./lora_tool")

四、4090 本地訓練流程

1 安裝環境

</>Bash
pip install torch
pip install transformers
pip install datasets
pip install peft
pip install accelerate
pip install bitsandbytes

2 生成 dataset

</>Bash
cd dataset
python generate_dataset.py

3 開始訓練

</>Bash
cd training
python train_lora.py

4090 VRAM 使用:

≈ 18GB

訓練時間:

1530 分鐘

五、工具函式

tools/tools.py

</>Python
def query_database(query_str):

database = {
"budget":"2026 budget = 3M"
}

return database.get(query_str,"not found")

六、自己的 ChatGPT + Tool Agent

server/chat_agent.py

</>Python
import json
from transformers import AutoModelForCausalLM,AutoTokenizer
from peft import PeftModel
from tools import query_database,add_calendar_event

base_model = "Qwen/Qwen2-7B"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
base_model,
load_in_4bit=True,
device_map="auto"
)

model = PeftModel.from_pretrained(model,"../training/lora_tool")

def call_tool(tool,params):

if tool=="query_database":
return query_database(**params)

if tool=="add_calendar_event":
return add_calendar_event(**params)

七、系統運作流程

整個系統:

User

LLM

輸出 JSON tool call

Python backend

執行 tool

回傳結果

示例:

User:
查一下預算並安排會議

LLM:
{"tool":"query_database","params":{"query_str":"budget"}}

Tool result:
2026 budget = 3M

八、整個系統只需

硬體:

RTX4090
24GB VRAM

模型:

7B

LoRA adapter:

~300MB

九、可以擴充的工具

例如:

weather_api
stock_price
email_sender
web_search

LLM 就會變成 AI agent


✅ 這就是一個真正可以運作的本地 Tool-Calling ChatGPT 系統



留言
avatar-img
sirius數字沙龍
11會員
234內容數
吃自助火鍋啦!不要客氣,想吃啥,請自行取用!
sirius數字沙龍的其他內容
2026/03/08
一、程式碼的問題 原本的: </>Python training_example = { "instruction": "幫我查一下預算表,並在明天下午三點排個審核會。", "output": '{"tool": "query_database",
Thumbnail
2026/03/08
一、程式碼的問題 原本的: </>Python training_example = { "instruction": "幫我查一下預算表,並在明天下午三點排個審核會。", "output": '{"tool": "query_database",
Thumbnail
2026/03/08
模型在腦中建立了一個簡化的「世界結構」,有些研究者發現 LLM 內部可能形成「世界模型」(world model),「世界模型」是近年 AI 研究中非常熱門的概念。許多研究者認為,一些大型語言模型在內部可能逐漸形成了某種簡化的世界結構表示。
Thumbnail
2026/03/08
模型在腦中建立了一個簡化的「世界結構」,有些研究者發現 LLM 內部可能形成「世界模型」(world model),「世界模型」是近年 AI 研究中非常熱門的概念。許多研究者認為,一些大型語言模型在內部可能逐漸形成了某種簡化的世界結構表示。
Thumbnail
2026/03/08
最近 AI 可解釋性研究的一個重大發現 - 語言概念神經元,在大型語言模型(LLM)裡,某些神經元似乎對特定「概念」特別敏感。研究者常把這類現象稱為 “concept neurons(概念神經元)” 或 “feature neurons(特徵神經元)”。
Thumbnail
2026/03/08
最近 AI 可解釋性研究的一個重大發現 - 語言概念神經元,在大型語言模型(LLM)裡,某些神經元似乎對特定「概念」特別敏感。研究者常把這類現象稱為 “concept neurons(概念神經元)” 或 “feature neurons(特徵神經元)”。
Thumbnail
看更多