B4 模块 — LLM 调用与工具路由核心
1. 模块概述
1.1 模块名称
B4 — LLM 调用与指令解析模块(b4_local_agent_llm)
1.2 模块说明
B4 模块是 Agent 系统的 "智能核心",负责将原始的 LLM(大语言模型)接入结构化的 Agent 框架。它将 B1 调度器传递的用户对话和工具定义转化为 LLM 能够理解的提示词,调用本地部署的 LLM 进行推理,并将模型输出解析为结构化的 AI_Message(含 content 或 tool_calls),供 B1 调度器决策下一步操作。
核心能力:
- 加载与管理多个本地 LLM(支持 small/large 双模型)
- 通过提示词工程约束 LLM 输出严格 JSON 格式
- 解析 LLM 输出为规范 AI_Message(最终回答 / 工具调用)
- 支持 Plan-and-Execute:复杂任务自动分解为多步执行
- 支持 Multi-tool:单轮多个工具并行调用
- 通过路由策略(auto)按任务难度自动切换模型
1.3 完成情况概览
| 类型 | 完成情况 |
|---|---|
| 基础要求 | ✅ 实现 LLM 调用、JSON 格式输出、单工具调用、输出解析容错 |
| 进阶要求 | ✅ 五项扩展全部完成(Multi-tool、Plan-and-Execute、模型路由、tools_schema 对比、批量评测) |
| 可独立运行的演示 | ✅ 见第 4 节和第 5 节的演示命令,通过 CLI 直接运行 |
| 与团队系统集成情况 | B1 调度器通过 generate_ai_message() 调用本模块,B4 返回 AI_Message 供 B1 决策 |
2. 环境、模型与数据依赖
2.1 运行环境
| 项目 | 要求 |
|---|---|
| Python 版本 | 3.10 |
| 必要依赖 | torch, transformers, pyyaml(见 requirements.txt) |
| 是否需要模型 | 需要 — 本地部署 Qwen3.5-4B |
| 是否需要 GPU | 推荐 — 建议 16GiB+ 显存;CPU 也可运行但速度较慢 |
| 是否需要外部数据集 | 不需要(测试数据在 data/messages/ 中自带) |
2.2 模型依赖
| 模型 | 来源 | 项目内相对路径 | 用途 |
|---|---|---|---|
| Qwen3.5-4B | ModelScope: Qwen/Qwen3.5-4B | /root/siton-pub/assignment_B/Qwen3.5-4B(可配置) |
large 模型,复杂推理与工具调用 |
| Qwen3-1.7B | ModelScope: Qwen/Qwen3-1.7B | 需额外下载(可配置) | small 模型,简单问答 |
# 模型下载命令(使用 modelscope)
pip install modelscope
modelscope download --model Qwen/Qwen3.5-4B --local_dir /root/siton-pub/assignment_B/Qwen3.5-4B
2.3 数据集或样例数据依赖
| 数据或文件 | 来源 | 项目内相对路径 | 用途 |
|---|---|---|---|
| test messages | 自行构造 | data/messages/ |
25 个测试用例覆盖 5 工具 × 5 难度 |
| tools_schema | 团队 B3 模块输出 | data/messages/tools_schema_basic.json |
工具定义描述 |
| model.yaml | 团队配置 | configs/model.yaml |
模型 profile 配置(需配置模型路径) |
| tools.yaml | 团队配置 | configs/tools.yaml |
Plan 模式工具执行配置 |
2.4 安装步骤
# 1. 创建 conda 环境
conda create -n agent python=3.10 -y
conda activate agent
# 2. 进入项目目录并安装依赖
cd /root/siton-pub/assignment_B/agent
pip install -r requirements.txt
# 3. 如需下载模型(若模型尚未下载)
pip install modelscope
modelscope download --model Qwen/Qwen3.5-4B --local_dir /root/siton-pub/assignment_B/Qwen3.5-4B
重要:运行前请确保 configs/model.yaml 中的 model_name_or_path 路径指向正确的模型本地路径。
3. 文件结构与接口边界
3.1 文件结构
agent/
├── code/
│ ├── b4_local_agent_llm.py # B4 核心模块(LLM 调用、解析、Plan 引擎)
│ ├── common/
│ │ ├── io_utils.py # JSON/JSONL 读写工具
│ │ ├── logging_utils.py # 日志工具
│ │ └── schemas.py # AI_Message 数据结构定义与校验
│ ├── b3_tool_layer.py # B3 工具层(B4 在 Plan 模式下直接调用)
│ └── README.md # 本文件
├── configs/
│ ├── model.yaml # 模型配置(模型路径、generation 参数)
│ └── tools.yaml # 工具注册配置
├── data/
│ └── messages/ # 测试用例消息文件
│ ├── messages_simple_task.json # 简单任务(25+37)
│ ├── messages_complex_task.json # 复杂任务(天平称量)
│ ├── messages_chicken_rabbit.json # 鸡兔同笼
│ ├── messages_no_tool.json # 无需工具的任务
│ ├── messages_with_tool.json # 含 tool_calls 上下文
│ ├── messages_with_error_tool.json # 工具错误场景
│ ├── messages_with_multi_tool.json # 多工具并行
│ ├── messages_no_tool_but_require_multi_tool.json
│ ├── messages_compare_both_modes.json
│ ├── messages_tool_test_01~05_*.json # file_reader 5 级难度
│ ├── messages_calc_test_01~05_*.json # calculator 5 级难度
│ ├── messages_search_test_01~05_*.json # local_file_search 5 级难度
│ ├── messages_table_test_01~05_*.json # table_analyzer 5 级难度
│ ├── messages_format_test_01~05_*.json # format_converter 5 级难度
│ └── tools_schema_basic.json # 工具 schema 定义
├── outputs/ # 运行输出目录(自动生成)
│ └── B4_llm/
│ ├── no_tool_real/ # 基础演示 1 输出
│ ├── with_tool_real/ # 基础演示 2 输出
│ ├── error_tool_real/ # 基础演示 3 输出
│ ├── plan_demo/ # Plan-and-Execute 输出
│ ├── chicken_rabbit_*/ # 工具模式对比输出
│ ├── benchmark/ # 批量评测汇总结果
│ └── ...
├── test_tool_call.py # 批量评测脚本(50 次测试)
├── test_plan_execute.py # Plan-and-Execute 测试脚本
└── requirements.txt # Python 依赖
3.2 接口边界
| 类型 | 来源 / 去向 | 数据格式 | 说明 |
|---|---|---|---|
| 输入 | B1 调度器调用 | messages: list[dict](对话历史) |
含 system/user/assistant/tool 角色 |
| 输入 | B1 调度器调用 | tools_schema: list[dict] |
B3 生成的工具 JSON Schema |
| 输入 | B1 调度器调用 | model_config: str |
model.yaml 路径 |
| 输入 | B1 调度器调用 | model_profile: str |
small / large / auto |
| 输入 | B1 调度器调用 | plan_and_execute: str |
plan / execute / None |
| 输入 | B1 调度器调用 | tools_config: str |
tools.yaml 路径(Plan 模式需要) |
| 输入 | B1 调度器调用 | use_native_tools: bool |
是否使用原生 tools 传参 |
| 输出 | 返回 B1 调度器 | ai_message: dict |
含 content(回答)或 tool_calls(工具调用) |
| 输出 | 磁盘文件 | raw_model_output.json |
完整运行日志与调试信息 |
| 输出 | 磁盘文件 | plan.json |
Plan 模式下每一步的状态持久化 |
| 内部调用 | B3 工具层 | tool_calls → execute_tool_calls() |
Plan 模式直接调用 B3 执行工具 |
4. 基础要求实现与演示
4.1 基础功能说明
基础功能实现了 LLM 调用的全链路:
1. 加载本地模型与分词器
2. 构建提示词(注入 tools_schema + 输出格式约束)
3. 调用 LLM 推理生成
4. 解析模型输出(三级容错:标准 JSON → 反引号 → 片段提取)
5. 返回规范 AI_Message
4.2 基础功能实现路径
| 文件 / 函数 | 作用 |
|---|---|
generate_ai_message() |
对外唯一接口,接收 B1 请求并返回 AI_Message |
_prompt_json_generate() |
加载模型、构建提示词、调用推理、解析输出 |
_build_prompt_messages() |
注入 tools_schema + 格式指令 + 工具结果引导 |
_parse_model_output() |
三级容错解析 LLM 原始输出 |
_parse_json_with_backtick_tail() |
容错处理:去除前导/尾部反引号包裹 |
_parse_tool_calls_fragment() |
容错处理:从非 JSON 文本提取 tool_calls |
make_ai_message() |
构建规范 AI_Message 数据结构(common/schemas.py) |
validate_ai_message() |
校验 content 和 tool_calls 的互斥性 |
[用户消息 + tools_schema] → _build_prompt_messages → model.generate → _parse_model_output → AI_Message
4.3 基础功能输入格式与样例
| 字段 / 输入文件 | 类型 / 格式 | 是否必需 | 说明 |
|---|---|---|---|
model_config |
文件路径 (str) | 是 | model.yaml 配置文件路径 |
messages |
JSON 列表 (list[dict]) | 是 | 对话历史,至少含一条 user 消息 |
tools_schema |
JSON 列表 (list[dict]) | 是 | 工具定义数组 |
mode |
字符串 (str) | 是 | prompt_json(LLM)/ mock(模拟) |
outdir |
文件路径 (str) | 是 | 输出目录 |
model_profile |
字符串 (str) | 否 | 默认 large,可选 small/auto |
样例输入:
| 样例文件 | 用途 |
|---|---|
data/messages/messages_simple_task.json |
简单计算,验证基础推理能力 |
data/messages/messages_chicken_rabbit.json |
鸡兔同笼,验证逻辑推理能力 |
data/messages/messages_no_tool.json |
需根据已有信息回答,验证无工具场景 |
4.4 基础功能演示命令
cd agent/code
# 基础演示 1:接收初始 messages,生成包含 tool_calls 的 AIMessage
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_no_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/no_tool_real
# 基础演示 2:接收已包含 ToolMessage 的 messages,生成最终回答的 AIMessage
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_with_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/with_tool_real
# 基础演示 3:工具调用失败后的模型回答
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_with_error_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/error_tool_real
观察现象:
- 每个命令运行后,输出目录生成
raw_model_output.json,包含模型原始输出、解析结果、状态信息 - 演示 1:
content非空,tool_calls为空(无需工具) - 演示 2:
content为基于已有工具结果生成的回答 - 演示 3:
content包含工具失败原因解释,不再重复调用工具
4.5 基础功能输出格式
| 输出文件 / 返回字段 | 格式 | 说明 |
|---|---|---|
raw_model_output.json |
JSON | 完整运行日志,含 raw_text、parsed_candidate、status、error |
ai_message.json |
JSON | 规范 AI_Message:{role, content, tool_calls} |
llm_run_log.jsonl |
JSONL | 运行时间戳日志 |
4.6 基础功能结果
// 演示 1 输出示例(no_tool_real/raw_model_output.json)
{
"raw_text": "{\"content\":\"62\",\"tool_calls\":[]}",
"parsed_candidate": {"content": "62", "tool_calls": []},
"status": "success",
"error": null
}
// 演示 2 输出示例(with_tool_real/raw_model_output.json)
{
"raw_text": "{\"content\":\"1. Agent系统由模型、工具、记忆和执行循环组成。\\n2. 工具调用让模型能够读取文件...\",\"tool_calls\":[]}",
"parsed_candidate": {"content": "1. Agent系统由模型、工具...", "tool_calls": []},
"status": "success",
"error": null
}
5. 进阶要求实现与演示
5.1 选择的进阶要求
| 进阶要求 | 是否完成 | 对应文件 / 函数 | 简要说明 |
|---|---|---|---|
| 单轮多 tool_calls 生成与多 ToolMessage 接收 | ✅ 完成 | _build_prompt_messages() |
修改提示词示例,支持并行多工具调用 |
| Plan-and-Execute | ✅ 完成 | _auto_execute_step(), _generate_plan(), _execute_plan_step() |
复杂任务自动分解、逐步执行、结果合并 |
| 多模型切换与路由 | ✅ 完成 | _router_classify(), _load_model_from_profile() |
small/large/auto 三种模式 |
| tools_schema 对比 | ✅ 完成 | use_native_tools 参数 |
Prompt 注入 vs 原生 tools 传参 |
| 批量评测与统计 | ✅ 完成 | test_tool_call.py |
50 次系统测试,量化对比两模型 |
5.2 进阶功能一:单轮多 tool_calls 生成与多 ToolMessage 接收
功能说明
允许 LLM 在单次输出中包含多个独立工具调用(如同时调用 file_reader 和 calculator),
减少 LLM 与调度器之间的交互轮次,提高任务执行效率。
执行多条工具后,LLM 能综合接收多条 ToolMessage 的结果并给出最终回答。
实现路径
| 文件 / 函数 | 作用 |
|---|---|
_build_prompt_messages() |
在格式 B 的示例中增加 multi-tool 样例 |
# 核心改动:提示词中增加 multi-tool 示例
"If the task involves multiple independent parts (e.g. read a file and do a calculation),\n"
"you can use Multi-tool: include multiple tool_call objects in the tool_calls array.\n\n"
"Valid schema B (Multi-tool example):\n"
'{"content":"","tool_calls":[{"id":"call_001","name":"file_reader",'
'"args":{"path":"docs/1.md","max_chars":2000}},'
'{"id":"call_002","name":"calculator",'
'"args":{"expression":"12 * 12"}}]}\n'
演示命令
cd agent/code
# Multi-tool 生成
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_no_tool_but_require_multi_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/with_ask_multi_tool
# Multi-ToolMessage 接收(已有双工具调用结果)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_with_multi_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/with_multi_tool_real
输出结果
{
"role": "assistant",
"content": "该文件总结了注入类攻击(SQL注入、命令注入)、跨站脚本(XSS)和身份访问控制类攻击(CSRF、权限控制失效)等Web安全风险,计算结果12 * 32 + 65 - 3 = 448。",
"tool_calls": []
}
LLM 成功综合了文件读取和数学计算两条工具结果,合并为一个连贯的回答。
5.3 进阶功能二:tools_schema 对比(原生传参 vs Prompt 注入)
功能说明
对比 Hugging Face Transformers 原生 tools 参数传参与传统 prompt 注入两种方式的效果。
- 原生方式:通过 tokenizer.apply_chat_template(tools=...) 结构化传入
- Prompt 注入:将 tools_schema 以 JSON 文本拼入 system prompt
实现路径
| 文件 / 函数 | 作用 |
|---|---|
_build_prompt_messages() |
native_tool_calling 参数控制提示词构造方式 |
_parse_model_output() |
prompt 注入方式的 JSON 三级容错解析 |
_parse_tool_call_xml() |
原生传参方式的 XML 解析 |
演示命令
cd agent/code
# Prompt 注入方式(默认)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_chicken_rabbit.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/chicken_rabbit_original
# 原生传参方式
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_chicken_rabbit.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/chicken_rabbit_native \
--use_native_tools
输出对比
// Prompt 注入方式 → 直接给出答案(无需工具)
{
"role": "assistant",
"content": "设鸡有x只,兔有y只...所以兔有12只,鸡有23只。",
"tool_calls": []
}
// 原生传参方式 → 调用 calculator 工具
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "call_001",
"name": "calculator",
"args": {"expression": "(94 - 35 * 2) / (4 - 2)"}
}
]
}
结论:Prompt 注入方式下 LLM 倾向于直接回答(自己计算),原生传参方式下 LLM 更愿意调用工具。原生方式输出格式更规范,解析成功率更高。
5.4 进阶功能三:多模型切换与路由
功能说明
支持根据 model_profile 参数选择不同规模的模型:
- small(Qwen3-1.7B):快速响应,适合简单问答(~2秒)
- large(Qwen3.5-4B):高准确率,适合复杂推理与工具调用
- auto:先用 small 模型分类难度,easy 用 small,difficult 切换为 large
实现路径
| 文件 / 函数 | 作用 |
|---|---|
_load_model_from_profile() |
按 profile 加载对应模型到全局缓存 |
_router_classify() |
auto 模式:用 small 模型做二分类(easy/difficult) |
_MODEL_CACHE |
全局模型缓存,同一 profile 避免重复加载 |
[用户请求] → model_profile 检查
├─ small → 直接使用 Qwen3-1.7B
├─ large → 直接使用 Qwen3.5-4B
└─ auto → small 模型分类
├─ "easy" → small 模型执行(如简单计算)
└─ "difficult" → 释放缓存 → large 模型执行(如复杂推理)
演示命令
cd agent/code
# small 模型(简单任务)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_simple_task.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/simple_small \
--model_profile small
# large 模型(简单任务)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_simple_task.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/simple_large \
--model_profile large
# auto 模式(按任务难度自动选择)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_simple_task.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/complex_small \
--model_profile auto
输出对比
// small 模型 → "25 + 37 = 62"
// large 模型 → "62"
// auto 模式(简单任务)→ 选择 small 模型,输出 router_result.txt = "easy"
// auto 模式(复杂任务:天平称量)→ 选择 large 模型,输出 router_result.txt = "difficult"
5.5 进阶功能四:Plan-and-Execute
功能说明
让 LLM 自主将复杂任务分解为多步计划(plan_map),并按顺序逐步执行。
每个步骤独立调用 LLM、可调用工具、可查看前面步骤的结果。
所有执行在 B4 内部完成,对外返回一个普通的 AI_Message(纯 content),
B1 模块无需修改即可兼容。
实现路径
| 文件 / 函数 | 作用 |
|---|---|
_generate_plan() |
调用 LLM 生成 plan_map(步骤列表) |
_auto_execute_step() |
单步执行引擎:LLM → tool_calls → B3 执行 → 注入 → 继续,直到输出 content |
_execute_plan_step() |
构建 step 提示词(plan 上下文 + 全局 messages) |
_parse_plan_output() |
解析 plan_map JSON |
_parse_plan_step_output() |
解析 step 执行结果的 JSON |
[用户输入] → _generate_plan → plan_map(步骤列表)
→ 遍历每个 step → _auto_execute_step
→ _execute_plan_step(提示词 + 工具)
→ 解析 → 有 tool_calls?→ B3 执行 → 循环
→ 有 content?→ step 完成 → 更新 plan.json
→ 全部完成 → 合并结果 → 返回普通 AI_Message
演示命令
cd agent/code
# 步骤 1:先生成计划(plan 模式)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_no_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/plan_step \
--plan_and_execute plan
# 步骤 2:从 plan.json 继续执行(execute 模式)
python b4_local_agent_llm.py \
--model_config ../configs/model.yaml \
--messages ../data/messages/messages_no_tool.json \
--tools_schema ../data/messages/tools_schema_basic.json \
--mode prompt_json \
--outdir ../outputs/B4_llm/plan_step \
--tools_config ../configs/tools.yaml \
--plan_and_execute execute
输出结果
{
"role": "assistant",
"content": "步骤1: 阅读 docs/agent_intro.txt 文件\n结果: Agent 系统通常由模型、工具、记忆和执行循环组成。工具调用让模型能够读取本地文件、执行计算,并把结果用于后续回答。\n\n步骤2: 总结文件内容\n结果: Agent 系统通常由模型、工具、记忆和执行循环组成。",
"tool_calls": []
}
5.6 进阶功能五:批量评测与统计
功能说明
通过 50 次系统化测试(5 工具 × 5 难度 × 2 模型),量化对比不同模型
在工具调用成功率和 token 使用量上的差异,为 auto 路由策略提供数据支撑。
实现路径
| 文件 / 函数 | 作用 |
|---|---|
test_tool_call.py |
自动批量测试脚本(先模型后用例循环,每模型只加载一次) |
data/messages/messages_*_test_01~05_*.json |
25 个测试用例文件 |
[脚本] → 遍历模型(small → large)→ 遍历工具(5种)→ 遍历难度(5级)
→ 调用 generate_ai_message → 记录状态、token、延迟
→ 统计:成功率、工具调用率、平均 token、平均延迟
演示命令
cd /root/siton-pub/assignment_B/agent
python test_tool_call.py
统计结果
整体统计(50 次测试):
- 解析成功率:94%
- 工具调用率:50%
- 平均 Token:54.8
- 平均延迟:25.6秒
模型对比:
- Qwen3-1.7B (small):92% 成功率 / 40% 工具调用率 / ~1.9秒
- Qwen3.5-4B (large):96% 成功率 / 60% 工具调用率 / ~49.4秒
各工具调用率:
- table_analyzer:80% (最高)
- file_reader:70%
- local_file_search:70%
- calculator:20%
- format_converter:10% (最低)
指令难度影响(full_results 见 outputs/B4_llm/benchmark/):
- 显式指令:90%
- 直接指令 / 中等委婉:50%
- 隐含需求 / 自然语言:30%
6. 与团队系统的集成说明
调用方式
团队完整系统中,B1 调度器通过以下方式调用 B4 模块:
from code.b4_local_agent_llm import generate_ai_message
result = generate_ai_message(
model_config="configs/model.yaml",
messages=[...], # 对话历史(B5 注入记忆 + 用户输入)
tools_schema=[...], # 工具定义(B3 提供)
mode="prompt_json",
outdir="outputs/...",
artifact_stem="...",
model_profile="large", # 或 "small"、"auto"
)
ai_message = result["ai_message"]
# ai_message = {"content": "...", "tool_calls": [...]}
数据流
B1 调度器
│ messages + tools_schema + model_config
▼
B4 generate_ai_message()
│ model.generate → 解析输出
▼
AI_Message { content / tool_calls }
│
├─ content 非空 → B1 返回给用户
└─ tool_calls 非空 → B1 调用 B3 执行工具 → 追加结果 → 再次调用 B4
Plan 模式下的直接调用
在 plan_and_execute="plan" 模式下,B4 绕过 B1 直接调用 B3 的 execute_tool_calls() 执行工具:
import importlib.util
b3_path = Path(__file__).parent / "b3_tool_layer.py"
spec = importlib.util.spec_from_file_location("b3_tool_layer_mod", b3_path)
b3_mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(b3_mod)
tool_msgs = b3_mod.execute_tool_calls(tool_calls, tools_config)
配置文件依赖
B4 模块需要团队仓库中的两个配置文件:
configs/model.yaml:定义模型的路径、device_map、generation 参数configs/tools.yaml:定义各工具的技能函数映射(Plan 模式下需要)
联调经验
在 Plan-and-Execute 开发中,最初的设计方案是新增 plan 字段到 AI_Message 中,让 B1 特判处理。但这会导致接口污染:B1 需要新增 plan 相关的调度逻辑,其他组员需要适配新的字段。
最终改为 "内部闭环、对外透明" 方案——所有 plan 逻辑在 B4 内部完成,通过 importlib 直接加载 B3 模块并调用 execute_tool_calls(),对外接口不变。这验证了团队协作中 "接口稳定比功能丰富更重要" 的原则。
7. 已知问题与后续改进
| 问题 | 当前原因 | 后续改进 |
|---|---|---|
| Plan-and-Execute 中不支持嵌套计划 | _auto_execute_step 无递归逻辑 |
添加递归检测,当某 step 结果仍为 plan_map 时触发嵌套执行 |
| 可调用模型有限 | 仅支持本地 transformers 后端 | 扩展后端抽象层,支持 OpenAI API、vLLM 等远程调用方式 |
| small 模型偶尔输出不稳定(重复 tool_calls) | Qwen3-1.7B 参数量小,对工具结果理解有限 | 加入重复检测 + 强制引导,建议复杂任务使用 large 模型 |
| JSON 解析容错仍有缺口 | 模型输出格式多变,边界情况难全覆盖 | 持续收集异常输出模式,扩展处理逻辑 |
| 批量评测不支持并行 | 50 次测试串行约需 20 分钟 | 引入多线程/多进程并行执行 |